From b32b8b31cd0028762e431a405a34f4f4a7a81688 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 13 Dec 2024 13:16:25 +0000 Subject: [PATCH] Deployed 84f08b9 with MkDocs version: 1.6.1 --- .nojekyll | 0 404.html | 1175 +++ api-compute.html | 2536 +++++++ api-config-config.html | 1315 ++++ api-config.html | 1951 +++++ api-display.html | 4647 ++++++++++++ api-io.html | 2777 +++++++ api-process.html | 2252 ++++++ api-script-pyramids.html | 2659 +++++++ api-script-qupath-script-runner.html | 1647 ++++ api-script-segment.html | 3334 ++++++++ api-seg.html | 3666 +++++++++ api-utils.html | 4588 +++++++++++ assets/_mkdocstrings.css | 143 + .../twemoji@15.1.0/assets/svg/26a0.svg | 1 + .../fonts.googleapis.com/css.49ea35f2.css | 594 ++ .../v32/KFOjCnqEu92Fr1Mu51TjASc-CsTKlA.woff2 | Bin 0 -> 10656 bytes .../v32/KFOjCnqEu92Fr1Mu51TjASc0CsTKlA.woff2 | Bin 0 -> 13360 bytes .../v32/KFOjCnqEu92Fr1Mu51TjASc1CsTKlA.woff2 | Bin 0 -> 6144 bytes .../v32/KFOjCnqEu92Fr1Mu51TjASc2CsTKlA.woff2 | Bin 0 -> 1536 bytes .../v32/KFOjCnqEu92Fr1Mu51TjASc3CsTKlA.woff2 | Bin 0 -> 16756 bytes .../v32/KFOjCnqEu92Fr1Mu51TjASc5CsTKlA.woff2 | Bin 0 -> 7708 bytes .../v32/KFOjCnqEu92Fr1Mu51TjASc6CsQ.woff2 | Bin 0 -> 20216 bytes .../v32/KFOjCnqEu92Fr1Mu51TzBic-CsTKlA.woff2 | Bin 0 -> 10356 bytes .../v32/KFOjCnqEu92Fr1Mu51TzBic0CsTKlA.woff2 | Bin 0 -> 13104 bytes .../v32/KFOjCnqEu92Fr1Mu51TzBic1CsTKlA.woff2 | Bin 0 -> 6148 bytes .../v32/KFOjCnqEu92Fr1Mu51TzBic2CsTKlA.woff2 | Bin 0 -> 1468 bytes .../v32/KFOjCnqEu92Fr1Mu51TzBic3CsTKlA.woff2 | Bin 0 -> 16080 bytes .../v32/KFOjCnqEu92Fr1Mu51TzBic5CsTKlA.woff2 | Bin 0 -> 7464 bytes .../v32/KFOjCnqEu92Fr1Mu51TzBic6CsQ.woff2 | Bin 0 -> 19780 bytes .../v32/KFOkCnqEu92Fr1Mu51xEIzIFKw.woff2 | Bin 0 -> 1516 bytes .../v32/KFOkCnqEu92Fr1Mu51xFIzIFKw.woff2 | Bin 0 -> 16688 bytes .../v32/KFOkCnqEu92Fr1Mu51xGIzIFKw.woff2 | Bin 0 -> 13224 bytes .../v32/KFOkCnqEu92Fr1Mu51xHIzIFKw.woff2 | Bin 0 -> 6144 bytes .../roboto/v32/KFOkCnqEu92Fr1Mu51xIIzI.woff2 | Bin 0 -> 20144 bytes .../v32/KFOkCnqEu92Fr1Mu51xLIzIFKw.woff2 | Bin 0 -> 7724 bytes .../v32/KFOkCnqEu92Fr1Mu51xMIzIFKw.woff2 | Bin 0 -> 10492 bytes .../v32/KFOlCnqEu92Fr1MmSU5fABc4EsA.woff2 | Bin 0 -> 9684 bytes .../roboto/v32/KFOlCnqEu92Fr1MmSU5fBBc4.woff2 | Bin 0 -> 18492 bytes .../v32/KFOlCnqEu92Fr1MmSU5fBxc4EsA.woff2 | Bin 0 -> 7180 bytes .../v32/KFOlCnqEu92Fr1MmSU5fCBc4EsA.woff2 | Bin 0 -> 1500 bytes .../v32/KFOlCnqEu92Fr1MmSU5fCRc4EsA.woff2 | Bin 0 -> 15028 bytes .../v32/KFOlCnqEu92Fr1MmSU5fChc4EsA.woff2 | Bin 0 -> 12324 bytes .../v32/KFOlCnqEu92Fr1MmSU5fCxc4EsA.woff2 | Bin 0 -> 5688 bytes .../v32/KFOlCnqEu92Fr1MmWUlfABc4EsA.woff2 | Bin 0 -> 9780 bytes .../roboto/v32/KFOlCnqEu92Fr1MmWUlfBBc4.woff2 | Bin 0 -> 18596 bytes .../v32/KFOlCnqEu92Fr1MmWUlfBxc4EsA.woff2 | Bin 0 -> 6904 bytes .../v32/KFOlCnqEu92Fr1MmWUlfCBc4EsA.woff2 | Bin 0 -> 1456 bytes .../v32/KFOlCnqEu92Fr1MmWUlfCRc4EsA.woff2 | Bin 0 -> 14740 bytes .../v32/KFOlCnqEu92Fr1MmWUlfChc4EsA.woff2 | Bin 0 -> 12304 bytes .../v32/KFOlCnqEu92Fr1MmWUlfCxc4EsA.woff2 | Bin 0 -> 5708 bytes .../roboto/v32/KFOmCnqEu92Fr1Mu4WxKOzY.woff2 | Bin 0 -> 7096 bytes .../s/roboto/v32/KFOmCnqEu92Fr1Mu4mxK.woff2 | Bin 0 -> 18536 bytes .../roboto/v32/KFOmCnqEu92Fr1Mu5mxKOzY.woff2 | Bin 0 -> 9852 bytes .../roboto/v32/KFOmCnqEu92Fr1Mu72xKOzY.woff2 | Bin 0 -> 15336 bytes .../roboto/v32/KFOmCnqEu92Fr1Mu7GxKOzY.woff2 | Bin 0 -> 12456 bytes .../roboto/v32/KFOmCnqEu92Fr1Mu7WxKOzY.woff2 | Bin 0 -> 5796 bytes .../roboto/v32/KFOmCnqEu92Fr1Mu7mxKOzY.woff2 | Bin 0 -> 1496 bytes ...wgGEFl0_3vrtSM1J-gEPT5Ese6hmHSV0mf0h.woff2 | Bin 0 -> 24792 bytes ...wgGEFl0_3vrtSM1J-gEPT5Ese6hmHSZ0mf0h.woff2 | Bin 0 -> 16296 bytes ...wgGEFl0_3vrtSM1J-gEPT5Ese6hmHSd0mf0h.woff2 | Bin 0 -> 7528 bytes ...5mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSh0mQ.woff2 | Bin 0 -> 22736 bytes ...wgGEFl0_3vrtSM1J-gEPT5Ese6hmHSt0mf0h.woff2 | Bin 0 -> 10096 bytes ...wgGEFl0_3vrtSM1J-gEPT5Ese6hmHSx0mf0h.woff2 | Bin 0 -> 13036 bytes ...euFoqFrlnAIe2Imhk1T8rbociImtElOUlYIw.woff2 | Bin 0 -> 7972 bytes ...euFoqFrlnAIe2Imhk1T8rbociImtEleUlYIw.woff2 | Bin 0 -> 17428 bytes ...euFoqFrlnAIe2Imhk1T8rbociImtEluUlYIw.woff2 | Bin 0 -> 26644 bytes ...q2oeuFoqFrlnAIe2Imhk1T8rbociImtEm-Ul.woff2 | Bin 0 -> 24652 bytes ...euFoqFrlnAIe2Imhk1T8rbociImtEmOUlYIw.woff2 | Bin 0 -> 10704 bytes ...euFoqFrlnAIe2Imhk1T8rbociImtEn-UlYIw.woff2 | Bin 0 -> 14288 bytes .../external/unpkg.com/iframe-worker/shim.js | 1 + .../katex@0/dist/contrib/auto-render.min.js | 1 + .../unpkg.com/katex@0/dist/katex.min.css | 1 + .../unpkg.com/katex@0/dist/katex.min.js | 1 + .../unpkg.com/mermaid@11/dist/mermaid.min.js | 2314 ++++++ assets/images/favicon.png | Bin 0 -> 1870 bytes assets/javascripts/bundle.83f73b43.min.js | 16 + assets/javascripts/bundle.83f73b43.min.js.map | 7 + assets/javascripts/lunr/min/lunr.ar.min.js | 1 + assets/javascripts/lunr/min/lunr.da.min.js | 18 + assets/javascripts/lunr/min/lunr.de.min.js | 18 + assets/javascripts/lunr/min/lunr.du.min.js | 18 + assets/javascripts/lunr/min/lunr.el.min.js | 1 + assets/javascripts/lunr/min/lunr.es.min.js | 18 + assets/javascripts/lunr/min/lunr.fi.min.js | 18 + assets/javascripts/lunr/min/lunr.fr.min.js | 18 + assets/javascripts/lunr/min/lunr.he.min.js | 1 + assets/javascripts/lunr/min/lunr.hi.min.js | 1 + assets/javascripts/lunr/min/lunr.hu.min.js | 18 + assets/javascripts/lunr/min/lunr.hy.min.js | 1 + assets/javascripts/lunr/min/lunr.it.min.js | 18 + assets/javascripts/lunr/min/lunr.ja.min.js | 1 + assets/javascripts/lunr/min/lunr.jp.min.js | 1 + assets/javascripts/lunr/min/lunr.kn.min.js | 1 + assets/javascripts/lunr/min/lunr.ko.min.js | 1 + assets/javascripts/lunr/min/lunr.multi.min.js | 1 + assets/javascripts/lunr/min/lunr.nl.min.js | 18 + assets/javascripts/lunr/min/lunr.no.min.js | 18 + assets/javascripts/lunr/min/lunr.pt.min.js | 18 + assets/javascripts/lunr/min/lunr.ro.min.js | 18 + assets/javascripts/lunr/min/lunr.ru.min.js | 18 + assets/javascripts/lunr/min/lunr.sa.min.js | 1 + .../lunr/min/lunr.stemmer.support.min.js | 1 + assets/javascripts/lunr/min/lunr.sv.min.js | 18 + assets/javascripts/lunr/min/lunr.ta.min.js | 1 + assets/javascripts/lunr/min/lunr.te.min.js | 1 + assets/javascripts/lunr/min/lunr.th.min.js | 1 + assets/javascripts/lunr/min/lunr.tr.min.js | 18 + assets/javascripts/lunr/min/lunr.vi.min.js | 1 + assets/javascripts/lunr/min/lunr.zh.min.js | 1 + assets/javascripts/lunr/tinyseg.js | 206 + assets/javascripts/lunr/wordcut.js | 6708 +++++++++++++++++ .../workers/search.6ce7567c.min.js | 42 + .../workers/search.6ce7567c.min.js.map | 7 + assets/stylesheets/main.6f8fc17f.min.css | 1 + assets/stylesheets/main.6f8fc17f.min.css.map | 1 + assets/stylesheets/palette.06af60db.min.css | 1 + .../stylesheets/palette.06af60db.min.css.map | 1 + demo_notebooks/cells_distributions.html | 2692 +++++++ demo_notebooks/cells_distributions.ipynb | 934 +++ demo_notebooks/density_map.html | 2492 ++++++ demo_notebooks/density_map.ipynb | 523 ++ demo_notebooks/fibers_coverage.html | 2297 ++++++ demo_notebooks/fibers_coverage.ipynb | 511 ++ demo_notebooks/fibers_length_multi.html | 2163 ++++++ demo_notebooks/fibers_length_multi.ipynb | 372 + guide-create-pyramids.html | 1483 ++++ guide-install-abba.html | 1650 ++++ guide-pipeline.html | 1512 ++++ guide-prepare-qupath.html | 1605 ++++ guide-qupath-objects.html | 1714 +++++ guide-register-abba.html | 1782 +++++ images/hq-pipeline.svg | 4 + index.html | 1393 ++++ javascripts/katex.js | 10 + main-citing.html | 1285 ++++ main-configuration-files.html | 1703 +++++ main-getting-help.html | 1290 ++++ main-getting-started.html | 1541 ++++ main-using-notebooks.html | 1322 ++++ overrides/main.html | 11 + search/search_index.js | 1 + search/search_index.json | 1 + sitemap.xml | 3 + sitemap.xml.gz | Bin 0 -> 127 bytes stylesheets/extra.css | 24 + tips-abba.html | 1290 ++++ tips-brain-contours.html | 1294 ++++ tips-formats.html | 1566 ++++ tips-qupath.html | 1358 ++++ 150 files changed, 78706 insertions(+) create mode 100644 .nojekyll create mode 100644 404.html create mode 100644 api-compute.html create mode 100644 api-config-config.html create mode 100644 api-config.html create mode 100644 api-display.html create mode 100644 api-io.html create mode 100644 api-process.html create mode 100644 api-script-pyramids.html create mode 100644 api-script-qupath-script-runner.html create mode 100644 api-script-segment.html create mode 100644 api-seg.html create mode 100644 api-utils.html create mode 100644 assets/_mkdocstrings.css create mode 100644 assets/external/cdn.jsdelivr.net/gh/jdecked/twemoji@15.1.0/assets/svg/26a0.svg create mode 100644 assets/external/fonts.googleapis.com/css.49ea35f2.css create mode 100644 assets/external/fonts.gstatic.com/s/roboto/v32/KFOjCnqEu92Fr1Mu51TjASc-CsTKlA.woff2 create mode 100644 assets/external/fonts.gstatic.com/s/roboto/v32/KFOjCnqEu92Fr1Mu51TjASc0CsTKlA.woff2 create mode 100644 assets/external/fonts.gstatic.com/s/roboto/v32/KFOjCnqEu92Fr1Mu51TjASc1CsTKlA.woff2 create mode 100644 assets/external/fonts.gstatic.com/s/roboto/v32/KFOjCnqEu92Fr1Mu51TjASc2CsTKlA.woff2 create mode 100644 assets/external/fonts.gstatic.com/s/roboto/v32/KFOjCnqEu92Fr1Mu51TjASc3CsTKlA.woff2 create mode 100644 assets/external/fonts.gstatic.com/s/roboto/v32/KFOjCnqEu92Fr1Mu51TjASc5CsTKlA.woff2 create mode 100644 assets/external/fonts.gstatic.com/s/roboto/v32/KFOjCnqEu92Fr1Mu51TjASc6CsQ.woff2 create mode 100644 assets/external/fonts.gstatic.com/s/roboto/v32/KFOjCnqEu92Fr1Mu51TzBic-CsTKlA.woff2 create mode 100644 assets/external/fonts.gstatic.com/s/roboto/v32/KFOjCnqEu92Fr1Mu51TzBic0CsTKlA.woff2 create mode 100644 assets/external/fonts.gstatic.com/s/roboto/v32/KFOjCnqEu92Fr1Mu51TzBic1CsTKlA.woff2 create mode 100644 assets/external/fonts.gstatic.com/s/roboto/v32/KFOjCnqEu92Fr1Mu51TzBic2CsTKlA.woff2 create mode 100644 assets/external/fonts.gstatic.com/s/roboto/v32/KFOjCnqEu92Fr1Mu51TzBic3CsTKlA.woff2 create mode 100644 assets/external/fonts.gstatic.com/s/roboto/v32/KFOjCnqEu92Fr1Mu51TzBic5CsTKlA.woff2 create mode 100644 assets/external/fonts.gstatic.com/s/roboto/v32/KFOjCnqEu92Fr1Mu51TzBic6CsQ.woff2 create mode 100644 assets/external/fonts.gstatic.com/s/roboto/v32/KFOkCnqEu92Fr1Mu51xEIzIFKw.woff2 create mode 100644 assets/external/fonts.gstatic.com/s/roboto/v32/KFOkCnqEu92Fr1Mu51xFIzIFKw.woff2 create mode 100644 assets/external/fonts.gstatic.com/s/roboto/v32/KFOkCnqEu92Fr1Mu51xGIzIFKw.woff2 create mode 100644 assets/external/fonts.gstatic.com/s/roboto/v32/KFOkCnqEu92Fr1Mu51xHIzIFKw.woff2 create mode 100644 assets/external/fonts.gstatic.com/s/roboto/v32/KFOkCnqEu92Fr1Mu51xIIzI.woff2 create mode 100644 assets/external/fonts.gstatic.com/s/roboto/v32/KFOkCnqEu92Fr1Mu51xLIzIFKw.woff2 create mode 100644 assets/external/fonts.gstatic.com/s/roboto/v32/KFOkCnqEu92Fr1Mu51xMIzIFKw.woff2 create mode 100644 assets/external/fonts.gstatic.com/s/roboto/v32/KFOlCnqEu92Fr1MmSU5fABc4EsA.woff2 create mode 100644 assets/external/fonts.gstatic.com/s/roboto/v32/KFOlCnqEu92Fr1MmSU5fBBc4.woff2 create mode 100644 assets/external/fonts.gstatic.com/s/roboto/v32/KFOlCnqEu92Fr1MmSU5fBxc4EsA.woff2 create mode 100644 assets/external/fonts.gstatic.com/s/roboto/v32/KFOlCnqEu92Fr1MmSU5fCBc4EsA.woff2 create mode 100644 assets/external/fonts.gstatic.com/s/roboto/v32/KFOlCnqEu92Fr1MmSU5fCRc4EsA.woff2 create mode 100644 assets/external/fonts.gstatic.com/s/roboto/v32/KFOlCnqEu92Fr1MmSU5fChc4EsA.woff2 create mode 100644 assets/external/fonts.gstatic.com/s/roboto/v32/KFOlCnqEu92Fr1MmSU5fCxc4EsA.woff2 create mode 100644 assets/external/fonts.gstatic.com/s/roboto/v32/KFOlCnqEu92Fr1MmWUlfABc4EsA.woff2 create mode 100644 assets/external/fonts.gstatic.com/s/roboto/v32/KFOlCnqEu92Fr1MmWUlfBBc4.woff2 create mode 100644 assets/external/fonts.gstatic.com/s/roboto/v32/KFOlCnqEu92Fr1MmWUlfBxc4EsA.woff2 create mode 100644 assets/external/fonts.gstatic.com/s/roboto/v32/KFOlCnqEu92Fr1MmWUlfCBc4EsA.woff2 create mode 100644 assets/external/fonts.gstatic.com/s/roboto/v32/KFOlCnqEu92Fr1MmWUlfCRc4EsA.woff2 create mode 100644 assets/external/fonts.gstatic.com/s/roboto/v32/KFOlCnqEu92Fr1MmWUlfChc4EsA.woff2 create mode 100644 assets/external/fonts.gstatic.com/s/roboto/v32/KFOlCnqEu92Fr1MmWUlfCxc4EsA.woff2 create mode 100644 assets/external/fonts.gstatic.com/s/roboto/v32/KFOmCnqEu92Fr1Mu4WxKOzY.woff2 create mode 100644 assets/external/fonts.gstatic.com/s/roboto/v32/KFOmCnqEu92Fr1Mu4mxK.woff2 create mode 100644 assets/external/fonts.gstatic.com/s/roboto/v32/KFOmCnqEu92Fr1Mu5mxKOzY.woff2 create mode 100644 assets/external/fonts.gstatic.com/s/roboto/v32/KFOmCnqEu92Fr1Mu72xKOzY.woff2 create mode 100644 assets/external/fonts.gstatic.com/s/roboto/v32/KFOmCnqEu92Fr1Mu7GxKOzY.woff2 create mode 100644 assets/external/fonts.gstatic.com/s/roboto/v32/KFOmCnqEu92Fr1Mu7WxKOzY.woff2 create mode 100644 assets/external/fonts.gstatic.com/s/roboto/v32/KFOmCnqEu92Fr1Mu7mxKOzY.woff2 create mode 100644 assets/external/fonts.gstatic.com/s/robotomono/v23/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSV0mf0h.woff2 create mode 100644 assets/external/fonts.gstatic.com/s/robotomono/v23/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSZ0mf0h.woff2 create mode 100644 assets/external/fonts.gstatic.com/s/robotomono/v23/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSd0mf0h.woff2 create mode 100644 assets/external/fonts.gstatic.com/s/robotomono/v23/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSh0mQ.woff2 create mode 100644 assets/external/fonts.gstatic.com/s/robotomono/v23/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSt0mf0h.woff2 create mode 100644 assets/external/fonts.gstatic.com/s/robotomono/v23/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSx0mf0h.woff2 create mode 100644 assets/external/fonts.gstatic.com/s/robotomono/v23/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtElOUlYIw.woff2 create mode 100644 assets/external/fonts.gstatic.com/s/robotomono/v23/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEleUlYIw.woff2 create mode 100644 assets/external/fonts.gstatic.com/s/robotomono/v23/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEluUlYIw.woff2 create mode 100644 assets/external/fonts.gstatic.com/s/robotomono/v23/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEm-Ul.woff2 create mode 100644 assets/external/fonts.gstatic.com/s/robotomono/v23/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEmOUlYIw.woff2 create mode 100644 assets/external/fonts.gstatic.com/s/robotomono/v23/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEn-UlYIw.woff2 create mode 100644 assets/external/unpkg.com/iframe-worker/shim.js create mode 100644 assets/external/unpkg.com/katex@0/dist/contrib/auto-render.min.js create mode 100644 assets/external/unpkg.com/katex@0/dist/katex.min.css create mode 100644 assets/external/unpkg.com/katex@0/dist/katex.min.js create mode 100644 assets/external/unpkg.com/mermaid@11/dist/mermaid.min.js create mode 100644 assets/images/favicon.png create mode 100644 assets/javascripts/bundle.83f73b43.min.js create mode 100644 assets/javascripts/bundle.83f73b43.min.js.map create mode 100644 assets/javascripts/lunr/min/lunr.ar.min.js create mode 100644 assets/javascripts/lunr/min/lunr.da.min.js create mode 100644 assets/javascripts/lunr/min/lunr.de.min.js create mode 100644 assets/javascripts/lunr/min/lunr.du.min.js create mode 100644 assets/javascripts/lunr/min/lunr.el.min.js create mode 100644 assets/javascripts/lunr/min/lunr.es.min.js create mode 100644 assets/javascripts/lunr/min/lunr.fi.min.js create mode 100644 assets/javascripts/lunr/min/lunr.fr.min.js create mode 100644 assets/javascripts/lunr/min/lunr.he.min.js create mode 100644 assets/javascripts/lunr/min/lunr.hi.min.js create mode 100644 assets/javascripts/lunr/min/lunr.hu.min.js create mode 100644 assets/javascripts/lunr/min/lunr.hy.min.js create mode 100644 assets/javascripts/lunr/min/lunr.it.min.js create mode 100644 assets/javascripts/lunr/min/lunr.ja.min.js create mode 100644 assets/javascripts/lunr/min/lunr.jp.min.js create mode 100644 assets/javascripts/lunr/min/lunr.kn.min.js create mode 100644 assets/javascripts/lunr/min/lunr.ko.min.js create mode 100644 assets/javascripts/lunr/min/lunr.multi.min.js create mode 100644 assets/javascripts/lunr/min/lunr.nl.min.js create mode 100644 assets/javascripts/lunr/min/lunr.no.min.js create mode 100644 assets/javascripts/lunr/min/lunr.pt.min.js create mode 100644 assets/javascripts/lunr/min/lunr.ro.min.js create mode 100644 assets/javascripts/lunr/min/lunr.ru.min.js create mode 100644 assets/javascripts/lunr/min/lunr.sa.min.js create mode 100644 assets/javascripts/lunr/min/lunr.stemmer.support.min.js create mode 100644 assets/javascripts/lunr/min/lunr.sv.min.js create mode 100644 assets/javascripts/lunr/min/lunr.ta.min.js create mode 100644 assets/javascripts/lunr/min/lunr.te.min.js create mode 100644 assets/javascripts/lunr/min/lunr.th.min.js create mode 100644 assets/javascripts/lunr/min/lunr.tr.min.js create mode 100644 assets/javascripts/lunr/min/lunr.vi.min.js create mode 100644 assets/javascripts/lunr/min/lunr.zh.min.js create mode 100644 assets/javascripts/lunr/tinyseg.js create mode 100644 assets/javascripts/lunr/wordcut.js create mode 100644 assets/javascripts/workers/search.6ce7567c.min.js create mode 100644 assets/javascripts/workers/search.6ce7567c.min.js.map create mode 100644 assets/stylesheets/main.6f8fc17f.min.css create mode 100644 assets/stylesheets/main.6f8fc17f.min.css.map create mode 100644 assets/stylesheets/palette.06af60db.min.css create mode 100644 assets/stylesheets/palette.06af60db.min.css.map create mode 100644 demo_notebooks/cells_distributions.html create mode 100644 demo_notebooks/cells_distributions.ipynb create mode 100644 demo_notebooks/density_map.html create mode 100644 demo_notebooks/density_map.ipynb create mode 100644 demo_notebooks/fibers_coverage.html create mode 100644 demo_notebooks/fibers_coverage.ipynb create mode 100644 demo_notebooks/fibers_length_multi.html create mode 100644 demo_notebooks/fibers_length_multi.ipynb create mode 100644 guide-create-pyramids.html create mode 100644 guide-install-abba.html create mode 100644 guide-pipeline.html create mode 100644 guide-prepare-qupath.html create mode 100644 guide-qupath-objects.html create mode 100644 guide-register-abba.html create mode 100644 images/hq-pipeline.svg create mode 100644 index.html create mode 100644 javascripts/katex.js create mode 100644 main-citing.html create mode 100644 main-configuration-files.html create mode 100644 main-getting-help.html create mode 100644 main-getting-started.html create mode 100644 main-using-notebooks.html create mode 100644 overrides/main.html create mode 100644 search/search_index.js create mode 100644 search/search_index.json create mode 100644 sitemap.xml create mode 100644 sitemap.xml.gz create mode 100644 stylesheets/extra.css create mode 100644 tips-abba.html create mode 100644 tips-brain-contours.html create mode 100644 tips-formats.html create mode 100644 tips-qupath.html diff --git a/.nojekyll b/.nojekyll new file mode 100644 index 0000000..e69de29 diff --git a/404.html b/404.html new file mode 100644 index 0000000..8425b0d --- /dev/null +++ b/404.html @@ -0,0 +1,1175 @@ + + + + + + + + + + + + + + + + + + + + + + + histoquant + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ +

404 - Not found

+ +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/api-compute.html b/api-compute.html new file mode 100644 index 0000000..11bea26 --- /dev/null +++ b/api-compute.html @@ -0,0 +1,2536 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + histoquant.compute - histoquant + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + Skip to content + + +
+
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + + + + +

histoquant.compute

+ +
+ + + + +
+ +

compute module, part of histoquant.

+

Contains actual computation functions.

+ + + + + + + + +
+ + + + + + + + + +
+ + +

+ get_distribution(df, col, hue, hue_filter, per_commonnorm, binlim, nbins=100) + +#

+ + +
+ +

Computes distribution of objects.

+

A global distribution using only col is computed, then it computes a distribution +distinguishing values in the hue column. For the latter, it is possible to use a +subset of the data ony, based on another column using hue_filter. This another +column is determined with hue, if the latter is "hemisphere", then hue_filter is +used in the "channel" color and vice-versa. +per_commonnorm controls how they are normalized, either as a whole (True) or +independantly (False).

+

Use cases : +(1) single-channel, two hemispheres : col=x, hue=hemisphere, hue_filter="", +per_commonorm=True. Computes a distribution for each hemisphere, the sum of the +area of both is equal to 1. +(2) three-channels, one hemisphere : col=x, hue=channel, +hue_filter="Ipsi.", per_commonnorm=False. Computes a distribution for each channel +only for points in the ipsilateral hemisphere. Each curve will have an area of 1.

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
+ df + + DataFrame + +
+ +
+
+ required +
+ col + + str + +
+

Key in df, used to compute the distributions.

+
+
+ required +
+ hue + + str + +
+

Key in df. Criterion for additional distributions.

+
+
+ required +
+ hue_filter + + str + +
+

Further filtering for "per" distribution. +- hue = channel : value is the name of one of the hemisphere +- hue = hemisphere : value can be the name of a channel, a list of such or "all"

+
+
+ required +
+ per_commonnorm + + bool + +
+

Use common normalization for all hues (per argument).

+
+
+ required +
+ binlim + + list or tuple + +
+

First bin left edge and last bin right edge.

+
+
+ required +
+ nbins + + int + +
+

Number of bins. Default is 100.

+
+
+ 100 +
+ + +

Returns:

+ + + + + + + + + + + + + +
Name TypeDescription
df_distribution + DataFrame + +
+

DataFrame with bins, distribution, count and their per-hemisphere or +per-channel variants.

+
+
+ +
+ Source code in histoquant/compute.py +
def get_distribution(
+    df: pd.DataFrame,
+    col: str,
+    hue: str,
+    hue_filter: dict,
+    per_commonnorm: bool,
+    binlim: tuple | list,
+    nbins=100,
+) -> pd.DataFrame:
+    """
+    Computes distribution of objects.
+
+    A global distribution using only `col` is computed, then it computes a distribution
+    distinguishing values in the `hue` column. For the latter, it is possible to use a
+    subset of the data ony, based on another column using `hue_filter`. This another
+    column is determined with `hue`, if the latter is "hemisphere", then `hue_filter` is
+    used in the "channel" color and vice-versa.
+    `per_commonnorm` controls how they are normalized, either as a whole (True) or
+    independantly (False).
+
+    Use cases :
+    (1) single-channel, two hemispheres : `col=x`, `hue=hemisphere`, `hue_filter=""`,
+    `per_commonorm=True`. Computes a distribution for each hemisphere, the sum of the
+    area of both is equal to 1.
+    (2) three-channels, one hemisphere : `col=x`, hue=`channel`,
+    `hue_filter="Ipsi.", per_commonnorm=False`. Computes a distribution for each channel
+    only for points in the ipsilateral hemisphere. Each curve will have an area of 1.
+
+    Parameters
+    ----------
+    df : pandas.DataFrame
+    col : str
+        Key in `df`, used to compute the distributions.
+    hue : str
+        Key in `df`. Criterion for additional distributions.
+    hue_filter : str
+        Further filtering for "per" distribution.
+        - hue = channel : value is the name of one of the hemisphere
+        - hue = hemisphere : value can be the name of a channel, a list of such or "all"
+    per_commonnorm : bool
+        Use common normalization for all hues (per argument).
+    binlim : list or tuple
+        First bin left edge and last bin right edge.
+    nbins : int, optional
+        Number of bins. Default is 100.
+
+    Returns
+    -------
+    df_distribution : pandas.DataFrame
+        DataFrame with `bins`, `distribution`, `count` and their per-hemisphere or
+        per-channel variants.
+
+    """
+
+    # - Preparation
+    bin_edges = np.linspace(*binlim, nbins + 1)  # create bins
+    df_distribution = []  # prepare list of distributions
+
+    # - Both hemispheres, all channels
+    # get raw count per bins (histogram)
+    count, bin_edges = np.histogram(df[col], bin_edges)
+    # get normalized count (pdf)
+    distribution, _ = np.histogram(df[col], bin_edges, density=True)
+    # get bin centers rather than edges to plot them
+    bin_centers = bin_edges[:-1] + np.diff(bin_edges) / 2
+
+    # make a DataFrame out of that
+    df_distribution.append(
+        pd.DataFrame(
+            {
+                "bins": bin_centers,
+                "distribution": distribution,
+                "count": count,
+                "hemisphere": "both",
+                "channel": "all",
+                "axis": col,  # keep track of what col. was used
+            }
+        )
+    )
+
+    # - Per additional criterion
+    # select data
+    df_sub = select_hemisphere_channel(df, hue, hue_filter, False)
+    hue_values = df[hue].unique()  # get grouping values
+    # total number of datapoints in the subset used for additional distribution
+    length_total = len(df_sub)
+
+    for value in hue_values:
+        # select part and coordinates
+        df_part = df_sub.loc[df_sub[hue] == value, col]
+
+        # get raw count per bins (histogram)
+        count, bin_edges = np.histogram(df_part, bin_edges)
+        # get normalized count (pdf)
+        distribution, _ = np.histogram(df_part, bin_edges, density=True)
+
+        if per_commonnorm:
+            # re-normalize so that the sum of areas of all sub-parts is 1
+            length_part = len(df_part)  # number of datapoints in that hemisphere
+            distribution *= length_part / length_total
+
+        # get bin centers rather than edges to plot them
+        bin_centers = bin_edges[:-1] + np.diff(bin_edges) / 2
+
+        # make a DataFrame out of that
+        df_distribution.append(
+            pd.DataFrame(
+                {
+                    "bins": bin_centers,
+                    "distribution": distribution,
+                    "count": count,
+                    hue: value,
+                    "channel" if hue == "hemisphere" else "hemisphere": hue_filter,
+                    "axis": col,  # keep track of what col. was used
+                }
+            )
+        )
+
+    return pd.concat(df_distribution)
+
+
+
+ +
+ +
+ + +

+ get_regions_metrics(df_annotations, object_type, channel_names, meas_base_name, metrics_names) + +#

+ + +
+ +

Get a new DataFrame with cumulated axons segments length in each brain regions.

+

This is the quantification per brain regions for fibers-like objects, eg. axons. The +returned DataFrame has columns "cum. length µm", "cum. length mm", "density µm^-1", +"density mm^-1", "coverage index".

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
+ df_annotations + + DataFrame + +
+

DataFrame with an entry for each brain regions, with columns "Area µm^2", +"Name", "hemisphere", and "{object_type: channel} Length µm".

+
+
+ required +
+ object_type + + str + +
+

Object type (primary classification).

+
+
+ required +
+ channel_names + + dict + +
+

Map between original channel names to something else.

+
+
+ required +
+ meas_base_name + + str + +
+ +
+
+ required +
+ metrics_names + + dict + +
+ +
+
+ required +
+ + +

Returns:

+ + + + + + + + + + + + + +
Name TypeDescription
df_regions + DataFrame + +
+

DataFrame with brain regions name, area and metrics.

+
+
+ +
+ Source code in histoquant/compute.py +
def get_regions_metrics(
+    df_annotations: pd.DataFrame,
+    object_type: str,
+    channel_names: dict,
+    meas_base_name: str,
+    metrics_names: dict,
+) -> pd.DataFrame:
+    """
+    Get a new DataFrame with cumulated axons segments length in each brain regions.
+
+    This is the quantification per brain regions for fibers-like objects, eg. axons. The
+    returned DataFrame has columns "cum. length µm", "cum. length mm", "density µm^-1",
+    "density mm^-1", "coverage index".
+
+    Parameters
+    ----------
+    df_annotations : pandas.DataFrame
+        DataFrame with an entry for each brain regions, with columns "Area µm^2",
+        "Name", "hemisphere", and "{object_type: channel} Length µm".
+    object_type : str
+        Object type (primary classification).
+    channel_names : dict
+        Map between original channel names to something else.
+    meas_base_name : str
+    metrics_names : dict
+
+    Returns
+    -------
+    df_regions : pandas.DataFrame
+        DataFrame with brain regions name, area and metrics.
+
+    """
+    # get columns names
+    cols = df_annotations.columns
+    # get columns with fibers lengths
+    cols_colors = cols[
+        cols.str.startswith(object_type) & cols.str.endswith(meas_base_name)
+    ]
+    # select relevant data
+    cols_to_select = pd.Index(["Name", "hemisphere", "Area µm^2"]).append(cols_colors)
+    # sum lengths and areas of each brain regions
+    df_regions = (
+        df_annotations[cols_to_select]
+        .groupby(["Name", "hemisphere"])
+        .sum()
+        .reset_index()
+    )
+
+    # get measurement for both hemispheres (sum)
+    df_both = df_annotations[cols_to_select].groupby(["Name"]).sum().reset_index()
+    df_both["hemisphere"] = "both"
+    df_regions = (
+        pd.concat([df_regions, df_both], ignore_index=True)
+        .sort_values(by="Name")
+        .reset_index()
+        .drop(columns="index")
+    )
+
+    # rename measurement columns to lower case
+    df_regions = df_regions.rename(
+        columns={
+            k: k.replace(meas_base_name, meas_base_name.lower()) for k in cols_colors
+        }
+    )
+
+    # update names
+    meas_base_name = meas_base_name.lower()
+    cols = df_regions.columns
+    cols_colors = cols[
+        cols.str.startswith(object_type) & cols.str.endswith(meas_base_name)
+    ]
+
+    # convert area in mm^2
+    df_regions["Area mm^2"] = df_regions["Area µm^2"] / 1e6
+
+    # prepare metrics
+    if "µm" in meas_base_name:
+        # fibers : convert to mm
+        cols_to_convert = pd.Index([col for col in cols_colors if "µm" in col])
+        df_regions[cols_to_convert.str.replace("µm", "mm")] = (
+            df_regions[cols_to_convert] / 1000
+        )
+        metrics = [meas_base_name, meas_base_name.replace("µm", "mm")]
+    else:
+        # objects : count
+        metrics = [meas_base_name]
+
+    # density = measurement / area
+    metric = metrics_names["density µm^-2"]
+    df_regions[cols_colors.str.replace(meas_base_name, metric)] = df_regions[
+        cols_colors
+    ].divide(df_regions["Area µm^2"], axis=0)
+    metrics.append(metric)
+    metric = metrics_names["density mm^-2"]
+    df_regions[cols_colors.str.replace(meas_base_name, metric)] = df_regions[
+        cols_colors
+    ].divide(df_regions["Area mm^2"], axis=0)
+    metrics.append(metric)
+
+    # coverage index = measurement² / area
+    metric = metrics_names["coverage index"]
+    df_regions[cols_colors.str.replace(meas_base_name, metric)] = (
+        df_regions[cols_colors].pow(2).divide(df_regions["Area µm^2"], axis=0)
+    )
+    metrics.append(metric)
+
+    # prepare relative metrics columns
+    metric = metrics_names["relative measurement"]
+    cols_rel_meas = cols_colors.str.replace(meas_base_name, metric)
+    df_regions[cols_rel_meas] = np.nan
+    metrics.append(metric)
+    metric = metrics_names["relative density"]
+    cols_dens = cols_colors.str.replace(meas_base_name, metrics_names["density mm^-2"])
+    cols_rel_dens = cols_colors.str.replace(meas_base_name, metric)
+    df_regions[cols_rel_dens] = np.nan
+    metrics.append(metric)
+    # relative metrics should be defined within each hemispheres (left, right, both)
+    for hemisphere in df_regions["hemisphere"].unique():
+        row_indexer = df_regions["hemisphere"] == hemisphere
+
+        # relative measurement = measurement / total measurement
+        df_regions.loc[row_indexer, cols_rel_meas] = (
+            df_regions.loc[row_indexer, cols_colors]
+            .divide(df_regions.loc[row_indexer, cols_colors].sum())
+            .to_numpy()
+        )
+
+        # relative density = density / total density
+        df_regions.loc[row_indexer, cols_rel_dens] = (
+            df_regions.loc[
+                row_indexer,
+                cols_dens,
+            ]
+            .divide(df_regions.loc[row_indexer, cols_dens].sum())
+            .to_numpy()
+        )
+
+    # collect channel names
+    channels = (
+        cols_colors.str.replace(object_type + ": ", "")
+        .str.replace(" " + meas_base_name, "")
+        .values.tolist()
+    )
+    # collect measurements columns names
+    cols_metrics = df_regions.columns.difference(
+        pd.Index(["Name", "hemisphere", "Area µm^2", "Area mm^2"])
+    )
+    for metric in metrics:
+        cols_to_cat = [f"{object_type}: {cn} {metric}" for cn in channels]
+        # make sure it's part of available metrics
+        if not set(cols_to_cat) <= set(cols_metrics):
+            raise ValueError(f"{cols_to_cat} not in DataFrame.")
+        # group all colors in the same colors
+        df_regions[metric] = df_regions[cols_to_cat].values.tolist()
+        # remove original data
+        df_regions = df_regions.drop(columns=cols_to_cat)
+
+    # add a color tag, given their names in the configuration file
+    df_regions["channel"] = len(df_regions) * [[channel_names[k] for k in channels]]
+    metrics.append("channel")
+
+    # explode the dataframe so that each color has an entry
+    df_regions = df_regions.explode(metrics)
+
+    return df_regions
+
+
+
+ +
+ +
+ + +

+ normalize_starter_cells(df, cols, animal, info_file, channel_names) + +#

+ + +
+ +

Normalize data by the number of starter cells.

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
+ df + + DataFrame + +
+

Contains the data to be normalized.

+
+
+ required +
+ cols + + list - like + +
+

Columns to divide by the number of starter cells.

+
+
+ required +
+ animal + + str + +
+

Animal ID to parse the number of starter cells.

+
+
+ required +
+ info_file + + str + +
+

Full path to the TOML file with informations.

+
+
+ required +
+ channel_names + + dict + +
+

Map between original channel names to something else.

+
+
+ required +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ DataFrame + +
+

Same df with normalized count.

+
+
+ +
+ Source code in histoquant/compute.py +
def normalize_starter_cells(
+    df: pd.DataFrame, cols: list[str], animal: str, info_file: str, channel_names: dict
+) -> pd.DataFrame:
+    """
+    Normalize data by the number of starter cells.
+
+    Parameters
+    ----------
+    df : pd.DataFrame
+        Contains the data to be normalized.
+    cols : list-like
+        Columns to divide by the number of starter cells.
+    animal : str
+        Animal ID to parse the number of starter cells.
+    info_file : str
+        Full path to the TOML file with informations.
+    channel_names : dict
+        Map between original channel names to something else.
+
+    Returns
+    -------
+    pd.DataFrame
+        Same `df` with normalized count.
+
+    """
+    for channel in df["channel"].unique():
+        # inverse mapping channel colors : names
+        reverse_channels = {v: k for k, v in channel_names.items()}
+        nstarters = get_starter_cells(animal, reverse_channels[channel], info_file)
+
+        for col in cols:
+            df.loc[df["channel"] == channel, col] = (
+                df.loc[df["channel"] == channel, col] / nstarters
+            )
+
+    return df
+
+
+
+ +
+ + + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/api-config-config.html b/api-config-config.html new file mode 100644 index 0000000..617006e --- /dev/null +++ b/api-config-config.html @@ -0,0 +1,1315 @@ + + + + + + + + + + + + + + + + + + + + + + + Api config config - histoquant + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + + + + +

Api config config

+ +

object_type : name of QuPath base classification (eg. without the ": subclass" part) +segmentation_tag : type of segmentation, matches directory name, used only in the full pipeline

+

atlas

+

Information related to the atlas used

+

name : brainglobe-atlasapi atlas name
+type : "brain" or "cord" (eg. registration done in ABBA or abba_python). This will determine whether to flip Left/Right when determining detections hemisphere based on their coordinates. Also adapts the axes in the 2D heatmaps.
+midline : midline Z coordinates (left/right limit) in microns to determine detections hemisphere based on their coordinates.
+outline_structures : structures to show an outline of in heatmaps

+

channels

+

Information related to imaging channels

+

names

+

Must contain all classifications derived from "object_type" you want to process. In the form subclassification name = name to display on the plots

+

"marker+" : classification name = name to display
+"marker-" : add any number of sub-classification

+

colors

+

Must have same keys as "names" keys, in the form subclassification name = color, with color specified as a matplotlib named color, an RGB list or an hex code.

+

"marker+" : classification name = matplotlib color
+"marker-" : must have the same entries as "names".

+

hemispheres

+

Information related to hemispheres, same structure as channels

+

names

+ +

Left : Left = name to display
+Right : Right = name to display

+

colors

+

Must have same keys as names' keys

+

Left : ff516e" # Left = matplotlib color (either #hex, color name or RGB list)
+Right : 960010" # Right = matplotlib color

+

distributions

+

Spatial distributions parameters

+

stereo : use stereotaxic coordinates (as in Paxinos, only for mouse brain CCFv3)
+ap_lim : bins limits for anterio-posterior in mm
+ap_nbins : number of bins for anterio-posterior
+dv_lim : bins limits for dorso-ventral in mm
+dv_nbins : number of bins for dorso-ventral
+ml_lim : bins limits for medio-lateral in mm
+ml_nbins : number of bins for medio-lateral
+hue : color curves with this parameter, must be "hemisphere" or "channel"
+hue_filter : use only a subset of data

+
    +
  • If hue=hemisphere : it should be a channel name, a list of such or "all"
  • +
  • If hue=channel : it should be a hemisphere name or "both"
  • +
+

common_norm : use a global normalization (eg. the sum of areas under all curves is 1). Otherwise, normalize each hue individually

+

display

+

Display parameters

+

show_injection : add a patch showing the extent of injection sites. Uses corresponding channel colors. Requires the information TOML configuration file set up +cmap : matplotlib color map for 2D heatmaps +cmap_nbins : number of bins for 2D heatmaps +cmap_lim : color limits for 2D heatmaps

+

regions

+

Distributions per regions parameters

+

base_measurement : the name of the measurement in QuPath to derive others from. Usually "Count" or "Length µm"
+hue : color bars with this parameter, must be "hemisphere" or "channel"
+hue_filter : use only a subset of data

+
    +
  • If hue=hemisphere : it should be a channel name, a list of such or "all"
  • +
  • If hue=channel : it should be a hemisphere name or "both"
  • +
+

hue_mirror : plot two hue_filter in mirror instead of discarding the others. For example, if hue=channel and hue_filter="both", plots the two hemisphere in mirror.
+normalize_starter_cells : normalize non-relative metrics by the number of starter cells

+

metrics

+

Names of metrics. The keys are used internally in histoquant as is so should NOT be modified. The values will only chang etheir names in the ouput file

+

"density µm^-2" : relevant name
+"density mm^-2" : relevant name
+"coverage index" : relevant name
+"relative measurement" : relevant name
+"relative density" : relevant name

+

display

+ +

nregions : number of regions to display (sorted by max.)
+orientation : orientation of the bars ("h" or "v")
+order : order the regions by "ontology" or by "max". Set to "max" to provide a custom order
+dodge : enforce the bar not being stacked
+log_scale : use log. scale for metrics

+
metrics
+

name of metrics to display

+

"count" : real_name = display_name, with real_name the "values" in [regions.metrics] +"density mm^-2"

+

files

+

Full path to information TOML files and atlas outlines for 2D heatmaps.

+

blacklist
+fusion
+outlines
+infos

+ + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/api-config.html b/api-config.html new file mode 100644 index 0000000..00170c6 --- /dev/null +++ b/api-config.html @@ -0,0 +1,1951 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + histoquant.config - histoquant + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + Skip to content + + +
+
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + + + + +

histoquant.config

+ +
+ + + + +
+ +

config module, part of histoquant.

+

Contains the Config class.

+ + + + + + + + +
+ + + + + + + + +
+ + + +

+ Config(config_file) + +#

+ + +
+ + +

The configuration class.

+

Reads input configuration file and provides its constant.

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
+ config_file + + str + +
+

Full path to the configuration file to load.

+
+
+ required +
+ + +

Returns:

+ + + + + + + + + + + + + +
Name TypeDescription
cfg + Config object. + +
+ +
+
+ +

Constructor.

+ + + + + + +
+ Source code in histoquant/config.py +
31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
def __init__(self, config_file):
+    """Constructor."""
+    with open(config_file, "rb") as fid:
+        cfg = tomllib.load(fid)
+
+        for key in cfg:
+            setattr(self, key, cfg[key])
+
+    self.config_file = config_file
+    self.bg_atlas = BrainGlobeAtlas(self.atlas["name"], check_latest=False)
+    self.get_blacklist()
+    self.get_leaves_list()
+
+
+ + + +
+ + + + + + + + + +
+ + +

+ get_blacklist() + +#

+ + +
+ +

Wraps histoquant.utils.get_blacklist.

+ +
+ Source code in histoquant/config.py +
44
+45
+46
+47
+48
+49
def get_blacklist(self):
+    """Wraps histoquant.utils.get_blacklist."""
+
+    self.atlas["blacklist"] = utils.get_blacklist(
+        self.files["blacklist"], self.bg_atlas
+    )
+
+
+
+ +
+ +
+ + +

+ get_hue_palette(mode) + +#

+ + +
+ +

Get color palette given hue.

+

Maps hue to colors in channels or hemispheres.

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
+ mode + + (hemisphere, channel) + +
+ +
+
+ "hemisphere" +
+ + +

Returns:

+ + + + + + + + + + + + + +
Name TypeDescription
palette + dict + +
+

Maps a hue level to a color, usable in seaborn.

+
+
+ +
+ Source code in histoquant/config.py +
def get_hue_palette(self, mode: str) -> dict:
+    """
+    Get color palette given hue.
+
+    Maps hue to colors in channels or hemispheres.
+
+    Parameters
+    ----------
+    mode : {"hemisphere", "channel"}
+
+    Returns
+    -------
+    palette : dict
+        Maps a hue level to a color, usable in seaborn.
+
+    """
+    params = getattr(self, mode)
+
+    if params["hue"] == "channel":
+        # replace channels by their new names
+        palette = {
+            self.channels["names"][k]: v for k, v in self.channels["colors"].items()
+        }
+    elif params["hue"] == "hemisphere":
+        # replace hemispheres by their new names
+        palette = {
+            self.hemispheres["names"][k]: v
+            for k, v in self.hemispheres["colors"].items()
+        }
+    else:
+        palette = None
+        warnings.warn(f"hue={self.regions["display"]["hue"]} not supported.")
+
+    return palette
+
+
+
+ +
+ +
+ + +

+ get_injection_sites(animals) + +#

+ + +
+ +

Get list of injection sites coordinates for each animals, for each channels.

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
+ animals + + list of str + +
+

List of animals.

+
+
+ required +
+ + +

Returns:

+ + + + + + + + + + + + + +
Name TypeDescription
injection_sites + dict + +
+

{"x": {channel0: [x]}, "y": {channel1: [y]}}

+
+
+ +
+ Source code in histoquant/config.py +
56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
def get_injection_sites(self, animals: list[str]) -> dict:
+    """
+    Get list of injection sites coordinates for each animals, for each channels.
+
+    Parameters
+    ----------
+    animals : list of str
+        List of animals.
+
+    Returns
+    -------
+    injection_sites : dict
+        {"x": {channel0: [x]}, "y": {channel1: [y]}}
+
+    """
+    injection_sites = {
+        axis: {channel: [] for channel in self.channels["names"].keys()}
+        for axis in ["x", "y", "z"]
+    }
+
+    for animal in animals:
+        for channel in self.channels["names"].keys():
+            injx, injy, injz = utils.get_injection_site(
+                animal,
+                self.files["infos"],
+                channel,
+                stereo=self.distributions["stereo"],
+            )
+            if injx is not None:
+                injection_sites["x"][channel].append(injx)
+            if injy is not None:
+                injection_sites["y"][channel].append(injy)
+            if injz is not None:
+                injection_sites["z"][channel].append(injz)
+
+    return injection_sites
+
+
+
+ +
+ +
+ + +

+ get_leaves_list() + +#

+ + +
+ +

Wraps utils.get_leaves_list.

+ +
+ Source code in histoquant/config.py +
51
+52
+53
+54
def get_leaves_list(self):
+    """Wraps utils.get_leaves_list."""
+
+    self.atlas["leaveslist"] = utils.get_leaves_list(self.bg_atlas)
+
+
+
+ +
+ + + +
+ +
+ +
+ + + + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/api-display.html b/api-display.html new file mode 100644 index 0000000..f634c81 --- /dev/null +++ b/api-display.html @@ -0,0 +1,4647 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + histoquant.display - histoquant + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + Skip to content + + +
+
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + + + + + +
+
+ + + + + + + + + + +

histoquant.display

+ +
+ + + + +
+ +

display module, part of histoquant.

+

Contains display functions, essentially wrapping matplotlib and seaborn functions.

+ + + + + + + + +
+ + + + + + + + + +
+ + +

+ add_data_coverage(df, ax, colors=None, **kwargs) + +#

+ + +
+ +

Add lines below the plot to represent data coverage.

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
+ df + + DataFrame + +
+

DataFrame with X_min and X_max on rows for each animals (on columns).

+
+
+ required +
+ ax + + Axes + +
+

Handle to axes where to add the patch.

+
+
+ required +
+ colors + + list or str or None + +
+

Colors for the patches, as a RGB list or hex list. Should be the same size as +the number of patches to plot, eg. the number of columns in df. If None, +default seaborn colors are used. If only one element, used for each animal.

+
+
+ None +
+ **kwargs + + passed to patches.Rectangle() + +
+ +
+
+ {} +
+ + +

Returns:

+ + + + + + + + + + + + + +
Name TypeDescription
ax + Axes + +
+

Handle to updated axes.

+
+
+ +
+ Source code in histoquant/display.py +
def add_data_coverage(
+    df: pd.DataFrame, ax: plt.Axes, colors: list | str | None = None, **kwargs
+) -> plt.Axes:
+    """
+    Add lines below the plot to represent data coverage.
+
+    Parameters
+    ----------
+    df : pandas.DataFrame
+        DataFrame with `X_min` and `X_max` on rows for each animals (on columns).
+    ax : Axes
+        Handle to axes where to add the patch.
+    colors : list or str or None, optional
+        Colors for the patches, as a RGB list or hex list. Should be the same size as
+        the number of patches to plot, eg. the number of columns in `df`. If None,
+        default seaborn colors are used. If only one element, used for each animal.
+    **kwargs : passed to patches.Rectangle()
+
+    Returns
+    -------
+    ax : Axes
+        Handle to updated axes.
+
+    """
+    # get colors
+    ncolumns = len(df.columns)
+    if not colors:
+        colors = sns.color_palette(n_colors=ncolumns)
+    elif isinstance(colors, str) or (isinstance(colors, list) & (len(colors) == 3)):
+        colors = [colors] * ncolumns
+    elif len(colors) != ncolumns:
+        warnings.warn(f"Wrong number of colors ({len(colors)}), using default colors.")
+        colors = sns.color_palette(n_colors=ncolumns)
+
+    # get patch height depending on current axis limits
+    ymin, ymax = ax.get_ylim()
+    height = (ymax - ymin) * 0.02
+
+    for animal, color in zip(df.columns, colors):
+        # get patch coordinates
+        ymin, ymax = ax.get_ylim()
+        ylength = ymax - ymin
+        ybottom = ymin - 0.02 * ylength
+        xleft = df.loc["X_min", animal]
+        xright = df.loc["X_max", animal]
+
+        # plot patch
+        ax.add_patch(
+            patches.Rectangle(
+                (xleft, ybottom),
+                xright - xleft,
+                height,
+                label=animal,
+                color=color,
+                **kwargs,
+            )
+        )
+
+        ax.autoscale(tight=True)  # set new axes limits
+
+    ax.autoscale()  # reset scale
+
+    return ax
+
+
+
+ +
+ +
+ + +

+ add_injection_patch(X, ax, **kwargs) + +#

+ + +
+ +

Add a patch representing the injection sites.

+

The patch will span from the minimal coordinate to the maximal. +If plotted in stereotaxic coordinates, coordinates should be converted beforehand.

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
+ X + + list + +
+

Coordinates in mm for each animals. Can be empty to not plot anything.

+
+
+ required +
+ ax + + Axes + +
+

Handle to axes where to add the patch.

+
+
+ required +
+ **kwargs + + passed to Axes.axvspan + +
+ +
+
+ {} +
+ + +

Returns:

+ + + + + + + + + + + + + +
Name TypeDescription
ax + Axes + +
+

Handle to updated Axes.

+
+
+ +
+ Source code in histoquant/display.py +
18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
def add_injection_patch(X: list, ax: plt.Axes, **kwargs) -> plt.Axes:
+    """
+    Add a patch representing the injection sites.
+
+    The patch will span from the minimal coordinate to the maximal.
+    If plotted in stereotaxic coordinates, coordinates should be converted beforehand.
+
+    Parameters
+    ----------
+    X : list
+        Coordinates in mm for each animals. Can be empty to not plot anything.
+    ax : Axes
+        Handle to axes where to add the patch.
+    **kwargs : passed to Axes.axvspan
+
+    Returns
+    -------
+    ax : Axes
+        Handle to updated Axes.
+
+    """
+    # plot patch
+    if len(X) > 0:
+        ax.axvspan(min(X), max(X), **kwargs)
+
+    return ax
+
+
+
+ +
+ +
+ + +

+ draw_structure_outline(view='sagittal', structures=['root'], outline_file='', ax=None, microns=False, **kwargs) + +#

+ + +
+ +

Plot brain regions outlines in given projection.

+

This requires a file containing the structures outlines.

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
+ view + + str + +
+

Projection, "sagittal", "coronal" or "top". Default is "sagittal".

+
+
+ 'sagittal' +
+ structures + + list[str] + +
+

List of structures acronyms whose outlines will be drawn. Default is ["root"].

+
+
+ ['root'] +
+ outline_file + + str + +
+

Full path the outlines HDF5 file.

+
+
+ '' +
+ ax + + Axes or None + +
+

Axes where to plot the outlines. If None, get current axes (the default).

+
+
+ None +
+ microns + + bool + +
+

If False (default), converts the coordinates in mm.

+
+
+ False +
+ **kwargs + + passed to pyplot.plot() + +
+ +
+
+ {} +
+ + +

Returns:

+ + + + + + + + + + + + + +
Name TypeDescription
ax + Axes + +
+ +
+
+ +
+ Source code in histoquant/display.py +
def draw_structure_outline(
+    view: str = "sagittal",
+    structures: list[str] = ["root"],
+    outline_file: str = "",
+    ax: plt.Axes | None = None,
+    microns: bool = False,
+    **kwargs,
+) -> plt.Axes:
+    """
+    Plot brain regions outlines in given projection.
+
+    This requires a file containing the structures outlines.
+
+    Parameters
+    ----------
+    view : str
+        Projection, "sagittal", "coronal" or "top". Default is "sagittal".
+    structures : list[str]
+        List of structures acronyms whose outlines will be drawn. Default is ["root"].
+    outline_file : str
+        Full path the outlines HDF5 file.
+    ax : plt.Axes or None, optional
+        Axes where to plot the outlines. If None, get current axes (the default).
+    microns : bool, optional
+        If False (default), converts the coordinates in mm.
+    **kwargs : passed to pyplot.plot()
+
+    Returns
+    -------
+    ax : plt.Axes
+
+    """
+    # get axes
+    if not ax:
+        ax = plt.gca()
+
+    # get units
+    if microns:
+        conv = 1
+    else:
+        conv = 1 / 1000
+
+    with h5py.File(outline_file) as f:
+        if view == "sagittal":
+            for structure in structures:
+                dsets = f["sagittal"][structure]
+
+                for dset in dsets.values():
+                    ax.plot(dset[:, 0] * conv, dset[:, 1] * conv, **kwargs)
+
+        if view == "coronal":
+            for structure in structures:
+                dsets = f["coronal"][structure]
+
+                for dset in dsets.values():
+                    ax.plot(dset[:, 0] * conv, dset[:, 1] * conv, **kwargs)
+
+        if view == "top":
+            for structure in structures:
+                dsets = f["top"][structure]
+
+                for dset in dsets.values():
+                    ax.plot(dset[:, 0] * conv, dset[:, 1] * conv, **kwargs)
+
+    return ax
+
+
+
+ +
+ +
+ + +

+ nice_bar_plot(df, x='', y=[''], hue='', ylabel=[''], orient='h', nx=None, ordering=None, names_list=None, hue_mirror=False, log_scale=False, bar_kws={}, pts_kws={}) + +#

+ + +
+ +

Nice bar plot of per-region objects distribution.

+

This is used for objects distribution across brain regions. Shows the y metric +(count, aeral density, cumulated length...) in each x categories (brain regions). +orient controls wether the bars are shown horizontally (default) or vertically. +Input df must have an additional "hemisphere" column. All y are plotted in the +same figure as different subplots. nx controls the number of displayed regions.

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
+ df + + DataFrame + +
+ +
+
+ required +
+ x + + str + +
+

Key in df.

+
+
+ '' +
+ y + + str + +
+

Key in df.

+
+
+ '' +
+ hue + + str + +
+

Key in df.

+
+
+ '' +
+ ylabel + + list of str + +
+

Y axis labels.

+
+
+ [''] +
+ orient + + h or v + +
+

"h" for horizontal bars (default) or "v" for vertical bars.

+
+
+ 'h' +
+ nx + + None or int + +
+

Number of x to show in the plot. Default is None (no limit).

+
+
+ None +
+ ordering + + None or list[str] or max + +
+

Sorted list of acronyms. Data will be sorted follwowing this order, if "max", +sorted by descending values, if None, not sorted (default).

+
+
+ None +
+ names_list + + list or None + +
+

List of names to display. If None (default), takes the most prominent overall +ones.

+
+
+ None +
+ hue_mirror + + bool + +
+

If there are 2 groups, plot in mirror. Default is False.

+
+
+ False +
+ log_scale + + bool + +
+

Set the metrics in log scale. Default is False.

+
+
+ False +
+ bar_kws + + dict + +
+

Passed to seaborn.barplot().

+
+
+ {} +
+ pts_kws + + dict + +
+

Passed to seaborn.stripplot().

+
+
+ {} +
+ + +

Returns:

+ + + + + + + + + + + + + +
Name TypeDescription
figs + list + +
+

List of figures.

+
+
+ +
+ Source code in histoquant/display.py +
def nice_bar_plot(
+    df: pd.DataFrame,
+    x: str = "",
+    y: list[str] = [""],
+    hue: str = "",
+    ylabel: list[str] = [""],
+    orient="h",
+    nx: None | int = None,
+    ordering: None | list[str] | str = None,
+    names_list: None | list = None,
+    hue_mirror: bool = False,
+    log_scale: bool = False,
+    bar_kws: dict = {},
+    pts_kws: dict = {},
+) -> list[plt.Axes]:
+    """
+    Nice bar plot of per-region objects distribution.
+
+    This is used for objects distribution across brain regions. Shows the `y` metric
+    (count, aeral density, cumulated length...) in each `x` categories (brain regions).
+    `orient` controls wether the bars are shown horizontally (default) or vertically.
+    Input `df` must have an additional "hemisphere" column. All `y` are plotted in the
+    same figure as different subplots. `nx` controls the number of displayed regions.
+
+    Parameters
+    ----------
+    df : pandas.DataFrame
+    x, y, hue : str
+        Key in `df`.
+    ylabel : list of str
+        Y axis labels.
+    orient : "h" or "v", optional
+        "h" for horizontal bars (default) or "v" for vertical bars.
+    nx : None or int, optional
+        Number of `x` to show in the plot. Default is None (no limit).
+    ordering : None or list[str] or "max", optional
+        Sorted list of acronyms. Data will be sorted follwowing this order, if "max",
+        sorted by descending values, if None, not sorted (default).
+    names_list : list or None, optional
+        List of names to display. If None (default), takes the most prominent overall
+        ones.
+    hue_mirror : bool, optional
+        If there are 2 groups, plot in mirror. Default is False.
+    log_scale : bool, optional
+        Set the metrics in log scale. Default is False.
+    bar_kws : dict
+        Passed to seaborn.barplot().
+    pts_kws : dict
+        Passed to seaborn.stripplot().
+
+    Returns
+    -------
+    figs : list
+        List of figures.
+
+    """
+    figs = []
+    # loop for each features
+    for yi, ylabeli in zip(y, ylabel):
+        # prepare data
+        # get nx first most prominent regions
+        if not names_list:
+            names_list_plt = (
+                df.groupby(["Name"])[yi].mean().sort_values(ascending=False).index[0:nx]
+            )
+        else:
+            names_list_plt = names_list
+        dfplt = df[df["Name"].isin(names_list_plt)]  # limit to those regions
+        # limit hierarchy list if provided
+        if isinstance(ordering, list):
+            order = [el for el in ordering if el in names_list_plt]
+        elif ordering == "max":
+            order = names_list_plt
+        else:
+            order = None
+
+        # reorder keys depending on orientation and create axes
+        if orient == "h":
+            xp = yi
+            yp = x
+            if hue_mirror:
+                nrows = 1
+                ncols = 2
+                sharex = None
+                sharey = "all"
+            else:
+                nrows = 1
+                ncols = 1
+                sharex = None
+                sharey = None
+        elif orient == "v":
+            xp = x
+            yp = yi
+            if hue_mirror:
+                nrows = 2
+                ncols = 1
+                sharex = "all"
+                sharey = None
+            else:
+                nrows = 1
+                ncols = 1
+                sharex = None
+                sharey = None
+        fig, axs = plt.subplots(nrows=nrows, ncols=ncols, sharex=sharex, sharey=sharey)
+
+        if hue_mirror:
+            # two graphs
+            ax1, ax2 = axs
+            # determine what will be mirrored
+            if hue == "channel":
+                hue_filter = "hemisphere"
+            elif hue == "hemisphere":
+                hue_filter = "channel"
+            # select the two types (should be left/right or two channels)
+            hue_filters = dfplt[hue_filter].unique()[0:2]
+            hue_filters.sort()  # make sure it will be always in the same order
+
+            # plot
+            for filt, ax in zip(hue_filters, [ax1, ax2]):
+                dfplt2 = dfplt[dfplt[hue_filter] == filt]
+                ax = sns.barplot(
+                    dfplt2,
+                    x=xp,
+                    y=yp,
+                    hue=hue,
+                    estimator="mean",
+                    errorbar="se",
+                    orient=orient,
+                    order=order,
+                    ax=ax,
+                    **bar_kws,
+                )
+                # add points
+                ax = sns.stripplot(
+                    dfplt2, x=xp, y=yp, hue=hue, legend=False, ax=ax, **pts_kws
+                )
+
+                # cosmetics
+                if orient == "h":
+                    ax.set_title(f"{hue_filter}: {filt}")
+                    ax.set_ylabel(None)
+                    ax.set_ylim((nx + 0.5, -0.5))
+                    if log_scale:
+                        ax.set_xscale("log")
+
+                elif orient == "v":
+                    if ax == ax1:
+                        # top title
+                        ax1.set_title(f"{hue_filter}: {filt}")
+                        ax.set_xlabel(None)
+                    elif ax == ax2:
+                        # use xlabel as bottom title
+                        ax2.set_xlabel(
+                            f"{hue_filter}: {filt}", fontsize=ax1.title.get_fontsize()
+                        )
+                    ax.set_xlim((-0.5, nx + 0.5))
+                    if log_scale:
+                        ax.set_yscale("log")
+
+                    for label in ax.get_xticklabels():
+                        label.set_verticalalignment("center")
+                        label.set_horizontalalignment("center")
+
+            # tune axes cosmetics
+            if orient == "h":
+                ax1.set_xlabel(ylabeli)
+                ax2.set_xlabel(ylabeli)
+                ax1.set_xlim(
+                    ax1.get_xlim()[0], max((ax1.get_xlim()[1], ax2.get_xlim()[1]))
+                )
+                ax2.set_xlim(
+                    ax2.get_xlim()[0], max((ax1.get_xlim()[1], ax2.get_xlim()[1]))
+                )
+                ax1.invert_xaxis()
+                sns.despine(ax=ax1, left=True, top=True, right=False, bottom=False)
+                sns.despine(ax=ax2, left=False, top=True, right=True, bottom=False)
+                ax1.yaxis.tick_right()
+                ax1.tick_params(axis="y", pad=20)
+                for label in ax1.get_yticklabels():
+                    label.set_verticalalignment("center")
+                    label.set_horizontalalignment("center")
+            elif orient == "v":
+                ax2.set_ylabel(ylabeli)
+                ax1.set_ylim(
+                    ax1.get_ylim()[0], max((ax1.get_ylim()[1], ax2.get_ylim()[1]))
+                )
+                ax2.set_ylim(
+                    ax2.get_ylim()[0], max((ax1.get_ylim()[1], ax2.get_ylim()[1]))
+                )
+                ax2.invert_yaxis()
+                sns.despine(ax=ax1, left=False, top=True, right=True, bottom=False)
+                sns.despine(ax=ax2, left=False, top=False, right=True, bottom=True)
+                for label in ax2.get_xticklabels():
+                    label.set_verticalalignment("center")
+                    label.set_horizontalalignment("center")
+                ax2.tick_params(axis="x", labelrotation=90, pad=20)
+
+        else:
+            # one graph
+            ax = axs
+            # plot
+            ax = sns.barplot(
+                dfplt,
+                x=xp,
+                y=yp,
+                hue=hue,
+                estimator="mean",
+                errorbar="se",
+                orient=orient,
+                order=order,
+                ax=ax,
+                **bar_kws,
+            )
+            # add points
+            ax = sns.stripplot(
+                dfplt, x=xp, y=yp, hue=hue, legend=False, ax=ax, **pts_kws
+            )
+
+            # cosmetics
+            if orient == "h":
+                ax.set_xlabel(ylabeli)
+                ax.set_ylabel(None)
+                ax.set_ylim((nx + 0.5, -0.5))
+                if log_scale:
+                    ax.set_xscale("log")
+            elif orient == "v":
+                ax.set_xlabel(None)
+                ax.set_ylabel(ylabeli)
+                ax.set_xlim((-0.5, nx + 0.5))
+                if log_scale:
+                    ax.set_yscale("log")
+
+        fig.tight_layout(pad=0)
+        figs.append(fig)
+
+    return figs
+
+
+
+ +
+ +
+ + +

+ nice_distribution_plot(df, x='', y='', hue=None, xlabel='', ylabel='', injections_sites={}, channel_colors={}, channel_names={}, ax=None, **kwargs) + +#

+ + +
+ +

Nice plot of 1D distribution of objects.

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
+ df + + DataFrame + +
+ +
+
+ required +
+ x + + str + +
+

Keys in df.

+
+
+ '' +
+ y + + str + +
+

Keys in df.

+
+
+ '' +
+ hue + + str or None + +
+

Key in df. If None, no hue is used.

+
+
+ None +
+ xlabel + + str + +
+

X and Y axes labels.

+
+
+ '' +
+ ylabel + + str + +
+

X and Y axes labels.

+
+
+ '' +
+ injections_sites + + dict + +
+

List of injection sites 1D coordinates in a dict with the channel name as key. +If empty, injection site is not plotted (default).

+
+
+ {} +
+ channel_colors + + dict + +
+

Required if injections_sites is not empty, dict mapping channel names to a +color.

+
+
+ {} +
+ channel_names + + dict + +
+

Required if injections_sites is not empty, dict mapping channel names to a +display name.

+
+
+ {} +
+ ax + + Axes or None + +
+

Axes in which to plot the figure, if None, a new figure is created (default).

+
+
+ None +
+ **kwargs + + passed to seaborn.lineplot() + +
+ +
+
+ {} +
+ + +

Returns:

+ + + + + + + + + + + + + +
Name TypeDescription
ax + matplotlib axes + +
+

Handle to axes.

+
+
+ +
+ Source code in histoquant/display.py +
def nice_distribution_plot(
+    df: pd.DataFrame,
+    x: str = "",
+    y: str = "",
+    hue: str | None = None,
+    xlabel: str = "",
+    ylabel: str = "",
+    injections_sites: dict = {},
+    channel_colors: dict = {},
+    channel_names: dict = {},
+    ax: plt.Axes | None = None,
+    **kwargs,
+) -> plt.Axes:
+    """
+    Nice plot of 1D distribution of objects.
+
+    Parameters
+    ----------
+    df : pandas.DataFrame
+    x, y : str
+        Keys in `df`.
+    hue : str or None, optional
+        Key in `df`. If None, no hue is used.
+    xlabel, ylabel : str
+        X and Y axes labels.
+    injections_sites : dict, optional
+        List of injection sites 1D coordinates in a dict with the channel name as key.
+        If empty, injection site is not plotted (default).
+    channel_colors : dict, optional
+        Required if injections_sites is not empty, dict mapping channel names to a
+        color.
+    channel_names : dict, optional
+        Required if injections_sites is not empty, dict mapping channel names to a
+        display name.
+    ax : Axes or None, optional
+        Axes in which to plot the figure, if None, a new figure is created (default).
+    **kwargs : passed to seaborn.lineplot()
+
+    Returns
+    -------
+    ax : matplotlib axes
+        Handle to axes.
+
+    """
+    if not ax:
+        # create figure
+        _, ax = plt.subplots(figsize=(10, 6))
+
+    ax = sns.lineplot(
+        df,
+        x=x,
+        y=y,
+        hue=hue,
+        estimator="mean",
+        errorbar="se",
+        ax=ax,
+        **kwargs,
+    )
+
+    for channel in injections_sites.keys():
+        ax = add_injection_patch(
+            injections_sites[channel],
+            ax,
+            color=channel_colors[channel],
+            edgecolor=None,
+            alpha=0.25,
+            label=channel_names[channel] + ": inj. site",
+        )
+
+    ax.legend()
+    ax.set_xlabel(xlabel)
+    ax.set_ylabel(ylabel)
+
+    return ax
+
+
+
+ +
+ +
+ + +

+ nice_heatmap(df, animals, x='', y='', xlabel='', ylabel='', invertx=False, inverty=False, **kwargs) + +#

+ + +
+ +

Nice plots of 2D distribution of boutons as a heatmap per animal.

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
+ df + + DataFrame + +
+ +
+
+ required +
+ animals + + list-like of str + +
+

List of animals.

+
+
+ required +
+ x + + str + +
+

Keys in df.

+
+
+ '' +
+ y + + str + +
+

Keys in df.

+
+
+ '' +
+ xlabel + + str + +
+

Labels of x and y axes.

+
+
+ '' +
+ ylabel + + str + +
+

Labels of x and y axes.

+
+
+ '' +
+ invertx + + bool + +
+

Wether to inverse the x or y axes. Default is False.

+
+
+ False +
+ inverty + + bool + +
+

Wether to inverse the x or y axes. Default is False.

+
+
+ False +
+ **kwargs + + passed to seaborn.histplot() + +
+ +
+
+ {} +
+ + +

Returns:

+ + + + + + + + + + + + + +
Name TypeDescription
ax + Axes or list of Axes + +
+

Handle to axes.

+
+
+ +
+ Source code in histoquant/display.py +
def nice_heatmap(
+    df: pd.DataFrame,
+    animals: tuple[str] | list[str],
+    x: str = "",
+    y: str = "",
+    xlabel: str = "",
+    ylabel: str = "",
+    invertx: bool = False,
+    inverty: bool = False,
+    **kwargs,
+) -> list[plt.Axes] | plt.Axes:
+    """
+    Nice plots of 2D distribution of boutons as a heatmap per animal.
+
+    Parameters
+    ----------
+    df : pandas.DataFrame
+    animals : list-like of str
+        List of animals.
+    x, y : str
+        Keys in `df`.
+    xlabel, ylabel : str
+        Labels of x and y axes.
+    invertx, inverty : bool, optional
+        Wether to inverse the x or y axes. Default is False.
+    **kwargs : passed to seaborn.histplot()
+
+    Returns
+    -------
+    ax : Axes or list of Axes
+        Handle to axes.
+
+    """
+
+    # 2D distribution, per animal
+    _, axs = plt.subplots(len(animals), 1, sharex="all")
+
+    for animal, ax in zip(animals, axs):
+        ax = sns.histplot(
+            df[df["animal"] == animal],
+            x=x,
+            y=y,
+            ax=ax,
+            **kwargs,
+        )
+        ax.set_xlabel(xlabel)
+        ax.set_ylabel(ylabel)
+        ax.set_title(animal)
+
+        if inverty:
+            ax.invert_yaxis()
+
+    if invertx:
+        axs[-1].invert_xaxis()  # only once since all x axes are shared
+
+    return axs
+
+
+
+ +
+ +
+ + +

+ nice_joint_plot(df, x='', y='', xlabel='', ylabel='', invertx=False, inverty=False, outline_kws={}, ax=None, **kwargs) + +#

+ + +
+ +

Joint distribution.

+

Used to display a 2D heatmap of objects. This is more qualitative than quantitative, +for display purposes.

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
+ df + + DataFrame + +
+ +
+
+ required +
+ x + + str + +
+

Keys in df.

+
+
+ '' +
+ y + + str + +
+

Keys in df.

+
+
+ '' +
+ xlabel + + str + +
+

Label of x and y axes.

+
+
+ '' +
+ ylabel + + str + +
+

Label of x and y axes.

+
+
+ '' +
+ invertx + + bool + +
+

Whether to inverse the x or y axes. Default is False for both.

+
+
+ False +
+ inverty + + bool + +
+

Whether to inverse the x or y axes. Default is False for both.

+
+
+ False +
+ outline_kws + + dict + +
+

Passed to draw_structure_outline().

+
+
+ {} +
+ ax + + Axes or None + +
+

Axes to plot in. If None, draws in current axes (default).

+
+
+ None +
+ **kwargs + + +
+

Passed to seaborn.histplot.

+
+
+ {} +
+ + +

Returns:

+ + + + + + + + + + + + + +
Name TypeDescription
ax + Axes + +
+ +
+
+ +
+ Source code in histoquant/display.py +
def nice_joint_plot(
+    df: pd.DataFrame,
+    x: str = "",
+    y: str = "",
+    xlabel: str = "",
+    ylabel: str = "",
+    invertx: bool = False,
+    inverty: bool = False,
+    outline_kws: dict = {},
+    ax: plt.Axes | None = None,
+    **kwargs,
+) -> plt.Figure:
+    """
+    Joint distribution.
+
+    Used to display a 2D heatmap of objects. This is more qualitative than quantitative,
+    for display purposes.
+
+    Parameters
+    ----------
+    df : pandas.DataFrame
+    x, y : str
+        Keys in `df`.
+    xlabel, ylabel : str
+        Label of x and y axes.
+    invertx, inverty : bool, optional
+        Whether to inverse the x or y axes. Default is False for both.
+    outline_kws : dict
+        Passed to draw_structure_outline().
+    ax : plt.Axes or None, optional
+        Axes to plot in. If None, draws in current axes (default).
+    **kwargs
+        Passed to seaborn.histplot.
+
+    Returns
+    -------
+    ax : plt.Axes
+
+    """
+    if not ax:
+        ax = plt.gca()
+
+    # plot outline
+    draw_structure_outline(ax=ax, **outline_kws)
+
+    # plot joint distribution
+    sns.histplot(
+        df,
+        x=x,
+        y=y,
+        ax=ax,
+        **kwargs,
+    )
+
+    # adjust axes
+    if invertx:
+        ax.invert_xaxis()
+    if inverty:
+        ax.invert_yaxis()
+
+    # labels
+    ax.set_xlabel(xlabel)
+    ax.set_ylabel(ylabel)
+
+    return ax
+
+
+
+ +
+ +
+ + +

+ plot_1D_distributions(dfs_distributions, cfg, df_coordinates=None) + +#

+ + +
+ +

Wraps nice_distribution_plot().

+ +
+ Source code in histoquant/display.py +
def plot_1D_distributions(
+    dfs_distributions: list[pd.DataFrame],
+    cfg,
+    df_coordinates: pd.DataFrame = None,
+):
+    """
+    Wraps nice_distribution_plot().
+    """
+    # prepare figures
+    fig, axs_dist = plt.subplots(1, 3, sharey=True, figsize=(13, 6))
+    xlabels = [
+        "Rostro-caudal position (mm)",
+        "Dorso-ventral position (mm)",
+        "Medio-lateral position (mm)",
+    ]
+
+    # get animals
+    animals = []
+    for df in dfs_distributions:
+        animals.extend(df["animal"].unique())
+    animals = set(animals)
+
+    # get injection sites
+    if cfg.distributions["display"]["show_injection"]:
+        injection_sites = cfg.get_injection_sites(animals)
+    else:
+        injection_sites = {k: {} for k in range(3)}
+
+    # get color palette based on hue
+    hue = cfg.distributions["hue"]
+    palette = cfg.get_hue_palette("distributions")
+
+    # loop through each axis
+    for df_dist, ax_dist, xlabel, inj_sites in zip(
+        dfs_distributions, axs_dist, xlabels, injection_sites.values()
+    ):
+        # select data
+        if cfg.distributions["hue"] == "hemisphere":
+            dfplt = df_dist[df_dist["hemisphere"] != "both"]
+        elif cfg.distributions["hue"] == "channel":
+            dfplt = df_dist[df_dist["channel"] != "all"]
+
+        # plot
+        ax_dist = nice_distribution_plot(
+            dfplt,
+            x="bins",
+            y="distribution",
+            hue=hue,
+            xlabel=xlabel,
+            ylabel="normalized distribution",
+            injections_sites=inj_sites,
+            channel_colors=cfg.channels["colors"],
+            channel_names=cfg.channels["names"],
+            linewidth=2,
+            palette=palette,
+            ax=ax_dist,
+        )
+
+        # add data coverage
+        if ("Atlas_AP" in df_dist["axis"].unique()) & (df_coordinates is not None):
+            df_coverage = utils.get_data_coverage(df_coordinates)
+            ax_dist = add_data_coverage(df_coverage, ax_dist, edgecolor=None, alpha=0.5)
+            ax_dist.legend()
+        else:
+            ax_dist.legend().remove()
+
+    # - Distributions, per animal
+    if len(animals) > 1:
+        _, axs_dist = plt.subplots(1, 3, sharey=True)
+
+        # loop through each axis
+        for df_dist, ax_dist, xlabel, inj_sites in zip(
+            dfs_distributions, axs_dist, xlabels, injection_sites.values()
+        ):
+            # select data
+            df_dist_plot = df_dist[df_dist["hemisphere"] == "both"]
+
+            # plot
+            ax_dist = nice_distribution_plot(
+                df_dist_plot,
+                x="bins",
+                y="distribution",
+                hue="animal",
+                xlabel=xlabel,
+                ylabel="normalized distribution",
+                injections_sites=inj_sites,
+                channel_colors=cfg.channels["colors"],
+                channel_names=cfg.channels["names"],
+                linewidth=2,
+                ax=ax_dist,
+            )
+
+    return fig
+
+
+
+ +
+ +
+ + +

+ plot_2D_distributions(df, cfg) + +#

+ + +
+ +

Wraps nice_joint_plot().

+ +
+ Source code in histoquant/display.py +
def plot_2D_distributions(df: pd.DataFrame, cfg):
+    """
+    Wraps nice_joint_plot().
+    """
+    # -- 2D heatmap, all animals pooled
+    # prepare figure
+    fig_heatmap = plt.figure(figsize=(12, 9))
+
+    ax_sag = fig_heatmap.add_subplot(2, 2, 1)
+    ax_cor = fig_heatmap.add_subplot(2, 2, 2, sharey=ax_sag)
+    ax_top = fig_heatmap.add_subplot(2, 2, 3, sharex=ax_sag)
+    ax_cbar = fig_heatmap.add_subplot(2, 2, 4, box_aspect=15)
+
+    # prepare options
+    map_options = dict(
+        bins=cfg.distributions["display"]["cmap_nbins"],
+        cmap=cfg.distributions["display"]["cmap"],
+        rasterized=True,
+        thresh=10,
+        stat="count",
+        vmin=cfg.distributions["display"]["cmap_lim"][0],
+        vmax=cfg.distributions["display"]["cmap_lim"][1],
+    )
+    outline_kws = dict(
+        structures=cfg.atlas["outline_structures"],
+        outline_file=cfg.files["outlines"],
+        linewidth=1.5,
+        color="k",
+    )
+    cbar_kws = dict(label="count")
+
+    # determine which axes are going to be inverted
+    if cfg.atlas["type"] == "brain":
+        cor_invertx = True
+        cor_inverty = False
+        top_invertx = True
+        top_inverty = False
+    elif cfg.atlas["type"] == "cord":
+        cor_invertx = False
+        cor_inverty = False
+        top_invertx = True
+        top_inverty = True
+
+    # - sagittal
+    # no need to invert axes because they are shared with the two other views
+    outline_kws["view"] = "sagittal"
+    nice_joint_plot(
+        df,
+        x="Atlas_X",
+        y="Atlas_Y",
+        xlabel="Rostro-caudal (mm)",
+        ylabel="Dorso-ventral (mm)",
+        outline_kws=outline_kws,
+        ax=ax_sag,
+        **map_options,
+    )
+
+    # - coronal
+    outline_kws["view"] = "coronal"
+    nice_joint_plot(
+        df,
+        x="Atlas_Z",
+        y="Atlas_Y",
+        xlabel="Medio-lateral (mm)",
+        ylabel="Dorso-ventral (mm)",
+        invertx=cor_invertx,
+        inverty=cor_inverty,
+        outline_kws=outline_kws,
+        ax=ax_cor,
+        **map_options,
+    )
+    ax_cor.invert_yaxis()
+
+    # - top
+    outline_kws["view"] = "top"
+    nice_joint_plot(
+        df,
+        x="Atlas_X",
+        y="Atlas_Z",
+        xlabel="Rostro-caudal (mm)",
+        ylabel="Medio-lateral (mm)",
+        invertx=top_invertx,
+        inverty=top_inverty,
+        outline_kws=outline_kws,
+        ax=ax_top,
+        cbar=True,
+        cbar_ax=ax_cbar,
+        cbar_kws=cbar_kws,
+        **map_options,
+    )
+    fig_heatmap.suptitle("sagittal, coronal and top-view projections")
+
+    # -- 2D heatmap per animals
+    # get animals
+    animals = df["animal"].unique()
+    if len(animals) > 1:
+        # Rostro-caudal, dorso-ventral (sagittal)
+        _ = nice_heatmap(
+            df,
+            animals,
+            x="Atlas_X",
+            y="Atlas_Y",
+            xlabel="Rostro-caudal (mm)",
+            ylabel="Dorso-ventral (mm)",
+            invertx=True,
+            inverty=True,
+            cmap="OrRd",
+            rasterized=True,
+            cbar=True,
+        )
+
+        # Medio-lateral, dorso-ventral (coronal)
+        _ = nice_heatmap(
+            df,
+            animals,
+            x="Atlas_Z",
+            y="Atlas_Y",
+            xlabel="Medio-lateral (mm)",
+            ylabel="Dorso-ventral (mm)",
+            inverty=True,
+            invertx=True,
+            cmap="OrRd",
+            rasterized=True,
+        )
+
+    return fig_heatmap
+
+
+
+ +
+ +
+ + +

+ plot_regions(df, cfg, **kwargs) + +#

+ + +
+ +

Wraps nice_bar_plot().

+ +
+ Source code in histoquant/display.py +
def plot_regions(df: pd.DataFrame, cfg, **kwargs):
+    """
+    Wraps nice_bar_plot().
+    """
+    # get regions order
+    if cfg.regions["display"]["order"] == "ontology":
+        regions_order = [d["acronym"] for d in cfg.bg_atlas.structures_list]
+    elif cfg.regions["display"]["order"] == "max":
+        regions_order = "max"
+    else:
+        regions_order = None
+
+    # determine metrics to be plotted and color palette based on hue
+    metrics = [*cfg.regions["display"]["metrics"].keys()]
+    hue = cfg.regions["hue"]
+    palette = cfg.get_hue_palette("regions")
+
+    # select data
+    dfplt = utils.select_hemisphere_channel(
+        df, hue, cfg.regions["hue_filter"], cfg.regions["hue_mirror"]
+    )
+
+    # prepare options
+    bar_kws = dict(
+        err_kws={"linewidth": 1.5},
+        dodge=cfg.regions["display"]["dodge"],
+        palette=palette,
+    )
+    pts_kws = dict(
+        size=4,
+        edgecolor="auto",
+        linewidth=0.75,
+        dodge=cfg.regions["display"]["dodge"],
+        palette=palette,
+    )
+    # draw
+    figs = nice_bar_plot(
+        dfplt,
+        x="Name",
+        y=metrics,
+        hue=hue,
+        ylabel=[*cfg.regions["display"]["metrics"].values()],
+        orient=cfg.regions["display"]["orientation"],
+        nx=cfg.regions["display"]["nregions"],
+        ordering=regions_order,
+        hue_mirror=cfg.regions["hue_mirror"],
+        log_scale=cfg.regions["display"]["log_scale"],
+        bar_kws=bar_kws,
+        pts_kws=pts_kws,
+        **kwargs,
+    )
+
+    return figs
+
+
+
+ +
+ + + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/api-io.html b/api-io.html new file mode 100644 index 0000000..852c472 --- /dev/null +++ b/api-io.html @@ -0,0 +1,2777 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + histoquant.io - histoquant + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + Skip to content + + +
+
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+ +
+
+ + + +
+
+ + + + + + + + + + +

histoquant.io

+ +
+ + + + +
+ +

io module, part of histoquant.

+

Contains loading and saving functions.

+ + + + + + + + +
+ + + + + + + + + +
+ + +

+ cat_csv_dir(directory, **kwargs) + +#

+ + +
+ +

Scans a directory for csv files and concatenate them into a single DataFrame.

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
+ directory + + str + +
+

Path to the directory to scan.

+
+
+ required +
+ **kwargs + + passed to pandas.read_csv() + +
+ +
+
+ {} +
+ + +

Returns:

+ + + + + + + + + + + + + +
Name TypeDescription
df + DataFrame + +
+

All CSV files concatenated in a single DataFrame.

+
+
+ +
+ Source code in histoquant/io.py +
def cat_csv_dir(directory, **kwargs) -> pd.DataFrame:
+    """
+    Scans a directory for csv files and concatenate them into a single DataFrame.
+
+    Parameters
+    ----------
+    directory : str
+        Path to the directory to scan.
+    **kwargs : passed to pandas.read_csv()
+
+    Returns
+    -------
+    df : pandas.DataFrame
+        All CSV files concatenated in a single DataFrame.
+
+    """
+    return pd.concat(
+        pd.read_csv(
+            os.path.join(directory, filename),
+            **kwargs,
+        )
+        for filename in os.listdir(directory)
+        if (filename.endswith(".csv"))
+        and not check_empty_file(os.path.join(directory, filename), threshold=1)
+    )
+
+
+
+ +
+ +
+ + +

+ cat_data_dir(directory, segtype, **kwargs) + +#

+ + +
+ +

Wraps either cat_csv_dir() or cat_json_dir() depending on segtype.

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
+ directory + + str + +
+

Path to the directory to scan.

+
+
+ required +
+ segtype + + str + +
+

"synaptophysin" or "fibers".

+
+
+ required +
+ **kwargs + + passed to cat_csv_dir() or cat_json_dir(). + +
+ +
+
+ {} +
+ + +

Returns:

+ + + + + + + + + + + + + +
Name TypeDescription
df + DataFrame + +
+

All files concatenated in a single DataFrame.

+
+
+ +
+ Source code in histoquant/io.py +
def cat_data_dir(directory: str, segtype: str, **kwargs) -> pd.DataFrame:
+    """
+    Wraps either cat_csv_dir() or cat_json_dir() depending on `segtype`.
+
+    Parameters
+    ----------
+    directory : str
+        Path to the directory to scan.
+    segtype : str
+        "synaptophysin" or "fibers".
+    **kwargs : passed to cat_csv_dir() or cat_json_dir().
+
+    Returns
+    -------
+    df : pd.DataFrame
+        All files concatenated in a single DataFrame.
+
+    """
+    if segtype in CSV_KW:
+        # remove kwargs for json
+        kwargs.pop("hemisphere_names", None)
+        kwargs.pop("atlas", None)
+        return cat_csv_dir(directory, **kwargs)
+    elif segtype in JSON_KW:
+        kwargs = {k: kwargs[k] for k in ["hemisphere_names", "atlas"] if k in kwargs}
+        return cat_json_dir(directory, **kwargs)
+    else:
+        raise ValueError(
+            f"'{segtype}' not supported, unable to determine if CSV or JSON."
+        )
+
+
+
+ +
+ +
+ + +

+ cat_json_dir(directory, hemisphere_names, atlas) + +#

+ + +
+ +

Scans a directory for json files and concatenate them in a single DataFrame.

+

The json files must be generated with 'workflow_import_export.groovy" from a QuPath +project.

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
+ directory + + str + +
+

Path to the directory to scan.

+
+
+ required +
+ hemisphere_names + + dict + +
+

Maps between hemisphere names in the json files ("Right" and "Left") to +something else (eg. "Ipsi." and "Contra.").

+
+
+ required +
+ atlas + + BrainGlobeAtlas + +
+

Atlas to read regions from.

+
+
+ required +
+ + +

Returns:

+ + + + + + + + + + + + + +
Name TypeDescription
df + DataFrame + +
+

All JSON files concatenated in a single DataFrame.

+
+
+ +
+ Source code in histoquant/io.py +
def cat_json_dir(
+    directory: str, hemisphere_names: dict, atlas: BrainGlobeAtlas
+) -> pd.DataFrame:
+    """
+    Scans a directory for json files and concatenate them in a single DataFrame.
+
+    The json files must be generated with 'workflow_import_export.groovy" from a QuPath
+    project.
+
+    Parameters
+    ----------
+    directory : str
+        Path to the directory to scan.
+    hemisphere_names : dict
+        Maps between hemisphere names in the json files ("Right" and "Left") to
+        something else (eg. "Ipsi." and "Contra.").
+    atlas : BrainGlobeAtlas
+        Atlas to read regions from.
+
+    Returns
+    -------
+    df : pd.DataFrame
+        All JSON files concatenated in a single DataFrame.
+
+    """
+    # list files
+    files_list = [
+        os.path.join(directory, filename)
+        for filename in os.listdir(directory)
+        if (filename.endswith(".json"))
+    ]
+
+    data = []  # prepare list of DataFrame
+    for filename in files_list:
+        with open(filename, "rb") as fid:
+            df = pd.DataFrame.from_dict(
+                orjson.loads(fid.read())["paths"], orient="index"
+            )
+            df["Image"] = os.path.basename(filename).split("_detections")[0]
+            data.append(df)
+
+    df = (
+        pd.concat(data)
+        .explode(
+            ["x", "y", "z", "hemisphere"]
+        )  # get an entry for each point of segments
+        .reset_index()
+        .rename(
+            columns=dict(
+                x="Atlas_X",
+                y="Atlas_Y",
+                z="Atlas_Z",
+                index="Object ID",
+                classification="Classification",
+            )
+        )
+        .set_index("Object ID")
+    )
+
+    # change hemisphere names
+    df["hemisphere"] = df["hemisphere"].map(hemisphere_names)
+
+    # add object type
+    df["Object type"] = "Detection"
+
+    # add brain regions
+    df = utils.add_brain_region(df, atlas, col="Parent")
+
+    return df
+
+
+
+ +
+ +
+ + +

+ check_empty_file(filename, threshold=1) + +#

+ + +
+ +

Checks if a file is empty.

+

Empty is defined as a file whose number of lines is lower than or equal to +threshold (to allow for headers).

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
+ filename + + str + +
+

Full path to the file to check.

+
+
+ required +
+ threshold + + int + +
+

If number of lines is lower than or equal to this value, it is considered as +empty. Default is 1.

+
+
+ 1 +
+ + +

Returns:

+ + + + + + + + + + + + + +
Name TypeDescription
empty + bool + +
+

True if the file is empty as defined above.

+
+
+ +
+ Source code in histoquant/io.py +
57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
def check_empty_file(filename: str, threshold: int = 1) -> bool:
+    """
+    Checks if a file is empty.
+
+    Empty is defined as a file whose number of lines is lower than or equal to
+    `threshold` (to allow for headers).
+
+    Parameters
+    ----------
+    filename : str
+        Full path to the file to check.
+    threshold : int, optional
+        If number of lines is lower than or equal to this value, it is considered as
+        empty. Default is 1.
+
+    Returns
+    -------
+    empty : bool
+        True if the file is empty as defined above.
+
+    """
+    with open(filename, "rb") as fid:
+        nlines = sum(1 for _ in fid)
+
+    if nlines <= threshold:
+        return True
+    else:
+        return False
+
+
+
+ +
+ +
+ + +

+ get_measurements_directory(wdir, animal, kind, segtype) + +#

+ + +
+ +

Get the directory with detections or annotations measurements for given animal ID.

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
+ wdir + + str + +
+

Base working directory.

+
+
+ required +
+ animal + + str + +
+

Animal ID.

+
+
+ required +
+ kind + + str + +
+

"annotation" or "detection".

+
+
+ required +
+ segtype + + str + +
+

Type of segmentation, eg. "synaptophysin".

+
+
+ required +
+ + +

Returns:

+ + + + + + + + + + + + + +
Name TypeDescription
directory + str + +
+

Path to detections or annotations directory.

+
+
+ +
+ Source code in histoquant/io.py +
24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
def get_measurements_directory(wdir, animal: str, kind: str, segtype: str) -> str:
+    """
+    Get the directory with detections or annotations measurements for given animal ID.
+
+    Parameters
+    ----------
+    wdir : str
+        Base working directory.
+    animal : str
+        Animal ID.
+    kind : str
+        "annotation" or "detection".
+    segtype : str
+        Type of segmentation, eg. "synaptophysin".
+
+    Returns
+    -------
+    directory : str
+        Path to detections or annotations directory.
+
+    """
+    bdir = os.path.join(wdir, animal, animal.lower() + "_segmentation", segtype)
+
+    if (kind == "detection") or (kind == "detections"):
+        return os.path.join(bdir, "detections")
+    elif (kind == "annotation") or (kind == "annotations"):
+        return os.path.join(bdir, "annotations")
+    else:
+        raise ValueError(
+            f"kind = '{kind}' not supported. Choose 'detection' or 'annotation'."
+        )
+
+
+
+ +
+ +
+ + +

+ load_dfs(filepath, fmt, identifiers=['df_regions', 'df_coordinates', 'df_distribution_ap', 'df_distribution_dv', 'df_distribution_ml']) + +#

+ + +
+ +

Load DataFrames from file.

+

If fmt is "h5" ("xslx"), identifiers are interpreted as h5 group identifier (sheet +name, respectively). +If fmt is "pickle", "csv" or "tsv", identifiers are appended to filename. +Path to the file can't have a dot (".") in it.

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
+ filepath + + str + +
+

Full path to the file(s), without extension.

+
+
+ required +
+ fmt + + (h5, csv, pickle, xlsx) + +
+

File(s) format.

+
+
+ "h5" +
+ identifiers + + list of str + +
+

List of identifiers to load from files. Defaults to the ones saved in +histoquant.process.process_animals().

+
+
+ ['df_regions', 'df_coordinates', 'df_distribution_ap', 'df_distribution_dv', 'df_distribution_ml'] +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ All requested DataFrames. + +
+ +
+
+ +
+ Source code in histoquant/io.py +
def load_dfs(
+    filepath: str,
+    fmt: str,
+    identifiers: list[str] = [
+        "df_regions",
+        "df_coordinates",
+        "df_distribution_ap",
+        "df_distribution_dv",
+        "df_distribution_ml",
+    ],
+):
+    """
+    Load DataFrames from file.
+
+    If `fmt` is "h5" ("xslx"), identifiers are interpreted as h5 group identifier (sheet
+    name, respectively).
+    If `fmt` is "pickle", "csv" or "tsv", identifiers are appended to `filename`.
+    Path to the file can't have a dot (".") in it.
+
+    Parameters
+    ----------
+    filepath : str
+        Full path to the file(s), without extension.
+    fmt : {"h5", "csv", "pickle", "xlsx"}
+        File(s) format.
+    identifiers : list of str, optional
+        List of identifiers to load from files. Defaults to the ones saved in
+        histoquant.process.process_animals().
+
+    Returns
+    -------
+    All requested DataFrames.
+
+    """
+    # ensure filename without extension
+    base_path = os.path.splitext(filepath)[0]
+    full_path = base_path + "." + fmt
+
+    res = []
+    if (fmt == "h5") or (fmt == "hdf") or (fmt == "hdf5"):
+        for identifier in identifiers:
+            res.append(pd.read_hdf(full_path, identifier))
+    elif fmt == "xlsx":
+        for identifier in identifiers:
+            res.append(pd.read_excel(full_path, sheet_name=identifier))
+    else:
+        for identifier in identifiers:
+            id_path = f"{base_path}_{identifier}.{fmt}"
+            if (fmt == "pickle") or (fmt == "pkl"):
+                res.append(pd.read_pickle(id_path))
+            elif fmt == "csv":
+                res.append(pd.read_csv(id_path))
+            elif fmt == "tsv":
+                res.append(pd.read_csv(id_path, sep="\t"))
+            else:
+                raise ValueError(f"{fmt} is not supported.")
+
+    return res
+
+
+
+ +
+ +
+ + +

+ save_dfs(out_dir, filename, dfs) + +#

+ + +
+ +

Save DataFrames to file.

+

File format is inferred from file name extension.

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
+ out_dir + + str + +
+

Output directory.

+
+
+ required +
+ filename + + _type_ + +
+

File name.

+
+
+ required +
+ dfs + + dict + +
+

DataFrames to save, as {identifier: df}. If HDF5 or xlsx, all df are saved in +the same file, otherwise identifier is appended to the file name.

+
+
+ required +
+ +
+ Source code in histoquant/io.py +
def save_dfs(out_dir: str, filename, dfs: dict):
+    """
+    Save DataFrames to file.
+
+    File format is inferred from file name extension.
+
+    Parameters
+    ----------
+    out_dir : str
+        Output directory.
+    filename : _type_
+        File name.
+    dfs : dict
+        DataFrames to save, as {identifier: df}. If HDF5 or xlsx, all df are saved in
+        the same file, otherwise identifier is appended to the file name.
+
+    """
+    if not os.path.isdir(out_dir):
+        os.makedirs(out_dir)
+
+    basename, ext = os.path.splitext(filename)
+    if ext in [".h5", ".hdf", ".hdf5"]:
+        path = os.path.join(out_dir, filename)
+        for identifier, df in dfs.items():
+            df.to_hdf(path, key=identifier)
+    elif ext == ".xlsx":
+        for identifier, df in dfs.items():
+            df.to_excel(path, sheet_name=identifier)
+    else:
+        for identifier, df in dfs.items():
+            path = os.path.join(out_dir, f"{basename}_{identifier}{ext}")
+            if ext in [".pickle", ".pkl"]:
+                df.to_pickle(path)
+            elif ext == ".csv":
+                df.to_csv(path)
+            elif ext == ".tsv":
+                df.to_csv(path, sep="\t")
+            else:
+                raise ValueError(f"{filename} has an unsupported extension.")
+
+
+
+ +
+ + + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/api-process.html b/api-process.html new file mode 100644 index 0000000..44428fa --- /dev/null +++ b/api-process.html @@ -0,0 +1,2252 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + histoquant.process - histoquant + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + Skip to content + + +
+
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + + + + +

histoquant.process

+ +
+ + + + +
+ +

process module, part of histoquant.

+

Wraps other functions for a click&play behaviour. Relies on the configuration file.

+ + + + + + + + +
+ + + + + + + + + +
+ + +

+ process_animal(animal, df_annotations, df_detections, cfg, compute_distributions=True) + +#

+ + +
+ +

Quantify objects for one animal.

+

Fetch required files and compute objects' distributions in brain regions, spatial +distributions and gather Atlas coordinates.

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
+ animal + + str + +
+

Animal ID.

+
+
+ required +
+ df_annotations + + DataFrame + +
+

DataFrames of QuPath Annotations and Detections.

+
+
+ required +
+ df_detections + + DataFrame + +
+

DataFrames of QuPath Annotations and Detections.

+
+
+ required +
+ cfg + + Config + +
+

The configuration loaded from TOML configuration file.

+
+
+ required +
+ compute_distributions + + bool + +
+

If False, do not compute the 1D distributions and return an empty list.Default +is True.

+
+
+ True +
+ + +

Returns:

+ + + + + + + + + + + + + + + + + + + + + +
Name TypeDescription
df_regions + DataFrame + +
+

Metrics in brain regions. One entry for each hemisphere of each brain regions.

+
+
df_distribution + list of pandas.DataFrame + +
+

Rostro-caudal distribution, as raw count and probability density function, in +each axis.

+
+
df_coordinates + DataFrame + +
+

Atlas coordinates of each points.

+
+
+ +
+ Source code in histoquant/process.py +
def process_animal(
+    animal: str,
+    df_annotations: pd.DataFrame,
+    df_detections: pd.DataFrame,
+    cfg,
+    compute_distributions: bool = True,
+) -> tuple[pd.DataFrame, list[pd.DataFrame], pd.DataFrame]:
+    """
+    Quantify objects for one animal.
+
+    Fetch required files and compute objects' distributions in brain regions, spatial
+    distributions and gather Atlas coordinates.
+
+    Parameters
+    ----------
+    animal : str
+        Animal ID.
+    df_annotations, df_detections : pd.DataFrame
+        DataFrames of QuPath Annotations and Detections.
+    cfg : histoquant.Config
+        The configuration loaded from TOML configuration file.
+    compute_distributions : bool, optional
+        If False, do not compute the 1D distributions and return an empty list.Default
+        is True.
+
+    Returns
+    -------
+    df_regions : pandas.DataFrame
+        Metrics in brain regions. One entry for each hemisphere of each brain regions.
+    df_distribution : list of pandas.DataFrame
+        Rostro-caudal distribution, as raw count and probability density function, in
+        each axis.
+    df_coordinates : pandas.DataFrame
+        Atlas coordinates of each points.
+
+    """
+    # - Annotations data cleanup
+    # filter regions
+    df_annotations = utils.filter_df_regions(
+        df_annotations, ["Root", "root"], mode="remove", col="Name"
+    )
+    df_annotations = utils.filter_df_regions(
+        df_annotations, cfg.atlas["blacklist"], mode="remove", col="Name"
+    )
+    # add hemisphere
+    df_annotations = utils.add_hemisphere(df_annotations, cfg.hemispheres["names"])
+    # remove objects in non-leaf regions
+    df_annotations = utils.filter_df_regions(
+        df_annotations, cfg.atlas["leaveslist"], mode="keep", col="Name"
+    )
+    # merge regions
+    df_annotations = utils.merge_regions(
+        df_annotations, col="Name", fusion_file=cfg.files["fusion"]
+    )
+    if compute_distributions:
+        # - Detections data cleanup
+        # remove objects not in selected classifications
+        df_detections = utils.filter_df_classifications(
+            df_detections, cfg.object_type, mode="keep", col="Classification"
+        )
+        # remove objects from blacklisted regions and "Root"
+        df_detections = utils.filter_df_regions(
+            df_detections, cfg.atlas["blacklist"], mode="remove", col="Parent"
+        )
+        # add hemisphere
+        df_detections = utils.add_hemisphere(
+            df_detections,
+            cfg.hemispheres["names"],
+            cfg.atlas["midline"],
+            col="Atlas_Z",
+            atlas_type=cfg.atlas["type"],
+        )
+        # add detection channel
+        df_detections = utils.add_channel(
+            df_detections, cfg.object_type, cfg.channels["names"]
+        )
+        # convert coordinates to mm
+        df_detections[["Atlas_X", "Atlas_Y", "Atlas_Z"]] = df_detections[
+            ["Atlas_X", "Atlas_Y", "Atlas_Z"]
+        ].divide(1000)
+        # convert to sterotaxic coordinates
+        if cfg.distributions["stereo"]:
+            (
+                df_detections["Atlas_AP"],
+                df_detections["Atlas_DV"],
+                df_detections["Atlas_ML"],
+            ) = utils.ccf_to_stereo(
+                df_detections["Atlas_X"],
+                df_detections["Atlas_Y"],
+                df_detections["Atlas_Z"],
+            )
+        else:
+            (
+                df_detections["Atlas_AP"],
+                df_detections["Atlas_DV"],
+                df_detections["Atlas_ML"],
+            ) = (
+                df_detections["Atlas_X"],
+                df_detections["Atlas_Y"],
+                df_detections["Atlas_Z"],
+            )
+
+    # - Computations
+    # get regions distributions
+    df_regions = compute.get_regions_metrics(
+        df_annotations,
+        cfg.object_type,
+        cfg.channels["names"],
+        cfg.regions["base_measurement"],
+        cfg.regions["metrics"],
+    )
+    colstonorm = [v for v in cfg.regions["metrics"].values() if "relative" not in v]
+
+    # normalize by starter cells
+    if cfg.regions["normalize_starter_cells"]:
+        df_regions = compute.normalize_starter_cells(
+            df_regions, colstonorm, animal, cfg.files["infos"], cfg.channels["names"]
+        )
+
+    # get AP, DV, ML distributions in stereotaxic coordinates
+    if compute_distributions:
+        dfs_distributions = [
+            compute.get_distribution(
+                df_detections,
+                axis,
+                cfg.distributions["hue"],
+                cfg.distributions["hue_filter"],
+                cfg.distributions["common_norm"],
+                stereo_lim,
+                nbins=nbins,
+            )
+            for axis, stereo_lim, nbins in zip(
+                ["Atlas_AP", "Atlas_DV", "Atlas_ML"],
+                [
+                    cfg.distributions["ap_lim"],
+                    cfg.distributions["dv_lim"],
+                    cfg.distributions["ml_lim"],
+                ],
+                [
+                    cfg.distributions["ap_nbins"],
+                    cfg.distributions["dv_nbins"],
+                    cfg.distributions["dv_nbins"],
+                ],
+            )
+        ]
+    else:
+        dfs_distributions = []
+
+    # add animal tag to each DataFrame
+    df_detections["animal"] = animal
+    df_regions["animal"] = animal
+    for df in dfs_distributions:
+        df["animal"] = animal
+
+    return df_regions, dfs_distributions, df_detections
+
+
+
+ +
+ +
+ + +

+ process_animals(wdir, animals, cfg, out_fmt=None, compute_distributions=True) + +#

+ + +
+ +

Get data from all animals and plot.

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
+ wdir + + str + +
+

Base working directory, containing animals folders.

+
+
+ required +
+ animals + + list-like of str + +
+

List of animals ID.

+
+
+ required +
+ cfg + + +
+

Configuration object.

+
+
+ required +
+ out_fmt + + (None, h5, csv, tsv, xslx, pickle) + +
+

Output file(s) format, if None, nothing is saved (default).

+
+
+ None +
+ compute_distributions + + bool + +
+

If False, do not compute the 1D distributions and return an empty list.Default +is True.

+
+
+ True +
+ + +

Returns:

+ + + + + + + + + + + + + + + + + + + + + +
Name TypeDescription
df_regions + DataFrame + +
+

Metrics in brain regions. One entry for each hemisphere of each brain regions.

+
+
df_distribution + list of pandas.DataFrame + +
+

Rostro-caudal distribution, as raw count and probability density function, in +each axis.

+
+
df_coordinates + DataFrame + +
+

Atlas coordinates of each points.

+
+
+ +
+ Source code in histoquant/process.py +
def process_animals(
+    wdir: str,
+    animals: list[str] | tuple[str],
+    cfg,
+    out_fmt: str | None = None,
+    compute_distributions: bool = True,
+) -> tuple[pd.DataFrame]:
+    """
+    Get data from all animals and plot.
+
+    Parameters
+    ----------
+    wdir : str
+        Base working directory, containing `animals` folders.
+    animals : list-like of str
+        List of animals ID.
+    cfg: histoquant.Config
+        Configuration object.
+    out_fmt : {None, "h5", "csv", "tsv", "xslx", "pickle"}
+        Output file(s) format, if None, nothing is saved (default).
+    compute_distributions : bool, optional
+        If False, do not compute the 1D distributions and return an empty list.Default
+        is True.
+
+
+    Returns
+    -------
+    df_regions : pandas.DataFrame
+        Metrics in brain regions. One entry for each hemisphere of each brain regions.
+    df_distribution : list of pandas.DataFrame
+        Rostro-caudal distribution, as raw count and probability density function, in
+        each axis.
+    df_coordinates : pandas.DataFrame
+        Atlas coordinates of each points.
+
+    """
+
+    # -- Preparation
+    df_regions = []
+    dfs_distributions = []
+    df_coordinates = []
+
+    # -- Processing
+    pbar = tqdm(animals)
+
+    for animal in pbar:
+        pbar.set_description(f"Processing {animal}")
+
+        # combine all detections and annotations from this animal
+        df_annotations = io.cat_csv_dir(
+            io.get_measurements_directory(
+                wdir, animal, "annotation", cfg.segmentation_tag
+            ),
+            index_col="Object ID",
+            sep="\t",
+        )
+        if compute_distributions:
+            df_detections = io.cat_data_dir(
+                io.get_measurements_directory(
+                    wdir, animal, "detection", cfg.segmentation_tag
+                ),
+                cfg.segmentation_tag,
+                index_col="Object ID",
+                sep="\t",
+                hemisphere_names=cfg.hemispheres["names"],
+                atlas=cfg.bg_atlas,
+            )
+        else:
+            df_detections = pd.DataFrame()
+
+        # get results
+        df_reg, dfs_dis, df_coo = process_animal(
+            animal,
+            df_annotations,
+            df_detections,
+            cfg,
+            compute_distributions=compute_distributions,
+        )
+
+        # collect results
+        df_regions.append(df_reg)
+        dfs_distributions.append(dfs_dis)
+        df_coordinates.append(df_coo)
+
+    # concatenate all results
+    df_regions = pd.concat(df_regions, ignore_index=True)
+    dfs_distributions = [
+        pd.concat(dfs_list, ignore_index=True) for dfs_list in zip(*dfs_distributions)
+    ]
+    df_coordinates = pd.concat(df_coordinates, ignore_index=True)
+
+    # -- Saving
+    if out_fmt:
+        outdir = os.path.join(wdir, "quantification")
+        outfile = f"{cfg.object_type.lower()}_{cfg.atlas["type"]}_{'-'.join(animals)}.{out_fmt}"
+        dfs = dict(
+            df_regions=df_regions,
+            df_coordinates=df_coordinates,
+            df_distribution_ap=dfs_distributions[0],
+            df_distribution_dv=dfs_distributions[1],
+            df_distribution_ml=dfs_distributions[2],
+        )
+        io.save_dfs(outdir, outfile, dfs)
+
+    return df_regions, dfs_distributions, df_coordinates
+
+
+
+ +
+ + + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/api-script-pyramids.html b/api-script-pyramids.html new file mode 100644 index 0000000..2c0bcb2 --- /dev/null +++ b/api-script-pyramids.html @@ -0,0 +1,2659 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + create_pyramids - histoquant + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + Skip to content + + +
+
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + + + + + +
+
+ + + + + + + + + + +

create_pyramids

+ +
+ + + + +
+ +

create_pyramids command line interface (CLI). +You can set up your settings filling the variables at the top of the file and run the +script :

+
+

python create_pyramids.py /path/to/your/images

+
+

Or alternatively, you can run the script as a CLI :

+
+

python create_pyramids.py [options] /path/to/your/images

+
+

Example :

+
+

python create_pyramids.py --tile-size 1024 --pyramid-factor 4 /path/to/your/images

+
+

To get help (eg. list all options), run :

+
+

python create_pyramids.py --help

+
+

To use the QuPath backend, you'll need the companion 'createPyramids.groovy' script.

+

author : Guillaume Le Goc (g.legoc@posteo.org) @ NeuroPSI +version : 2024.11.19

+ + + + + + + + +
+ + + + + + + +
+ + + +

+ COMPRESSION_PYTHON: str = 'LZW' + + + module-attribute + + +#

+ + +
+ +

Compression method.

+
+ +
+ +
+ + + +

+ INEXT: str = 'ome.tiff' + + + module-attribute + + +#

+ + +
+ +

Input files extension.

+
+ +
+ +
+ + + +

+ NTHREADS: int = int(multiprocessing.cpu_count() / 2) + + + module-attribute + + +#

+ + +
+ +

Number of threads for parallelization.

+
+ +
+ +
+ + + +

+ PYRAMID_FACTOR: int = 2 + + + module-attribute + + +#

+ + +
+ +

Factor between two consecutive pyramid levels.

+
+ +
+ +
+ + + +

+ PYRAMID_MAX: int = 32 + + + module-attribute + + +#

+ + +
+ +

Maximum rescaling (smaller pyramid).

+
+ +
+ +
+ + + +

+ QUPATH_PATH: str = 'C:/Users/glegoc/AppData/Local/QuPath-0.5.1/QuPath-0.5.1 (console).exe' + + + module-attribute + + +#

+ + +
+ +

Full path to the QuPath (console) executable.

+
+ +
+ +
+ + + +

+ SCRIPT_PATH: str = os.path.join(os.path.dirname(__file__), 'createPyramids.groovy') + + + module-attribute + + +#

+ + +
+ +

Full path to the groovy script that does the job.

+
+ +
+ +
+ + + +

+ TILE_SIZE: int = 512 + + + module-attribute + + +#

+ + +
+ +

Tile size (usually 512 or 1024).

+
+ +
+ +
+ + + +

+ USE_QUPATH: bool = True + + + module-attribute + + +#

+ + +
+ +

Use QuPath and the external groovy script instead of pure python (more reliable).

+
+ +
+ + + +
+ + +

+ get_tiff_options(compression, nthreads, tilesize) + +#

+ + +
+ +

Get the relevant tags and options to write a TIFF file.

+

The returned dict is meant to be used to write a new tiff page with those tags.

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
+ compression + + str + +
+

Tiff compression (None, LZW, ...).

+
+
+ required +
+ nthreads + + int + +
+

Number of threads to write tiles.

+
+
+ required +
+ tilesize + + int + +
+

Tile size in pixels. Should be a power of 2.

+
+
+ required +
+ + +

Returns:

+ + + + + + + + + + + + + +
Name TypeDescription
options + dict + +
+

Dictionary with Tiff tags.

+
+
+ +
+ Source code in scripts/pyramids/create_pyramids.py +
def get_tiff_options(compression: str, nthreads: int, tilesize: int) -> dict:
+    """
+    Get the relevant tags and options to write a TIFF file.
+
+    The returned dict is meant to be used to write a new tiff page with those tags.
+
+    Parameters
+    ----------
+    compression : str
+        Tiff compression (None, LZW, ...).
+    nthreads : int
+        Number of threads to write tiles.
+    tilesize : int
+        Tile size in pixels. Should be a power of 2.
+
+    Returns
+    -------
+    options : dict
+        Dictionary with Tiff tags.
+
+    """
+    return {
+        "compression": compression,
+        "photometric": "minisblack",
+        "resolutionunit": "CENTIMETER",
+        "maxworkers": nthreads,
+        "tile": (tilesize, tilesize),
+    }
+
+
+
+ +
+ +
+ + +

+ pyramidalize_directory(inputdir, version=None, use_qupath=USE_QUPATH, tile_size=TILE_SIZE, pyramid_factor=PYRAMID_FACTOR, nthreads=NTHREADS, qupath_path=QUPATH_PATH, script_path=SCRIPT_PATH, pyramid_max=PYRAMID_MAX) + +#

+ + +
+ +

Create pyramidal versions of .ome.tiff images found in the input directory. +You need to edit the script to set the "QUPATH_PATH" to your installation of QuPath. +Usually on Windows it should be here : +C:/Users/$USERNAME$/AppData/Local/QuPath-0.X.Y/QuPath-0.X.Y (console).exe +Alternatively you can run the script with the --qupath-path option.

+ +
+ Source code in scripts/pyramids/create_pyramids.py +
def pyramidalize_directory(
+    inputdir: Annotated[
+        str,
+        typer.Argument(help="Full path to the directory with images to pyramidalize."),
+    ],
+    version: Annotated[
+        Optional[bool],
+        typer.Option("--version", callback=version_callback, is_eager=True),
+    ] = None,
+    use_qupath: Annotated[
+        Optional[bool],
+        typer.Option(help="Use QuPath backend instead of Python."),
+    ] = USE_QUPATH,
+    tile_size: Annotated[
+        Optional[int],
+        typer.Option(help="Image tile size, typically 512 or 1024."),
+    ] = TILE_SIZE,
+    pyramid_factor: Annotated[
+        Optional[int],
+        typer.Option(help="Factor between two consecutive pyramid levels."),
+    ] = PYRAMID_FACTOR,
+    nthreads: Annotated[
+        Optional[int],
+        typer.Option(help="Number of threads to parallelize image writing."),
+    ] = NTHREADS,
+    qupath_path: Annotated[
+        Optional[str],
+        typer.Option(
+            help="Full path to the QuPath (console) executable.",
+            rich_help_panel="QuPath backend",
+        ),
+    ] = QUPATH_PATH,
+    script_path: Annotated[
+        Optional[str],
+        typer.Option(
+            help="Full path to the groovy script that does the job.",
+            rich_help_panel="QuPath backend",
+        ),
+    ] = SCRIPT_PATH,
+    pyramid_max: Annotated[
+        Optional[int],
+        typer.Option(
+            help="Maximum rescaling (smaller pyramid, will be rounded to closer power of 2).",
+            rich_help_panel="Python backend",
+        ),
+    ] = PYRAMID_MAX,
+):
+    """
+    Create pyramidal versions of .ome.tiff images found in the input directory.
+    You need to edit the script to set the "QUPATH_PATH" to your installation of QuPath.
+    Usually on Windows it should be here :
+    C:/Users/$USERNAME$/AppData/Local/QuPath-0.X.Y/QuPath-0.X.Y (console).exe
+    Alternatively you can run the script with the --qupath-path option.
+
+    """
+    # check QuPath was correctly set
+    if not os.path.isfile(qupath_path):
+        raise FileNotFoundError(
+            """QuPath executable was not found. Edit the script to set 'QUPATH_PATH',
+            or run the script with the --qupath-path  option. Usually it is installed
+            at C:/Users/$USERNAME$/AppData/Local/QuPath-0.X.Y/QuPath-0.X.Y (console).exe"""
+        )
+    # prepare output directory
+    outputdir = os.path.join(inputdir, "pyramidal")
+    if not os.path.isdir(outputdir):
+        os.mkdir(outputdir)
+
+    # get a list of images
+    files = [filename for filename in os.listdir(inputdir) if filename.endswith(INEXT)]
+
+    # check we have files to process
+    if len(files) == 0:
+        print("Specified input directory is empty.")
+        sys.exit()
+
+    # loop over all files
+    print(f"Found {len(files)} to pyramidalize...")
+
+    pbar = tqdm(files)
+    for imagename in pbar:
+        # prepare image names
+        image_path = os.path.join(inputdir, imagename)
+        output_image = os.path.join(outputdir, imagename)
+
+        # check if output file already exists
+        if os.path.isfile(output_image):
+            continue
+
+        # verbose
+        pbar.set_description(f"Pyramidalyzing {imagename}")
+
+        if use_qupath:
+            pyramidalize_qupath(
+                image_path,
+                output_image,
+                qupath_path,
+                script_path,
+                tile_size,
+                pyramid_factor,
+                nthreads,
+            )
+        else:
+            # prepare tiffwriter options
+            tiffoptions = get_tiff_options(COMPRESSION_PYTHON, nthreads, tile_size)
+
+            # number of pyramid levels
+            levels = [
+                pyramid_factor**i
+                for i in range(1, int(math.log(pyramid_max, pyramid_factor)) + 1)
+            ]
+            pyramidalize_python(image_path, output_image, levels, tiffoptions)
+
+    print("All done!")
+
+
+
+ +
+ +
+ + +

+ pyramidalize_python(image_path, output_image, levels, tiffoptions) + +#

+ + +
+ +

Pyramidalization with tifffile and scikit-image.

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
+ image_path + + str + +
+

Full path to the image.

+
+
+ required +
+ output_image + + str + +
+

Full path to the pyramidalized image.

+
+
+ required +
+ levels + + list-like of int + +
+

Pyramids levels.

+
+
+ required +
+ tiffoptions + + dict + +
+

Options for TiffWriter.

+
+
+ required +
+ +
+ Source code in scripts/pyramids/create_pyramids.py +
def pyramidalize_python(
+    image_path: str, output_image: str, levels: list | tuple, tiffoptions: dict
+):
+    """
+    Pyramidalization with tifffile and scikit-image.
+
+    Parameters
+    ----------
+    image_path : str
+        Full path to the image.
+    output_image : str
+        Full path to the pyramidalized image.
+    levels : list-like of int
+        Pyramids levels.
+    tiffoptions : dict
+        Options for TiffWriter.
+    """
+    # specific imports
+    import xml.etree.ElementTree as ET
+
+    import numpy as np
+    import tifffile
+    from skimage import transform
+
+    # Nested functions
+    def get_pixelsize_ome(
+        desc: str,
+        namespace: dict = {"ome": "http://www.openmicroscopy.org/Schemas/OME/2016-06"},
+    ) -> float:
+        """
+        Extract physical pixel size from OME-XML description.
+
+        Raise a warning if pixels are anisotropic (eg. X and Y sizes are not the same).
+        Raise an error if size units are not microns ("µm").
+
+        Parameters
+        ----------
+        desc : str
+            OME-XML string from Tiff page.
+        namespace : dict, optional
+            XML namespace, defaults to latest OME-XML schema (2016-06).
+
+        Returns
+        -------
+        pixelsize : float
+            Physical pixel size.
+
+        """
+        root = ET.fromstring(desc)
+
+        for pixels in root.findall(".//ome:Pixels", namespace):
+            pixelsize_x = float(pixels.get("PhysicalSizeX"))
+            pixelsize_y = float(pixels.get("PhysicalSizeY"))
+            break  # stop at first Pixels field in the XML
+
+        # sanity checks
+        if pixelsize_x != pixelsize_y:
+            warnings.warn(
+                f"Anisotropic pixels size found, are you sure ? ({pixelsize_x}, {pixelsize_y})"
+            )
+
+        return np.mean([pixelsize_x, pixelsize_y])
+
+    def im_downscale(img, downfactor, **kwargs):
+        """
+        Downscale an image by the given factor.
+
+        Wrapper for `skimage.transform.rescale`.
+
+        Parameters
+        ----------
+        img : np.ndarray
+        downfactor : int or float
+            Downscaling factor.
+        **kwargs : passed to skimage.transform.rescale
+
+        Returns
+        -------
+        img_rs : np.ndarray
+            Rescaled image.
+
+        """
+        return transform.rescale(
+            img, 1 / downfactor, anti_aliasing=False, preserve_range=True, **kwargs
+        )
+
+    # get metadata from original file (without loading the whole image)
+    with tifffile.TiffFile(image_path) as tifin:
+        metadata = tifin.ome_metadata
+        pixelsize = get_pixelsize_ome(metadata)
+
+    with tifffile.TiffWriter(output_image, ome=False) as tifout:
+        # read full image
+        img = tifffile.imread(image_path)
+
+        # write full resolution multichannel image
+        tifout.write(
+            img,
+            subifds=len(levels),
+            resolution=(1e4 / pixelsize, 1e4 / pixelsize),
+            description=metadata,
+            metadata=None,
+            **tiffoptions,
+        )
+
+        # write downsampled images (pyramidal levels)
+        for level in levels:
+            img_down = im_downscale(
+                img, level, order=0, channel_axis=0
+            )  # downsample image
+            tifout.write(
+                img_down,
+                subfiletype=1,
+                resolution=(1e4 / level / pixelsize, 1e4 / level / pixelsize),
+                **tiffoptions,
+            )
+
+
+
+ +
+ +
+ + +

+ pyramidalize_qupath(image_path, output_image, qupath_path, script_path, tile_size, pyramid_factor, nthreads) + +#

+ + +
+ +

Pyramidalization with QuPath backend.

+ +
+ Source code in scripts/pyramids/create_pyramids.py +
def pyramidalize_qupath(
+    image_path: str,
+    output_image: str,
+    qupath_path: str,
+    script_path: str,
+    tile_size: int,
+    pyramid_factor: int,
+    nthreads: int,
+):
+    """
+    Pyramidalization with QuPath backend.
+
+    """
+    # generate an uid to make sure to not overwrite original file
+    uid = uuid.uuid1().hex
+
+    # prepare image names
+    imagename = os.path.basename(image_path)
+    inputdir = os.path.dirname(image_path)
+    new_imagename = uid + "_" + imagename
+    new_imagepath = os.path.join(inputdir, new_imagename)
+
+    # prepare arguments
+    args = "[" f"{uid}," f"{tile_size}," f"{pyramid_factor}," f"{nthreads}" "]"
+
+    # call the qupath groovy script within a shell
+    subprocess.run(
+        [qupath_path, "script", script_path, "-i", image_path, "--args", args],
+        shell=True,
+        stdout=subprocess.DEVNULL,
+    )
+
+    if not os.path.isfile(new_imagepath):
+        raise FileNotFoundError(
+            "QuPath did not manage to create the pyramidalized image."
+        )
+
+    # move the pyramidalized image in the output directory
+    os.rename(new_imagepath, output_image)
+
+
+
+ +
+ + + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/api-script-qupath-script-runner.html b/api-script-qupath-script-runner.html new file mode 100644 index 0000000..36e0f0a --- /dev/null +++ b/api-script-qupath-script-runner.html @@ -0,0 +1,1647 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + qupath_script_runner - histoquant + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + Skip to content + + +
+
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + + + + +

qupath_script_runner

+ +
+ + + + +
+ +

Template to show how to run groovy script with QuPath, multi-threaded.

+ + + + + + + + +
+ + + + + + + +
+ + + +

+ EXCLUDE_LIST = [] + + + module-attribute + + +#

+ + +
+ +

Images names to NOT run the script on.

+
+ +
+ +
+ + + +

+ NTHREADS = 5 + + + module-attribute + + +#

+ + +
+ +

Number of threads to use.

+
+ +
+ +
+ + + +

+ QPROJ_PATH = '/path/to/qupath/project.qproj' + + + module-attribute + + +#

+ + +
+ +

Full path to the QuPath project.

+
+ +
+ +
+ + + +

+ QUIET = True + + + module-attribute + + +#

+ + +
+ +

Use QuPath in quiet mode, eg. with minimal verbosity.

+
+ +
+ +
+ + + +

+ QUPATH_EXE = '/path/to/the/qupath/QuPath-0.5.1 (console).exe' + + + module-attribute + + +#

+ + +
+ +

Path to the QuPath executable (console mode).

+
+ +
+ +
+ + + +

+ SAVE = True + + + module-attribute + + +#

+ + +
+ +

Whether to save the project after the script ran on an image.

+
+ +
+ +
+ + + +

+ SCRIPT_PATH = '/path/to/the/script.groovy' + + + module-attribute + + +#

+ + +
+ +

Path to the groovy script.

+
+ +
+ + + + + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/api-script-segment.html b/api-script-segment.html new file mode 100644 index 0000000..2894b68 --- /dev/null +++ b/api-script-segment.html @@ -0,0 +1,3334 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + segment_images - histoquant + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + Skip to content + + +
+
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + + + + + +
+
+ + + + + + + + + + +

segment_images

+ +
+ + + + +
+ +

Script to segment objects from images.

+

For fiber-like objects, binarize and skeletonize the image, then use skan to extract +branches coordinates. +For polygon-like objects, binarize the image and detect objects and extract contours +coordinates. +For points, treat that as polygons then extract the centroids instead of contours. +Finally, export the coordinates as collections in geojson files, importable in QuPath. +Supports any number of channel of interest within the same image. One file output file +per channel will be created.

+

This script uses histoquant.seg. It is designed to work on probability maps generated +from a pixel classifier in QuPath, but might work on raw images.

+

Usage : fill-in the Parameters section of the script and run it. +A "geojson" folder will be created in the parent directory of IMAGES_DIR. +To exclude objects near the edges of an ROI, specify the path to masks stored as images +with the same names as probabilities images (without their suffix).

+

author : Guillaume Le Goc (g.legoc@posteo.org) @ NeuroPSI +version : 2024.12.10

+ + + + + + + + +
+ + + + + + + +
+ + + +

+ CHANNELS_PARAMS = [{'name': 'cy5', 'target_channel': 0, 'proba_threshold': 0.85, 'qp_class': 'Fibers: Cy5', 'qp_color': [164, 250, 120]}, {'name': 'dsred', 'target_channel': 1, 'proba_threshold': 0.65, 'qp_class': 'Fibers: DsRed', 'qp_color': [224, 153, 18]}, {'name': 'egfp', 'target_channel': 2, 'proba_threshold': 0.85, 'qp_class': 'Fibers: EGFP', 'qp_color': [135, 11, 191]}] + + + module-attribute + + +#

+ + +
+ +

This should be a list of dictionary (one per channel) with keys :

+
    +
  • name: str, used as suffix for output geojson files, not used if only one channel
  • +
  • target_channel: int, index of the segmented channel of the image, 0-based
  • +
  • proba_threshold: float < 1, probability cut-off for that channel
  • +
  • qp_class: str, name of QuPath classification
  • +
  • qp_color: list of RGB values, associated color
  • +
+
+ +
+ +
+ + + +

+ EDGE_DIST = 0 + + + module-attribute + + +#

+ + +
+ +

Distance to brain edge to ignore, in µm. 0 to disable.

+
+ +
+ +
+ + + +

+ FILTERS = {'length_low': 1.5, 'area_low': 10, 'area_high': 1000, 'ecc_low': 0.0, 'ecc_high': 0.9, 'dist_thresh': 30} + + + module-attribute + + +#

+ + +
+ +

Dictionary with keys :

+
    +
  • length_low: minimal length in microns - for lines
  • +
  • area_low: minimal area in µm² - for polygons and points
  • +
  • area_high: maximal area in µm² - for polygons and points
  • +
  • ecc_low: minimal eccentricity - for polygons and points (0 = circle)
  • +
  • ecc_high: maximal eccentricity - for polygons and points (1 = line)
  • +
  • dist_thresh: maximal inter-point distance in µm - for points
  • +
+
+ +
+ +
+ + + +

+ IMAGES_DIR = '/path/to/images' + + + module-attribute + + +#

+ + +
+ +

Full path to the images to segment.

+
+ +
+ +
+ + + +

+ IMG_SUFFIX = '_Probabilities.tiff' + + + module-attribute + + +#

+ + +
+ +

Images suffix, including extension. Masks must be the same name without the suffix.

+
+ +
+ +
+ + + +

+ MASKS_DIR = 'path/to/corresponding/masks' + + + module-attribute + + +#

+ + +
+ +

Full path to the masks, to exclude objects near the brain edges (set to None or empty +string to disable this feature).

+
+ +
+ +
+ + + +

+ MASKS_EXT = 'tiff' + + + module-attribute + + +#

+ + +
+ +

Masks files extension.

+
+ +
+ +
+ + + +

+ MAX_PIX_VALUE = 255 + + + module-attribute + + +#

+ + +
+ +

Maximum pixel possible value to adjust proba_threshold.

+
+ +
+ +
+ + + +

+ ORIGINAL_PIXELSIZE = 0.45 + + + module-attribute + + +#

+ + +
+ +

Original images pixel size in microns. This is in case the pixel classifier uses +a lower resolution, yielding smaller probability maps, so output objects coordinates +need to be rescaled to the full size images. The pixel size is written in the "Image" +tab in QuPath.

+
+ +
+ +
+ + + +

+ QUPATH_TYPE = 'detection' + + + module-attribute + + +#

+ + +
+ +

QuPath object type.

+
+ +
+ +
+ + + +

+ SEGTYPE = 'boutons' + + + module-attribute + + +#

+ + +
+ +

Type of segmentation.

+
+ +
+ + + +
+ + +

+ get_geojson_dir(images_dir) + +#

+ + +
+ +

Get the directory of geojson files, which will be in the parent directory +of images_dir.

+

If the directory does not exist, create it.

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
+ images_dir + + str + +
+ +
+
+ required +
+ + +

Returns:

+ + + + + + + + + + + + + +
Name TypeDescription
geojson_dir + str + +
+ +
+
+ +
+ Source code in scripts/segmentation/segment_images.py +
def get_geojson_dir(images_dir: str):
+    """
+    Get the directory of geojson files, which will be in the parent directory
+    of `images_dir`.
+
+    If the directory does not exist, create it.
+
+    Parameters
+    ----------
+    images_dir : str
+
+    Returns
+    -------
+    geojson_dir : str
+
+    """
+
+    geojson_dir = os.path.join(Path(images_dir).parent, "geojson")
+
+    if not os.path.isdir(geojson_dir):
+        os.mkdir(geojson_dir)
+
+    return geojson_dir
+
+
+
+ +
+ +
+ + +

+ get_geojson_properties(name, color, objtype='detection') + +#

+ + +
+ +

Return geojson objects properties as a dictionnary, ready to be used in geojson.Feature.

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
+ name + + str + +
+

Classification name.

+
+
+ required +
+ color + + tuple or list + +
+

Classification color in RGB (3-elements vector).

+
+
+ required +
+ objtype + + str + +
+

Object type ("detection" or "annotation"). Default is "detection".

+
+
+ 'detection' +
+ + +

Returns:

+ + + + + + + + + + + + + +
Name TypeDescription
props + dict + +
+ +
+
+ +
+ Source code in scripts/segmentation/segment_images.py +
def get_geojson_properties(name: str, color: tuple | list, objtype: str = "detection"):
+    """
+    Return geojson objects properties as a dictionnary, ready to be used in geojson.Feature.
+
+    Parameters
+    ----------
+    name : str
+        Classification name.
+    color : tuple or list
+        Classification color in RGB (3-elements vector).
+    objtype : str, optional
+        Object type ("detection" or "annotation"). Default is "detection".
+
+    Returns
+    -------
+    props : dict
+
+    """
+
+    return {
+        "objectType": objtype,
+        "classification": {"name": name, "color": color},
+        "isLocked": "true",
+    }
+
+
+
+ +
+ +
+ + +

+ get_seg_method(segtype) + +#

+ + +
+ +

Determine what kind of segmentation is performed.

+

Segmentation kind are, for now, lines, polygons or points. We detect that based on +hardcoded keywords.

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
+ segtype + + str + +
+ +
+
+ required +
+ + +

Returns:

+ + + + + + + + + + + + + +
Name TypeDescription
seg_method + str + +
+ +
+
+ +
+ Source code in scripts/segmentation/segment_images.py +
def get_seg_method(segtype: str):
+    """
+    Determine what kind of segmentation is performed.
+
+    Segmentation kind are, for now, lines, polygons or points. We detect that based on
+    hardcoded keywords.
+
+    Parameters
+    ----------
+    segtype : str
+
+    Returns
+    -------
+    seg_method : str
+
+    """
+
+    line_list = ["fibers", "axons", "fiber", "axon"]
+    point_list = ["synapto", "synaptophysin", "syngfp", "boutons", "points"]
+    polygon_list = ["cells", "polygon", "polygons", "polygon", "cell"]
+
+    if segtype in line_list:
+        seg_method = "lines"
+    elif segtype in polygon_list:
+        seg_method = "polygons"
+    elif segtype in point_list:
+        seg_method = "points"
+    else:
+        raise ValueError(
+            f"Could not determine method to use based on segtype : {segtype}."
+        )
+
+    return seg_method
+
+
+
+ +
+ +
+ + +

+ parameters_as_dict(images_dir, masks_dir, segtype, name, proba_threshold, edge_dist) + +#

+ + +
+ +

Get information as a dictionnary.

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
+ images_dir + + str + +
+

Path to images to be segmented.

+
+
+ required +
+ masks_dir + + str + +
+

Path to images masks.

+
+
+ required +
+ segtype + + str + +
+

Segmentation type (eg. "fibers").

+
+
+ required +
+ name + + str + +
+

Name of the segmentation (eg. "green").

+
+
+ required +
+ proba_threshold + + float < 1 + +
+

Probability threshold.

+
+
+ required +
+ edge_dist + + float + +
+

Distance in µm to the brain edge that is ignored.

+
+
+ required +
+ + +

Returns:

+ + + + + + + + + + + + + +
Name TypeDescription
params + dict + +
+ +
+
+ +
+ Source code in scripts/segmentation/segment_images.py +
def parameters_as_dict(
+    images_dir: str,
+    masks_dir: str,
+    segtype: str,
+    name: str,
+    proba_threshold: float,
+    edge_dist: float,
+):
+    """
+    Get information as a dictionnary.
+
+    Parameters
+    ----------
+    images_dir : str
+        Path to images to be segmented.
+    masks_dir : str
+        Path to images masks.
+    segtype : str
+        Segmentation type (eg. "fibers").
+    name : str
+        Name of the segmentation (eg. "green").
+    proba_threshold : float < 1
+        Probability threshold.
+    edge_dist : float
+        Distance in µm to the brain edge that is ignored.
+
+    Returns
+    -------
+    params : dict
+
+    """
+
+    return {
+        "images_location": images_dir,
+        "masks_location": masks_dir,
+        "type": segtype,
+        "probability threshold": proba_threshold,
+        "name": name,
+        "edge distance": edge_dist,
+    }
+
+
+
+ +
+ +
+ + +

+ process_directory(images_dir, img_suffix='', segtype='', original_pixelsize=1.0, target_channel=0, proba_threshold=0.0, qupath_class='Object', qupath_color=[0, 0, 0], channel_suffix='', edge_dist=0.0, filters={}, masks_dir='', masks_ext='') + +#

+ + +
+ +

Main function, processes the .ome.tiff files in the input directory.

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
+ images_dir + + str + +
+

Animal ID to process.

+
+
+ required +
+ img_suffix + + str + +
+

Images suffix, including extension.

+
+
+ '' +
+ segtype + + str + +
+

Segmentation type.

+
+
+ '' +
+ original_pixelsize + + float + +
+

Original images pixel size in microns.

+
+
+ 1.0 +
+ target_channel + + int + +
+

Index of the channel containning the objects of interest (eg. not the +background), in the probability map (not the original images channels).

+
+
+ 0 +
+ proba_threshold + + float < 1 + +
+

Probability below this value will be discarded (multiplied by MAX_PIXEL_VALUE)

+
+
+ 0.0 +
+ qupath_class + + str + +
+

Name of the QuPath classification.

+
+
+ 'Object' +
+ qupath_color + + list of three elements + +
+

Color associated to that classification in RGB.

+
+
+ [0, 0, 0] +
+ channel_suffix + + str + +
+

Channel name, will be used as a suffix in output geojson files.

+
+
+ '' +
+ edge_dist + + float + +
+

Distance to the edge of the brain masks that will be ignored, in microns. Set to +0 to disable this feature.

+
+
+ 0.0 +
+ filters + + dict + +
+

Filters values to include or excludes objects. See the top of the script.

+
+
+ {} +
+ masks_dir + + str + +
+

Path to images masks, to exclude objects found near the edges. The masks must be +with the same name as the corresponding image to be segmented, without its +suffix. Default is "", which disables this feature.

+
+
+ '' +
+ masks_ext + + str + +
+

Masks files extension, without leading ".". Default is ""

+
+
+ '' +
+ +
+ Source code in scripts/segmentation/segment_images.py +
def process_directory(
+    images_dir: str,
+    img_suffix: str = "",
+    segtype: str = "",
+    original_pixelsize: float = 1.0,
+    target_channel: int = 0,
+    proba_threshold: float = 0.0,
+    qupath_class: str = "Object",
+    qupath_color: list = [0, 0, 0],
+    channel_suffix: str = "",
+    edge_dist: float = 0.0,
+    filters: dict = {},
+    masks_dir: str = "",
+    masks_ext: str = "",
+):
+    """
+    Main function, processes the .ome.tiff files in the input directory.
+
+    Parameters
+    ----------
+    images_dir : str
+        Animal ID to process.
+    img_suffix : str
+        Images suffix, including extension.
+    segtype : str
+        Segmentation type.
+    original_pixelsize : float
+        Original images pixel size in microns.
+    target_channel : int
+        Index of the channel containning the objects of interest (eg. not the
+        background), in the probability map (*not* the original images channels).
+    proba_threshold : float < 1
+        Probability below this value will be discarded (multiplied by `MAX_PIXEL_VALUE`)
+    qupath_class : str
+        Name of the QuPath classification.
+    qupath_color : list of three elements
+        Color associated to that classification in RGB.
+    channel_suffix : str
+        Channel name, will be used as a suffix in output geojson files.
+    edge_dist : float
+        Distance to the edge of the brain masks that will be ignored, in microns. Set to
+        0 to disable this feature.
+    filters : dict
+        Filters values to include or excludes objects. See the top of the script.
+    masks_dir : str, optional
+        Path to images masks, to exclude objects found near the edges. The masks must be
+        with the same name as the corresponding image to be segmented, without its
+        suffix. Default is "", which disables this feature.
+    masks_ext : str, optional
+        Masks files extension, without leading ".". Default is ""
+
+    """
+
+    # -- Preparation
+    # get segmentation type
+    seg_method = get_seg_method(segtype)
+
+    # get output directory path
+    geojson_dir = get_geojson_dir(images_dir)
+
+    # get images list
+    images_list = [
+        os.path.join(images_dir, filename)
+        for filename in os.listdir(images_dir)
+        if filename.endswith(img_suffix)
+    ]
+
+    # write parameters
+    parameters = parameters_as_dict(
+        images_dir, masks_dir, segtype, channel_suffix, proba_threshold, edge_dist
+    )
+    param_file = os.path.join(geojson_dir, "parameters" + channel_suffix + ".txt")
+    if os.path.isfile(param_file):
+        raise FileExistsError("Parameters file already exists.")
+    else:
+        write_parameters(param_file, parameters, filters, original_pixelsize)
+
+    # convert parameters to pixels in probability map
+    pixelsize = hq.seg.get_pixelsize(images_list[0])  # get pixel size
+    edge_dist = int(edge_dist / pixelsize)
+    filters = hq.seg.convert_to_pixels(filters, pixelsize)
+
+    # get rescaling factor
+    rescale_factor = pixelsize / original_pixelsize
+
+    # get GeoJSON properties
+    geojson_props = get_geojson_properties(
+        qupath_class, qupath_color, objtype=QUPATH_TYPE
+    )
+
+    # -- Processing
+    pbar = tqdm(images_list)
+    for imgpath in pbar:
+        # build file names
+        imgname = os.path.basename(imgpath)
+        geoname = imgname.replace(img_suffix, "")
+        geojson_file = os.path.join(
+            geojson_dir, geoname + "_segmentation" + channel_suffix + ".geojson"
+        )
+
+        # checks if output file already exists
+        if os.path.isfile(geojson_file):
+            continue
+
+        # read images
+        pbar.set_description(f"{geoname}: Loading...")
+        img = tifffile.imread(imgpath, key=target_channel)
+        if (edge_dist > 0) & (len(masks_dir) != 0):
+            mask = tifffile.imread(os.path.join(masks_dir, geoname + "." + masks_ext))
+            mask = hq.seg.pad_image(mask, img.shape)  # resize mask
+            # apply mask, eroding from the edges
+            img = img * hq.seg.erode_mask(mask, edge_dist)
+
+        # image processing
+        pbar.set_description(f"{geoname}: IP...")
+
+        # threshold probability and binarization
+        img = img >= proba_threshold * MAX_PIX_VALUE
+
+        # segmentation
+        pbar.set_description(f"{geoname}: Segmenting...")
+
+        if seg_method == "lines":
+            collection = hq.seg.segment_lines(
+                img,
+                geojson_props,
+                minsize=filters["length_low"],
+                rescale_factor=rescale_factor,
+            )
+
+        elif seg_method == "polygons":
+            collection = hq.seg.segment_polygons(
+                img,
+                geojson_props,
+                area_min=filters["area_low"],
+                area_max=filters["area_high"],
+                ecc_min=filters["ecc_low"],
+                ecc_max=filters["ecc_high"],
+                rescale_factor=rescale_factor,
+            )
+
+        elif seg_method == "points":
+            collection = hq.seg.segment_points(
+                img,
+                geojson_props,
+                area_min=filters["area_low"],
+                area_max=filters["area_high"],
+                ecc_min=filters["ecc_low"],
+                ecc_max=filters["ecc_high"],
+                dist_thresh=filters["dist_thresh"],
+                rescale_factor=rescale_factor,
+            )
+        else:
+            # we already printed an error message
+            return
+
+        # save geojson
+        pbar.set_description(f"{geoname}: Saving...")
+        with open(geojson_file, "w") as fid:
+            fid.write(geojson.dumps(collection))
+
+
+
+ +
+ +
+ + +

+ write_parameters(outfile, parameters, filters, original_pixelsize) + +#

+ + +
+ +

Write parameters to outfile.

+

A timestamp will be added. Parameters are written as key = value, +and a [filters] is added before filters parameters.

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
+ outfile + + str + +
+

Full path to the output file.

+
+
+ required +
+ parameters + + dict + +
+

General parameters.

+
+
+ required +
+ filters + + dict + +
+

Filters parameters.

+
+
+ required +
+ original_pixelsize + + float + +
+

Size of pixels in original image.

+
+
+ required +
+ +
+ Source code in scripts/segmentation/segment_images.py +
def write_parameters(
+    outfile: str, parameters: dict, filters: dict, original_pixelsize: float
+):
+    """
+    Write parameters to `outfile`.
+
+    A timestamp will be added. Parameters are written as key = value,
+    and a [filters] is added before filters parameters.
+
+    Parameters
+    ----------
+    outfile : str
+        Full path to the output file.
+    parameters : dict
+        General parameters.
+    filters : dict
+        Filters parameters.
+    original_pixelsize : float
+        Size of pixels in original image.
+
+    """
+
+    with open(outfile, "w") as fid:
+        fid.writelines(f"date = {datetime.now().strftime('%d-%B-%Y %H:%M:%S')}\n")
+
+        fid.writelines(f"original_pixelsize = {original_pixelsize}\n")
+
+        for key, value in parameters.items():
+            fid.writelines(f"{key} = {value}\n")
+
+        fid.writelines("[filters]\n")
+
+        for key, value in filters.items():
+            fid.writelines(f"{key} = {value}\n")
+
+
+
+ +
+ + + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/api-seg.html b/api-seg.html new file mode 100644 index 0000000..f1a4203 --- /dev/null +++ b/api-seg.html @@ -0,0 +1,3666 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + histoquant.seg - histoquant + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + Skip to content + + +
+
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + + + + + +
+
+ + + + + + + + + + +

histoquant.seg

+ +
+ + + + +
+ +

seg module, part of histoquant.

+

Functions for segmentating probability map stored as an image.

+ + + + + + + + +
+ + + + + + + + + +
+ + +

+ convert_to_pixels(filters, pixelsize) + +#

+ + +
+ +

Convert some values in filters in pixels.

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
+ filters + + dict + +
+

Must contain the keys used below.

+
+
+ required +
+ pixelsize + + float + +
+

Pixel size in microns.

+
+
+ required +
+ + +

Returns:

+ + + + + + + + + + + + + +
Name TypeDescription
filters + dict + +
+

Same as input, with values in pixels.

+
+
+ +
+ Source code in histoquant/seg.py +
42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
def convert_to_pixels(filters, pixelsize):
+    """
+    Convert some values in `filters` in pixels.
+
+    Parameters
+    ----------
+    filters : dict
+        Must contain the keys used below.
+    pixelsize : float
+        Pixel size in microns.
+
+    Returns
+    -------
+    filters : dict
+        Same as input, with values in pixels.
+
+    """
+
+    filters["area_low"] = filters["area_low"] / pixelsize**2
+    filters["area_high"] = filters["area_high"] / pixelsize**2
+    filters["length_low"] = filters["length_low"] / pixelsize
+    filters["dist_thresh"] = int(filters["dist_thresh"] / pixelsize)
+
+    return filters
+
+
+
+ +
+ +
+ + +

+ erode_mask(mask, edge_dist) + +#

+ + +
+ +

Erode the mask outline so that is is edge_dist smaller from the border.

+

This allows discarding the edges.

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
+ mask + + ndarray + +
+ +
+
+ required +
+ edge_dist + + float + +
+

Distance to edges, in pixels.

+
+
+ required +
+ + +

Returns:

+ + + + + + + + + + + + + +
Name TypeDescription
eroded_mask + ndarray of bool + +
+ +
+
+ +
+ Source code in histoquant/seg.py +
def erode_mask(mask: np.ndarray, edge_dist: float) -> np.ndarray:
+    """
+    Erode the mask outline so that is is `edge_dist` smaller from the border.
+
+    This allows discarding the edges.
+
+    Parameters
+    ----------
+    mask : ndarray
+    edge_dist : float
+        Distance to edges, in pixels.
+
+    Returns
+    -------
+    eroded_mask : ndarray of bool
+
+    """
+
+    if edge_dist % 2 == 0:
+        edge_dist += 1  # decomposition requires even number
+
+    footprint = morphology.square(edge_dist, decomposition="sequence")
+
+    return mask * morphology.binary_erosion(mask, footprint=footprint)
+
+
+
+ +
+ +
+ + +

+ get_collection_from_points(coords, properties, rescale_factor=1.0, offset=0.5) + +#

+ + +
+ +

Gather coordinates from coords and put them in GeoJSON format.

+

An entry in coords are pairs of (x, y) coordinates defining the point. +properties is a dictionnary with QuPath properties of each detections.

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
+ coords + + list + +
+ +
+
+ required +
+ properties + + dict + +
+ +
+
+ required +
+ rescale_factor + + float + +
+

Rescale output coordinates by this factor.

+
+
+ 1.0 +
+ + +

Returns:

+ + + + + + + + + + + + + +
Name TypeDescription
collection + FeatureCollection + +
+ +
+
+ +
+ Source code in histoquant/seg.py +
def get_collection_from_points(
+    coords: list, properties: dict, rescale_factor: float = 1.0, offset: float = 0.5
+) -> geojson.FeatureCollection:
+    """
+    Gather coordinates from `coords` and put them in GeoJSON format.
+
+    An entry in `coords` are pairs of (x, y) coordinates defining the point.
+    `properties` is a dictionnary with QuPath properties of each detections.
+
+    Parameters
+    ----------
+    coords : list
+    properties : dict
+    rescale_factor : float
+        Rescale output coordinates by this factor.
+
+    Returns
+    -------
+    collection : geojson.FeatureCollection
+
+    """
+
+    collection = [
+        geojson.Feature(
+            geometry=shapely.Point(
+                np.flip((coord + offset) * rescale_factor)
+            ),  # shape object
+            properties=properties,  # object properties
+            id=str(uuid.uuid4()),  # object uuid
+        )
+        for coord in coords
+    ]
+
+    return geojson.FeatureCollection(collection)
+
+
+
+ +
+ +
+ + +

+ get_collection_from_poly(contours, properties, rescale_factor=1.0, offset=0.5) + +#

+ + +
+ +

Gather coordinates in the list and put them in GeoJSON format as Polygons.

+

An entry in contours must define a closed polygon. properties is a dictionnary +with QuPath properties of each detections.

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
+ contours + + list + +
+ +
+
+ required +
+ properties + + dict + +
+

QuPatj objects' properties.

+
+
+ required +
+ rescale_factor + + float + +
+

Rescale output coordinates by this factor.

+
+
+ 1.0 +
+ offset + + float + +
+

Shift coordinates by this amount, typically to get pixel centers or edges. +Default is 0.5.

+
+
+ 0.5 +
+ + +

Returns:

+ + + + + + + + + + + + + +
Name TypeDescription
collection + FeatureCollection + +
+

A FeatureCollection ready to be written as geojson.

+
+
+ +
+ Source code in histoquant/seg.py +
def get_collection_from_poly(
+    contours: list, properties: dict, rescale_factor: float = 1.0, offset: float = 0.5
+) -> geojson.FeatureCollection:
+    """
+    Gather coordinates in the list and put them in GeoJSON format as Polygons.
+
+    An entry in `contours` must define a closed polygon. `properties` is a dictionnary
+    with QuPath properties of each detections.
+
+    Parameters
+    ----------
+    contours : list
+    properties : dict
+        QuPatj objects' properties.
+    rescale_factor : float
+        Rescale output coordinates by this factor.
+    offset : float
+        Shift coordinates by this amount, typically to get pixel centers or edges.
+        Default is 0.5.
+
+    Returns
+    -------
+    collection : geojson.FeatureCollection
+        A FeatureCollection ready to be written as geojson.
+
+    """
+    collection = [
+        geojson.Feature(
+            geometry=shapely.Polygon(
+                np.fliplr((contour + offset) * rescale_factor)
+            ),  # shape object
+            properties=properties,  # object properties
+            id=str(uuid.uuid4()),  # object uuid
+        )
+        for contour in contours
+    ]
+
+    return geojson.FeatureCollection(collection)
+
+
+
+ +
+ +
+ + +

+ get_collection_from_skel(skeleton, properties, rescale_factor=1.0, offset=0.5) + +#

+ + +
+ +

Get the coordinates of each skeleton path as a GeoJSON Features in a +FeatureCollection. +properties is a dictionnary with QuPath properties of each detections.

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
+ skeleton + + Skeleton + +
+ +
+
+ required +
+ properties + + dict + +
+

QuPatj objects' properties.

+
+
+ required +
+ rescale_factor + + float + +
+

Rescale output coordinates by this factor.

+
+
+ 1.0 +
+ offset + + float + +
+

Shift coordinates by this amount, typically to get pixel centers or edges. +Default is 0.5.

+
+
+ 0.5 +
+ + +

Returns:

+ + + + + + + + + + + + + +
Name TypeDescription
collection + FeatureCollection + +
+

A FeatureCollection ready to be written as geojson.

+
+
+ +
+ Source code in histoquant/seg.py +
def get_collection_from_skel(
+    skeleton: Skeleton, properties: dict, rescale_factor: float = 1.0, offset=0.5
+) -> geojson.FeatureCollection:
+    """
+    Get the coordinates of each skeleton path as a GeoJSON Features in a
+    FeatureCollection.
+    `properties` is a dictionnary with QuPath properties of each detections.
+
+    Parameters
+    ----------
+    skeleton : skan.Skeleton
+    properties : dict
+        QuPatj objects' properties.
+    rescale_factor : float
+        Rescale output coordinates by this factor.
+    offset : float
+        Shift coordinates by this amount, typically to get pixel centers or edges.
+        Default is 0.5.
+
+    Returns
+    -------
+    collection : geojson.FeatureCollection
+        A FeatureCollection ready to be written as geojson.
+
+    """
+
+    branch_data = summarize(skeleton, separator="_")
+
+    collection = []
+    for ind in range(skeleton.n_paths):
+        prop = properties.copy()
+        prop["measurements"] = {"skeleton_id": int(branch_data.loc[ind, "skeleton_id"])}
+        collection.append(
+            geojson.Feature(
+                geometry=shapely.LineString(
+                    (skeleton.path_coordinates(ind)[:, ::-1] + offset) * rescale_factor
+                ),  # shape object
+                properties=prop,  # object properties
+                id=str(uuid.uuid4()),  # object uuid
+            )
+        )
+
+    return geojson.FeatureCollection(collection)
+
+
+
+ +
+ +
+ + +

+ get_image_skeleton(img, minsize=0) + +#

+ + +
+ +

Get the image skeleton.

+

Computes the image skeleton and removes objects smaller than minsize.

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
+ img + + ndarray of bool + +
+ +
+
+ required +
+ minsize + + number + +
+

Min. size the object can have, as a number of pixels. Default is 0.

+
+
+ 0 +
+ + +

Returns:

+ + + + + + + + + + + + + +
Name TypeDescription
skel + ndarray of bool + +
+

Binary image with 1-pixel wide skeleton.

+
+
+ +
+ Source code in histoquant/seg.py +
def get_image_skeleton(img: np.ndarray, minsize=0) -> np.ndarray:
+    """
+    Get the image skeleton.
+
+    Computes the image skeleton and removes objects smaller than `minsize`.
+
+    Parameters
+    ----------
+    img : ndarray of bool
+    minsize : number, optional
+        Min. size the object can have, as a number of pixels. Default is 0.
+
+    Returns
+    -------
+    skel : ndarray of bool
+        Binary image with 1-pixel wide skeleton.
+
+    """
+
+    skel = morphology.skeletonize(img)
+
+    return morphology.remove_small_objects(skel, min_size=minsize, connectivity=2)
+
+
+
+ +
+ +
+ + +

+ get_pixelsize(image_name) + +#

+ + +
+ +

Get pixel size recorded in image_name TIFF metadata.

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
+ image_name + + str + +
+

Full path to image.

+
+
+ required +
+ + +

Returns:

+ + + + + + + + + + + + + +
Name TypeDescription
pixelsize + float + +
+

Pixel size in microns.

+
+
+ +
+ Source code in histoquant/seg.py +
18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
def get_pixelsize(image_name: str) -> float:
+    """
+    Get pixel size recorded in `image_name` TIFF metadata.
+
+    Parameters
+    ----------
+    image_name : str
+        Full path to image.
+
+    Returns
+    -------
+    pixelsize : float
+        Pixel size in microns.
+
+    """
+
+    with tifffile.TiffFile(image_name) as tif:
+        # XResolution is a tuple, numerator, denomitor. The inverse is the pixel size
+        return (
+            tif.pages[0].tags["XResolution"].value[1]
+            / tif.pages[0].tags["XResolution"].value[0]
+        )
+
+
+
+ +
+ +
+ + +

+ pad_image(img, finalsize) + +#

+ + +
+ +

Pad image with zeroes to match expected final size.

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
+ img + + ndarray + +
+ +
+
+ required +
+ finalsize + + tuple or list + +
+

nrows, ncolumns

+
+
+ required +
+ + +

Returns:

+ + + + + + + + + + + + + +
Name TypeDescription
imgpad + ndarray + +
+

img with black borders.

+
+
+ +
+ Source code in histoquant/seg.py +
68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+93
+94
+95
def pad_image(img: np.ndarray, finalsize: tuple | list) -> np.ndarray:
+    """
+    Pad image with zeroes to match expected final size.
+
+    Parameters
+    ----------
+    img : ndarray
+    finalsize : tuple or list
+        nrows, ncolumns
+
+    Returns
+    -------
+    imgpad : ndarray
+        img with black borders.
+
+    """
+
+    final_h = finalsize[0]  # requested number of rows (height)
+    final_w = finalsize[1]  # requested number of columns (width)
+    original_h = img.shape[0]  # input number of rows
+    original_w = img.shape[1]  # input number of columns
+
+    a = (final_h - original_h) // 2  # vertical padding before
+    aa = final_h - a - original_h  # vertical padding after
+    b = (final_w - original_w) // 2  # horizontal padding before
+    bb = final_w - b - original_w  # horizontal padding after
+
+    return np.pad(img, pad_width=((a, aa), (b, bb)), mode="constant")
+
+
+
+ +
+ +
+ + +

+ segment_lines(img, geojson_props, minsize=0.0, rescale_factor=1.0) + +#

+ + +
+ +

Wraps skeleton analysis to get paths coordinates.

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
+ img + + ndarray of bool + +
+

Binary image to segment as lines.

+
+
+ required +
+ geojson_props + + dict + +
+

GeoJSON properties of objects.

+
+
+ required +
+ minsize + + float + +
+

Minimum size in pixels for an object.

+
+
+ 0.0 +
+ rescale_factor + + float + +
+

Rescale output coordinates by this factor.

+
+
+ 1.0 +
+ + +

Returns:

+ + + + + + + + + + + + + +
Name TypeDescription
collection + FeatureCollection + +
+

A FeatureCollection ready to be written as geojson.

+
+
+ +
+ Source code in histoquant/seg.py +
def segment_lines(
+    img: np.ndarray, geojson_props: dict, minsize=0.0, rescale_factor=1.0
+) -> geojson.FeatureCollection:
+    """
+    Wraps skeleton analysis to get paths coordinates.
+
+    Parameters
+    ----------
+    img : ndarray of bool
+        Binary image to segment as lines.
+    geojson_props : dict
+        GeoJSON properties of objects.
+    minsize : float
+        Minimum size in pixels for an object.
+    rescale_factor : float
+        Rescale output coordinates by this factor.
+
+    Returns
+    -------
+    collection : geojson.FeatureCollection
+        A FeatureCollection ready to be written as geojson.
+
+    """
+
+    skel = get_image_skeleton(img, minsize=minsize)
+
+    # get paths coordinates as FeatureCollection
+    skeleton = Skeleton(skel, keep_images=False)
+    return get_collection_from_skel(
+        skeleton, geojson_props, rescale_factor=rescale_factor
+    )
+
+
+
+ +
+ +
+ + +

+ segment_points(img, geojson_props, area_min=0.0, area_max=np.inf, ecc_min=0, ecc_max=1, dist_thresh=0, rescale_factor=1) + +#

+ + +
+ +

Point segmentation.

+

First, segment polygons to apply shape filters, then extract their centroids, +and remove isolated points as defined by dist_thresh.

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
+ img + + ndarray of bool + +
+

Binary image to segment as points.

+
+
+ required +
+ geojson_props + + dict + +
+

GeoJSON properties of objects.

+
+
+ required +
+ area_min + + float + +
+

Minimum and maximum area in pixels for an object.

+
+
+ 0.0 +
+ area_max + + float + +
+

Minimum and maximum area in pixels for an object.

+
+
+ 0.0 +
+ ecc_min + + float + +
+

Minimum and maximum eccentricity for an object.

+
+
+ 0 +
+ ecc_max + + float + +
+

Minimum and maximum eccentricity for an object.

+
+
+ 0 +
+ dist_thresh + + float + +
+

Maximal distance in pixels between objects before considering them as isolated and remove them. +0 disables it.

+
+
+ 0 +
+ rescale_factor + + float + +
+

Rescale output coordinates by this factor.

+
+
+ 1 +
+ + +

Returns:

+ + + + + + + + + + + + + +
Name TypeDescription
collection + FeatureCollection + +
+

A FeatureCollection ready to be written as geojson.

+
+
+ +
+ Source code in histoquant/seg.py +
def segment_points(
+    img: np.ndarray,
+    geojson_props: dict,
+    area_min: float = 0.0,
+    area_max: float = np.inf,
+    ecc_min: float = 0,
+    ecc_max: float = 1,
+    dist_thresh: float = 0,
+    rescale_factor: float = 1,
+) -> geojson.FeatureCollection:
+    """
+    Point segmentation.
+
+    First, segment polygons to apply shape filters, then extract their centroids,
+    and remove isolated points as defined by `dist_thresh`.
+
+    Parameters
+    ----------
+    img : ndarray of bool
+        Binary image to segment as points.
+    geojson_props : dict
+        GeoJSON properties of objects.
+    area_min, area_max : float
+        Minimum and maximum area in pixels for an object.
+    ecc_min, ecc_max : float
+        Minimum and maximum eccentricity for an object.
+    dist_thresh : float
+        Maximal distance in pixels between objects before considering them as isolated and remove them.
+        0 disables it.
+    rescale_factor : float
+        Rescale output coordinates by this factor.
+
+    Returns
+    -------
+    collection : geojson.FeatureCollection
+        A FeatureCollection ready to be written as geojson.
+
+    """
+
+    # get objects properties
+    stats = pd.DataFrame(
+        measure.regionprops_table(
+            measure.label(img), properties=("label", "area", "eccentricity", "centroid")
+        )
+    )
+
+    # keep objects matching filters
+    stats = stats[
+        (stats["area"] >= area_min)
+        & (stats["area"] <= area_max)
+        & (stats["eccentricity"] >= ecc_min)
+        & (stats["eccentricity"] <= ecc_max)
+    ]
+
+    # create an image from centroids only
+    stats["centroid-0"] = stats["centroid-0"].astype(int)
+    stats["centroid-1"] = stats["centroid-1"].astype(int)
+    bw = np.zeros(img.shape, dtype=bool)
+    bw[stats["centroid-0"], stats["centroid-1"]] = True
+
+    # filter isolated objects
+    if dist_thresh:
+        # dilation of points
+        if dist_thresh % 2 == 0:
+            dist_thresh += 1  # decomposition requires even number
+
+        footprint = morphology.square(int(dist_thresh), decomposition="sequence")
+        dilated = measure.label(morphology.binary_dilation(bw, footprint=footprint))
+        stats = pd.DataFrame(
+            measure.regionprops_table(dilated, properties=("label", "area"))
+        )
+
+        # objects that did not merge are alone
+        toremove = stats[(stats["area"] <= dist_thresh**2)]
+        dilated[np.isin(dilated, toremove["label"])] = 0  # remove them
+
+        # apply mask
+        bw = bw * dilated
+
+    # get points coordinates
+    coords = np.argwhere(bw)
+
+    return get_collection_from_points(
+        coords, geojson_props, rescale_factor=rescale_factor
+    )
+
+
+
+ +
+ +
+ + +

+ segment_polygons(img, geojson_props, area_min=0.0, area_max=np.inf, ecc_min=0.0, ecc_max=1.0, rescale_factor=1.0) + +#

+ + +
+ +

Polygon segmentation.

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
+ img + + ndarray of bool + +
+

Binary image to segment as polygons.

+
+
+ required +
+ geojson_props + + dict + +
+

GeoJSON properties of objects.

+
+
+ required +
+ area_min + + float + +
+

Minimum and maximum area in pixels for an object.

+
+
+ 0.0 +
+ area_max + + float + +
+

Minimum and maximum area in pixels for an object.

+
+
+ 0.0 +
+ ecc_min + + float + +
+

Minimum and maximum eccentricity for an object.

+
+
+ 0.0 +
+ ecc_max + + float + +
+

Minimum and maximum eccentricity for an object.

+
+
+ 0.0 +
+ rescale_factor + + float + +
+

Rescale output coordinates by this factor.

+
+
+ 1.0 +
+ + +

Returns:

+ + + + + + + + + + + + + +
Name TypeDescription
collection + FeatureCollection + +
+

A FeatureCollection ready to be written as geojson.

+
+
+ +
+ Source code in histoquant/seg.py +
def segment_polygons(
+    img: np.ndarray,
+    geojson_props: dict,
+    area_min: float = 0.0,
+    area_max: float = np.inf,
+    ecc_min: float = 0.0,
+    ecc_max: float = 1.0,
+    rescale_factor: float = 1.0,
+) -> geojson.FeatureCollection:
+    """
+    Polygon segmentation.
+
+    Parameters
+    ----------
+    img : ndarray of bool
+        Binary image to segment as polygons.
+    geojson_props : dict
+        GeoJSON properties of objects.
+    area_min, area_max : float
+        Minimum and maximum area in pixels for an object.
+    ecc_min, ecc_max : float
+        Minimum and maximum eccentricity for an object.
+    rescale_factor: float
+        Rescale output coordinates by this factor.
+
+    Returns
+    -------
+    collection : geojson.FeatureCollection
+        A FeatureCollection ready to be written as geojson.
+
+    """
+
+    label_image = measure.label(img)
+
+    # get objects properties
+    stats = pd.DataFrame(
+        measure.regionprops_table(
+            label_image, properties=("label", "area", "eccentricity")
+        )
+    )
+
+    # remove objects not matching filters
+    toremove = stats[
+        (stats["area"] < area_min)
+        | (stats["area"] > area_max)
+        | (stats["eccentricity"] < ecc_min)
+        | (stats["eccentricity"] > ecc_max)
+    ]
+
+    label_image[np.isin(label_image, toremove["label"])] = 0
+
+    # find objects countours
+    label_image = label_image > 0
+    contours = measure.find_contours(label_image)
+
+    return get_collection_from_poly(
+        contours, geojson_props, rescale_factor=rescale_factor
+    )
+
+
+
+ +
+ + + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/api-utils.html b/api-utils.html new file mode 100644 index 0000000..e12bc08 --- /dev/null +++ b/api-utils.html @@ -0,0 +1,4588 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + histoquant.utils - histoquant + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + Skip to content + + +
+
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + + + + + +
+
+ + + + + + + + + + +

histoquant.utils

+ +
+ + + + +
+ +

utils module, part of histoquant.

+

Contains utilities functions.

+ + + + + + + + +
+ + + + + + + + + +
+ + +

+ add_brain_region(df, atlas, col='Parent') + +#

+ + +
+ +

Add brain region to a DataFrame with Atlas_X, Atlas_Y and Atlas_Z columns.

+

This uses Brainglobe Atlas API to query the atlas. It does not use the +structure_from_coords() method, instead it manually converts the coordinates in +stack indices, then get the corresponding annotation id and query the corresponding +acronym -- because brainglobe-atlasapi is not vectorized at all.

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
+ df + + DataFrame + +
+

DataFrame with atlas coordinates in microns.

+
+
+ required +
+ atlas + + BrainGlobeAtlas + +
+ +
+
+ required +
+ col + + str + +
+

Column in which to put the regions acronyms. Default is "Parent".

+
+
+ 'Parent' +
+ + +

Returns:

+ + + + + + + + + + + + + +
Name TypeDescription
df + DataFrame + +
+

Same DataFrame with a new "Parent" column.

+
+
+ +
+ Source code in histoquant/utils.py +
def add_brain_region(
+    df: pd.DataFrame, atlas: BrainGlobeAtlas, col="Parent"
+) -> pd.DataFrame:
+    """
+    Add brain region to a DataFrame with `Atlas_X`, `Atlas_Y` and `Atlas_Z` columns.
+
+    This uses Brainglobe Atlas API to query the atlas. It does not use the
+    structure_from_coords() method, instead it manually converts the coordinates in
+    stack indices, then get the corresponding annotation id and query the corresponding
+    acronym -- because brainglobe-atlasapi is not vectorized at all.
+
+    Parameters
+    ----------
+    df : pd.DataFrame
+        DataFrame with atlas coordinates in microns.
+    atlas : BrainGlobeAtlas
+    col : str, optional
+        Column in which to put the regions acronyms. Default is "Parent".
+
+    Returns
+    -------
+    df : pd.DataFrame
+        Same DataFrame with a new "Parent" column.
+
+    """
+    df_in = df.copy()
+
+    res = atlas.resolution  # microns <-> pixels conversion
+    lims = atlas.shape_um  # out of brain
+
+    # set out-of-brain objects at 0 so we get "root" as their parent
+    df_in.loc[(df_in["Atlas_X"] >= lims[0]) | (df_in["Atlas_X"] < 0), "Atlas_X"] = 0
+    df_in.loc[(df_in["Atlas_Y"] >= lims[1]) | (df_in["Atlas_Y"] < 0), "Atlas_Y"] = 0
+    df_in.loc[(df_in["Atlas_Z"] >= lims[2]) | (df_in["Atlas_Z"] < 0), "Atlas_Z"] = 0
+
+    # build the multi index, in pixels and integers
+    ixyz = (
+        df_in["Atlas_X"].divide(res[0]).astype(int),
+        df_in["Atlas_Y"].divide(res[1]).astype(int),
+        df_in["Atlas_Z"].divide(res[2]).astype(int),
+    )
+    # convert i, j, k indices in raveled indices
+    linear_indices = np.ravel_multi_index(ixyz, dims=atlas.annotation.shape)
+    # get the structure id from the annotation stack
+    idlist = atlas.annotation.ravel()[linear_indices]
+    # replace 0 which does not exist to 997 (root)
+    idlist[idlist == 0] = 997
+
+    # query the corresponding acronyms
+    lookup = atlas.lookup_df.set_index("id")
+    df.loc[:, col] = lookup.loc[idlist, "acronym"].values
+
+    return df
+
+
+
+ +
+ +
+ + +

+ add_channel(df, object_type, channel_names) + +#

+ + +
+ +

Add channel as a measurement for detections DataFrame.

+

The channel is read from the Classification column, the latter having to be +formatted as "object_type: channel".

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
+ df + + DataFrame + +
+

DataFrame with detections measurements.

+
+
+ required +
+ object_type + + str + +
+

Object type (primary classification).

+
+
+ required +
+ channel_names + + dict + +
+

Map between original channel names to something else.

+
+
+ required +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ DataFrame + +
+

Same DataFrame with a "channel" column.

+
+
+ +
+ Source code in histoquant/utils.py +
def add_channel(
+    df: pd.DataFrame, object_type: str, channel_names: dict
+) -> pd.DataFrame:
+    """
+    Add channel as a measurement for detections DataFrame.
+
+    The channel is read from the Classification column, the latter having to be
+    formatted as "object_type: channel".
+
+    Parameters
+    ----------
+    df : pd.DataFrame
+        DataFrame with detections measurements.
+    object_type : str
+        Object type (primary classification).
+    channel_names : dict
+        Map between original channel names to something else.
+
+    Returns
+    -------
+    pd.DataFrame
+        Same DataFrame with a "channel" column.
+
+    """
+    # check if there is something to do
+    if "channel" in df.columns:
+        return df
+
+    kind = get_df_kind(df)
+    if kind == "annotation":
+        warnings.warn("Annotation DataFrame not supported.")
+        return df
+
+    # add channel, from {class_name: channel} classification
+    df["channel"] = (
+        df["Classification"].str.replace(object_type + ": ", "").map(channel_names)
+    )
+
+    return df
+
+
+
+ +
+ +
+ + +

+ add_hemisphere(df, hemisphere_names, midline=5700, col='Atlas_Z', atlas_type='brain') + +#

+ + +
+ +

Add hemisphere (left/right) as a measurement for detections or annotations.

+

The hemisphere is read in the "Classification" column for annotations. The latter +needs to be in the form "Right: Name" or "Left: Name". For detections, the input +col of df is compared to midline to assess if the object belong to the left or +right hemispheres.

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
+ df + + DataFrame + +
+

DataFrame with detections or annotations measurements.

+
+
+ required +
+ hemisphere_names + + dict + +
+

Map between "Left" and "Right" to something else.

+
+
+ required +
+ midline + + float + +
+

Used only for "detections" df. Corresponds to the brain midline in microns, +should be 5700 for CCFv3 and 1610 for spinal cord.

+
+
+ 5700 +
+ col + + str + +
+

Name of the column containing the Z coordinate (medio-lateral) in microns. +Default is "Atlas_Z".

+
+
+ 'Atlas_Z' +
+ atlas_type + + (brain, cord) + +
+

Type of atlas used for registration. Required because the brain atlas is swapped +between left and right while the spinal cord atlas is not. Default is "brain".

+
+
+ "brain" +
+ + +

Returns:

+ + + + + + + + + + + + + +
Name TypeDescription
df + DataFrame + +
+

The same DataFrame with a new "hemisphere" column

+
+
+ +
+ Source code in histoquant/utils.py +
def add_hemisphere(
+    df: pd.DataFrame,
+    hemisphere_names: dict,
+    midline: float = 5700,
+    col: str = "Atlas_Z",
+    atlas_type: str = "brain",
+) -> pd.DataFrame:
+    """
+    Add hemisphere (left/right) as a measurement for detections or annotations.
+
+    The hemisphere is read in the "Classification" column for annotations. The latter
+    needs to be in the form "Right: Name" or "Left: Name". For detections, the input
+    `col` of `df` is compared to `midline` to assess if the object belong to the left or
+    right hemispheres.
+
+    Parameters
+    ----------
+    df : pandas.DataFrame
+        DataFrame with detections or annotations measurements.
+    hemisphere_names : dict
+        Map between "Left" and "Right" to something else.
+    midline : float
+        Used only for "detections" `df`. Corresponds to the brain midline in microns,
+        should be 5700 for CCFv3 and 1610 for spinal cord.
+    col : str, optional
+        Name of the column containing the Z coordinate (medio-lateral) in microns.
+        Default is "Atlas_Z".
+    atlas_type : {"brain", "cord"}, optional
+        Type of atlas used for registration. Required because the brain atlas is swapped
+        between left and right while the spinal cord atlas is not. Default is "brain".
+
+    Returns
+    -------
+    df : pandas.DataFrame
+        The same DataFrame with a new "hemisphere" column
+
+    """
+    # check if there is something to do
+    if "hemisphere" in df.columns:
+        return df
+
+    # get kind of DataFrame
+    kind = get_df_kind(df)
+
+    if kind == "detection":
+        # use midline
+        if atlas_type == "brain":
+            # brain atlas : beyond midline, it's left
+            df.loc[df[col] >= midline, "hemisphere"] = hemisphere_names["Left"]
+            df.loc[df[col] < midline, "hemisphere"] = hemisphere_names["Right"]
+        elif atlas_type == "cord":
+            # cord atlas : below midline, it's left
+            df.loc[df[col] <= midline, "hemisphere"] = hemisphere_names["Left"]
+            df.loc[df[col] > midline, "hemisphere"] = hemisphere_names["Right"]
+
+    elif kind == "annotation":
+        # use Classification name -- this does not depend on atlas type
+        df["hemisphere"] = [name.split(":")[0] for name in df["Classification"]]
+        df["hemisphere"] = df["hemisphere"].map(hemisphere_names)
+
+    return df
+
+
+
+ +
+ +
+ + +

+ ccf_to_stereo(x_ccf, y_ccf, z_ccf=0) + +#

+ + +
+ +

Convert X, Y, Z coordinates in CCFv3 to stereotaxis coordinates (as in +Paxinos-Franklin atlas).

+

Coordinates are shifted, rotated and squeezed, see (1) for more info. Input must be +in mm. +x_ccf corresponds to the anterio-posterior (rostro-caudal) axis. +y_ccf corresponds to the dorso-ventral axis. +z_ccf corresponds to the medio-lateral axis (left-right) axis.

+

Warning : it is a rough estimation.

+

(1) https://community.brain-map.org/t/how-to-transform-ccf-x-y-z-coordinates-into-stereotactic-coordinates/1858

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
+ x_ccf + + floats or ndarray + +
+

Coordinates in CCFv3 space in mm.

+
+
+ required +
+ y_ccf + + floats or ndarray + +
+

Coordinates in CCFv3 space in mm.

+
+
+ required +
+ z_ccf + + float or ndarray + +
+

Coordinate in CCFv3 space in mm. Default is 0.

+
+
+ 0 +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ ap, dv, ml : floats or np.ndarray + +
+

Stereotaxic coordinates in mm.

+
+
+ +
+ Source code in histoquant/utils.py +
def ccf_to_stereo(
+    x_ccf: float | np.ndarray, y_ccf: float | np.ndarray, z_ccf: float | np.ndarray = 0
+) -> tuple:
+    """
+    Convert X, Y, Z coordinates in CCFv3 to stereotaxis coordinates (as in
+    Paxinos-Franklin atlas).
+
+    Coordinates are shifted, rotated and squeezed, see (1) for more info. Input must be
+    in mm.
+    `x_ccf` corresponds to the anterio-posterior (rostro-caudal) axis.
+    `y_ccf` corresponds to the dorso-ventral axis.
+    `z_ccf` corresponds to the medio-lateral axis (left-right) axis.
+
+    Warning : it is a rough estimation.
+
+    (1) https://community.brain-map.org/t/how-to-transform-ccf-x-y-z-coordinates-into-stereotactic-coordinates/1858
+
+    Parameters
+    ----------
+    x_ccf, y_ccf : floats or np.ndarray
+        Coordinates in CCFv3 space in mm.
+    z_ccf : float or np.ndarray, optional
+        Coordinate in CCFv3 space in mm. Default is 0.
+
+    Returns
+    -------
+    ap, dv, ml : floats or np.ndarray
+        Stereotaxic coordinates in mm.
+
+    """
+    # Center CCF on Bregma
+    xstereo = -(x_ccf - 5.40)  # anterio-posterior coordinate (rostro-caudal)
+    ystereo = y_ccf - 0.44  # dorso-ventral coordinate
+    ml = z_ccf - 5.70  # medio-lateral coordinate (left-right)
+
+    # Rotate CCF of 5°
+    angle = np.deg2rad(5)
+    ap = xstereo * np.cos(angle) - ystereo * np.sin(angle)
+    dv = xstereo * np.sin(angle) + ystereo * np.cos(angle)
+
+    # Squeeze the dorso-ventral axis by 94.34%
+    dv *= 0.9434
+
+    return ap, dv, ml
+
+
+
+ +
+ +
+ + +

+ filter_df_classifications(df, filter_list, mode='keep', col='Classification') + +#

+ + +
+ +

Filter a DataFrame whether specified col column entries contain elements in +filter_list. Case insensitive.

+

If mode is "keep", keep entries only if their col in is in the list (default). +If mode is "remove", remove entries if their col is in the list.

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
+ df + + DataFrame + +
+ +
+
+ required +
+ filter_list + + list | tuple | str + +
+

List of words that should be present to trigger the filter.

+
+
+ required +
+ mode + + keep or remove + +
+

Keep or remove entries from the list. Default is "keep".

+
+
+ 'keep' +
+ col + + str + +
+

Key in df. Default is "Classification".

+
+
+ 'Classification' +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ DataFrame + +
+

Filtered DataFrame.

+
+
+ +
+ Source code in histoquant/utils.py +
def filter_df_classifications(
+    df: pd.DataFrame, filter_list: list | tuple | str, mode="keep", col="Classification"
+) -> pd.DataFrame:
+    """
+    Filter a DataFrame whether specified `col` column entries contain elements in
+    `filter_list`. Case insensitive.
+
+    If `mode` is "keep", keep entries only if their `col` in is in the list (default).
+    If `mode` is "remove", remove entries if their `col` is in the list.
+
+    Parameters
+    ----------
+    df : pd.DataFrame
+    filter_list : list | tuple | str
+        List of words that should be present to trigger the filter.
+    mode : "keep" or "remove", optional
+        Keep or remove entries from the list. Default is "keep".
+    col : str, optional
+        Key in `df`. Default is "Classification".
+
+    Returns
+    -------
+    pd.DataFrame
+        Filtered DataFrame.
+
+    """
+    # check input
+    if isinstance(filter_list, str):
+        filter_list = [filter_list]  # make sure it is a list
+
+    if col not in df.columns:
+        # might be because of 'Classification' instead of 'classification'
+        col = col.capitalize()
+        if col not in df.columns:
+            raise KeyError(f"{col} not in DataFrame.")
+
+    pattern = "|".join(f".*{s}.*" for s in filter_list)
+
+    if mode == "keep":
+        df_return = df[df[col].str.contains(pattern, case=False, regex=True)]
+    elif mode == "remove":
+        df_return = df[~df[col].str.contains(pattern, case=False, regex=True)]
+
+    # check
+    if len(df_return) == 0:
+        raise ValueError(
+            (
+                f"Filtering '{col}' with {filter_list} resulted in an"
+                + " empty DataFrame, check your config file."
+            )
+        )
+    return df_return
+
+
+
+ +
+ +
+ + +

+ filter_df_regions(df, filter_list, mode='keep', col='Parent') + +#

+ + +
+ +

Filters entries in df based on wether their col is in filter_list or not.

+

If mode is "keep", keep entries only if their col in is in the list (default). +If mode is "remove", remove entries if their col is in the list.

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
+ df + + DataFrame + +
+ +
+
+ required +
+ filter_list + + list - like + +
+

List of regions to keep or remove from the DataFrame.

+
+
+ required +
+ mode + + keep or remove + +
+

Keep or remove entries from the list. Default is "keep".

+
+
+ 'keep' +
+ col + + str + +
+

Key in df. Default is "Parent".

+
+
+ 'Parent' +
+ + +

Returns:

+ + + + + + + + + + + + + +
Name TypeDescription
df + DataFrame + +
+

Filtered DataFrame.

+
+
+ +
+ Source code in histoquant/utils.py +
def filter_df_regions(
+    df: pd.DataFrame, filter_list: list | tuple, mode="keep", col="Parent"
+) -> pd.DataFrame:
+    """
+    Filters entries in `df` based on wether their `col` is in `filter_list` or not.
+
+    If `mode` is "keep", keep entries only if their `col` in is in the list (default).
+    If `mode` is "remove", remove entries if their `col` is in the list.
+
+    Parameters
+    ----------
+    df : pandas.DataFrame
+    filter_list : list-like
+        List of regions to keep or remove from the DataFrame.
+    mode : "keep" or "remove", optional
+        Keep or remove entries from the list. Default is "keep".
+    col : str, optional
+        Key in `df`. Default is "Parent".
+
+    Returns
+    -------
+    df : pandas.DataFrame
+        Filtered DataFrame.
+
+    """
+
+    if mode == "keep":
+        return df[df[col].isin(filter_list)]
+    if mode == "remove":
+        return df[~df[col].isin(filter_list)]
+
+
+
+ +
+ +
+ + +

+ get_blacklist(file, atlas) + +#

+ + +
+ +

Build a list of regions to exclude from file.

+

File must be a TOML with [WITH_CHILDS] and [EXACT] sections.

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
+ file + + str + +
+

Full path the atlas_blacklist.toml file.

+
+
+ required +
+ atlas + + BrainGlobeAtlas + +
+

Atlas to extract regions from.

+
+
+ required +
+ + +

Returns:

+ + + + + + + + + + + + + +
Name TypeDescription
black_list + list + +
+

Full list of acronyms to discard.

+
+
+ +
+ Source code in histoquant/utils.py +
def get_blacklist(file: str, atlas: BrainGlobeAtlas) -> list:
+    """
+    Build a list of regions to exclude from file.
+
+    File must be a TOML with [WITH_CHILDS] and [EXACT] sections.
+
+    Parameters
+    ----------
+    file : str
+        Full path the atlas_blacklist.toml file.
+    atlas : BrainGlobeAtlas
+        Atlas to extract regions from.
+
+    Returns
+    -------
+    black_list : list
+        Full list of acronyms to discard.
+
+    """
+    with open(file, "rb") as fid:
+        content = tomllib.load(fid)
+
+    blacklist = []  # init. the list
+
+    # add regions and their descendants
+    for region in content["WITH_CHILDS"]["members"]:
+        blacklist.extend(
+            [
+                atlas.structures[id]["acronym"]
+                for id in atlas.structures.tree.expand_tree(
+                    atlas.structures[region]["id"]
+                )
+            ]
+        )
+
+    # add regions specified exactly (no descendants)
+    blacklist.extend(content["EXACT"]["members"])
+
+    return blacklist
+
+
+
+ +
+ +
+ + +

+ get_data_coverage(df, col='Atlas_AP', by='animal') + +#

+ + +
+ +

Get min and max in col for each by.

+

Used to get data coverage for each animal to plot in distributions.

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
+ df + + DataFrame + +
+

description

+
+
+ required +
+ col + + str + +
+

Key in df, default is "Atlas_X".

+
+
+ 'Atlas_AP' +
+ by + + str + +
+

Key in df , default is "animal".

+
+
+ 'animal' +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ DataFrame + +
+

min and max of col for each by, named "X_min", and "X_max".

+
+
+ +
+ Source code in histoquant/utils.py +
def get_data_coverage(df: pd.DataFrame, col="Atlas_AP", by="animal") -> pd.DataFrame:
+    """
+    Get min and max in `col` for each `by`.
+
+    Used to get data coverage for each animal to plot in distributions.
+
+    Parameters
+    ----------
+    df : pd.DataFrame
+        _description_
+    col : str, optional
+        Key in `df`, default is "Atlas_X".
+    by : str, optional
+        Key in `df` , default is "animal".
+
+    Returns
+    -------
+    pd.DataFrame
+        min and max of `col` for each `by`, named "X_min", and "X_max".
+
+    """
+    df_group = df.groupby([by])
+    return pd.DataFrame(
+        [
+            df_group[col].min(),
+            df_group[col].max(),
+        ],
+        index=["X_min", "X_max"],
+    )
+
+
+
+ +
+ +
+ + +

+ get_df_kind(df) + +#

+ + +
+ +

Get DataFrame kind, eg. Annotations or Detections.

+

It is based on reading the Object Type of the first entry, so the DataFrame must +have only one kind of object.

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
+ df + + DataFrame + +
+ +
+
+ required +
+ + +

Returns:

+ + + + + + + + + + + + + +
Name TypeDescription
kind + str + +
+

"detection" or "annotation".

+
+
+ +
+ Source code in histoquant/utils.py +
def get_df_kind(df: pd.DataFrame) -> str:
+    """
+    Get DataFrame kind, eg. Annotations or Detections.
+
+    It is based on reading the Object Type of the first entry, so the DataFrame must
+    have only one kind of object.
+
+    Parameters
+    ----------
+    df : pandas.DataFrame
+
+    Returns
+    -------
+    kind : str
+        "detection" or "annotation".
+
+    """
+    return df["Object type"].iloc[0].lower()
+
+
+
+ +
+ +
+ + +

+ get_injection_site(animal, info_file, channel, stereo=False) + +#

+ + +
+ +

Get the injection site coordinates associated with animal.

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
+ animal + + str + +
+

Animal ID.

+
+
+ required +
+ info_file + + str + +
+

Path to TOML info file.

+
+
+ required +
+ channel + + str + +
+

Channel ID as in the TOML file.

+
+
+ required +
+ stereo + + bool + +
+

Wether to convert coordinates in stereotaxis coordinates. Default is False.

+
+
+ False +
+ + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ x, y, z : floats + +
+

Injection site coordinates.

+
+
+ +
+ Source code in histoquant/utils.py +
40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
def get_injection_site(
+    animal: str, info_file: str, channel: str, stereo: bool = False
+) -> tuple:
+    """
+    Get the injection site coordinates associated with animal.
+
+    Parameters
+    ----------
+    animal : str
+        Animal ID.
+    info_file : str
+        Path to TOML info file.
+    channel : str
+        Channel ID as in the TOML file.
+    stereo : bool, optional
+        Wether to convert coordinates in stereotaxis coordinates. Default is False.
+
+    Returns
+    -------
+    x, y, z : floats
+        Injection site coordinates.
+
+    """
+    with open(info_file, "rb") as fid:
+        info = tomllib.load(fid)
+
+    if channel in info[animal]:
+        x, y, z = info[animal][channel]["injection_site"]
+        if stereo:
+            x, y, z = ccf_to_stereo(x, y, z)
+    else:
+        x, y, z = None, None, None
+
+    return x, y, z
+
+
+
+ +
+ +
+ + +

+ get_leaves_list(atlas) + +#

+ + +
+ +

Get the list of leaf brain regions.

+

Leaf brain regions are defined as regions without childs, eg. regions that are at +the bottom of the hiearchy.

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
+ atlas + + BrainGlobeAtlas + +
+

Atlas to extract regions from.

+
+
+ required +
+ + +

Returns:

+ + + + + + + + + + + + + +
Name TypeDescription
leaves_list + list + +
+

Acronyms of leaf brain regions.

+
+
+ +
+ Source code in histoquant/utils.py +
def get_leaves_list(atlas: BrainGlobeAtlas) -> list:
+    """
+    Get the list of leaf brain regions.
+
+    Leaf brain regions are defined as regions without childs, eg. regions that are at
+    the bottom of the hiearchy.
+
+    Parameters
+    ----------
+    atlas : BrainGlobeAtlas
+        Atlas to extract regions from.
+
+    Returns
+    -------
+    leaves_list : list
+        Acronyms of leaf brain regions.
+
+    """
+    leaves_list = []
+    for region in atlas.structures_list:
+        if atlas.structures.tree[region["id"]].is_leaf():
+            leaves_list.append(region["acronym"])
+
+    return leaves_list
+
+
+
+ +
+ +
+ + +

+ get_mapping_fusion(fusion_file) + +#

+ + +
+ +

Get mapping dictionnary between input brain regions and new regions defined in +atlas_fusion.toml file.

+

The returned dictionnary can be used in DataFrame.replace().

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
+ fusion_file + + str + +
+

Path to the TOML file with the merging rules.

+
+
+ required +
+ + +

Returns:

+ + + + + + + + + + + + + +
Name TypeDescription
m + dict + +
+

Mapping as {old: new}.

+
+
+ +
+ Source code in histoquant/utils.py +
def get_mapping_fusion(fusion_file: str) -> dict:
+    """
+    Get mapping dictionnary between input brain regions and new regions defined in
+    `atlas_fusion.toml` file.
+
+    The returned dictionnary can be used in DataFrame.replace().
+
+    Parameters
+    ----------
+    fusion_file : str
+        Path to the TOML file with the merging rules.
+
+    Returns
+    -------
+    m : dict
+        Mapping as {old: new}.
+
+    """
+    with open(fusion_file, "rb") as fid:
+        df = pd.DataFrame.from_dict(tomllib.load(fid), orient="index").set_index(
+            "acronym"
+        )
+
+    return (
+        df.drop(columns="name")["members"]
+        .explode()
+        .reset_index()
+        .set_index("members")
+        .to_dict()["acronym"]
+    )
+
+
+
+ +
+ +
+ + +

+ get_starter_cells(animal, channel, info_file) + +#

+ + +
+ +

Get the number of starter cells associated with animal.

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
+ animal + + str + +
+

Animal ID.

+
+
+ required +
+ channel + + str + +
+

Channel ID.

+
+
+ required +
+ info_file + + str + +
+

Path to TOML info file.

+
+
+ required +
+ + +

Returns:

+ + + + + + + + + + + + + +
Name TypeDescription
n_starters + int + +
+

Number of starter cells.

+
+
+ +
+ Source code in histoquant/utils.py +
15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
def get_starter_cells(animal: str, channel: str, info_file: str) -> int:
+    """
+    Get the number of starter cells associated with animal.
+
+    Parameters
+    ----------
+    animal : str
+        Animal ID.
+    channel : str
+        Channel ID.
+    info_file : str
+        Path to TOML info file.
+
+    Returns
+    -------
+    n_starters : int
+        Number of starter cells.
+
+    """
+    with open(info_file, "rb") as fid:
+        info = tomllib.load(fid)
+
+    return info[animal][channel]["starter_cells"]
+
+
+
+ +
+ +
+ + +

+ merge_regions(df, col, fusion_file) + +#

+ + +
+ +

Merge brain regions following rules in the fusion_file.toml file.

+

Apply this merging on col of the input DataFrame. col whose value is found in +the members sections in the file will be changed to the new acronym.

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
+ df + + DataFrame + +
+ +
+
+ required +
+ col + + str + +
+

Column of df on which to apply the mapping.

+
+
+ required +
+ fusion_file + + str + +
+

Path to the toml file with the merging rules.

+
+
+ required +
+ + +

Returns:

+ + + + + + + + + + + + + +
Name TypeDescription
df + DataFrame + +
+

Same DataFrame with regions renamed.

+
+
+ +
+ Source code in histoquant/utils.py +
def merge_regions(df: pd.DataFrame, col: str, fusion_file: str) -> pd.DataFrame:
+    """
+    Merge brain regions following rules in the `fusion_file.toml` file.
+
+    Apply this merging on `col` of the input DataFrame. `col` whose value is found in
+    the `members` sections in the file will be changed to the new acronym.
+
+    Parameters
+    ----------
+    df : pandas.DataFrame
+    col : str
+        Column of `df` on which to apply the mapping.
+    fusion_file : str
+        Path to the toml file with the merging rules.
+
+    Returns
+    -------
+    df : pandas.DataFrame
+        Same DataFrame with regions renamed.
+
+    """
+    df[col] = df[col].replace(get_mapping_fusion(fusion_file))
+
+    return df
+
+
+
+ +
+ +
+ + +

+ renormalize_per_key(df, by, on) + +#

+ + +
+ +

Renormalize on column by its sum for each by.

+

Use case : relative density is computed for both hemispheres, so if one wants to +plot only one hemisphere, the sum of the bars corresponding to one channel (by) +should be 1. So :

+
+
+
+

df = df[df["hemisphere"] == "Ipsi."] +df = renormalize_per_key(df, "channel", "relative density") +Then, the sum of "relative density" for each "channel" equals 1.

+
+
+
+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
+ df + + DataFrame + +
+ +
+
+ required +
+ by + + str + +
+

Key in df. df is normalized for each by.

+
+
+ required +
+ on + + str + +
+

Key in df. Measurement to be normalized.

+
+
+ required +
+ + +

Returns:

+ + + + + + + + + + + + + +
Name TypeDescription
df + DataFrame + +
+

Same DataFrame with normalized on column.

+
+
+ +
+ Source code in histoquant/utils.py +
def renormalize_per_key(df: pd.DataFrame, by: str, on: str):
+    """
+    Renormalize `on` column by its sum for each `by`.
+
+    Use case : relative density is computed for both hemispheres, so if one wants to
+    plot only one hemisphere, the sum of the bars corresponding to one channel (`by`)
+    should be 1. So :
+    >>> df = df[df["hemisphere"] == "Ipsi."]
+    >>> df = renormalize_per_key(df, "channel", "relative density")
+    Then, the sum of "relative density" for each "channel" equals 1.
+
+    Parameters
+    ----------
+    df : pd.DataFrame
+    by : str
+        Key in `df`. `df` is normalized for each `by`.
+    on : str
+        Key in `df`. Measurement to be normalized.
+
+    Returns
+    -------
+    df : pd.DataFrame
+        Same DataFrame with normalized `on` column.
+
+    """
+    norm = df.groupby(by)[on].sum()
+    bys = df[by].unique()
+    for key in bys:
+        df.loc[df[by] == key, on] = df.loc[df[by] == key, on].divide(norm[key])
+
+    return df
+
+
+
+ +
+ +
+ + +

+ select_hemisphere_channel(df, hue, hue_filter, hue_mirror) + +#

+ + +
+ +

Select relevant data given hue and filters.

+

Returns the DataFrame with only things to be used.

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
+ df + + DataFrame + +
+

DataFrame to filter.

+
+
+ required +
+ hue + + (hemisphere, channel) + +
+

hue that will be used in seaborn plots.

+
+
+ "hemisphere" +
+ hue_filter + + str + +
+

Selected data.

+
+
+ required +
+ hue_mirror + + bool + +
+

Instead of keeping only hue_filter values, they will be plotted in mirror.

+
+
+ required +
+ + +

Returns:

+ + + + + + + + + + + + + +
Name TypeDescription
dfplt + DataFrame + +
+

DataFrame to be used in plots.

+
+
+ +
+ Source code in histoquant/utils.py +
def select_hemisphere_channel(
+    df: pd.DataFrame, hue: str, hue_filter: str, hue_mirror: bool
+) -> pd.DataFrame:
+    """
+    Select relevant data given hue and filters.
+
+    Returns the DataFrame with only things to be used.
+
+    Parameters
+    ----------
+    df : pd.DataFrame
+        DataFrame to filter.
+    hue : {"hemisphere", "channel"}
+        hue that will be used in seaborn plots.
+    hue_filter : str
+        Selected data.
+    hue_mirror : bool
+        Instead of keeping only hue_filter values, they will be plotted in mirror.
+
+    Returns
+    -------
+    dfplt : pd.DataFrame
+        DataFrame to be used in plots.
+
+    """
+    dfplt = df.copy()
+
+    if hue == "hemisphere":
+        # hue_filter is used to select channels
+        # keep only left and right hemispheres, not "both"
+        dfplt = dfplt[dfplt["hemisphere"] != "both"]
+        if hue_filter == "all":
+            hue_filter = dfplt["channel"].unique()
+        elif not isinstance(hue_filter, (list, tuple)):
+            # it is allowed to select several channels so handle lists
+            hue_filter = [hue_filter]
+        dfplt = dfplt[dfplt["channel"].isin(hue_filter)]
+    elif hue == "channel":
+        # hue_filter is used to select hemispheres
+        # it can only be left, right, both or empty
+        if hue_filter == "both":
+            # handle if it's a coordinates DataFrame which doesn't have "both"
+            if "both" not in dfplt["hemisphere"].unique():
+                # keep both hemispheres, don't do anything
+                pass
+            else:
+                if hue_mirror:
+                    # we need to keep both hemispheres to plot them in mirror
+                    dfplt = dfplt[dfplt["hemisphere"] != "both"]
+                else:
+                    # we keep the metrics computed in both hemispheres
+                    dfplt = dfplt[dfplt["hemisphere"] == "both"]
+        else:
+            # hue_filter should correspond to an hemisphere name
+            dfplt = dfplt[dfplt["hemisphere"] == hue_filter]
+    else:
+        # not handled. Just return the DataFrame without filtering, maybe it'll make
+        # sense.
+        warnings.warn(f"{hue} should be 'channel' or 'hemisphere'.")
+
+    # check result
+    if len(dfplt) == 0:
+        warnings.warn(
+            f"hue={hue} and hue_filter={hue_filter} resulted in an empty subset."
+        )
+
+    return dfplt
+
+
+
+ +
+ + + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/assets/_mkdocstrings.css b/assets/_mkdocstrings.css new file mode 100644 index 0000000..b500381 --- /dev/null +++ b/assets/_mkdocstrings.css @@ -0,0 +1,143 @@ + +/* Avoid breaking parameter names, etc. in table cells. */ +.doc-contents td code { + word-break: normal !important; +} + +/* No line break before first paragraph of descriptions. */ +.doc-md-description, +.doc-md-description>p:first-child { + display: inline; +} + +/* Max width for docstring sections tables. */ +.doc .md-typeset__table, +.doc .md-typeset__table table { + display: table !important; + width: 100%; +} + +.doc .md-typeset__table tr { + display: table-row; +} + +/* Defaults in Spacy table style. */ +.doc-param-default { + float: right; +} + +/* Parameter headings must be inline, not blocks. */ +.doc-heading-parameter { + display: inline; +} + +/* Prefer space on the right, not the left of parameter permalinks. */ +.doc-heading-parameter .headerlink { + margin-left: 0 !important; + margin-right: 0.2rem; +} + +/* Backward-compatibility: docstring section titles in bold. */ +.doc-section-title { + font-weight: bold; +} + +/* Symbols in Navigation and ToC. */ +:root, :host, +[data-md-color-scheme="default"] { + --doc-symbol-parameter-fg-color: #df50af; + --doc-symbol-attribute-fg-color: #953800; + --doc-symbol-function-fg-color: #8250df; + --doc-symbol-method-fg-color: #8250df; + --doc-symbol-class-fg-color: #0550ae; + --doc-symbol-module-fg-color: #5cad0f; + + --doc-symbol-parameter-bg-color: #df50af1a; + --doc-symbol-attribute-bg-color: #9538001a; + --doc-symbol-function-bg-color: #8250df1a; + --doc-symbol-method-bg-color: #8250df1a; + --doc-symbol-class-bg-color: #0550ae1a; + --doc-symbol-module-bg-color: #5cad0f1a; +} + +[data-md-color-scheme="slate"] { + --doc-symbol-parameter-fg-color: #ffa8cc; + --doc-symbol-attribute-fg-color: #ffa657; + --doc-symbol-function-fg-color: #d2a8ff; + --doc-symbol-method-fg-color: #d2a8ff; + --doc-symbol-class-fg-color: #79c0ff; + --doc-symbol-module-fg-color: #baff79; + + --doc-symbol-parameter-bg-color: #ffa8cc1a; + --doc-symbol-attribute-bg-color: #ffa6571a; + --doc-symbol-function-bg-color: #d2a8ff1a; + --doc-symbol-method-bg-color: #d2a8ff1a; + --doc-symbol-class-bg-color: #79c0ff1a; + --doc-symbol-module-bg-color: #baff791a; +} + +code.doc-symbol { + border-radius: .1rem; + font-size: .85em; + padding: 0 .3em; + font-weight: bold; +} + +code.doc-symbol-parameter { + color: var(--doc-symbol-parameter-fg-color); + background-color: var(--doc-symbol-parameter-bg-color); +} + +code.doc-symbol-parameter::after { + content: "param"; +} + +code.doc-symbol-attribute { + color: var(--doc-symbol-attribute-fg-color); + background-color: var(--doc-symbol-attribute-bg-color); +} + +code.doc-symbol-attribute::after { + content: "attr"; +} + +code.doc-symbol-function { + color: var(--doc-symbol-function-fg-color); + background-color: var(--doc-symbol-function-bg-color); +} + +code.doc-symbol-function::after { + content: "func"; +} + +code.doc-symbol-method { + color: var(--doc-symbol-method-fg-color); + background-color: var(--doc-symbol-method-bg-color); +} + +code.doc-symbol-method::after { + content: "meth"; +} + +code.doc-symbol-class { + color: var(--doc-symbol-class-fg-color); + background-color: var(--doc-symbol-class-bg-color); +} + +code.doc-symbol-class::after { + content: "class"; +} + +code.doc-symbol-module { + color: var(--doc-symbol-module-fg-color); + background-color: var(--doc-symbol-module-bg-color); +} + +code.doc-symbol-module::after { + content: "mod"; +} + +.doc-signature .autorefs { + color: inherit; + border-bottom: 1px dotted currentcolor; +} diff --git a/assets/external/cdn.jsdelivr.net/gh/jdecked/twemoji@15.1.0/assets/svg/26a0.svg b/assets/external/cdn.jsdelivr.net/gh/jdecked/twemoji@15.1.0/assets/svg/26a0.svg new file mode 100644 index 0000000..b9ee297 --- /dev/null +++ b/assets/external/cdn.jsdelivr.net/gh/jdecked/twemoji@15.1.0/assets/svg/26a0.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/external/fonts.googleapis.com/css.49ea35f2.css b/assets/external/fonts.googleapis.com/css.49ea35f2.css new file mode 100644 index 0000000..68986a1 --- /dev/null +++ b/assets/external/fonts.googleapis.com/css.49ea35f2.css @@ -0,0 +1,594 @@ +/* cyrillic-ext */ +@font-face { + font-family: 'Roboto'; + font-style: italic; + font-weight: 300; + font-display: fallback; + src: url(../fonts.gstatic.com/s/roboto/v32/KFOjCnqEu92Fr1Mu51TjASc3CsTKlA.woff2) format('woff2'); + unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; +} +/* cyrillic */ +@font-face { + font-family: 'Roboto'; + font-style: italic; + font-weight: 300; + font-display: fallback; + src: url(../fonts.gstatic.com/s/roboto/v32/KFOjCnqEu92Fr1Mu51TjASc-CsTKlA.woff2) format('woff2'); + unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; +} +/* greek-ext */ +@font-face { + font-family: 'Roboto'; + font-style: italic; + font-weight: 300; + font-display: fallback; + src: url(../fonts.gstatic.com/s/roboto/v32/KFOjCnqEu92Fr1Mu51TjASc2CsTKlA.woff2) format('woff2'); + unicode-range: U+1F00-1FFF; +} +/* greek */ +@font-face { + font-family: 'Roboto'; + font-style: italic; + font-weight: 300; + font-display: fallback; + src: url(../fonts.gstatic.com/s/roboto/v32/KFOjCnqEu92Fr1Mu51TjASc5CsTKlA.woff2) format('woff2'); + unicode-range: U+0370-0377, U+037A-037F, U+0384-038A, U+038C, U+038E-03A1, U+03A3-03FF; +} +/* vietnamese */ +@font-face { + font-family: 'Roboto'; + font-style: italic; + font-weight: 300; + font-display: fallback; + src: url(../fonts.gstatic.com/s/roboto/v32/KFOjCnqEu92Fr1Mu51TjASc1CsTKlA.woff2) format('woff2'); + unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB; +} +/* latin-ext */ +@font-face { + font-family: 'Roboto'; + font-style: italic; + font-weight: 300; + font-display: fallback; + src: url(../fonts.gstatic.com/s/roboto/v32/KFOjCnqEu92Fr1Mu51TjASc0CsTKlA.woff2) format('woff2'); + unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF; +} +/* latin */ +@font-face { + font-family: 'Roboto'; + font-style: italic; + font-weight: 300; + font-display: fallback; + src: url(../fonts.gstatic.com/s/roboto/v32/KFOjCnqEu92Fr1Mu51TjASc6CsQ.woff2) format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; +} +/* cyrillic-ext */ +@font-face { + font-family: 'Roboto'; + font-style: italic; + font-weight: 400; + font-display: fallback; + src: url(../fonts.gstatic.com/s/roboto/v32/KFOkCnqEu92Fr1Mu51xFIzIFKw.woff2) format('woff2'); + unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; +} +/* cyrillic */ +@font-face { + font-family: 'Roboto'; + font-style: italic; + font-weight: 400; + font-display: fallback; + src: url(../fonts.gstatic.com/s/roboto/v32/KFOkCnqEu92Fr1Mu51xMIzIFKw.woff2) format('woff2'); + unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; +} +/* greek-ext */ +@font-face { + font-family: 'Roboto'; + font-style: italic; + font-weight: 400; + font-display: fallback; + src: url(../fonts.gstatic.com/s/roboto/v32/KFOkCnqEu92Fr1Mu51xEIzIFKw.woff2) format('woff2'); + unicode-range: U+1F00-1FFF; +} +/* greek */ +@font-face { + font-family: 'Roboto'; + font-style: italic; + font-weight: 400; + font-display: fallback; + src: url(../fonts.gstatic.com/s/roboto/v32/KFOkCnqEu92Fr1Mu51xLIzIFKw.woff2) format('woff2'); + unicode-range: U+0370-0377, U+037A-037F, U+0384-038A, U+038C, U+038E-03A1, U+03A3-03FF; +} +/* vietnamese */ +@font-face { + font-family: 'Roboto'; + font-style: italic; + font-weight: 400; + font-display: fallback; + src: url(../fonts.gstatic.com/s/roboto/v32/KFOkCnqEu92Fr1Mu51xHIzIFKw.woff2) format('woff2'); + unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB; +} +/* latin-ext */ +@font-face { + font-family: 'Roboto'; + font-style: italic; + font-weight: 400; + font-display: fallback; + src: url(../fonts.gstatic.com/s/roboto/v32/KFOkCnqEu92Fr1Mu51xGIzIFKw.woff2) format('woff2'); + unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF; +} +/* latin */ +@font-face { + font-family: 'Roboto'; + font-style: italic; + font-weight: 400; + font-display: fallback; + src: url(../fonts.gstatic.com/s/roboto/v32/KFOkCnqEu92Fr1Mu51xIIzI.woff2) format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; +} +/* cyrillic-ext */ +@font-face { + font-family: 'Roboto'; + font-style: italic; + font-weight: 700; + font-display: fallback; + src: url(../fonts.gstatic.com/s/roboto/v32/KFOjCnqEu92Fr1Mu51TzBic3CsTKlA.woff2) format('woff2'); + unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; +} +/* cyrillic */ +@font-face { + font-family: 'Roboto'; + font-style: italic; + font-weight: 700; + font-display: fallback; + src: url(../fonts.gstatic.com/s/roboto/v32/KFOjCnqEu92Fr1Mu51TzBic-CsTKlA.woff2) format('woff2'); + unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; +} +/* greek-ext */ +@font-face { + font-family: 'Roboto'; + font-style: italic; + font-weight: 700; + font-display: fallback; + src: url(../fonts.gstatic.com/s/roboto/v32/KFOjCnqEu92Fr1Mu51TzBic2CsTKlA.woff2) format('woff2'); + unicode-range: U+1F00-1FFF; +} +/* greek */ +@font-face { + font-family: 'Roboto'; + font-style: italic; + font-weight: 700; + font-display: fallback; + src: url(../fonts.gstatic.com/s/roboto/v32/KFOjCnqEu92Fr1Mu51TzBic5CsTKlA.woff2) format('woff2'); + unicode-range: U+0370-0377, U+037A-037F, U+0384-038A, U+038C, U+038E-03A1, U+03A3-03FF; +} +/* vietnamese */ +@font-face { + font-family: 'Roboto'; + font-style: italic; + font-weight: 700; + font-display: fallback; + src: url(../fonts.gstatic.com/s/roboto/v32/KFOjCnqEu92Fr1Mu51TzBic1CsTKlA.woff2) format('woff2'); + unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB; +} +/* latin-ext */ +@font-face { + font-family: 'Roboto'; + font-style: italic; + font-weight: 700; + font-display: fallback; + src: url(../fonts.gstatic.com/s/roboto/v32/KFOjCnqEu92Fr1Mu51TzBic0CsTKlA.woff2) format('woff2'); + unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF; +} +/* latin */ +@font-face { + font-family: 'Roboto'; + font-style: italic; + font-weight: 700; + font-display: fallback; + src: url(../fonts.gstatic.com/s/roboto/v32/KFOjCnqEu92Fr1Mu51TzBic6CsQ.woff2) format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; +} +/* cyrillic-ext */ +@font-face { + font-family: 'Roboto'; + font-style: normal; + font-weight: 300; + font-display: fallback; + src: url(../fonts.gstatic.com/s/roboto/v32/KFOlCnqEu92Fr1MmSU5fCRc4EsA.woff2) format('woff2'); + unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; +} +/* cyrillic */ +@font-face { + font-family: 'Roboto'; + font-style: normal; + font-weight: 300; + font-display: fallback; + src: url(../fonts.gstatic.com/s/roboto/v32/KFOlCnqEu92Fr1MmSU5fABc4EsA.woff2) format('woff2'); + unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; +} +/* greek-ext */ +@font-face { + font-family: 'Roboto'; + font-style: normal; + font-weight: 300; + font-display: fallback; + src: url(../fonts.gstatic.com/s/roboto/v32/KFOlCnqEu92Fr1MmSU5fCBc4EsA.woff2) format('woff2'); + unicode-range: U+1F00-1FFF; +} +/* greek */ +@font-face { + font-family: 'Roboto'; + font-style: normal; + font-weight: 300; + font-display: fallback; + src: url(../fonts.gstatic.com/s/roboto/v32/KFOlCnqEu92Fr1MmSU5fBxc4EsA.woff2) format('woff2'); + unicode-range: U+0370-0377, U+037A-037F, U+0384-038A, U+038C, U+038E-03A1, U+03A3-03FF; +} +/* vietnamese */ +@font-face { + font-family: 'Roboto'; + font-style: normal; + font-weight: 300; + font-display: fallback; + src: url(../fonts.gstatic.com/s/roboto/v32/KFOlCnqEu92Fr1MmSU5fCxc4EsA.woff2) format('woff2'); + unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB; +} +/* latin-ext */ +@font-face { + font-family: 'Roboto'; + font-style: normal; + font-weight: 300; + font-display: fallback; + src: url(../fonts.gstatic.com/s/roboto/v32/KFOlCnqEu92Fr1MmSU5fChc4EsA.woff2) format('woff2'); + unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF; +} +/* latin */ +@font-face { + font-family: 'Roboto'; + font-style: normal; + font-weight: 300; + font-display: fallback; + src: url(../fonts.gstatic.com/s/roboto/v32/KFOlCnqEu92Fr1MmSU5fBBc4.woff2) format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; +} +/* cyrillic-ext */ +@font-face { + font-family: 'Roboto'; + font-style: normal; + font-weight: 400; + font-display: fallback; + src: url(../fonts.gstatic.com/s/roboto/v32/KFOmCnqEu92Fr1Mu72xKOzY.woff2) format('woff2'); + unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; +} +/* cyrillic */ +@font-face { + font-family: 'Roboto'; + font-style: normal; + font-weight: 400; + font-display: fallback; + src: url(../fonts.gstatic.com/s/roboto/v32/KFOmCnqEu92Fr1Mu5mxKOzY.woff2) format('woff2'); + unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; +} +/* greek-ext */ +@font-face { + font-family: 'Roboto'; + font-style: normal; + font-weight: 400; + font-display: fallback; + src: url(../fonts.gstatic.com/s/roboto/v32/KFOmCnqEu92Fr1Mu7mxKOzY.woff2) format('woff2'); + unicode-range: U+1F00-1FFF; +} +/* greek */ +@font-face { + font-family: 'Roboto'; + font-style: normal; + font-weight: 400; + font-display: fallback; + src: url(../fonts.gstatic.com/s/roboto/v32/KFOmCnqEu92Fr1Mu4WxKOzY.woff2) format('woff2'); + unicode-range: U+0370-0377, U+037A-037F, U+0384-038A, U+038C, U+038E-03A1, U+03A3-03FF; +} +/* vietnamese */ +@font-face { + font-family: 'Roboto'; + font-style: normal; + font-weight: 400; + font-display: fallback; + src: url(../fonts.gstatic.com/s/roboto/v32/KFOmCnqEu92Fr1Mu7WxKOzY.woff2) format('woff2'); + unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB; +} +/* latin-ext */ +@font-face { + font-family: 'Roboto'; + font-style: normal; + font-weight: 400; + font-display: fallback; + src: url(../fonts.gstatic.com/s/roboto/v32/KFOmCnqEu92Fr1Mu7GxKOzY.woff2) format('woff2'); + unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF; +} +/* latin */ +@font-face { + font-family: 'Roboto'; + font-style: normal; + font-weight: 400; + font-display: fallback; + src: url(../fonts.gstatic.com/s/roboto/v32/KFOmCnqEu92Fr1Mu4mxK.woff2) format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; +} +/* cyrillic-ext */ +@font-face { + font-family: 'Roboto'; + font-style: normal; + font-weight: 700; + font-display: fallback; + src: url(../fonts.gstatic.com/s/roboto/v32/KFOlCnqEu92Fr1MmWUlfCRc4EsA.woff2) format('woff2'); + unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; +} +/* cyrillic */ +@font-face { + font-family: 'Roboto'; + font-style: normal; + font-weight: 700; + font-display: fallback; + src: url(../fonts.gstatic.com/s/roboto/v32/KFOlCnqEu92Fr1MmWUlfABc4EsA.woff2) format('woff2'); + unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; +} +/* greek-ext */ +@font-face { + font-family: 'Roboto'; + font-style: normal; + font-weight: 700; + font-display: fallback; + src: url(../fonts.gstatic.com/s/roboto/v32/KFOlCnqEu92Fr1MmWUlfCBc4EsA.woff2) format('woff2'); + unicode-range: U+1F00-1FFF; +} +/* greek */ +@font-face { + font-family: 'Roboto'; + font-style: normal; + font-weight: 700; + font-display: fallback; + src: url(../fonts.gstatic.com/s/roboto/v32/KFOlCnqEu92Fr1MmWUlfBxc4EsA.woff2) format('woff2'); + unicode-range: U+0370-0377, U+037A-037F, U+0384-038A, U+038C, U+038E-03A1, U+03A3-03FF; +} +/* vietnamese */ +@font-face { + font-family: 'Roboto'; + font-style: normal; + font-weight: 700; + font-display: fallback; + src: url(../fonts.gstatic.com/s/roboto/v32/KFOlCnqEu92Fr1MmWUlfCxc4EsA.woff2) format('woff2'); + unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB; +} +/* latin-ext */ +@font-face { + font-family: 'Roboto'; + font-style: normal; + font-weight: 700; + font-display: fallback; + src: url(../fonts.gstatic.com/s/roboto/v32/KFOlCnqEu92Fr1MmWUlfChc4EsA.woff2) format('woff2'); + unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF; +} +/* latin */ +@font-face { + font-family: 'Roboto'; + font-style: normal; + font-weight: 700; + font-display: fallback; + src: url(../fonts.gstatic.com/s/roboto/v32/KFOlCnqEu92Fr1MmWUlfBBc4.woff2) format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; +} +/* cyrillic-ext */ +@font-face { + font-family: 'Roboto Mono'; + font-style: italic; + font-weight: 400; + font-display: fallback; + src: url(../fonts.gstatic.com/s/robotomono/v23/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEluUlYIw.woff2) format('woff2'); + unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; +} +/* cyrillic */ +@font-face { + font-family: 'Roboto Mono'; + font-style: italic; + font-weight: 400; + font-display: fallback; + src: url(../fonts.gstatic.com/s/robotomono/v23/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEn-UlYIw.woff2) format('woff2'); + unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; +} +/* greek */ +@font-face { + font-family: 'Roboto Mono'; + font-style: italic; + font-weight: 400; + font-display: fallback; + src: url(../fonts.gstatic.com/s/robotomono/v23/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEmOUlYIw.woff2) format('woff2'); + unicode-range: U+0370-0377, U+037A-037F, U+0384-038A, U+038C, U+038E-03A1, U+03A3-03FF; +} +/* vietnamese */ +@font-face { + font-family: 'Roboto Mono'; + font-style: italic; + font-weight: 400; + font-display: fallback; + src: url(../fonts.gstatic.com/s/robotomono/v23/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtElOUlYIw.woff2) format('woff2'); + unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB; +} +/* latin-ext */ +@font-face { + font-family: 'Roboto Mono'; + font-style: italic; + font-weight: 400; + font-display: fallback; + src: url(../fonts.gstatic.com/s/robotomono/v23/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEleUlYIw.woff2) format('woff2'); + unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF; +} +/* latin */ +@font-face { + font-family: 'Roboto Mono'; + font-style: italic; + font-weight: 400; + font-display: fallback; + src: url(../fonts.gstatic.com/s/robotomono/v23/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEm-Ul.woff2) format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; +} +/* cyrillic-ext */ +@font-face { + font-family: 'Roboto Mono'; + font-style: italic; + font-weight: 700; + font-display: fallback; + src: url(../fonts.gstatic.com/s/robotomono/v23/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEluUlYIw.woff2) format('woff2'); + unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; +} +/* cyrillic */ +@font-face { + font-family: 'Roboto Mono'; + font-style: italic; + font-weight: 700; + font-display: fallback; + src: url(../fonts.gstatic.com/s/robotomono/v23/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEn-UlYIw.woff2) format('woff2'); + unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; +} +/* greek */ +@font-face { + font-family: 'Roboto Mono'; + font-style: italic; + font-weight: 700; + font-display: fallback; + src: url(../fonts.gstatic.com/s/robotomono/v23/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEmOUlYIw.woff2) format('woff2'); + unicode-range: U+0370-0377, U+037A-037F, U+0384-038A, U+038C, U+038E-03A1, U+03A3-03FF; +} +/* vietnamese */ +@font-face { + font-family: 'Roboto Mono'; + font-style: italic; + font-weight: 700; + font-display: fallback; + src: url(../fonts.gstatic.com/s/robotomono/v23/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtElOUlYIw.woff2) format('woff2'); + unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB; +} +/* latin-ext */ +@font-face { + font-family: 'Roboto Mono'; + font-style: italic; + font-weight: 700; + font-display: fallback; + src: url(../fonts.gstatic.com/s/robotomono/v23/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEleUlYIw.woff2) format('woff2'); + unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF; +} +/* latin */ +@font-face { + font-family: 'Roboto Mono'; + font-style: italic; + font-weight: 700; + font-display: fallback; + src: url(../fonts.gstatic.com/s/robotomono/v23/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEm-Ul.woff2) format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; +} +/* cyrillic-ext */ +@font-face { + font-family: 'Roboto Mono'; + font-style: normal; + font-weight: 400; + font-display: fallback; + src: url(../fonts.gstatic.com/s/robotomono/v23/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSV0mf0h.woff2) format('woff2'); + unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; +} +/* cyrillic */ +@font-face { + font-family: 'Roboto Mono'; + font-style: normal; + font-weight: 400; + font-display: fallback; + src: url(../fonts.gstatic.com/s/robotomono/v23/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSx0mf0h.woff2) format('woff2'); + unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; +} +/* greek */ +@font-face { + font-family: 'Roboto Mono'; + font-style: normal; + font-weight: 400; + font-display: fallback; + src: url(../fonts.gstatic.com/s/robotomono/v23/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSt0mf0h.woff2) format('woff2'); + unicode-range: U+0370-0377, U+037A-037F, U+0384-038A, U+038C, U+038E-03A1, U+03A3-03FF; +} +/* vietnamese */ +@font-face { + font-family: 'Roboto Mono'; + font-style: normal; + font-weight: 400; + font-display: fallback; + src: url(../fonts.gstatic.com/s/robotomono/v23/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSd0mf0h.woff2) format('woff2'); + unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB; +} +/* latin-ext */ +@font-face { + font-family: 'Roboto Mono'; + font-style: normal; + font-weight: 400; + font-display: fallback; + src: url(../fonts.gstatic.com/s/robotomono/v23/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSZ0mf0h.woff2) format('woff2'); + unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF; +} +/* latin */ +@font-face { + font-family: 'Roboto Mono'; + font-style: normal; + font-weight: 400; + font-display: fallback; + src: url(../fonts.gstatic.com/s/robotomono/v23/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSh0mQ.woff2) format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; +} +/* cyrillic-ext */ +@font-face { + font-family: 'Roboto Mono'; + font-style: normal; + font-weight: 700; + font-display: fallback; + src: url(../fonts.gstatic.com/s/robotomono/v23/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSV0mf0h.woff2) format('woff2'); + unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; +} +/* cyrillic */ +@font-face { + font-family: 'Roboto Mono'; + font-style: normal; + font-weight: 700; + font-display: fallback; + src: url(../fonts.gstatic.com/s/robotomono/v23/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSx0mf0h.woff2) format('woff2'); + unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; +} +/* greek */ +@font-face { + font-family: 'Roboto Mono'; + font-style: normal; + font-weight: 700; + font-display: fallback; + src: url(../fonts.gstatic.com/s/robotomono/v23/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSt0mf0h.woff2) format('woff2'); + unicode-range: U+0370-0377, U+037A-037F, U+0384-038A, U+038C, U+038E-03A1, U+03A3-03FF; +} +/* vietnamese */ +@font-face { + font-family: 'Roboto Mono'; + font-style: normal; + font-weight: 700; + font-display: fallback; + src: url(../fonts.gstatic.com/s/robotomono/v23/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSd0mf0h.woff2) format('woff2'); + unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB; +} +/* latin-ext */ +@font-face { + font-family: 'Roboto Mono'; + font-style: normal; + font-weight: 700; + font-display: fallback; + src: url(../fonts.gstatic.com/s/robotomono/v23/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSZ0mf0h.woff2) format('woff2'); + unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF; +} +/* latin */ +@font-face { + font-family: 'Roboto Mono'; + font-style: normal; + font-weight: 700; + font-display: fallback; + src: url(../fonts.gstatic.com/s/robotomono/v23/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSh0mQ.woff2) format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; +} diff --git a/assets/external/fonts.gstatic.com/s/roboto/v32/KFOjCnqEu92Fr1Mu51TjASc-CsTKlA.woff2 b/assets/external/fonts.gstatic.com/s/roboto/v32/KFOjCnqEu92Fr1Mu51TjASc-CsTKlA.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..d88dd2b865729b9e220b2f6644a4e42ca9757525 GIT binary patch literal 10656 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 Gr2qidA)JB$ literal 0 HcmV?d00001 diff --git a/assets/external/fonts.gstatic.com/s/roboto/v32/KFOjCnqEu92Fr1Mu51TjASc1CsTKlA.woff2 b/assets/external/fonts.gstatic.com/s/roboto/v32/KFOjCnqEu92Fr1Mu51TjASc1CsTKlA.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..317f651efe77aac3beaa1de48b60c15d5154f833 GIT binary patch literal 6144 zcmV+b82{&YPew8T0RR9102lxO5&!@I0626202iD90RR9100000000000000000000 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 literal 0 HcmV?d00001 diff --git a/assets/external/fonts.gstatic.com/s/roboto/v32/KFOjCnqEu92Fr1Mu51TjASc3CsTKlA.woff2 b/assets/external/fonts.gstatic.com/s/roboto/v32/KFOjCnqEu92Fr1Mu51TjASc3CsTKlA.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..e0934d94e95b8f6fa1d541448b9f646e05c877c5 GIT binary patch literal 16756 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 z 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

xNsgs2dmYC5`1PTpk@S_3cRaIRb_hK4 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 SYkI*7T8CziX@4%b5&!^*pZ631 literal 0 HcmV?d00001 diff --git a/assets/external/fonts.gstatic.com/s/roboto/v32/KFOjCnqEu92Fr1Mu51TzBic0CsTKlA.woff2 b/assets/external/fonts.gstatic.com/s/roboto/v32/KFOjCnqEu92Fr1Mu51TzBic0CsTKlA.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..efbe79a294d2a5816017ca654b2c0071e9de9d5b GIT binary patch literal 13104 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 KuVs;F0RRAvJ12Dj literal 0 HcmV?d00001 diff --git a/assets/external/fonts.gstatic.com/s/roboto/v32/KFOjCnqEu92Fr1Mu51TzBic1CsTKlA.woff2 b/assets/external/fonts.gstatic.com/s/roboto/v32/KFOjCnqEu92Fr1Mu51TzBic1CsTKlA.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..ea329ab8262310d36eed5cb3aab74c8548b0dd57 GIT binary patch literal 6148 zcmV+f82jgUPew8T0RR9102l-S5&!@I06H)L02iVF0RR9100000000000000000000 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 W6iz@`zsu3k2CI=u4f-W1L2ml5i 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 Wzk{-4rd()5mu{-TrML#n1pok0$Ovx$ literal 0 HcmV?d00001 diff --git a/assets/external/fonts.gstatic.com/s/roboto/v32/KFOjCnqEu92Fr1Mu51TzBic5CsTKlA.woff2 b/assets/external/fonts.gstatic.com/s/roboto/v32/KFOjCnqEu92Fr1Mu51TzBic5CsTKlA.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..1283c45d72b3fb4f4c96927ca56c33b35958c230 GIT binary patch literal 7464 zcmV+@9oOP_Pew8T0RR91039d*5&!@I06L@q0368x0RR9100000000000000000000 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 literal 0 HcmV?d00001 diff --git a/assets/external/fonts.gstatic.com/s/roboto/v32/KFOjCnqEu92Fr1Mu51TzBic6CsQ.woff2 b/assets/external/fonts.gstatic.com/s/roboto/v32/KFOjCnqEu92Fr1Mu51TzBic6CsQ.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..851fedb92bd64b3ae2878f6f7a90841cff0d24a0 GIT binary patch literal 19780 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∾^te@a;W{kKTTH#0o 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,iiBZ4r}M?=1_X-76&vmPP-mBe z4Qx`GDoQz-p zrDv+Tq|wj3NPrpeAJqc8FGB9kk#zDakzLT>MQ_lJQM;t_Wn8d_p>D9;?}`=Udkvms zLn7stPckQ**u|x=#Pi?|qov4Lg6zqJTJ|23e(icAT8(-yGL^0C*f&)tZKYfw62VoR z2O<-7_}GN(L9FHraG80CBF*>X_g#-7uOT$?P*fxa3~jub-EAAPr57P8!&s1ls7*vF zO(vn8C#Y#;SrpEkkS`%j{arXftl0xywkQ=UD&mA|u3hvyB~t({*iF;excGoilZ5?GQc`FbMOp%sS}9B^~>|1^GJpV=>; zA?nEzYvu839O;m0K24)tPps2k3P~VG!(imry#l+@qnICSSM3Vzo zMM3vG@7sro`wNZ}@dDm}enY0s-{GEAS4xp1rx;0crVYJzg5FA9SbbF`JqapaS}$-0 zzLqceV|M6A3Rjv|i8WP>2~T2q$^V9`KUlUXs~gX~z!&O~`5uDMz`t|W?+&x;%UxV6 zt4MF4OwfUJK?MiYS2MEeVDn~w6<=0MEB721)ltx+wz0JOS>8bIfszU<%#cBr$sE2YTow*@!GDVSxh?kmo^P77N#;JPqvU)o zzK|*J*#1D6#cvV(S2N7tvR`23VXzb&1s4IKnb`oWUQ;Yd=89)o6<_4&o8K#t^<&oh zNOP%q)buRYc&cAvt&WrzuOHPf>QVKqI>~Zj4ueiU7#WZLWE0WaARs*_IOe!{P5O)aW;K{ozjbw>V4bYHO1w(?oVGE+6&MU(KEkjc_hNU+IV#Bd{2FxV`hT3qcGz@Kp zG2}rsWVlsOhPW{qYylavP#acs4QGfL%qa3n94Gk;QXhIZ@eL`$l)~=Ema5lDy*O2Y zRL~iHdk1zY)J^<`BnEklDKsb%kTM;h0)TD~LQrBQ6HY@V)x_JdsnH8%8dT$BSveuD%oNflzPU5bhi(cTNQw`G zGB;-L!eH(?gB+~sMp)08M3PRc8(})Xvv!F_yQ!n=5O)=w(>0sh_i>RM z2HIprFRChm2Kf6e-I*5G>dsw*&L4A(mJBs{3tI}~wuEW9%DXMAnb`WRM5ZwR{)3x9 z+}~t64z;)j$Y9u#dzW;^9*5peP;4LYrj@9z znnf#O-O}(|PVd`*(yWcoj0$XvZKKgsuh*FQdeS}M|GfnMe+T&QJK+Bp1pd1#|Hu(W+RpZEBjH(YDe!XNIz*@=nxmr63Q0Q1EnU*El0lBeqa-TI{#@Quyj2u{BD)~%scA8OG4YggSGZf-8WXgMPM)3NnjV*2lkL%Q1#-#Uik~1+)sAI z73bEE_LNHi`d^p7Br1s&vx5kLS-0R^@!A_!PSA_O)H08aIU+XKYJ)U=<;;470Vqol6=cS-nG?vgjv0vF5y5gnc^6SP7Tthgxygd%l_Fz zSZI|WTRdY37@q}3s(7cfl=B&T%5X{`Rov1Ga(Q;7RVI1+fdCejUJil7bm+0of7k4ZDvrO&OYw1YPISSTsdwT z{*?U2_&d=zc=wfji;w6x&mEp{$KHcGM^}<>@gw&u_l5h5`;I2Qle@Y6%p1WgBfT*&}6i literal 0 HcmV?d00001 diff --git a/assets/external/fonts.gstatic.com/s/roboto/v32/KFOkCnqEu92Fr1Mu51xEIzIFKw.woff2 b/assets/external/fonts.gstatic.com/s/roboto/v32/KFOkCnqEu92Fr1Mu51xEIzIFKw.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..8f20a2cc1b0b8dbd9f75174bdf248cbe800b50a8 GIT binary patch literal 1516 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 LrJ*q=4PyWR#vvox literal 0 HcmV?d00001 diff --git a/assets/external/fonts.gstatic.com/s/roboto/v32/KFOkCnqEu92Fr1Mu51xGIzIFKw.woff2 b/assets/external/fonts.gstatic.com/s/roboto/v32/KFOkCnqEu92Fr1Mu51xGIzIFKw.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..e1f558cd3f7c412f3e42ea6533e2855ca8ae5830 GIT binary patch literal 13224 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 literal 0 HcmV?d00001 diff --git a/assets/external/fonts.gstatic.com/s/roboto/v32/KFOkCnqEu92Fr1Mu51xHIzIFKw.woff2 b/assets/external/fonts.gstatic.com/s/roboto/v32/KFOkCnqEu92Fr1Mu51xHIzIFKw.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..688c713dc6860f28df2bedd0a642c868f17b94e7 GIT binary patch literal 6144 zcmV+b82{&YPew8T0RR9102lxO5&!@I05{M802iGA0RR9100000000000000000000 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 Si literal 0 HcmV?d00001 diff --git a/assets/external/fonts.gstatic.com/s/roboto/v32/KFOkCnqEu92Fr1Mu51xIIzI.woff2 b/assets/external/fonts.gstatic.com/s/roboto/v32/KFOkCnqEu92Fr1Mu51xIIzI.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..9dc0be8362dd3302d12382547e46cb7ae2c8b6be GIT binary patch literal 20144 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 literal 0 HcmV?d00001 diff --git a/assets/external/fonts.gstatic.com/s/roboto/v32/KFOkCnqEu92Fr1Mu51xLIzIFKw.woff2 b/assets/external/fonts.gstatic.com/s/roboto/v32/KFOkCnqEu92Fr1Mu51xLIzIFKw.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..3e5facb890d04bc7fcf288ba7cd1c9403369fb30 GIT binary patch literal 7724 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 literal 0 HcmV?d00001 diff --git a/assets/external/fonts.gstatic.com/s/roboto/v32/KFOkCnqEu92Fr1Mu51xMIzIFKw.woff2 b/assets/external/fonts.gstatic.com/s/roboto/v32/KFOkCnqEu92Fr1Mu51xMIzIFKw.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..1125cc0127468d17764e277be8ed3ddb99969f4b GIT binary patch literal 10492 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 }h677(3&d+QGjo2Bjr`Ny}< zY%TL}wir6--6!oALyYI}RevGLyFk?gW|Ohdn4O$8Z?u2>tpZm(kN-H@(~~p#tq(aw z7rve_oU8`ik)<4yzY9^GB5>gerCwTil8c%lgjAj+5skQqcgTB@xcc6H zyvKd%XqpmKaknHo#?cdMaBEjpi3!Z}^Iov)1?ck(~s5`NO)+z4h)C$96WL+4o| zZv~ys1O}%Q&Z!rFe$;jG;OM!6%ZcEAH4N8xE3W4k4fh)NdBgI!lXL%uJO2ou5Im*; z_V!`l%xUcWqrLqPI#UB{>|jl;{+~P8Qw>WrV6TWdXYiddSmR33<-xjQ^yh2*OM^Ww zqAfXeqq*EyAHzcnm;2vS`nhvi$|Cf!yFMJ=W$1sf;PAl%xAn=NS|72{KA;+D=${FU z=+07(aHJh$&2od%5z3J9Q56q9P$C5BK%S6079YU0*0k3kDk;N8^=V=SEvMLEeH;iW?({YJ9O)`O#nL#9;D9INWhdY14CV8I& zEU*R16eo}q?ZdS}EC%r_9H-~TG9f{nLk5Z_Oq8F!nTiQ(X|Ah6 zHQ}-&Jr1au@Ev)_Z1qfp(nOw(s)-olZfPiQLUUt$EHws6RYHHbiTvesqrl!ICr=|2 zaVCoW0V8$#ZB(91NGpM9Itgzk0sq-zozpx8C}-M91rkk1KcvbSYkJOfKq@oUmb#ew y#I$^|WlGG%D4J09DyDNU;u(P2v`Y&JP`~Efq{7QN(+J<01|;10X7081B5gLAO(Va2OtcB zIvXcY73|ncxE+8LMfX68BG@<(Vm#+W5o{bl2>rHvd5imuJD@?rPUv@?EH2MKEtbc1mIY8>|mRJ4Z5exE$B^ZmxOY=v=9%Q zUUh`VKFQ_z|F`?+o2P1@s{200OkxZobVDQW(YeIChNrpxy9E^+ZP6l3KtPjRobgVs>-k;#zYW#s?VvQDF8WyL}b@m#W$B!xGAz)2?%u*q)E~KV#(Ya`Q7j0?(X}^B;UBrCx{f*FmiDW2c zc2>`uUDm!l!FJKX-xo88CRsF;K~$niNR&u}MyT{`9ejV8_P*qxE~J}SngF3PR(!b4 z?Dpw9I+xvYh~#YQlMsS$$?@MMx{@v)J`b1-e7o)EXb^+|aMhzI7X^~i4Iwz1Ald?Q z#)CLZPZ+QljvR$ESK-cGT;nN-$ii2s2$xB^0xU8SHhI6yDl{2F9e0AA8<4p?Dl7oV zTpi})4`gm2Mg##FD1g7En_YipSPIi^<_-H<&X3y#ZxWm85Y8o-j3y@qt=UJNoV{T6wtLPMVs?6* z69v@#gg$|MqxpAzP^Fpnb-iie_&3Vfyps8>^V>W#k*LND_hb=0c~f;-vc=?1Ca86%mz={aVOxY)1XO6up1bdqQ!_6Cq=4snIMXM z@jws+EC8@7fYpftSkta;6s~r;2uTQ104)-E002PP;-j|FI(1l!HqqcV@!-dW4AdqF zHvw+}Um=1UKr8a{24!U8-!_O=zt|f>wEj_L*V9}wI^D#2wwBMQHX9`Mgre?1wSo^H zNeI}vJL+rG0BaEY$E#+r?D?5j8G zGWF`fgoWUw)`SJ$L{HD2$_PYuZ)KegQ1_qeJ%UjA7PZ`kC#Qav7^KoABbX#EI5`{> z&AGW;6Xl}3oMH$!9yr8{+w8OOnS<;LYY(vwnfjTA*+yWgxx}F-br*x!Fk1f4B-n-1 zmt%xDHB2sSV{+%lf*~_d#>SoT!jcDv}3Xf-kcAa=NX$px`)jpfbIhfc_UMp)fJ6jETvF7 zxSh1e0klV(=AKwaItx@zX`OAhYCB{>2K6W;>--R%pHi?^oMCoL;B;ZyV8&!YmShEM z8|R4ZU=MO47dnq95QB4rI8ZV&*omT;O)5$>nVIhdC%Hg5O9rb_E%R^<8Y(rj&ImAf z!Gk~@L0cno<_WY&%d|)fwA_7}xoM;41}&P)GC^Y6N?$_SN*~xhg!⋘iv5Y-g@w} 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 WvBs=}zzEW=AzKWF*C#4aH~;{?1*U}n literal 0 HcmV?d00001 diff --git a/assets/external/fonts.gstatic.com/s/roboto/v32/KFOlCnqEu92Fr1MmSU5fBBc4.woff2 b/assets/external/fonts.gstatic.com/s/roboto/v32/KFOlCnqEu92Fr1MmSU5fBBc4.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..72226f5df01b19b5db8e7fe8df16d93bd2a646d3 GIT binary patch literal 18492 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 ODwAE}GN`$r3kCvP?5KJG literal 0 HcmV?d00001 diff --git a/assets/external/fonts.gstatic.com/s/roboto/v32/KFOlCnqEu92Fr1MmSU5fCBc4EsA.woff2 b/assets/external/fonts.gstatic.com/s/roboto/v32/KFOlCnqEu92Fr1MmSU5fCBc4EsA.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..a26ba157a533ab9ed979d512dfb4beaa890547d1 GIT binary patch literal 1500 zcmV<21ta=*Pew8T0RR9100rCt5&!@I016NQ00n*k0RR9100000000000000000000 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 KFPNT{g8~6O0t27` literal 0 HcmV?d00001 diff --git a/assets/external/fonts.gstatic.com/s/roboto/v32/KFOlCnqEu92Fr1MmSU5fChc4EsA.woff2 b/assets/external/fonts.gstatic.com/s/roboto/v32/KFOlCnqEu92Fr1MmSU5fChc4EsA.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..14af54ae68c055ac99aae4c52872fb2a1a3338ee GIT binary patch literal 12324 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�TIFZa7msJCQ7lD6Q zfp4IY*T6sTqA;u?ybooHM>cn_ymTLEiifny6-RM?Lc0!ATlxZ*0>yb3_k1LJdW#!P zuroq=#@x#`;D(W}WPrVb&L~2_2J?}&2@oTUyG;ZU4_e$zj~U`<4?_+hvNjQ91mc`z z$oI&MSxI;icjF&uqzvUux<7gUk;&|=p)^l0YRDACKS`a!&Lnjf_c4^MhL0Pl1@Z>j z$Vw8TJsmw{CM!cWAxA24URFw8H;kVNP{ux|1kgRmIb^a!2xbEE3v&S(uAC3Za@G<6 zIfh<mIF1@Z7nl1-!5eM&&2oz1Xm(b?JIM09Uzb*@`)oto_}Gp*i&94w!G;ItWMo~EfXV1W2!*FX7)dN2 zq0{gy?VbdSCLARhEP!89_Ob{h5s#b|bB2uBaAZuK7A#E;XnfJo(WtW$fYR=ooRNf! z5P;?~OjSCLwo~*(teHH;0qL5I6wHS*EccAD4FAmrN2?o}k%4PTQ#7=k4@N3$?lM1E zL%-qRkVCZ{;=RIjw%G=?<(&LK26uZ-RCGaS3%abLD6n`6hJ<=5aET9~!kl}$>3~^bMo3}1aJ#X@Z=z!4DOQe}fbnIDtG7J(u-cB&_xlZZkGL~<@jXXYg^ z2}q+Sony<;n0%(4IY4r9B@>Av0TDsj=OZ-PfJrdF5t8dk=Uig)ndi)bc|o72fiY;1 K{Md0Q0ssJ$#ip15 literal 0 HcmV?d00001 diff --git a/assets/external/fonts.gstatic.com/s/roboto/v32/KFOlCnqEu92Fr1MmSU5fCxc4EsA.woff2 b/assets/external/fonts.gstatic.com/s/roboto/v32/KFOlCnqEu92Fr1MmSU5fCxc4EsA.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..a7026d4c3afd9c83ffe3acd3bc4dc11283dab930 GIT binary patch literal 5688 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 literal 0 HcmV?d00001 diff --git a/assets/external/fonts.gstatic.com/s/roboto/v32/KFOlCnqEu92Fr1MmWUlfABc4EsA.woff2 b/assets/external/fonts.gstatic.com/s/roboto/v32/KFOlCnqEu92Fr1MmWUlfABc4EsA.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..41637e58ca4a6076924871c469c506fa182efa19 GIT binary patch literal 9780 zcmV-4Cd=7(Pew8T0RR91046j55&!@I09yC}042}>0RR9100000000000000000000 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 KxLqU10{{SCezoZU literal 0 HcmV?d00001 diff --git a/assets/external/fonts.gstatic.com/s/roboto/v32/KFOlCnqEu92Fr1MmWUlfCRc4EsA.woff2 b/assets/external/fonts.gstatic.com/s/roboto/v32/KFOlCnqEu92Fr1MmWUlfCRc4EsA.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..660850eed0f9b98671f9c00256697e81f9431993 GIT binary patch literal 14740 zcmV;FIcvsuPew8T0RR9106CNZ5&!@I0Ek=w068uI0RR9100000000000000000000 z0000QfkqpWS{yV6U;u*x2uKNoJP`~Ef!+*(#Q+O~UH}q-cmXy7Bm;*y1Rw>1eg_~7 zf+-uecooxao*=ga0Hx|IZzMw4IDnAA3kKX_*f{X)z~%-2e@vh$Q-nEWGnEsez2Dm2mn15xqxo+c% z1(S zr#8gWo$p=`A4zP=y1cu0f@wfk8Fq`#Z4O1_%B3H{DfrTUnrg;e2_5Qoh?fDgD>(K3 zROiJs8Mga57TXboRBHrUpv?ugsR=Wo>eYm!gFwpxs`NGwR>Bg<&E(o%1xtmz(6LbX_$(p1 z+m5=1+4dzs=_;Kl1@K?6vMCS%wK=n7*OR!h*HK&L@B3?a4}a(d+yvwxIsl8HhUf3s z%Iy2yzq38*&}_mga|pr#3VT9ExZkgPoBm)g@ocDP!n1*;x`6hnCtdmRZPK}1B- z-7|&EbHBTcsXf^4Tt5g3_;@j7Zj-J5ru)tASXLi3w35(<5~R5f0<*V2LQg?BiQp{A zh#AO&1<0B$$esfvS8gC5z94`8pkN`ONHL&zWKfc1P`Y$brd&{wVo;efP=yLmjT%s` zOQ0*RfEqM_+I50@P(jx%f>x}6zW55-@Ers}zyJZV=LF~g3y`G&wezl1OT>55>)i$M zopyJ4PJCzYK3owW6u={|-C3vHT@gJX9v&zNKwl5X08#da0&=-BiU&K=zNP?T`HFbL zgRcxrud2lOx8`+!c>^jI2|RE$nsUYv;yS`|RI1iOt^7hGlfN>!Xk@A8b zsKd2?QLGt5{X#IN3~#B-+$Dg8jIRur48jdCyQ!~7qsv*HXlK2Lx)4p1-U<;=8rKUD zp_}zR>I=A)Zmd*ru8Y7y6M_jOQ|!#3d7|S3!xsxb3`iIRVh{}@28&!!AvQ%Yim~Xx zt`k}xW>>MIVss7K4H!4ExDBBntve9zqV)icf#@Nc-Uz@L#bO5Z5YjB9XXre~?FF@@D{rKmla^uQAA$1wCh2al6FdN%lLaI(J)A zlQX^0*UahGH)~|i{|VU2<(h4Lf?uNYJk(_eml>!4X3UtpgM zJvX+AX}~>~2#CwK6(=k5QZnT@pew^) z!8?I;p=8hvWet$?uv$b2YE4hDkunp#7Lu@hT&c)5Q^u^o2cgf(K10?K@AM2<_=FWt z1N;^2fVPb6nApK>5fR^sGJX&-pJ_T)AgizyL(9gNFe@y;TE+_n(_rGt3Dn??JT~cD za*srQGEL-l>KyD9qCWE%!(8JW^2)zWvNuJ(nWN>;KTH%$jT6ubwWfqXae%f$B8(w?kjT%#v%-3Y>5M6OS?#Ea>il^}=mSR5FLa>-_X$Q$UokpVl;-_>g%VO@(OV8OGK(__NC^P~Vv%{_7Ubp#3)W9)!4im)aX zXXVA!wPCBnnCq_)03-ZfKobu)AiVvEAw13+AB`FUdEBvOApC0FIc)=aZj1mwB8k<@ z!1&chfE3>dCmTvazVb2xCSGQj5WQ#QHn;R+`S*G+gR(kg?< z6H)9F!%{wzB%Z191piWFh~FzeEV93z*GPLbj8j{}N^u9nt0;zPG9^+5HC5#`pQiz% zfkmlA401)*L1bygq2P3Leq%#Y;WHZ13}*Q}hd)<4M4&jERs)d2yQJc@{W+|(!3p2l z$Wm0o?@hGJ5cs_ob*DXL2ZNCkKTe$y6q)nW_{TS<+|>rJ=szt&@p+CO6)t%BtTQj5oOV%JRK_(z|iz$ zC^IDdHsmzQaL9C;of30znmg{B3#K7!;>PLtC;~%XlH*Qm62+ElF{mz*1($ZKbu1Ne zc&|9|+z@!`XeBmfv6pe2C^67tBaJhfCt3_$n~3G4u?{nwg*C45hzGnAYY{W%(jg~# znz=(J_NnN2%j+`ZDW%3bd1Tn#hWRJLnJn@}o=1_jRk_i#cCPfP*R6Sb{snJaBWf|K z-DaBRsp}U*UG0epaw-_I-Dg*l#MUN|U?GRcqxouZjB|f#lis3<8W4X%!WrG>b!ifv z7YEDuzo~Of9q9@pDA3fLh_3=zkr4Rig*@LSVK?xYe_Y8Fb;8+L=zL9)Na6m`)#Ep- zaEKT8Utzm^7$o7*U(skO%$*-ba>7!b40ZGE`_qp^pCSKznporxRBD~K37 zl3rfCyX0vwo*IzwM!_{njf-?%oGqs7=iW(Y(RDVFPd1`2HBe#jb(-MSBxfnCiIrS= zIR_@QxCQYskd+xtXf@y4DFaP|oY%9;G`3f4m(SQt_qz6=E$4z^ueVS)L4l$<`_vhx zF-x5R3TSK<5QEMJ@3QSV`|OYi+ZlRJXzmY{@UEVjiO%&t-_$b}e?$^W&*-rFMKwy1 z)0NrODu53yRFzgar={%(jjKi=Q*l$P4CpG3;Bv9`BW3V^-`!r@Ez_o-|EJJe#xF{= zOP)R?Ip!ndv1{ghn33$Wb%z8*Edm=s9rBXLHJaYd9);n8ga?w*m{xyrO{DQs&*{dU zIWM9{So@yb1J!7GSIYUrI;{42AD)h|IJ88q8tTbBWcy~X zBo*YZ)a!0(x|bX(s@P#&1`i3t5GOJ1V%(Y&$Ek6Yka~;AipH`!49yH{8;*k_6~{!4 zheIALb*zd-R9v4Eap81T9=psak1M21i%VOa#u^u+j91sPUQ7=d)_JU9pv7(ACh6eL zbgCFJH~lk2v9He1%;JY#A4^z`c62h@_?TxW^%L$JYoj^Wg=XzlDXBh};n{)NxN0(; zvte;*G4|$Svd+gV-)_-AcaG&WrL6$~gt)`_rcSrsbFzQ$jZ_CtX(_!~p=S<<$~;La zz+G*ltl(>KSLIpCs(Gq?yNZw(pAE_$@G4fqT{sSEwxZU=3`qZUZ%*#L0$j6R$_QQVYuYKqhJH zdZym4ejZyT0DI(I6M@FAIC!@vXrRq%yCe%5n+^($(Lm3*QN~^s9>A%wNdn&NTO42) zgb8XU<$mp*vKpuWRJfEmT*JIoI)&)Bz8?||jisM&vW;)_V>D2}WtrPCHypJZOI9bq z&=wh37wm3-LU2iYoBBxbatvegPIW{Wyc1^RbO9Z-EW5~{h_D$n9QvVD^tQJMmeQPT zMcWgdZYNv6V`d_6B?p@XHio=5IWDSg1Z_}H(dTHQILd8tYal;NSd+`Ysvp?1&1@`~ zs&UrCK5)alW|1|^uJGB{zBD%PpXfAyAT^Vl4{pKs;=XO%k_UI<&Ba5Tc4z&CSu)M; zpGGraI1U+jkurBlg4(Aij3e8K^o!2+q`01#M3&60OepjCDAou`}0Sc66#yzBwvZph)Rwd&C8p#hWr4SLNQ$!kg55m;Aq+tef-#TGDmnLv z#sIX-Lmo7{E8>y~$Ee=sK|wF7JCJqmCFk2^Q!%T)TmNCwvk`WGU~_R#d$=pEn`MKW z=?G1s`}lwSxUlkW=1d&|Ea_@hEbrVrv#QIq9tyXiS_Xir*x1p?fRK(*N}dIKGWkx{ z?WV}0>Uq?(YJ1~|S@FXCV~ypZ;YFlJ@UMiAVZ2Kxrk*G6aOSt-W;knU9p8D-ar>$< z4v$RFiR}!x7&R{1?pv~PmvCAm2|0PsFhAx05YS>g**t4$ZL)R)aR70G{CmAV|JCsB zw=n;}^hnbQPr15*z6zmj#j+Z>J~Ujt(Sf+5Htp(mKm%q&c`?@L{5lJb{Wt(SC2GskoE>6K+WVH z=XSmSf3}p=XaC591j zB<`Vj2i5@OTK$-4FeHRy)+I53EVC#n_E1MpH4iGcX_g2;tYW5UBSpNs6ptZTLoxvS zrnLrxkd`DdoTF5oJyAcBJ1hzxSx#i z%Z*6rmJ8jG#JeF?7J^zj36T7G7fgY$&_({U>3C)zNlol3l^e%J)x@3&xh-I5S-Q%) zp^5>e7TMV8MY$$>*X@4_7@i$GLt%DGepSUQxEQus{I<3rHwB$(sIe5UmEE%S4A6|T zJ54THj@GgOA7LDU2Q(wz!q@_DK2mqLP7AbBd3*(U^aSz&%_voTx{tR)eU>-#-09xp z&%B+im-=5<>+)Ugzjd;=P6s?UdR=S4*BA0;a{0856Sn)hm}8#lp{ zky*>Y-~fK$&Q6nz*o}Lvdrs}ouYYjk`ClzJ&ZONq*@$KcNS7F$UT$EOV`cdn%PlGA z1;ljJKkF~-IqLrfvNTN1%)ic!t@YKh?$Pyg&Y9C2)3;xOi{ch+?9*Dos`d9m-eM|& zvZ;Q8>^#xO0UEJ@k792>_C5cVQ3S>D2QB{f(e4@?Vu3b30oH#0Wvyr0{YuTXh5j!| zPF(Si6~h5q;lfeD*(v{hC+%o|BPf6&nBM!q0O{A_VAaqnknkV;inj$F>FsMYrfP?BCK+Qee{(RUWn( zvQg0zm1k47LDWn&D4$eZB74q#($r#qPqik>1!5g}ZmO&3@hI6TnH#BVm>LI|nw&Q? zd9I*LG$Nd}Fji7*{+ITQQY+o{_Uk8NE`W55*)rY+n__ujA&*4s4#I5IRf#%s@-5CGQA{Bzr`+xRKDJ{C*wX?i z%jMG|d#CHkM;{A{!J8e##+720a7r?%&{t-_;+~P(Yi+bbg1J{DOHeqUr;B%h-0FVT zV6*aIW6l#z6FnVmV?9k#(bi)m8vm{pf4qX9*W#aF`6-A#V~AegMf0lY&JPp~-~r8e z7q7~m7|RuPwehL+8w5k`m4c$p6WREzKO9150sR;FrH(cFr7H)h-E6>099_^a4E z+!cb-s_t@k9_iQ%dXbIF5$&I6j_;OY6@1mLt-Q3A6`jIQ3OX8RaL}%02@=WNU$f`E?MD2Zc(KG%_ub`6g?Hzi5Y!s zVe02IHjv2!nUQ`HWBHxHVv93^*>jCal(){Z`I!Ey9{>C`F^h=t^#CN|SG2OGnPjby zJO3`Tt{!nh%Kyy7a!*xqo!LUJ%t}pz^Kqf&mAR*?4EdIuHz59SZe9W$BnW6m>Eq#_ z(YeV%K9s0PXc@H3R9KLhRbDj8F!*@q5#wmpgTmaLG=^e4*AH0^aGSlWTw~rtM~lph zP-bOab5}wVhlyCiBHjp=W|U$}(_dY1vsEG@{XdrnRbVSZ7R&uD{yCiUp|t%`GttmD zbR;Na%Xj(*pZ{pCHnJyM2;R}US9wI8pZMQ@39I6zYiVw0NHDZIXMOoWdp0st<|YA4 zz+MWh!x3)#R{tvBp{3eSIN+j8#NtgS~^N zaLNtq2Hc#8(MA@mf3b$m|DG1kxkdEFbpLzy?i&FoEd9jZ#ZuqE$=cD9zuect#om}T zEauijzrlIJW`4JVG&LHWi`GrzHx1p zfo6F@Y95Ta2F0X(l74kG=@Jl=_Q}f^MWDb}8@n?A@qS=QXvveQjUB{%HZC9ezN8cJ zDH~UWdQ(@9d{^Klp+^8hb93v*a4jx_-X_`}aFUUq@)j0y~aA551)O!|^_Q3`f9SQpGlVHveh1%WXO!<#0Mv9$i`Gv5%%5J0|t`}?wM zhIm0&@+9-xFVzs}>U}}Yih2>(IRr}!Z`5=^6B0=9wO-&U*sAx3;cj&0s-?vTj8eS) zQhexx9^>7pxuZFjO}JNE)OpopLA$GRzxNr`NP@0DX{yAA9Lf4&7@ypp-=yS~sH>Ls z>*CGJLv#wrvf_P4Dc;-CCm0UeZE&<MhgI+LNwr#k0a8a{tl#HYe9O zLE6v;*FTmj|NTxqSHgJGcN|ZW_*r4D#P34EV}V-&XA4sxgLInKByyr|))$WC^ zkc8aEy@Ih(YeNp&BA?bor}%=}gU9&RgubvWeHEVK4QUIV;9C}2vs5fm{m&d@P^)vw ztKFwag>gHV5Z2~wB}`prLa(nbGoV*LkgIBJVYTk*%PJFkdB-V`oUxt}NOp?q2KUqM zX=9bEV^9}6zup|fer9u8=V7PK?r{4DvSi^FzN!Tak);!G#y~Vi%Stk!lO*R6-`A;o z)AYr`9(XnW`s=~OeV=l_^1BnOJBVkGUmqOIt(&`q#gCHBLNzOY)p9l@62tX0%|gke z@vdQJj}EhW9jnEv2!av;0jycV5lI1|Hhgih02?;Wyi;N5BS-zhm#i3=8I*b}H6bOv zB9%S2vQ=ratWs~L<|-}*;$5F(_tkequI97Ds#Y34@Fwi5?l0Qra6Q;6O zp;)i}(=V}$T!$FR)tRleVOATrKy%-aI#A0`c-^n#I4sa@n2PJXsd4plkwBM0s!-Pq z3EO3qj_bOk-?LmXf9;v3@ON@ZO$ek=0r(vUf~jDEooABk#{w>wH6TcmJw&WVEeVQe zyF{LtH8*CF6=_{482}B0U@KiFfml8(T|zKu7${+qR@||TA`M29Y$K#aWTk~ucbF3p^QAeRiUSCFeahK!6Bjd8!RIP`F-v6xO%{fq!jV^UH}u@b6vIN zFg|OcXf`h?Hp9<3qdZZi>#fse-QeVmFvu~(r1L2;-_O}n_XP)xtMZKxaPW$;SBPlw zjXc5vnje_ZfdR>#(;q}p0yNb@&HlOar2C3Nxo7Lbvq_GQ!MsKh`Q0r~Xc0Uo&zoZK z*~qfw@-Y}v(ym>Fp<1nudEfKTU2%>$+%Ll{0oGvI6I8oO{II8FKq~M~DLb6WR^Lz}#hN(Y~NIpu9CDA2V%ffHH)&84=0@8Ov;#>AMwy4_( zpFC%E^eD_BU60+cA!ZL(>~F2BQ({x{g1yv$A&K2YL$G#PqaBy((fT#;5u#J|SB*qq zst>s;Jr{c4!V!arSVFIp=V#2vJGynIBQqMkH`IpbyE3?cUaI=<7CH*5-;F-s=(+xQ zT4wN4*#FV|r0f@!F&sS|T&4yJNV{Eob8w^j@+9hM(R6mcA;$JFAowb~}uranVNeZ&U*)(y8Vzi~rPqb3UqFlp+ z7;tS^e|lS%s`Yx9#q^nD(O=uv4w(;k;Ol83E6&!zwzBQw1J2PYWUnvQ51H!DhiGG( zd;1SZ%qFNw@%0{douc;>si~KFY2oP#!?VA52p(3FA~h%4KHZ#ZBTIqKi(H(STL9Dg zB=cGiu3Hc8U7KoCm)+OJE=e%XzsRY-2QMn{SLa+I?Qwh&WM+ClkLRPdyuLSt-6TamDsx8k7 zpHYmb>$$Y+El0(s|&yBkS*Rch})>RjBnz8fvg%uoR$qZ~DpnZA)EN z%=h=o7o0W=}^3D^8=N{d`(B!k5mRhXLE8VK(s}H>Ew@RqU#JE{(uuj2HqoP1} zFAz8KGq1Z%d;iJg@Z;MWvilZ7-^7_(=CV3(ur=iH*R)^ul0gl4?c4=ZzLb7}>5Y*w z?D~G`1}SZjg13(Ia}G)mw9m`TEX{flB)v@Z+vo>_enofrXVyo@_`mL4SSO_pP;j=1 zfo>sLp^gRFnWcGmoalL!1&4o00h;l2%U^Qt`@;O}cmETbwq_T8MdwgRff?Bm(7LYW z4>{*u(HmLXKi_{z4eHuLpIn;r&v|gV)=_fV`{a}0Y!E)9GG}7&Ez^&o2MS(wc^yh5C zeS^CDC7+PbInWxXKD62&$p8snq>eq?eJ=>v<{o}O>B&l<-Ls;v7IuZ6O{hY}Z%mOB zUJ^6VA9kc4e95e^r(<{3^azah_LuWQKz9RuXqJtLL)K`v^5L_1Qt6S8zHU9ZiMSPk zrWgf8|A+4fD`9AA%Q4ORiARVi>nNLxwavy4@Te}IbS?1p=nHC;loA>#OS7)Ojl?X? zeEjOaZNTCGf0des@%_k>b!&AulQO3uq_c?F!Uuxh5eT-MHoWx$a z^(n_u{d10PV`=}h4%mGAMOg%li$eGzN);!BMcO$Wpab%y(4mg^OI=vS7s2k%cQON* zAlpCP9{h!u`F*A){os4S#d{vwQp?_Id4b7YMYx=tE`w9^_xkqJ_S-a#G;9=S1c+g` zHQx(++<>-}!<;17&kY^k0=@~U0NKay>#W={tmUf`@8Q*-&tBT`13v=e7Wy_edVtzd{upaz0cj9 zqKIFnY2#ZH*on^m&cVfv;rT7o2z_^E^0@!;Rs7Yl{;@@^?|mE?av8?n`OyEN6k9sb zKfqzNS7BlOBf-QxQDd|uBBS{KK}Ls95!mk%6zIgd*I7=`&f8ac>scb^>EB`u9-8p} z;J??Euj$;{6L2QKxGt~ z8?;G5DN}g`nM~0NDuXI1$Rvqbd`P(!!~~U8Pytj$L3$B!%q^w{6-X&56s<%CRZ>b4 zWmNJlRaD}ui*@`O&{)F;d;bUnTxqKlNj4tm9eXY71&{xv@BbrmQ56-$0u@(KRa8Mn zRyOq&OpL6U0ZgIuMwBZQMrt+~`R8~SaDjkFWdlH&2o3b2Xy6B!bDSl~`X!FDB|87u zagoGEw5n-Al!4EkNbR;l=k*A6s1~Tq2zdSYuaeRZ1Y0Q+R;VFg1?X3TH^41TBX}Jo zHk4igcL)bm$E}5OeJXE22A9|cPrH>Ez>J_@i4X$*5?(Y;;@A=tLk-pKQw1OfU7!Mw zpbD3Z^;f39B{BZPm&ieN!d@gMzP1tN5`4v{#HT~XYJM0HG$F^O7f9KfNY#9@AS97W zyi9p~=wnGj9Hu-o;jJ|Tlvn8DKyU?sprl!WoK&Tk&tKr;X<)5oh#N}i1mLQIW#3b% zK%RJm#Uz9&9JdsyvH}mOq=IOpDhjNZup)*^D`19RNw;xoK3|s`X1_ zOrdG!tAS_v`c11QlC1#&MIi49=*_3RW;4p09@>)A1`uoI5*-+4$O#Mf{E%ijIZk&z zMn#U%pD)V$FxUOt_{;46ZP~XF!54oFu+2S!7AoEDb@?Db`%jZ03e*>Js{`G3^XP`B zH*E%O{(~e2=d12(dssTKn_3h^6d(?4GK_5Y8Q+;rr*A1;KeDKSu^%tZuVW?5y?;t~ z`W_XHo&L00-se0rkjvFo;XtgE?Q-{qVZpM;cuF^h_*m$o?JNi6bDUNm?Xc+97*!i+ zoFJAO2hCXd0sG>gzQtBug`DpdFdvhf~&P?4pWAcSzR`iYVd}$b({tZT?fFxs81{APd!~@J;h?z$1tl z%F(iY@{1@O*-Tcg!BqCDqGH)YLEJR$r5+Qtg(p$75B=$8um{w~^;X-_Q(HZNk{iGR z(!agDg+fk>I}DE9YFRaf6n1LKkhv_-Ayic z2&!ibW_>|NT^hJ^5G`nEbT+4!F8-DQGug=g!U*~$DJxRe)H2~u37DY6cH^Mcijzj{ z2E?@rur%J5H9)pUlg^(FzJAOo#W}gU-c5-}Y7TCQyMPYQW@jzkk*;gmHB&!O^^y85 zx`kWEeVF_Uk6^F2Zo!^|qsnu%h8{v`uYvJ^^Y;4=aZS*?Jq^S`7rfyKyb!P>8Ho9* zhGXWw^bI6`oSBzvpt(o9g};ee(MUxKJ%y=&MW$_D3HYG9$@}FV!C=8R#^wx`hKgI% z0f)$B5Hhf54)Svb!sW2OnVO8+a2r7!KhCvbg~hGp*T9Wj-o_O*HXy$wAfx( zE)qz-?k9h1H)^dYHBLV@g z&p{v)E|XA*Jc*iMU5V!ql5)-yO0Cp^KXih2Q#dV|#;oCXYFSMS--l&}KZK#mZ^Iyv zm>hfBE5=L!wyF+-srmuD>Qfq|2L9oB58bXo2!UXIB8oaIO_DxWPPK5HSp;$KS4g2H zr>o=hIR+I6v7kK2J@O)GR;+7PBr{K}p7hg-IJqwQf2+^c`A=7AAMQB;PUNxreBL5|z+nrAngf5Li%&>2wM3Yms!0)QlqR$D?h$ zMfX4i4(DOD#(8e#$P_oYD9m9pAqt&5TnZerH(p!~5z3&Mz_(2UIls%@TLu$@Dv5Ye z1t-f}Wi)gyVa8<*t{QS1w2u5Vj*FiFTN%P_^-oc!doS%mV7?=EY&1yFMc0LXro=VT zyYWK$k|+>tm0Y15?2lpd&ObYf7)1)%eX7q$w2ej9wF_jFtgDV})wYIenjQwb7t+Dt zVHRXyg_Hs))s&kr_rTTkyxC7$M{{MaLw~uJ#_H&CTl>S@uCMcDNohl1%aC?8R+bxH zLE~X-JF=q*jWZ+lGd)#Qt;?>vjuF_QJ&TDa?C0{!0g{=H@{RAYI`uUwaC4qM9Djpa7H{rN6Ph(WO+V~T%`r* zNbjmb8zU6j9~1!=0Xvbs9r-$( z`EJ9@0_Mm|Uccxoxv;(}bSO~G^qG|(?v*CX*fPRFezm}5i>#j!qN-93uhx;=jUj1b z1lEy9I~LS-Gt9tslGJPpN0=>R{V0qqBwkqy8qxS6ouii*mPXBXghp8?w1h;y=4V`6 zG6X>bQQSQ^b&Q7369(E%InSVH^m&6Nl@PT)aW#n$GI8FEY;cv3f>7LOM9q<1GbcnT>1LGw{mB?q26xxu{ zZ1O+B9L>bhiTQJx=Z(3XxIChZ#$3ALfb(=-JbT+{ecNIaY@%}2M_CZL+IGCU%;vxK zjW^!%=jcdaFx9x1Z=s>+6jRKY^|yrqx?y%cO@g#9?9%P_Ie99DQTcG=TG$4X|X)(~C% z{ez2zkgJb*{6EQyV|JF{WTFCCImu;opiA|oy_ChWU2UrEa1GaRz(L;k4xqsW zuHl3e9t$4(IC_|R1Q{}X9@YW|+3}3M14|14TlQNZqeO8@xdt=lWXX0enY|^w<;3R9 zXTWIsA7;zi9!!`pW0pJ2!6?eMwZi~B^V*4ACW$Jf6l=;{uKo&9H(b1dk(Y_SW0I8O zMuX+9>U-Y@CeEIQxxfTWmq1SvNI{tK_1KRAb@*3(3m8xXJeIry$=juRlWF0HD2#kO z1{br*YtPPRjlwf4tQIB2bYtZfCtPxERv)osw7QWS>LVs2^E#1>`MeY z;jWtDUX9#E5>GSa{Lb5_I4qUg_-j<(^M+!gDG?~NvuQ0qg7?7ha^7s-5;(NvObgu6 zLUO7M>uybfec7rhmJR!M2)3=NKA|{QSpG*TrLk%&$7hR@_OMJ5Q`RXp9?7z%g@iS{ zDG3r^Cg!O4Ug%g^(yF#EkfJE_h}a%gglt}fvZ!k$ZYbh%IV)tq;%Un|v->JcQ8*5g zb)F7zcY;h{BA#e)587~($!FKfa!zhlnsb97L1Me0E(Bp3bx#M;_B2NwDiFt&On@ZL z)hM)B8vX$>XFyJE+(92mn&xtDuhg76cT}xbg^ob9ky1332Z~-iTTCzpJA0;NJg=j2 zuFOx;en(MG6bSO=tP7j5n}kl?d+F-K47~;HRSoI{*_zh_r1j`tzn|LNN81zf9BHpqcEuD>Dd!@c<5Hk{=wl6-6Xf47n3uaw~hrpI+nl-p7{7Zoux2RE1I39_56IDqUwgm$$9LI4V1&IkBtII@E5@y__x6; z(9uu9LA_tpKW?4@?aH=203ClGw@9}drjSAoTjr)AodPJ>l+v6t0^rjM8H&vxywHl| z0!FQbns;0?CaLiXfG#Q2PAS4n(QuC{4n5&nMugNDjUII@iYZw>(Ye+*y{0nBD)SX# z*RW}g!^=$n3K*~V{K0i?d4P94TJRM>+@2hhfbyYbk1Q<)%u zh>s!T0yX1+{hWghZ)@5a3pu6mwLE91mfE~M7}u-WT}chr4}qmA{v6Le8-HkBmiA83 zluZdgyd-3R*vhmz(H+nzv8>8h zZpXym99^QO)+~D41mtfh4b#LkSS}VyLdtw!Tn3KD=#rCI(m;a_?(M-Lx2i$Q<$jgv zvBqdpk$bDkX!dJmGD9!N_ZG|a*mOhFxH4Z|^QzL?5a+nl@N2npZP~E?*TF zyD!_;T-KuK)!E=TL{NXahgqF6$Oe1bzhM8F-Y9jkBwbeZedDb+j|FUo8%2s(wdAxa z=zg@GH?bdwA}~PNbTgz%`4tqlEvz@g@6Iw&ctox=rD@9J1a4zO%`dk_&_^EFTvzUc za24XsioI1zz#;G4vnZ{POda+(IVE(qbf`ar!y9*{u0wwA{ZnqR&Mrf3oF_q2W59|) zN{0lo0b-)g&*)h;>pHvMnSPzK@$2z`oaXZ*K1r&Qx4}lW8vd$ex|vzQxBIelg0BUP ziPp0`iwo7H*fyCFyC6nf!&kd@@dMJM^}KU@Ab3tMf-Kk5*|&M-04u4J&_)3QIW0@d z%(zCOHS`_IgT#G`Gq;R^;p<*j8df z#)_kqc=oPJR5(9SYPIh(RS+;)HVc*xNtM+?dlSbc_r%U|RwXAhJ2U18>q2Cj`BVxm zf))<#LL=O~8w+%RKcN`|=wFYlHES7aBX1Tt41GqRX}H#A^(tb>W=mmfHdYR;W=2OZ zFw3m+tf`!P3$`wMfqe$7uv9&(vnDdA&2B}1sGo6aRbv;{70(8FcD1wRz`pNW$pQ%K;6i`a>z?tF)WHANt=2rZ>9WiG8G@ zWIIZ4r?Md=J6k)n9b(CaJGLQWPkMo;6BKM|!zdC3L^i&j*>MF5vb@AS5IR~GM17r3 zFDE<{yZNw6TKQG8jC@mFf6ldY} zCDAxVKk|hK1tkh`R}K{U%pCY5jAO(y+7MsRc;tF)_D&^Hj zO8qS~KMJ3js~nhQ$0>BtoXT|0kx46sFlH^HOX{>T@iksZ#O@9`g(3U+D;W4+bPr_T z|Er+g_aE64L{wGebi(tDm-Hw>k$%hml^JJ+3`N+QKGEEknF=UrDlML))H=d>7olpQ zq@3`!h>~qW23MK&yO0{nJtf$s9qw?z)x_a4l~fgympmLZQdlGj$ZFY@d0LI>=|Rd% zi&B)TMJ!cuXNSzl6jJq2Qb~BLMXAjwS;90L5Tl88%n~l$xU&{_T*8%*anlh~=Q&q% z+9^aTuF{SKq3sT>Iz_YXO0Tutl8r%}V~{QQ^8}sL5LDBNWdiQP3=u`-vvR~1QB0}7W!3sy?&wqq5j8Ye0YuukJy@f7!s+GA zEb_Fvg=sQ1r^n$kbyN@Qg;jCE5_eF7n+2MB!y+j?#1?4feGdE~!I%M#b&qr`#H7zg zSf#dOk+@x$8AZp^5D{e4f@EtmpB`|!m@W{3Kt_!Bq z5iog%%GQO}5fVfRMB2x6W63YT&<@xAA^c8kEQ}9nTN_vc0n^N*McfN>+HuVGbrd5F zu_;K*MR#*tNOA;8*E`03L;aoHdU2l(&~Nx`ptnPbT|xw}PC`mA+h`?E62=`rS&N>8 z3a=V)nv+atn?lTZ5>D7O5wO<^<&D}&q|08dLhwZD@5hfsb=tYU5M$eLgnzVZ@hfYC z7d=6B0}u;io=Ag;#@Ht`J(}Y|LMq4<#ynvugbO9YRpA);H6z3#38^s_-tV#SfFPtg iKO68D#ysI6ln76SV@Ff(lLQ0E&vjOAOSW4Bm;<81Rw>1eg_~7 zf+-tdYb9gc4G+!(feQZp<+CE#H~>&@8>0v|4ggC0Ald(aNuXnhf$b@(J2qCUu?9yX z3(Kk@Y-?nplW3J)bPjnuy)Ujl*zBYZ;V>K-8ymSD9Wm%PNR%|ni=7+l9 zRlW<BQWgF zSV6AR0dPqR9}sMBK)Nc=I%-pL3Cw~6%7?o$SIf+voftOH#tZRt!jE2n>5B&&F##w8 zXaJ3v0Cj$Yi$i7`k(MPX2=&Ij(6T!@D|MA5lgQq=^_b*C?(pFMgCM{BF$c~#$En=^ zH?^eyYiw_S_cST{0!wEBOt!ChFRdcD_r2QDYFye?U+HZ|-g}bfn(dU=aBu*u z1l{AQEF6Z1aFU;&OYKj}vQ@PMYFW5#Zbr|TpO@x7U5c2yVoHExw<$o6ppZ~bs!hAu zPEJU-`JZcPbAc=1FQqG!LZ-@9#>t~Ui?2v2ph8vQR#u*$?5Fm_UGfT7ut>73H2{st z0jgy}O*m3B5=b@^b|y>JC*++CGO@Q9;qh&K^HuEwGM0MER2J(p3PsTjO~Ej%sNH|- zXKa2^`xm|aNNzJH3W~rBK-}HV0)o7gAO9W@Bsd|0IP(DU;tRsXhm<4#4luRP%AW7Re+-`0KVcr8_T z_xtCa@{(rBr$3Nl))H~ocg})16SrTNVXy22A>-4^1sSWhHRa5a{cJey&w>i2NjZEsJ-^tZ_GH@ zgh>ZXnRd`2M;vp)1(#fL%?-EAyX(G(9(&@cXP$du!Aq~a^TD!DK6}|KUiF$u%!=7D zC+5bym=EIRDg+2nwD+$hu5XF}O%2F|Xc5BaFM^r2dl~Da2!$&QBw77}hMG%bPx6C;W<@tLagi-VSMuYPMY_k;aqzu8arpM95z9;|e=;412FiPiEf8yW>xN%SNa#uMAw0V@%RTdh zk3RZfSYX}775wL-u`>ZI=z{=xw*pg{BY`|$yaW^kdw zOzly7)r2~#PNXV*jnr=kpar2ECb1!Gs`n#?M=-)aq9W;oEspVv-;SBIA_=ZeZ?CoP ziNEN*dd^4H&^brcafmY_`Rq(VxG1jasg`$Ma&jK#^(>)tZu7do6;3A4PybmQ< z8<(nmc;*-i&omWq&%qXOEl=@@Taz^lMPq0+W9w8jy=^F&(*!?O=@^DM+|y)gSFRu2 zOy|1`{10$A4cUN^#`|qV(J@|HDhVDrVck727~WnJtPQWv3xcubUsVLFP@ypwkA23< zSP*i`gdw1;R*@k+pivi+OFJd??t)lGfV2ex9|ERV5tz3IfvH~sE zY;c1|KLSri8MQGaTIN-BUY{lVrwy|5dX{7&!`GS%iZqWcIkV zRpKnmk3i03$4%wERNPMTT8l=<$8p|zi$(mwrfByE?2g)%H@#SuU3_R=m=`(>BMBAS z6al$N3x)V-n+9svP&BTwE4*b2Ov>_XciZn)*7o8@LeVVg%II0sz=&xO`mc(zj$9KCT(raD;?t;7sg%D9i< z~HztcXDoYV2wq@9aJ8zZuvz zaBlsfmveaNEvqKcY+)&6JGtc=DpCM7<8l8y2_lHUmg#Mfsl7d+K{eyCKBd*`9oLkcJCcE`&oQ1Q5XM;-%b#~U1U^Fmt_XII|Ro*R{6qCYO zcUF(-GJfrD2I`L5Jg`gV7$t16KY;=@q{_W!tY@v6I-i)SW7^8-HZw=~Nb>63Qm2PO zPf;G?$$lS-tZw17MF~uvHZFc@YcnTfJ^KN&hZEEHnk12;W*FfcLH)f&CWCBhpW`Hm z+8$}G`)OoRlQ#?yw<07Lo*Oy$6)|Zk0xl0FHoYV&*RLR zD;p|W#4-vuD~n~PlnCf63e$Nho@~A=SCPHkB|#|b(MJQ?n&W!7TQ{eq74t-=7|oxu zOLOg!pA?2FRBwgsaa!7tgX|Q|22?GCM>%XDF25+w;p_bty_XR12>)SdoPbj&axIm} z@F8@@)LXM;xiDnUcHqKb;0&!7pTUCKTdyoFx_q}A2#dl56lNI!{S7Nx8FmDOEu&CH zloCY16ATtxrTNa5!AxLkeHx%}Q|IZf21>-_8_@x6N{g}!@;3__5^7GMZ_zi!oX(UI z_Q1n-8WD8dpzvxLm3e+Az`t9pT)B)02qI0wbAgg{Z!9~(L|J;VDBrb&3G$xMfi}B7 zED~IEWjggBp2{DZZ7{gOB8F2^*nNR?`phQQRpM{g-wL`uw3k?LcV{=!oGt%3)vo;x z!neNj$NM0xp1tRhjsNB5_DeqYzkvO|-xJ4q2VOqb+#UBCRyRFUyLm95Qpp%)oTwGTS0%C|}F^br9xJTqgtZ`AFw z*X1E+tNkZ|RL+Sj4e*iI&>iN}L$4;B-4^o6r2{KBKnP!3?F%Ibxh?R>JUl?dQ>*0# zWF7~5m=m==W$J{^KqnEp9s97+O?Bib((t?12P2g&<-&rFp4VV2{Pq5KBcnb(f0UlM z3b_P;&!lGJ0UE}$s4P5l_UU+a@poYS=c-Nf&xAE^p!fGIQ-kB9`SH2w1gcNhuz3GI zG#5{0Kg~jw;=D}b8T&tPT^SV|lPPu()`-JuP_UH%4O`Uej%hZ#Ueny^qPxGgOwC{} z7T}GFPoAuPq()6MGv*BL!l8R@URvXarnUEXd4ik1_c}LfjiqUgO~-QA3cT)LZg1;< z54L=s^?&PZ>srbP*b_Z?zPi6Ol+|^Ai{YCr+NgpE$hQXT?Orr#_jfA=e(&h!2_>FK$aqFu4)fk z%HO{BVV29@nalc1E1;zRN3Ac$TGsjMz7#83E6N^GtxtV^x)K0epyaNvQub{mf`z*G zs9(#_|I)IGy|em)Lq$@~NY9N!)%*S*`V30k=!{?fz>B6V zCFKj`RHvS!X%FODfCJsTkTB1Q4TO9ZKzi=MD{))i%9x;3eoL9Yz5I0%I;8;dVw1S> z35|n#!|@GF52Jqz=4W>&E4! zo&K$0v9kH;e+?*aLN2*_d)jb#LCtP*=#vEL;sSn(P(HO$1B#4I%A*+lTC%!08B-_| zk5R8Jy7?}BSN@9#B5nJ4YC)%P`=%^XY-a!I&xF5N$)?<)#GOtt=ZP^plJZ82HJi?4 zSByoW+NW{*!`VUM+nu5z9KZk^O>96iu+i|~^XRldo`+`;uQ7<{uBA%KJ#gaO0lJss zYp3B3~#XkzyJeXjaMYeg6!%uH<<%j z1GnM5SFRl}m<;pr4;5K&28+0f2r4glvqStp9H~H~nIySISbuuo@I~mtG2B!bn;X8# zCGiiAG77ID>Mu3?yt+98E72+JOH0lbPqgI@rltr7yz#5%!xjTJ z8E0@LC5a+_b0?wO=dhW5l8aDd2j@rq$C=q{-)FmUZfs5fmF;0m2qE1wqiVh4U2pz( z@M8I`sQi%_Wh5inFPP`=7OvAmkv=kiM91Z}2VvtQ|8*e*w2ja1`Q6g~-_uieoESTJ z9-29eJ2u+cH zqT1WNepvME2PGzlC)X(t0cTbF4;4X}(H5=7jDy>UFhiMsW}bR9lwK_%rylH(W1Jjf z@T`sDpG$oCnD0wV3Kc0#DA-YhxS7Yb`YjHKy#4Es*RGtIOCnnS{vI5!^rLP*RxEOJFO2`CRo!WurUg3UlkxI}^RTe(e1M zMu-ef0FxWB(GIKJf;xWVwlICG;5;(SmiIRA{~r2VW>B`uabRT&Y7T>4Aua2%SwVA_Bz7dq;JcgcjX<+Rh^IZ3;3`i z%qDHxrFOBI#j>vFYHHFSu!im$C`H%{w+e^Se#8hS8h%AXb6t!wif2C`eQ-h274qL3 zpO@2duy(9n!AMcU@kX6hUh)p%TT`@iND<)Fxf@eVvZCCpV-AII00E0)ztlDPrrT5S z|7le%xW9^czq?jJAljN(9cOidb<~%5&qK<#kQtq&kRs5E3XMr}%y}!j*iqk6zo58Y zWrV2vExV!ihm3{hAqy?3AI8?Nzn7fscR1NwcGaCm@${fl+}A4(zVT);3RrY+3Y%WQ zVQ5I?TJU$|g@=i9f&#V+Bcr$GW^?ho<96dM$706JnyIF2j=hH`?xjw*uX$M9wv3p4 zPvf*4;=g7Uw?~?Y6CEFG8$y=DQUXy|q#i4u_-LIW*3xtR;F|0BhlBXFSC{i-s*_)0 zd~IU1A15`kF*O#o4?9XO#2RcO?=jW*N^MWOi;i9ba8a{=uY-TJDqrG@BB(88Fmfxit?LXeQQ<> zSHgUhdiDEyb|KR{dYX~7m%hKdKELvOMn8Zb?B^8_9fhhj=+Q=|Ylwr9kFJWZ_Svjo z7PdcCYV+46@ufbTqdOKl^X7N(>ufa=`z~(los8*a`_QB?rxIcl4(m9d@w7I1BF=J=cF`YPHJLKdUDE;8>RHLsi`^9v{pQ( zS$tl+SUyWgpVdm8wXT?bB0i~EJSZ+Dnwp!Mo;5Q?USwt~7q{CKXDSu9+*ZYXrg*%? zzV&);KR`M+aS(CS+rS~jmm3dqI5?8lJn1@aF)fA8g!uam`oTf>XPAWF0J2aT6_2{% z$-ohhNVSp5Z;Qu)?6~-rLlLU>^q0qq|J?rndouDk5Gc3r?a-CwuWg^4d3V#oM=s)` z-PsoP=2PPb45rZX^p_4`eEEoF^Rn&P1B8M>NRjkqf1!`(AD{USFP-s2^(`t{M_ul) zDA*R#H9vNmdj-{=<_&2V#dL;ih|yuBzB$QQp+ z{U!Al999aFk3JS1q&S4Udgk5!_M<0z)^|R0JRIe?EiOxNTeZ3Tygs2#k2xMb*Idi; z%|>iXoc9Ump4GDxRUA8XOi$-yzIW)}y2Gn|t0zTg(RV@D{Gs_v6kg2=L-=v-(77%e{|?2< z?kZ9$Dz?+Gfg0@Zl6hstK~dNQ<5Pj?Z%8|c&3}rL6miBL2(`^$EYRYSe5h?~m5yQr z?zB{+hxT$A+l2wd1Y}Jr$eH7=A=!4&A!{1#=5-B}7Qb zH9GX>YQNuXS(^^K&&qm}PJwPEb|U%(6vo-aOt?Xp{+S?4b)=|ht<9bhgTZDb8A?1( zb2DO^wlgGnoe)H|9$Z{D&mSRKHf;$YBgA;FQkRfxcJoS8kZOZeUQmhKPmt?hty(=lD%ek*J?pR zGWW@Etvh~zwiW`tCk4^dJHM}tOfvO4qA_?n|CjJz4EjOS2u?1Y2q=SV!=$gbmOG9} zlQce*bsdY4uaXAZ&tU|jw$X^vUOz?eus%Ao+tYF*m+$a*k##3iS^3kRiR`6E6V z@o@6Y?-)@v`6QG~S}*3(>$6}3Mv0bMlU_d={yAHkADWIaJk=7 zHS`MRsH+5T8)AT+w4wi?5Es4eSsxdst&B@hquNYv*HIfVRkwF(^J5p|p_V#Tk??z4 z7XVHsTK2_c@vmIdsLzCBu0o%m0hA8X_E|iNBI8Kr{jbtU+Obf{0BzqYtxakh#O(d^3oC@!%iLBHAl7y_ zX`c@kjb&Q5gJNn`txaZ9heA8QNQY^3I8#RvUPaK&AcBJA2l!*{(22Emhk#-bjv*lT z^)<_OyQskN7lP*(1TeyJZl4$X-lBFq%|_z%CF9*T@yFV_LO{U>IRxb1{@$`ZDXPJ7 z7lXW$#b5v~qG^w>v_N=E#`>rV2%KjU6JU((+z&`wg`Z13Hd97I6= z^GF(VJAB90*L+>jEBj@%;_qzDKZ&$nAra871 z{VXG%zw7o(yt0O)7ss6lN@yxkeNo|z(ywzE@{5WRh7J0>OX_{Oey6_Fx9)b)Y*5ai znIf~ylfTBvmonJ#cgTi@%s(nH>B)@uWTAkFj<#Le2Otksdf%@W%kgozG1^L6Rw#|6 zF3_iB#PjP^C-qd_etvdYvp!J&K043=%J(V&3CJ&0QDi$D(1J87>L1YjG+_8iiO5pQ zPjVboC}wj!bo7+CuNsOE@4d7ii(bvnUgdAj`+%e$Eb}Gx)++oP)m`2Y0rf8J3dqAh zwwoE|r?efwT;}v89vg|scnJ5sf5qd{l7spTw<`c4~3xZqz)~Wt85{rnD zlM$K4Y?;?bK!QR4-;1a8Q1De@YJ3dTDUH~|>omcOoW^NTrFfg(FUBa0D1{I#@KCnX zct8$2J`9<~L`76K*SUVK#`ni?@_Aku1xUDf4$L81og9*5(BNa_UTU9T@|k$%`>IVI zVdE_mvo}^UmK06OAhs}HqW9Jdz906d1d(yOV71?}<5|4aG=-_M;8+7z7Xy)Mqs#b;?F_hoOF|Dn?-z28r6z4C=ymtxr=I2I&!^ zaFAx!C^BFaV@2(9q)379P|?xX2=eDZkY=X{2$~UZ7Dd$8D54pg?5NiSAyi^0+76N# zI4dC0LAwj+IMM`AY$oCAXf2xv8G@}9q59JsJDtuL$f$6}dAZ>2a?fnzvvxRe-ja0kf*(&Pi&2|C}3Q=DyE6L85)*|D3vGYb<3&<62-Q(>Vi*1phHK{y) ztmqZrpG?CZjedh{h%t82u76h3U%qcH#9^IA*a6)r0Uoi}Mde_HpiwMR1=4uxS2!3x zz93eOEaa=(Y@Y-m^c}&1bp^pndp~AnS&oMx;ADjmg*gk&=`080!-1pyQvmyt?pYEe z**X#>Y|4tm42d8mF_ob4LXKS5dC`jd0?Sm1gB%d4zd9w|k^4JBtsNXb1heiO6Cny6 zz$hGV4DXQBK4w1;DDph`kN zyqJqz+Yg8--jP|YtVI?v4AxG_Hw;~mC6=mLzavTll7axhR&$608x_63FM`;PuvN9W z;Ms{bg)OUo7zfKfs5|S-!u*ifg(3fOZ!YcJBC5B|sfl3chom+7*HDhJDUHnqu#@ zEL-E&H=^^M{JhQUe97x87DA^iM<({-try@TTMdq;5ABV;hLsB?$o=>^o!{ty&p z&Bk;Bm&bykvOFu+#qB79U)m6&#IO!U4LcaWM2}t#tm;yQXgi>S1b(D|A#W%-ZM76j zMGq9J7~XeKGGM>wO?wi8&BQ8&PbapSnf<`<{h&`z+6}C2QO09POCOO5z1C5*EQy8& zD7P?q{W*z`Ipcy#VI!c+YEY;;s$^{s9py*OO)0MjWKBpqeofp9cICLnB+2~3a@e+Q z?nRQC2=(FEIb;)}56K2Q*3BNhNHBwEwP1DH?0`0u67q?|ix7yr8+0>u;{a`*fC7$| zqrkDr(xZLDtQ^~5)wN30hhubPE!e==2Ci9cC<=DM_1fbVNRSUCxkDSZ)0R)!hibpQ z@ysKA?7+Lh^c_qPcQIyo!qO`1EQbhSVbd^_8FKpi5Nrxe4cZ(r?#YiPcBuMtoTfy4tMlUY#+Sg4c&gvi$0u^~_LLcR!` zigLgcI1jSZS9%y^O~Cl52^zzq9Ws5L-VYM7s>FX1HG<#jmDynWSOam`MCfuv14ELf zzus=yQ1o03jdcyy9<4k^xO(Y(wd+|Pd|AFI*DT{eEI$}y2%wl6#ru4ZsPPFN08S9n z&mEWrpQsL9Djx;!7WYh71PmI3VL9@bPKfd+jRHyriR6(<43M9=nkiks`%+=6;JZvf zie>8ODiq|t**9dj=X#}*4YVMo#t^77t5~&ERx7Zg z{W#$iokma}_s2{)0xBDAvbOWLeMR&wCpn*R1nO{{yXz%zumvYiTXyO8L>B(h#GA;J z3-hQ6%q))>1XY)0zf+WH;0^{Sl~$Pm1`QC_K@JlQGr<@Lxqn`96gf9T8}G8|c_bg( zshB5|TVfFbkfOFl(2bCx7Z6q-a_>*y1E+1y=jt#W1tWLcZf7}3hKM0GuSV|kJxG`c zN_R<>mP;m2WGG9C^N?5hkYBkGdHbQWWNHWJ)qI#=b7P(l#^-rq#xs9Y{4G&1jpT2J z6HE%4w9?Dk=qL1$UefXD;q>bC;q*)2(9iW}O_>?&e_XH&@;#1Nn3psa(r;jr$pv7p z&6q|YaGcvpz9>YYpw^Hm=a_>mbdEL;Bt$0^cC;spN;0|Ua~)VZ&N|yYAygl7hzQay zH*(Y@v|c;(!cgU>JAFGFo81evK?@B9>UjxrDhIV^I^T+D_|o$^ppLwpxoF+^v!R4F zkHL<0!jS?qsi-W)8$X=gV95!Zh#4KywB7HfHT2HZ;+mt2=_-Ku=#mEau?pgS`rN9; z*E0{R8nl*bJGGRE2nC>Uv_B50*$eRh``k+nYEjSYfL`joe(JxT>66yP#`EGY zV}w8IwWI6v;i_wjnDWw$3y>Pm|q@pMrz?p!?4B10#EE>b`sHH&;nq&?YAU;K{5)qqX67DYagm0BZdLi+G3Mnzh_k^dpU)^;`#vz3L- zVmu8|e$|0j!BQ(WiEu4yh7jhI!m!`>X01G{9Xo4;ZF+ZQxYU;Cm;T@9^5zlWRpI8+ zzd4uBU;0mqSWoB=-so4NYi4=-!Yy!J#AtOnuiBHvW`|Oc1Ox`+^osVL}@#(_ znD$afp>k1Q&Ep|htfuCH1&Z6s?gMDHNqImlw@=8zipirer}MmsnO7E`+}ePZVikWk z)pp#BbWB#rtXH>~WV+--@4vAD-yi3b;Qw1PR1(`^S*aPCXy>VUx>|(94gnXKFezEc zCdK*&Y*}Ql?MrH}#RcDs^=GoHl?yt!drY>oEywrkIGWe{T?M5AZgtp2I@2vY86FkL zvS-&71~@(dPCXW-#ag@DK7^RM5jxMpk?UA;41Jr04PzKcDmj4M{E1Qy8n*!}!ciO7*3tz49rG*kr= z73sTayS{7b#{eORoZD`dG|$3UF&N)=f4D z2#U|4FCt5n{{sFh9ul@Fnu2V-rVPetwxi{>TDBB zj!CC@d97}s1EbiQW6c^f3xzI<6kpf$9M^;!d7`>l%=lp}pjKZXA)?8FExPfXMQR&9 z^Bm6O#lC1I1h4OaPyhr->o5Ah*;hr*cX>^6S6Quwxxxj{^ zs-b|;5dpU{#7c7|ZSw=~yc#=tik!M;{rpABe?%P`LFwb{G7Tl;d1eurJifVscC|@T z(wCl8doMN;toy#LE)(Ru2&8)hdP@(kmWi&6&I4y!hcyX=NrYSJF{2~v`*``>7kWBU@? z`(;_}X{s;i12VR%1MNWKRuSkLS~LOLf(C6O&>nPZ6@e{O4T}c!$+GTZlIEp3=@y!q zf=1GZtlmD+5i1Bq;|xyhw-ANoMP&koj{}ob6o;Ov=hg zn8V-?wO5%W$V0+OSkWPlN6uss%CzN9x~m!<33)rR^2nKF%L2Jh9+%gUz8Wm&qFg|j qg61z_0?k?8&OZ^-_sE%yl}3Ckfloi literal 0 HcmV?d00001 diff --git a/assets/external/fonts.gstatic.com/s/roboto/v32/KFOlCnqEu92Fr1MmWUlfCxc4EsA.woff2 b/assets/external/fonts.gstatic.com/s/roboto/v32/KFOlCnqEu92Fr1MmWUlfCxc4EsA.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..c17545332e1f32ae3b1f321d94b51fc54756f906 GIT binary patch literal 5708 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 literal 0 HcmV?d00001 diff --git a/assets/external/fonts.gstatic.com/s/roboto/v32/KFOmCnqEu92Fr1Mu4WxKOzY.woff2 b/assets/external/fonts.gstatic.com/s/roboto/v32/KFOmCnqEu92Fr1Mu4WxKOzY.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..a7f32b6f05ab0e473a38ca47efaf58724dff8315 GIT binary patch literal 7096 zcmV;p8%N}KPew8T0RR9102{af5&!@I06Dk-02@~T0RR9100000000000000000000 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 literal 0 HcmV?d00001 diff --git a/assets/external/fonts.gstatic.com/s/roboto/v32/KFOmCnqEu92Fr1Mu4mxK.woff2 b/assets/external/fonts.gstatic.com/s/roboto/v32/KFOmCnqEu92Fr1Mu4mxK.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..2d7b215136a471c9a1644966be6e5af672806eea GIT binary patch literal 18536 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�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 literal 0 HcmV?d00001 diff --git a/assets/external/fonts.gstatic.com/s/roboto/v32/KFOmCnqEu92Fr1Mu5mxKOzY.woff2 b/assets/external/fonts.gstatic.com/s/roboto/v32/KFOmCnqEu92Fr1Mu5mxKOzY.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..a4962e9b425730ba136b544273ff2bf03c0503ea GIT binary patch literal 9852 zcmV-?CWF~`Pew8T0RR910496@5&!@I09srC045j!0RR9100000000000000000000 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 ip5Q3{p1bO#^| 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�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 G0002&1Enzl literal 0 HcmV?d00001 diff --git a/assets/external/fonts.gstatic.com/s/roboto/v32/KFOmCnqEu92Fr1Mu7GxKOzY.woff2 b/assets/external/fonts.gstatic.com/s/roboto/v32/KFOmCnqEu92Fr1Mu7GxKOzY.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..20c87e676ea8cca21679bc8886fd9566172771de GIT binary patch literal 12456 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 literal 0 HcmV?d00001 diff --git a/assets/external/fonts.gstatic.com/s/roboto/v32/KFOmCnqEu92Fr1Mu7WxKOzY.woff2 b/assets/external/fonts.gstatic.com/s/roboto/v32/KFOmCnqEu92Fr1Mu7WxKOzY.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..cfd043dbaaefbe81712f30912f9403405061703d GIT binary patch literal 5796 zcmV;V7F+3ePew8T0RR9102ZVG5&!@I05~`R02V_40RR9100000000000000000000 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 literal 0 HcmV?d00001 diff --git a/assets/external/fonts.gstatic.com/s/roboto/v32/KFOmCnqEu92Fr1Mu7mxKOzY.woff2 b/assets/external/fonts.gstatic.com/s/roboto/v32/KFOmCnqEu92Fr1Mu7mxKOzY.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..47ce460fa9a827bd143a2cc1d70f6dd4b97352cf GIT binary patch literal 1496 zcmV;}1t1bO#^|f=L^k2vJm! zG68-Z0c>{d3teP$ehh!!R+zFi z-JPU2hiMtv&=% zoF#>G^mfu~?)EXT^#44%xYAf+PnzyRmrfXD`z+1P>BAPo{4DhHA0USWz_LS89mQb? zABjS9#>o$>WHQzW8;R`BAe^NUHzF)3jbtMQNT!1(r-dG4kAs(wv4FO-CDQ4kIzP2~ zoSY#@;vE6a3VVtBUB42^YNV-nntzi@nTPr4(7b z59jed?NA~bd7Y}>KJF3~Ly^xHX1dH0Z&7@&IhOvo9qFePuBDm#m=uoj{)JKSiP}pj z`Dx3gYwO=W+Q&7)OucTu? zKY$Z%c(~@@)6o3`{dGU3wq;7;q*k#MzDcI?Ydq)Gt=;QT+yA6}9BR$ZXuHSB4+E3Y0P{Ga%dcgsuHfaSoh{j~ScdZM zypF1!y;U|kWMy(gm+@FCZgEay8QRxcdXoKpt1l4nBG$_Ad7G+>>zh~*0QK9dIvv2P zXV)#BJhk%JZwCnIR7FaRc^V4>;^gT2r~_Ye``*8aR+RuBe^8TvZ&2cwU+&*Km9eY? zP>CQ=T=q{!b?`5%f030DBK)f4PUk6yfBJ#!T300m)?Uu1{~Q6Ka*yR`d;#=`;uL{^ z(gnCeTHy@)Y)8=Xq9f{gcro!Urp=L=VRGcwqVqkp0xnW7Ehe5Q-t?VF`AqT^D#akN zYL%c=DpQD2tq!9OC0c|aAz~#7v7954Q6g3WRz22oi5MjsRLWN?1*2A-GOTJu)J6wR z+;}0(c#a#N&G~o`mPw0RWlEH)XK{rS!mwB+*E0wasudy;0#wQ#A+e|G5cwvurXSUa zQG~<=noFRFxVG*rtu4Yq6_*A)MA|cs3_Z6_uNe?6IugRY$nmA-hPPu{xcj0>lEfhA z`O8U~6XU&f70FyTPOR#aye2!;(TWr^S7&+7C1qzxyoV*J=n&ThOG&FSFUr+s-0nLs z_AKcfZ0ApggUE9pgI7>)Xd2M literal 0 HcmV?d00001 diff --git a/assets/external/fonts.gstatic.com/s/robotomono/v23/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSV0mf0h.woff2 b/assets/external/fonts.gstatic.com/s/robotomono/v23/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSV0mf0h.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..022274d4c4af877ac322df360cb0c1856d2931a1 GIT binary patch literal 24792 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∾9# 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 literal 0 HcmV?d00001 diff --git a/assets/external/fonts.gstatic.com/s/robotomono/v23/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSh0mQ.woff2 b/assets/external/fonts.gstatic.com/s/robotomono/v23/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSh0mQ.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..1d988a3f4c7e169088a83234773dd3eb346c2196 GIT binary patch literal 22736 zcmV({K+?Z=Pew8T0RR9109eof5&!@I0F*QU09a`N0RR9100000000000000000000 z0000SHa|#KK~gFPU_Vn-K~!WX8UTb=FG3Lr3W1wI`YH>9OaL(N9sxE2Bm;v?1Rw>5 zI0uAl3el^jU`!HS|}lX}_z|0%gKrq%%JpHP5cA&GK38q*Cqz!)Zh z3apH95}Rv5J)>?_K;Z-==Ek~#+>EWbiDH2v&s-r;1M>{N7l_j@J0t7T6f#TVno%yw z4J=Y4{ihNYcGi=>)4lDP>VMu}AEB{Na*wCW`l@=*t?3>FTpS?uO!k`x;gidQ76%9G zOp;Oe8=jwA4Zd{Ygqh6G8V9n8nH1lL{M66LJ>g)1d}kPJ&e5atm-?J zhkwTL-uLM&HM21(53X?kOH?Y%U|QT+W`o}R=d_d)nPm&`3%`IYG)OYV3hqo1AkRfS zwx>On7_+mOVMzX0r+rhBzPLw#Q*pg@v8t9QK(-wjp-AiThCHOx%2@^{hd|X8)!jo= zU0&6CuBv`El;6q_l)!k4c)H_Q;+; zV~`ZmEYSySL-dj*o&M_#O)J@fk2n$!Bdvx&2_AwSExxr~Q$)ZR-*Ah&4&*Z zxRv-7Q4~cQe{ZVR{tplyfN~&Ad$`V&Y>wd!=i0bfnsY^Sb4|5)*yaA+<%)|1BrX8* zxD1*B2x+(k!!2H1@YrKb83^Pc>vI2fqWdcmnyP>4 zFQ{K0Me?FW*aNnlxFcfI*mAv>y@R|05o7>o-3?q6JPaQ8hJ!W~BET^{K^wBm2=qsx z$YI3l;ZYO-J}JyRs?}*uBTcYP>0H()FDj^+B);k;W#!DeWVcX6(=rs{WfagOZD#;$ zu|8AlXnYICq1Ye|E0aHi5rc^GrWv^o2&lvhia`Lb!!`x`x*v|imM^ds`baGrWQ_C=XSFB2=LP9XNzjxUH+vZ4SC%PzHP8(m$Kuy}&Rc z21vRbvyDVFswLeNTv&txlpoLlPUL?J$)t0Ws<-NUt3Ur1kLKd%6cD%ySKvHsk+mno zA!OkP_ujwv-o5Acp4fYO@0rQ=?|YB@|C2jo@!wYWOJA5Q-#_7Jq+knx)Gy$83#smZ;F8QnzgXsM4-lj|a3=)RHBctJ4`BcrI%4 z&^)ItFbjn1q)WPFI*)_zG9dwx6w58O%nH5wi1k}-z)Gu(7&2^)L8CTUYn@HjtGCgl zG2F^4rc>QBd=@Q1%7`rChU*3h9; z>&mESz-6IGV{x6s5>(*4Q&@(EWne`ynMsu6FT;S(qt^oErvMBUFJ?Ocs2|Efa`z_% z4+3-`nsg~u)%>w>kU>I#3DY9O@oV8+5|@}#Q_WJMOA-h0q!0^ZwMq$C2&yp!P?B}P z@=2j4X15s27udgjvj`{xRk)Vg42}kc$VYK}XeQ(MdWFMU+dd|DYIw_WNZfZ={Qg>P z(pa;VGZq{PjM>$55w<85>$GN26xDH@yT7H>HzK!0lB@?0YNLG*)Kfw5L8fQSk-yW? zdK*RC=z}=1`q-Y04rUutp-kgD*M~neG7>ET#ZYW87Frl4qJe6@&I+E_Xaq&Qj-lYY zakSa2)nw5z8X5^!7wa@`8^dL^V8B!O7wBYjz%UNeHM?Z1>}-h;1WeXi5po+HqoFtI zD#-~-qem&XsDR8YYgYy#DX~Tcam>zfHfBlO!D9I4F2+|;7eH(Ua)z!_&V?5df}w>h z;|te>K$xO>e?AGsX9~{gFl-;*V*66(23qLteM )8x2wTy4sm|$UBVF7Wz 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 bGAR@Yh2TTsqnk*C_-*A}-af0}9g0mS;50#L literal 0 HcmV?d00001 diff --git a/assets/external/fonts.gstatic.com/s/robotomono/v23/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSt0mf0h.woff2 b/assets/external/fonts.gstatic.com/s/robotomono/v23/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSt0mf0h.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..11e6a46a40c7afdee2981511cf98f78a62ef9f2f GIT binary patch literal 10096 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

-KfCKkVgUqz8QxqfO}8iQ0)j$QDq& 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 literal 0 HcmV?d00001 diff --git a/assets/external/fonts.gstatic.com/s/robotomono/v23/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtElOUlYIw.woff2 b/assets/external/fonts.gstatic.com/s/robotomono/v23/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtElOUlYIw.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..1f1c97fecdbde2d7c29e8dd92b152e5b4f30f17c GIT binary patch literal 7972 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 XMQ{4hxA|M=Cwa5=H!EjyH2?qr_e6{Z literal 0 HcmV?d00001 diff --git a/assets/external/fonts.gstatic.com/s/robotomono/v23/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEluUlYIw.woff2 b/assets/external/fonts.gstatic.com/s/robotomono/v23/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEluUlYIw.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..6f232c38a17ecea6607432d096a52b3c0ce4fb3a GIT binary patch literal 26644 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 literal 0 HcmV?d00001 diff --git a/assets/external/fonts.gstatic.com/s/robotomono/v23/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEm-Ul.woff2 b/assets/external/fonts.gstatic.com/s/robotomono/v23/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEm-Ul.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..a3e5aef7c93b6334a03923067da54adb1e025619 GIT binary patch literal 24652 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 TS>*;jf81#>o`iG#8mbKdV$}U= literal 0 HcmV?d00001 diff --git a/assets/external/fonts.gstatic.com/s/robotomono/v23/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEmOUlYIw.woff2 b/assets/external/fonts.gstatic.com/s/robotomono/v23/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEmOUlYIw.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..f73f27d6e1a1f8ae9f9da42274083f7543d85513 GIT binary patch literal 10704 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 CEy7m- literal 0 HcmV?d00001 diff --git a/assets/external/fonts.gstatic.com/s/robotomono/v23/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEn-UlYIw.woff2 b/assets/external/fonts.gstatic.com/s/robotomono/v23/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEn-UlYIw.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..135d06e00d05b590861cd226b3bbe781f4940952 GIT binary patch literal 14288 zcmV;>H!sL{Pew8T0RR9105{M85&!@I09+^l05@p>0RR9100000000000000000000 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 literal 0 HcmV?d00001 diff --git a/assets/external/unpkg.com/iframe-worker/shim.js b/assets/external/unpkg.com/iframe-worker/shim.js new file mode 100644 index 0000000..5f1e232 --- /dev/null +++ b/assets/external/unpkg.com/iframe-worker/shim.js @@ -0,0 +1 @@ +"use strict";(()=>{function c(s,n){parent.postMessage(s,n||"*")}function d(...s){return s.reduce((n,e)=>n.then(()=>new Promise(r=>{let t=document.createElement("script");t.src=e,t.onload=r,document.body.appendChild(t)})),Promise.resolve())}var o=class extends EventTarget{constructor(e){super();this.url=e;this.m=e=>{e.source===this.w&&(this.dispatchEvent(new MessageEvent("message",{data:e.data})),this.onmessage&&this.onmessage(e))};this.e=(e,r,t,i,m)=>{if(r===`${this.url}`){let a=new ErrorEvent("error",{message:e,filename:r,lineno:t,colno:i,error:m});this.dispatchEvent(a),this.onerror&&this.onerror(a)}};let r=document.createElement("iframe");r.hidden=!0,document.body.appendChild(this.iframe=r),this.w.document.open(),this.w.document.write(` + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + + + + + + + + +

Cells distributions

+ + + + + + + + + + + + +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/demo_notebooks/cells_distributions.ipynb b/demo_notebooks/cells_distributions.ipynb new file mode 100644 index 0000000..a5ac43e --- /dev/null +++ b/demo_notebooks/cells_distributions.ipynb @@ -0,0 +1,934 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "This notebook shows how to load data exported from QuPath, compute metrics and display them, according to the configuration file. This is meant for a single-animal.\n", + "\n", + "There are some conventions that need to be met in the QuPath project so that the measurements are usable with `histoquant`:\n", + "+ Objects' classifications must be derived, eg. be in the form \"something: else\". The primary classification (\"something\") will be refered to \"object_type\" and the secondary classification (\"else\") to \"channel\" in the configuration file.\n", + "+ Only one \"object_type\" can be processed at once, but supports any numbers of channels.\n", + "+ Annotations (brain regions) must have properly formatted measurements. For punctual objects, it would be the count. Run the \"add_regions_count.groovy\" script to add them. The measurements names must be in the form \"something: else name\", for instance, \"something: else Count\". \"name\" is refered to \"base_measurement\" in the configuration file.\n", + "\n", + "You should copy this notebook, the configuration file and the atlas-related configuration files (blacklist and fusion) elsewhere and edit them according to your need.\n", + "\n", + "The data was generated from QuPath with stardist cell detection on toy data." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "import pandas as pd\n", + "\n", + "import histoquant as hq" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "# Full path to your configuration file, edited according to your need beforehand\n", + "config_file = \"../../resources/demo_config_cells.toml\"" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "# - Files\n", + "# animal identifier\n", + "animal = \"animalid0\"\n", + "# set the full path to the annotations tsv file from QuPath\n", + "annotations_file = \"../../resources/cells_measurements_annotations.tsv\"\n", + "# set the full path to the detections tsv file from QuPath\n", + "detections_file = \"../../resources/cells_measurements_detections.tsv\"" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "# get configuration\n", + "cfg = hq.config.Config(config_file)" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
ImageObject typeNameClassificationParentROICentroid X µmCentroid Y µmCells: marker+ CountCells: marker- CountIDSideParent IDNum DetectionsNum Cells: marker+Num Cells: marker-Area µm^2Perimeter µm
Object ID
4781ed63-0d8e-422e-aead-b685fbe20eb5animalid0_030.ome.tiffAnnotationRootNaNRoot object (Image)Geometry5372.53922.100NaNNaNNaN2441136230531666431.637111.9
aa4b133d-13f9-42d9-8c21-45f143b41a85animalid0_030.ome.tiffAnnotationrootRight: rootRootPolygon7094.94085.7009970.0NaN128441124315882755.918819.5
42c3b914-91c5-4b65-a603-3f9431717d48animalid0_030.ome.tiffAnnotationgreyRight: greyrootGeometry7256.84290.60080.0997.010092498512026268.749600.3
887af3eb-4061-4f8a-aa4c-fe9b81184061animalid0_030.ome.tiffAnnotationCBRight: CBgreyGeometry7778.73679.20165120.08.054255376943579.030600.2
adaabc05-36d1-4aad-91fe-2e904adc574fanimalid0_030.ome.tiffAnnotationCBNRight: CBNCBGeometry6790.53567.9005190.0512.055154864212.37147.4
\n", + "
" + ], + "text/plain": [ + " Image Object type \\\n", + "Object ID \n", + "4781ed63-0d8e-422e-aead-b685fbe20eb5 animalid0_030.ome.tiff Annotation \n", + "aa4b133d-13f9-42d9-8c21-45f143b41a85 animalid0_030.ome.tiff Annotation \n", + "42c3b914-91c5-4b65-a603-3f9431717d48 animalid0_030.ome.tiff Annotation \n", + "887af3eb-4061-4f8a-aa4c-fe9b81184061 animalid0_030.ome.tiff Annotation \n", + "adaabc05-36d1-4aad-91fe-2e904adc574f animalid0_030.ome.tiff Annotation \n", + "\n", + " Name Classification \\\n", + "Object ID \n", + "4781ed63-0d8e-422e-aead-b685fbe20eb5 Root NaN \n", + "aa4b133d-13f9-42d9-8c21-45f143b41a85 root Right: root \n", + "42c3b914-91c5-4b65-a603-3f9431717d48 grey Right: grey \n", + "887af3eb-4061-4f8a-aa4c-fe9b81184061 CB Right: CB \n", + "adaabc05-36d1-4aad-91fe-2e904adc574f CBN Right: CBN \n", + "\n", + " Parent ROI \\\n", + "Object ID \n", + "4781ed63-0d8e-422e-aead-b685fbe20eb5 Root object (Image) Geometry \n", + "aa4b133d-13f9-42d9-8c21-45f143b41a85 Root Polygon \n", + "42c3b914-91c5-4b65-a603-3f9431717d48 root Geometry \n", + "887af3eb-4061-4f8a-aa4c-fe9b81184061 grey Geometry \n", + "adaabc05-36d1-4aad-91fe-2e904adc574f CB Geometry \n", + "\n", + " Centroid X µm Centroid Y µm \\\n", + "Object ID \n", + "4781ed63-0d8e-422e-aead-b685fbe20eb5 5372.5 3922.1 \n", + "aa4b133d-13f9-42d9-8c21-45f143b41a85 7094.9 4085.7 \n", + "42c3b914-91c5-4b65-a603-3f9431717d48 7256.8 4290.6 \n", + "887af3eb-4061-4f8a-aa4c-fe9b81184061 7778.7 3679.2 \n", + "adaabc05-36d1-4aad-91fe-2e904adc574f 6790.5 3567.9 \n", + "\n", + " Cells: marker+ Count \\\n", + "Object ID \n", + "4781ed63-0d8e-422e-aead-b685fbe20eb5 0 \n", + "aa4b133d-13f9-42d9-8c21-45f143b41a85 0 \n", + "42c3b914-91c5-4b65-a603-3f9431717d48 0 \n", + "887af3eb-4061-4f8a-aa4c-fe9b81184061 0 \n", + "adaabc05-36d1-4aad-91fe-2e904adc574f 0 \n", + "\n", + " Cells: marker- Count ID Side \\\n", + "Object ID \n", + "4781ed63-0d8e-422e-aead-b685fbe20eb5 0 NaN NaN \n", + "aa4b133d-13f9-42d9-8c21-45f143b41a85 0 997 0.0 \n", + "42c3b914-91c5-4b65-a603-3f9431717d48 0 8 0.0 \n", + "887af3eb-4061-4f8a-aa4c-fe9b81184061 16 512 0.0 \n", + "adaabc05-36d1-4aad-91fe-2e904adc574f 0 519 0.0 \n", + "\n", + " Parent ID Num Detections \\\n", + "Object ID \n", + "4781ed63-0d8e-422e-aead-b685fbe20eb5 NaN 2441 \n", + "aa4b133d-13f9-42d9-8c21-45f143b41a85 NaN 1284 \n", + "42c3b914-91c5-4b65-a603-3f9431717d48 997.0 1009 \n", + "887af3eb-4061-4f8a-aa4c-fe9b81184061 8.0 542 \n", + "adaabc05-36d1-4aad-91fe-2e904adc574f 512.0 55 \n", + "\n", + " Num Cells: marker+ Num Cells: marker- \\\n", + "Object ID \n", + "4781ed63-0d8e-422e-aead-b685fbe20eb5 136 2305 \n", + "aa4b133d-13f9-42d9-8c21-45f143b41a85 41 1243 \n", + "42c3b914-91c5-4b65-a603-3f9431717d48 24 985 \n", + "887af3eb-4061-4f8a-aa4c-fe9b81184061 5 537 \n", + "adaabc05-36d1-4aad-91fe-2e904adc574f 1 54 \n", + "\n", + " Area µm^2 Perimeter µm \n", + "Object ID \n", + "4781ed63-0d8e-422e-aead-b685fbe20eb5 31666431.6 37111.9 \n", + "aa4b133d-13f9-42d9-8c21-45f143b41a85 15882755.9 18819.5 \n", + "42c3b914-91c5-4b65-a603-3f9431717d48 12026268.7 49600.3 \n", + "887af3eb-4061-4f8a-aa4c-fe9b81184061 6943579.0 30600.2 \n", + "adaabc05-36d1-4aad-91fe-2e904adc574f 864212.3 7147.4 " + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
ImageObject typeNameClassificationParentROIAtlas_XAtlas_YAtlas_Z
Object ID
5ff386a8-5abd-46d1-8e0d-f5c5365457c1animalid0_030.ome.tiffDetectionNaNCells: marker-VeCBPolygon11523.04272.44276.7
9a2a9a8c-acbe-4308-bc5e-f3c9fd1754c0animalid0_030.ome.tiffDetectionNaNCells: marker-VeCBPolygon11520.24278.44418.6
481a519b-8b40-4450-9ec6-725181807d72animalid0_030.ome.tiffDetectionNaNCells: marker-VeCBPolygon11506.04317.24356.3
fd28e09c-2c64-4750-b026-cd99e3526a57animalid0_030.ome.tiffDetectionNaNCells: marker-VeCBPolygon11528.44257.44336.4
3d9ce034-f2ed-4c73-99be-f782363cf323animalid0_030.ome.tiffDetectionNaNCells: marker-VeCBPolygon11548.74203.34294.3
\n", + "
" + ], + "text/plain": [ + " Image Object type \\\n", + "Object ID \n", + "5ff386a8-5abd-46d1-8e0d-f5c5365457c1 animalid0_030.ome.tiff Detection \n", + "9a2a9a8c-acbe-4308-bc5e-f3c9fd1754c0 animalid0_030.ome.tiff Detection \n", + "481a519b-8b40-4450-9ec6-725181807d72 animalid0_030.ome.tiff Detection \n", + "fd28e09c-2c64-4750-b026-cd99e3526a57 animalid0_030.ome.tiff Detection \n", + "3d9ce034-f2ed-4c73-99be-f782363cf323 animalid0_030.ome.tiff Detection \n", + "\n", + " Name Classification Parent ROI \\\n", + "Object ID \n", + "5ff386a8-5abd-46d1-8e0d-f5c5365457c1 NaN Cells: marker- VeCB Polygon \n", + "9a2a9a8c-acbe-4308-bc5e-f3c9fd1754c0 NaN Cells: marker- VeCB Polygon \n", + "481a519b-8b40-4450-9ec6-725181807d72 NaN Cells: marker- VeCB Polygon \n", + "fd28e09c-2c64-4750-b026-cd99e3526a57 NaN Cells: marker- VeCB Polygon \n", + "3d9ce034-f2ed-4c73-99be-f782363cf323 NaN Cells: marker- VeCB Polygon \n", + "\n", + " Atlas_X Atlas_Y Atlas_Z \n", + "Object ID \n", + "5ff386a8-5abd-46d1-8e0d-f5c5365457c1 11523.0 4272.4 4276.7 \n", + "9a2a9a8c-acbe-4308-bc5e-f3c9fd1754c0 11520.2 4278.4 4418.6 \n", + "481a519b-8b40-4450-9ec6-725181807d72 11506.0 4317.2 4356.3 \n", + "fd28e09c-2c64-4750-b026-cd99e3526a57 11528.4 4257.4 4336.4 \n", + "3d9ce034-f2ed-4c73-99be-f782363cf323 11548.7 4203.3 4294.3 " + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# read data\n", + "df_annotations = pd.read_csv(annotations_file, index_col=\"Object ID\", sep=\"\\t\")\n", + "df_detections = pd.read_csv(detections_file, index_col=\"Object ID\", sep=\"\\t\")\n", + "\n", + "# remove annotations that are not brain regions\n", + "df_annotations = df_annotations[df_annotations[\"Classification\"] != \"Region*\"]\n", + "df_annotations = df_annotations[df_annotations[\"ROI\"] != \"Rectangle\"]\n", + "\n", + "# convert atlas coordinates from mm to microns\n", + "df_detections[[\"Atlas_X\", \"Atlas_Y\", \"Atlas_Z\"]] = df_detections[\n", + " [\"Atlas_X\", \"Atlas_Y\", \"Atlas_Z\"]\n", + "].multiply(1000)\n", + "\n", + "# have a look\n", + "display(df_annotations.head())\n", + "display(df_detections.head())" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
NamehemisphereArea µm^2Area mm^2countdensity µm^-2density mm^-2coverage indexrelative countrelative densitychannelanimal
0ACVIILeft8307.10.00830710.00012120.3789530.000120.0021320.205275Positiveanimalid0
0ACVIILeft8307.10.00830710.00012120.3789530.000120.0001890.020671Negativeanimalid0
1ACVIIRight7061.40.00706100.00.00.00.00.0Positiveanimalid0
1ACVIIRight7061.40.00706110.000142141.6149770.0001420.0001440.021646Negativeanimalid0
2ACVIIboth15368.50.01536910.00006565.0681590.0000650.0013620.153797Positiveanimalid0
\n", + "
" + ], + "text/plain": [ + " Name hemisphere Area µm^2 Area mm^2 count density µm^-2 density mm^-2 \\\n", + "0 ACVII Left 8307.1 0.008307 1 0.00012 120.378953 \n", + "0 ACVII Left 8307.1 0.008307 1 0.00012 120.378953 \n", + "1 ACVII Right 7061.4 0.007061 0 0.0 0.0 \n", + "1 ACVII Right 7061.4 0.007061 1 0.000142 141.614977 \n", + "2 ACVII both 15368.5 0.015369 1 0.000065 65.068159 \n", + "\n", + " coverage index relative count relative density channel animal \n", + "0 0.00012 0.002132 0.205275 Positive animalid0 \n", + "0 0.00012 0.000189 0.020671 Negative animalid0 \n", + "1 0.0 0.0 0.0 Positive animalid0 \n", + "1 0.000142 0.000144 0.021646 Negative animalid0 \n", + "2 0.000065 0.001362 0.153797 Positive animalid0 " + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
ImageObject typeNameClassificationParentROIAtlas_XAtlas_YAtlas_ZhemispherechannelAtlas_APAtlas_DVAtlas_MLanimal
Object ID
5ff386a8-5abd-46d1-8e0d-f5c5365457c1animalid0_030.ome.tiffDetectionNaNCells: marker-VeCBPolygon11.52304.27244.2767RightNegative-6.4337163.098278-1.4233animalid0
9a2a9a8c-acbe-4308-bc5e-f3c9fd1754c0animalid0_030.ome.tiffDetectionNaNCells: marker-VeCBPolygon11.52024.27844.4186RightNegative-6.4314493.104147-1.2814animalid0
481a519b-8b40-4450-9ec6-725181807d72animalid0_030.ome.tiffDetectionNaNCells: marker-VeCBPolygon11.50604.31724.3563RightNegative-6.4206853.141780-1.3437animalid0
fd28e09c-2c64-4750-b026-cd99e3526a57animalid0_030.ome.tiffDetectionNaNCells: marker-VeCBPolygon11.52844.25744.3364RightNegative-6.4377883.083737-1.3636animalid0
3d9ce034-f2ed-4c73-99be-f782363cf323animalid0_030.ome.tiffDetectionNaNCells: marker-VeCBPolygon11.54874.20334.2943RightNegative-6.4532963.031224-1.4057animalid0
\n", + "
" + ], + "text/plain": [ + " Image Object type \\\n", + "Object ID \n", + "5ff386a8-5abd-46d1-8e0d-f5c5365457c1 animalid0_030.ome.tiff Detection \n", + "9a2a9a8c-acbe-4308-bc5e-f3c9fd1754c0 animalid0_030.ome.tiff Detection \n", + "481a519b-8b40-4450-9ec6-725181807d72 animalid0_030.ome.tiff Detection \n", + "fd28e09c-2c64-4750-b026-cd99e3526a57 animalid0_030.ome.tiff Detection \n", + "3d9ce034-f2ed-4c73-99be-f782363cf323 animalid0_030.ome.tiff Detection \n", + "\n", + " Name Classification Parent ROI \\\n", + "Object ID \n", + "5ff386a8-5abd-46d1-8e0d-f5c5365457c1 NaN Cells: marker- VeCB Polygon \n", + "9a2a9a8c-acbe-4308-bc5e-f3c9fd1754c0 NaN Cells: marker- VeCB Polygon \n", + "481a519b-8b40-4450-9ec6-725181807d72 NaN Cells: marker- VeCB Polygon \n", + "fd28e09c-2c64-4750-b026-cd99e3526a57 NaN Cells: marker- VeCB Polygon \n", + "3d9ce034-f2ed-4c73-99be-f782363cf323 NaN Cells: marker- VeCB Polygon \n", + "\n", + " Atlas_X Atlas_Y Atlas_Z hemisphere \\\n", + "Object ID \n", + "5ff386a8-5abd-46d1-8e0d-f5c5365457c1 11.5230 4.2724 4.2767 Right \n", + "9a2a9a8c-acbe-4308-bc5e-f3c9fd1754c0 11.5202 4.2784 4.4186 Right \n", + "481a519b-8b40-4450-9ec6-725181807d72 11.5060 4.3172 4.3563 Right \n", + "fd28e09c-2c64-4750-b026-cd99e3526a57 11.5284 4.2574 4.3364 Right \n", + "3d9ce034-f2ed-4c73-99be-f782363cf323 11.5487 4.2033 4.2943 Right \n", + "\n", + " channel Atlas_AP Atlas_DV Atlas_ML \\\n", + "Object ID \n", + "5ff386a8-5abd-46d1-8e0d-f5c5365457c1 Negative -6.433716 3.098278 -1.4233 \n", + "9a2a9a8c-acbe-4308-bc5e-f3c9fd1754c0 Negative -6.431449 3.104147 -1.2814 \n", + "481a519b-8b40-4450-9ec6-725181807d72 Negative -6.420685 3.141780 -1.3437 \n", + "fd28e09c-2c64-4750-b026-cd99e3526a57 Negative -6.437788 3.083737 -1.3636 \n", + "3d9ce034-f2ed-4c73-99be-f782363cf323 Negative -6.453296 3.031224 -1.4057 \n", + "\n", + " animal \n", + "Object ID \n", + "5ff386a8-5abd-46d1-8e0d-f5c5365457c1 animalid0 \n", + "9a2a9a8c-acbe-4308-bc5e-f3c9fd1754c0 animalid0 \n", + "481a519b-8b40-4450-9ec6-725181807d72 animalid0 \n", + "fd28e09c-2c64-4750-b026-cd99e3526a57 animalid0 \n", + "3d9ce034-f2ed-4c73-99be-f782363cf323 animalid0 " + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# get distributions per regions, spatial distributions and coordinates\n", + "df_regions, dfs_distributions, df_coordinates = hq.process.process_animal(\n", + " animal, df_annotations, df_detections, cfg, compute_distributions=True\n", + ")\n", + "\n", + "# have a look\n", + "display(df_regions.head())\n", + "display(df_coordinates.head())" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# plot distributions per regions\n", + "figs_regions = hq.display.plot_regions(df_regions, cfg)\n", + "# specify which regions to plot\n", + "# figs_regions = hq.display.plot_regions(df_regions, cfg, names_list=[\"GRN\", \"IRN\", \"MDRNv\"])\n", + "\n", + "# save as svg\n", + "# figs_regions[0].savefig(r\"C:\\Users\\glegoc\\Downloads\\regions_count.svg\")\n", + "# figs_regions[1].savefig(r\"C:\\Users\\glegoc\\Downloads\\regions_density.svg\")" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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eOONEAQBgiDAYrFg5MiReOCBB+DpOJAySDNmzEBZWRlSU1MBAC+99BLS0tI6nffNN9/glltu6dd7xTNlYsNgt8nHblZsEBEREVEcqi/+HAAgudxo2blP42hI70xaB0ChM3v2bPztb3+D0+nEu+++i9tvvx1msxlLly7t8zUtFgtycnJ6PS8zM7PP70GA5HbLx4YEG9DcDADwVFZrFRIRERERkWZadu6Xj8XGZg0joWjAio0YYrVakZOTg2HDhuG2225DYWEh1q5di9raWsybNw/p6elISEjAT37yE+zb1571PHz4MC655BKkp6cjMTERJ510Et59910A6laUjRs3Yv78+aivr5erQ+6//34A6laUa6+9FnPmzFHF5na7kZGRgVdeeQUAIIoili9fjoKCAtjtdkyaNAn//ve/w/+XpFPKVa+GBLt8zIoNIiIiIoo3YqsDzoNH5M+9TGxQL1ixEcPsdjtOnDiBG2+8Efv27cPatWuRkpKCX//617jwwguxc+dOmM1m3H777XC5XPj000+RmJiInTt3IikpqdP1ZsyYgZUrV+Lee+/Fnj17AKDL8+bOnYurr74aTU1N8vPvv/8+WlpacMUVVwAAli9fjn/84x8oKirCqFGj8Omnn+K6665DZmYmZs6cGca/FX1StaIoExvsJyQiIiKiONO65yAgivLn3sYmDaOhaMDERgAu2r0RVW5HxN8302zDurHnBP06SZJQXFyM999/Hz/5yU/w1ltv4fPPP8eMGTMAAKtXr0ZeXh7eeustXH311SgtLcWVV16JCRMmAACGDx/e5XUtFgtSU1MhCEKP7SmzZs1CYmIi3nzzTVx//fUAgFdffRWXXnopkpOT4XQ68fDDD2PDhg2YPn26/J6bNm3CCy+8ENeJDUEQIJhNEAy+Yip3FRMbRERERBRfWhVtKADgbWrRKBKKFkxsBKDK7UC5BomNYL3zzjtISkqC2+2GKIq49tpr8dOf/hTvvPMOpk2bJp83cOBAjBkzBrt27QIALFy4ELfddhs++OADFBYW4sorr8TEiRP7HIfJZMLPfvYzrF69Gtdffz2am5vx9ttv47XXXgMA7N+/Hy0tLbjgggtUr3O5XJgyZUqf3zeayYkNk8mX3DD5/tN0V9VC8nohGI1ahkdEREREFDEdh4V6G1ixQT1jYiMAmWZb7yfp4H3PPfdcPP/8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a7Dps8+waNm9AHxtKMokiJ8pJQnpl5wPU2qy/Jh/xgbAzShEREREFP3c5VXw1vp+4edvQwHUFRtiU0vE46LooemMjTlz5qCqqgr33nsvysvLMXnyZKxfv14eKFpaWgqDonohLy8P77//PhYtWoSJEyciNzcXd955J379619r9UfQJUmSUFxcjPfffx933HEH9u3bh7Vr1+Lzzz/HjBkzAACrV69GXl4e3nrrLVx99dUoLS3FlVdeiQkTJgAAhg/vur3BYrEgNTUVgiD02AIya9YsJCYm4s0338T1118PAHj11Vdx6aWXIjk5GU6nEw8//DA2bNggV+gMHz4cmzZtwgsvvICZM2cCAEaMGIGMjIyg/vxutxtFRUUYMWIEAGDBggV44IEHgrqGUmlpKRITE3HxxRcjOTkZw4YNw5QpU7o8d8CAATAajUhOTlb9/Sxfvhxz586VKztGjRqFJ+5dhsKrrsDK392H5Iz0gOORhilbUVixQURERETRTTU4dJwisZHC4aEUGM2Hhy5YsAALFizo8rmNGzd2emz69On48ssvwxxVdHrnnXeQlJQEt9sNURRx7bXX4v7770dxcTFMJhOmTZsmnztw4ECMGTMGu3btAgAsXLgQt912Gz744AMUFhbiyiuvxMSJE/sci8lkws9+9jOsXr0a119/PZqbm/H222/jtddeAwDs378fLS0tuOCCC1Svc7lcqqSBslUpUAkJCXJSA/DNZqmsrOzjnwS44IILMGzYMAwfPhyzZ8/G7NmzccUVVyAhIaH3F7f57rvvsH37dqxevVp+TPKKEEURh8uOYfLkkwIPKCkBxoHp8J6oZcUGEREREUW9FsXgUPtJo+RjY6Ji3StnbFAPNE9sUOice+65eP7552GxWDB48OCgtqHcdNNNmDVrFtatW4cPPvgAy5cvxxNPPNGv7SFz587FzJkzUVlZiQ8//BB2ux2zZ88GALlFZd26dcjNzVW9rr8DrZQbSgDf/ApJkvp8veTkZGzduhUbN27EBx98gHvvvRf3338/vvnmG6SlpQV0jaamJvzyl7/EwoULAQCuskp46hsBAMMnnNx5cGgvzAW58J6ohbvyBLzNLaqbPhERERFRNOmuYkMwm2Cw2yC2OpjYoB5pOmODQisxMREjR47E0KFDVUmNcePGwePx4KuvvpIfO3HiBPbs2YPx48fLj+Xl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HopD5eXl4amnnoKvry+kUim6du2K06dPO3pYxIk5+7lJbZmZmZg2bRqio6MhlUoRExODRYsWQafTOXpoN8UVj5V30jHPmY9dFNhwYgMHDkR+fr7N1zPPPIPo6Gj07t3b0cNrlr/++guTJk3C1KlTcf78eRw5cgT/+c9/HD2sm/LOO+/Y/E1efPFFRw/pps2bNw8hISGOHsZNGzJkCP744w+kpKTgr7/+QlpaGh577DFHD4s4od9//x1z587FokWLkJiYiO7du2PEiBEoLCx09NAc4uDBg5gxYwaOHz+OPXv2QK/X4/7774dSqXT00NqEU6dO4dtvv0W3bt0cPRSHKisrw6BBgyAUCrFjxw5cvnwZn376Kby9vR09NOLEnP3cpLYrV67AZDLh22+/RVJSEj7//HOsWLECr7/+uqOH1myueqy8U455Tn/sYonL0Ol0rL+/P/vOO+84eijNotfr2dDQUPaHH35w9FBuWWRkJPv55587ehgtYvv27WzHjh3ZpKQkFgB79uxZRw/plm3evJllGIbV6XSOHgpxMn379mVnzJjB/Ww0GtmQkBB2yZIlDhxV21FYWMgCYA8ePOjooThcVVUVGxsby+7Zs4e999572dmzZzt6SA4zf/589q677nL0MIgLccVzE3s++ugjNjo62tHDaLY75Vjpisc8Vzh2UcaGC9myZQtKSkowdepURw+lWRITE5GXlwcej4cePXogODgYDzzwAC5duuTood2UDz74AL6+vujRowc+/vhjGAwGRw+p2W7cuIFnn30Wq1evhkwmc/RwWkRpaSnWrFmDgQMHQigUOno4xInodDqcOXMGw4cP527j8XgYPnw4jh075sCRtR0VFRUAAB8fHwePxPFmzJiB0aNH2/y/3Km2bNmC3r17Y/z48QgICECPHj3w/fffO3pYxEm54rlJfSoqKpxuPr2TjpWueMxzhWMXBTZcyI8//ogRI0YgLCzM0UNplvT0dADA22+/jYULF2Lr1q3w9vbG4MGDUVpa6uDRNc+sWbOwbt067N+/H88//zwWL16MefPmOXpYzcKyLJ5++mlMnz7d6ZY02TN//nzI5XL4+voiOzsbmzdvdvSQiJMpLi6G0WhEYGCgze2BgYEoKChw0KjaDpPJhJdeegmDBg1Cly5dHD0ch1q3bh0SExOxZMkSRw+lTUhPT8fy5csRGxuLXbt24YUXXsCsWbPw888/O3poxMm42rlJQ1JTU7Fs2TI8//zzjh5Ks9wpx0pXPOa5yrGLAhtt0GuvvVZvUdDqrytXrtg8Jjc3F7t27cK0adMcNOq6mvo6TCYTAOCNN97Ao48+il69emHlypVgGAbr16938Kto3t9j7ty5GDx4MLp164bp06fj008/xbJly6DVah38Kpr+OpYtW4aqqiosWLDA0UO2q7nvj1dffRVnz57F7t27wefzMXnyZLAs68BXQIhrmTFjBi5duoR169Y5eigOlZOTg9mzZ2PNmjWQSCSOHk6bYDKZ0LNnTyxevBg9evTAc889h2effRYrVqxw9NBIG+Eq5yb23Mz5fF5eHkaOHInx48fj2WefddDISUNc7ZjnSscuhqUz/DanqKgIJSUlDW7Trl07iEQi7ud3330Xy5YtQ15eXptJs2/q6zhy5AiGDh2Kw4cP46677uLu69evH4YPH47333+/tYfaoJv5e1RLSkpCly5dcOXKFcTFxbXWEJukqa/j8ccfx99//w2GYbjbjUYj+Hw+Jk6c6PArbbfy98jNzUV4eDiOHj2KAQMGtNYQiYvR6XSQyWT4888/bbo1TZkyBeXl5Xd0FtDMmTOxefNmHDp0CNHR0Y4ejkNt2rQJDz/8MPh8Pneb0WgEwzDg8XjQarU2990JIiMjcd999+GHH37gblu+fDnee+895OXlOXBkpK1wlXMTe5p7vnL9+nUMHjwY/fv3x6pVq8DjOdf15zvhWOmKxzxXOnYJHD0AUpe/vz/8/f2bvD3Lsli5ciUmT57cZoIaQNNfR69evSAWi5GSksIFNvR6PTIzMxEZGdnaw2xUc/8e1s6dOwcej4eAgIAWHlXzNfV1fPnll3jvvfe4n69fv44RI0bg999/R79+/VpziE1yK3+P6uygtpBBQ5yHSCRCr169sHfvXu5kzWQyYe/evZg5c6ZjB+cgLMvixRdfxMaNG3HgwAGXOcG7FcOGDcPFixdtbps6dSo6duyI+fPnO82JYUsaNGhQnZaIV69ebRPHdtI2uMq5iT3NOV/Jy8vDkCFDuKxlZwtqAK59rHTlY54rHbsosOEC9u3bh4yMDDzzzDOOHspN8fDwwPTp07Fo0SKEh4cjMjISH3/8MQBg/PjxDh5d0x07dgwnTpzAkCFD4O7ujmPHjmHOnDl46qmnnKq1XUREhM3Pbm5uAICYmBinqt9y4sQJnDp1CnfddRe8vb2RlpaGN998EzExMZStQZpt7ty5mDJlCnr37o2+ffti6dKlUCqVTlesuaXMmDEDa9euxebNm+Hu7s6tn/b09IRUKnXw6BzD3d29znrr6vo+rrIOu7nmzJmDgQMHYvHixXj88cdx8uRJfPfdd/juu+8cPTTiZFzl3MSevLw8DB48GJGRkfjkk09QVFTE3RcUFOTAkTWfqx4rXfmY50rHLgpsuIAff/wRAwcORMeOHR09lJv28ccfQyAQYNKkSVCr1ejXrx/27dvnVAEBsViMdevW4e2334ZWq0V0dDTmzJmDuXPnOnpodySZTIYNGzZg0aJFUCqVCA4OxsiRI7Fw4UKIxWJHD484mQkTJqCoqAhvvfUWCgoKkJCQgJ07d9YpknanWL58OQBg8ODBNrevXLkSTz/99O0fEGmT+vTpg40bN2LBggV45513EB0djaVLl2LixImOHhohbcaePXuQmpqK1NTUOkEaZ6sY4KrHSjrmOQeqsUEIIYQQQgghhBCn5XwLuAghhBBCCCGEEEIsKLBBCCGEEEIIIYQQp0WBDUIIIYQQQgghhDgtCmwQQgghhBBCCCHEaVFggxBCCCGEEEIIIU6LAhuEEEIIIYQQQghxWhTYIIQQQgghhBBCiNOiwAa5Y7399ttISEho1mMYhsGmTZtaZTxNceDAATAMg/Ly8ga3i4qKwtKlS2/LmCZNmoTFixffln3V1r9/f/z1118O2TchxHFoLq6L5mJCbr/ac8GqVavg5eV1y897O+eOm0XzcF00DzsWBTac3NNPPw2GYcAwDIRCIaKjozFv3jxoNJoWef7MzEwwDINz5861yPORWzNw4EDk5+fD09MTQP0H0FOnTuG5555r9fGcP38e27dvx6xZs1p9X/YsXLgQr732Gkwmk0P2T4i12vNxYGAg7rvvPvz00093/P+oM5ykNwfNxbZoLiZtUfWcPH369Dr3zZgxAwzD4Omnn27RfU6YMAFXr15t0edsipYKqDgTmodt0TxMgQ2XMHLkSOTn5yM9PR2ff/45vv32WyxatOi2jkGn093W/d2pRCIRgoKCwDBMg9v5+/tDJpO1+niWLVuG8ePHw83NrdX3Zc8DDzyAqqoq7NixwyH7J6S26vk4MzMTO3bswJAhQzB79myMGTMGBoPhpp/3TphjjUaj05yQ0Vxsi+Zi0laFh4dj3bp1UKvV3G0ajQZr165FREREi+9PKpUiICCgxZ/3dqF5+ObRPOx4FNhwAWKxGEFBQQgPD8e4ceMwfPhw7Nmzh7tfq9Vi1qxZCAgIgEQiwV133YVTp05x95eVlWHixInw9/eHVCpFbGwsVq5cCQCIjo4GAPTo0QMMw2Dw4MEAzFHwcePG4f3330dISAji4uIAABcvXsTQoUMhlUrh6+uL5557DgqFotHX8Pfff6NPnz6QSCTw8/PDww8/zN23evVq9O7dG+7u7ggKCsJ//vMfFBYWcvfbi9Bu2rSpzkT3wQcfIDAwEO7u7pg2bVqdrJZTp07hvvvug5+fHzw9PXHvvfciMTGx0bFbGzx4MGbOnImZM2fC09MTfn5+ePPNN8GyLLdNWVkZJk+eDG9vb8hkMjzwwAO4du0ad39WVhYefPBBeHt7Qy6Xo3Pnzti+fTsA27S7AwcOYOrUqaioqOCuEr/99tsA6l4dzc7OxtixY+Hm5gYPDw88/vjjuHHjBnd/9bKc1atXIyoqCp6ennjiiSdQVVVV72s1Go34888/8eCDD9rcHhUVhffeew+TJ0+Gm5sbIiMjsWXLFhQVFXFj6NatG06fPs09pvpvuHXrVsTFxUEmk+Gxxx6DSqXCzz//jKioKHh7e2PWrFkwGo3c4/h8PkaNGoV169Y16+9ESGupno9DQ0PRs2dPvP7669i8eTN27NiBVatWcds19T35ww8/IDo6GhKJBADw559/omvXrtwcO3z4cCiVSgCAyWTCO++8g7CwMIjFYiQkJGDnzp31jrWyshJSqbTOSdDGjRvh7u4OlUoFAMjJycHjjz8OLy8v+Pj4YOzYscjMzOS2rz4efPLJJwgODoavry9mzJgBvV4PwDwvZmVlYc6cOdxcBdS877ds2YJOnTpBLBYjOzub5mKaiwlpMT179kR4eDg2bNjA3bZhwwZERESgR48eNtuaTCYsWbIE0dHRkEql6N69O/7880+bbbZv344OHTpAKpViyJAhNnMhYP+cdPny5YiJiYFIJEJcXBxWr17d7Nfx2WefoWvXrpDL5QgPD8f//d//cefXDc1BWq0Wr7zyCkJDQyGXy9GvXz8cOHCgznhpHqZ52BVQYMPFXLp0CUePHoVIJOJumzdvHv766y/8/PPPSExMRPv27TFixAiUlpYCAN58801cvnwZO3bsQHJyMpYvXw4/Pz8AwMmTJwEA//zzD/Lz820ODHv37kVKSgr27NmDrVu3QqlUYsSIEfD29sapU6ewfv16/PPPP5g5c2aDY962bRsefvhhjBo1CmfPnsXevXvRt29f7n69Xo93330X58+fx6ZNm5CZmdns1ME//vgDb7/9NhYvXozTp08jODgY33zzjc02VVVVmDJlCv79918cP34csbGxGDVqVIMTmT0///wzBAIBTp48iS+++AKfffYZfvjhB+7+p59+GqdPn8aWLVtw7NgxsCyLUaNGcR8CZsyYAa1Wi0OHDuHixYv48MMP7UZ/Bw4ciKVLl8LDwwP5+fnIz8/HK6+8Umc7k8mEsWPHorS0FAcPHsSePXuQnp6OCRMm2GyXlpaGTZs2YevWrdi6dSsOHjyIDz74oN7XeeHCBVRUVKB379517vv8888xaNAgnD17FqNHj8akSZMwefJkPPXUU0hMTERMTAwmT55sc3BTqVT48ssvsW7dOuzcuRMHDhzAww8/jO3bt2P79u1YvXo1vv322zonGX379sXhw4frHSchjjZ06FB0796dmz+b+p5MTU3FX3/9hQ0bNuDcuXPIz8/Hk08+if/+979ITk7GgQMH8Mgjj3Dvoy+++AKffvopPvnkE1y4cAEjRozAQw89ZHOSaM3DwwNjxozB2rVrbW5fs2YNxo0bB5lMBr1ejxEjRsDd3R2HDx/GkSNH4ObmhpEjR9pkkezfvx9paWnYv38/fv75Z6xatYoL5GzYsAFhYWF45513uLmqmkqlwocffogffvgBSUlJCAgIoLmY5mJCWtR///tf7oIdAPz000+YOnVqne2WLFmCX375BStWrEBSUhLmzJmDp556CgcPHgRgDvI+8sgjePDBB3Hu3Dk888wzeO211xrc98aNGzF79my8/PLLuHTpEp5//nlMnToV+/fvb9Zr4PF4+PLLL5GUlISff/4Z+/btw7x58wA0PAfNnDkTx44dw7p163DhwgWMHz8eI0eOtDku0DxM87DLYIlTmzJlCsvn81m5XM6KxWIWAMvj8dg///yTZVmWVSgUrFAoZNesWcM9RqfTsSEhIexHH33EsizLPvjgg+zUqVPtPn9GRgYLgD179myd/QYGBrJarZa77bvvvmO9vb1ZhULB3bZt2zaWx+OxBQUF9b6GAQMG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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# plot 1D distributions\n", + "fig_distrib = hq.display.plot_1D_distributions(\n", + " dfs_distributions, cfg, df_coordinates=df_coordinates\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "If there were several `animal` in the measurement file, it would be displayed as mean +/- sem instead." + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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iy++yNdff82WLVs4d86yzNkff/xBxYoVMR0+lBKPIZJu3bx5k7Zt27JmzRoAPv30U7766itcXFzsHJmIiNiFARsue2abakSedWohtzFvb2/u3r2Lt7d3mloCzZYuXLjAnTt3MJvN7N27lxs3bnDnzh0OHDhAWFjYI68pV64c77//PkWKFOH06dM8//zzAHTs2JGpU6cCYDo8HVALuUhCXL58mfr163P48GEMBgPjx4/nww8/tHdYcp9ayEUkNVlbyHf9imfmjLapMzgU74rv631MJJnUQm5jffr0YdCgQdy5c4d///2Xxo0b2zukVOfv74+/vz8AZcqUSdS1JpOJV155xfr6o48+su4rERdJmB07dvD6669z9uxZ/Pz8mD17Ni+99JK9wxIREbuz5XJlaiIXsQVN6mZj/fv3t3YHffXVV+0cTdpiMpkoV64cR48eBWDGjBlUqVLFzlGJpB0xMTF06dKFKlWqcPbsWQoUKMCmTZuUjIuIiIg4KCXkNpYhQwbmzJkDQFhY2DMxuZutLFmyhP379wMwffp03nzzTTtHJJJ2nDt3jrJlyzJu3DgAateuzcaNG8mfP7+dIxMREYehdchFHI4S8hRQtWpV6/4vv/xix0jSjqCgIAYNGgRAnTp1aN9eS5yJJITZbGb27NlUrFiRgwcP4uzszOzZs/nvv//w8/Ozd3giIuJQjDbeRCS59JOUAnx8fMiUKRMAEyZMsHM0js9kMtGyZUsOHDiAp6cnI0eOtHdIImlCVFQU7dq144033uDmzZsUKVKE/fv38/rrr9s7NBERcURqIRdxOErIU0j9+vUBOHr0KO+8846do3FsEyZM4L///gNg/vz5VKxY0c4RiTi+8PBwWrduzaxZswB455132LRpE0WLFrVzZCIi4rhsmYwrIRexBSXkKWTWrFlkzGhZVmLatGn07dvXzhE5pqioKPr06QNAp06dqFu3rp0jEnF8//77LyVLlmTJkiW4ubnxzz//MGXKFLJnz27v0EREREQkEZSQpxA3NzeuXbtGtmzZABg9erSdI3JMH330EeHh4QCMGjXKztGIOLbIyEgGDRrEK6+8wqlTp8icOTPLli17JpdXFBGRpDDYeBOR5FJCnoIyZ85snfE4MjKS7du32zkix/Lff/8xZcoUADp37kyWLFnsG5CIAwsJCaFJkyYMHToUgGbNmhEQEECtWrXsG5iIiKQdBqNtNxFJNv0kpbDXXnsNo9Hyz/zBBx/YORrHERYWRqtWrQCoXr269YMLEYnvzz//JEeOHKxatQonJyd++uknFi5cyPPPP2/v0EREJC3RpG4iDkcJeSpo2rQpAPv37+f555/nxIkTdo7I/j788EMCAwMBy0RuIvJoI0eO5O233yYsLAwvLy82btxIjx49MOgPIRERSTT7dVnfsGEDTZs2xc/PD4PBwMKFC+McN5vNDB48mFy5cuHu7k69evX0N7M8E5SQp4I5c+aQO3duAE6fPk3ZsmUxmUx2jir1mY7NxnRsNptmfcUff/wBQLdu3fDx8bFzZCKOx2w2M3DgQPr37w9Y5ls4d+4cVatWtXNkIiKSZtmxy3pISAhlypRh7Nixjzw+atQoRo8ezYQJE9i+fTuZMmWiYcOG1rmGRNIrh07IR4wYQaVKlfDw8MDHx4cWLVpw7Ngxe4eVaC4uLpw7d45evXoBEBoayl9//WXnqOzjwpVbNO70DQClS5fm559/tnNEIo7nxo0bvP322wwfPhywtJKPHz8eLy8vO0cmIiKSNI0aNWLo0KG0bNky3jGz2cxPP/3E559/TvPmzSldujS///47ly9fjteSLpLeOHRCvn79erp06cK2bdtYtWoVUVFRNGjQgJCQEHuHlmhGo5EffvgBV1dXALp27frMtZKv3LSfAnW6cS8kDLCMi1W3W5FYZrOZ7777Dh8fH2bMmAHAuHHj6Nevn50jExGR9MBgMNh0AwgKCoqzRUREJDquM2fOcPXqVerVq2ct8/LyokqVKmzdutVmzy/iiBw6IV++fDkdO3akRIkSlClThmnTpnH+/Hl2795t79CS7MHEbrdv3yZr1qwEBATYN6BUsmbNGhq9PwKT2QzAhAkTKFWqlJ2jEnEcly9fpl27dvTt2xcAb29v5s+fT+fOne0cmYiIpB+2H0Pu7++Pl5eXdRsxYkSio7p69SoAvr6+ccp9fX2tx0TSqwz2DiAxHkwCljVrVjtHknSjR49m586dbNu2jcDAQCpVqsTJkyfJmzevvUNLUW+//Xac1506dbJTJCKOZ926dTRt2pTg4GAAvvrqKwYOHGhdoUFERMQmDAbbLVd2v4X8woULeHp6Wosf9AYVkYRJM3/tmUwmevbsSfXq1SlZsuRjz4uIiIjXdcbRbN26lYkTJwIQHR1NzZo17RxRyqtSpYp1v3SRPEo0RLB0Uf/jjz9o1KgRwcHB5MiRg/nz5zNo0CD9jIiISAqwfQu5p6dnnC0pCXnOnDkBuHbtWpzya9euWY+JpFdp5i++Ll26cPDgQWbPnv3E80aMGBGn24y/v38qRZg4H3zwgbWV+Ny5cxQrVoxTp07ZOaqU8/BYcc8ceewYiYhj2LZtG0WLFqV9+/aEh4fTtGlTzp8//8jJbkRERNKz/PnzkzNnTtasWWMtCwoKYvv27VpdRNK9NJGQd+3alaVLl7J27Vrr8mGP89lnnxEYGGjdLly4kEpRJt6kSZNo0KABAEePHqVQoUJMnz7dzlGlvDJlytg7BBG7CQ8P56uvvqJGjRocP34cgM6dOzNv3jzc3NzsHJ2IiKRrBoNtt0QIDg4mICDAOn/SmTNnCAgI4Pz58xgMBnr27MnQoUNZvHgxBw4coH379vj5+dGiRQvb/zuIOBCHHkNuNpvp1q0bCxYsYN26deTPn/+p17i6uqapsSsrVqygc+fOTJgwAbPZzDvvvEPu3LmpW7euvUNLMR4eHvYOQcQubty4QcOGDdm7dy8ANWvW5LfffuP555+3c2QiIvJMSML64U+sKxF27dpF7dq1ra979+4NQIcOHZg2bRr9+vUjJCSEDz74gLt37/Liiy+yfPlyfVgt6Z5Dt5B36dKFP//8k5kzZ+Lh4cHVq1e5evUqYWFh9g7NpsaPH8/BgwcxGo2YzWbq1avH888/z5kzZ+wdmojYgNls5ueffyZv3rzs3bsXV1dXvvrqK1auXKlkXEREUpHtx5AnVK1atTCbzfG2adOmWSIzGPjqq6+4evUq4eHhrF69msKFCyf3gUUcnkMn5OPHjycwMJBatWqRK1cu6/bXX3/ZOzSbK1GiBCtXrrS27p8+fZpChQpx7NgxO0dmGw93U3/W1l+XZ9uuXbt49eklZpYAACIpSURBVNVX6dmzJ2FhYTz33HPs27ePQYMG4eLiYu/wRETkWWLHLusi8mgOnZA/6lM0s9lMx44d7R1aiqhbty6hoaF07doVgJiYGIoWLUqlSpWIjo62c3TJ07ZtW+v+nj177BiJSOowm8188sknVKpUifnz5wPwySefcPToUYoUKWLn6ERERETEETh0Qv4sMhqN/PLLL4wYMcK67NGuXbvImDEjgwYNsnN0SVekSBHrpByXLl2ybzAiKWz79u34+/vz/fffA5YeIkuXLuXbb78lc+bMdo5ORESeWQ/GkNtqE5Fk00+Sg+rfvz9hYWHWJZCioqIYOnQorq6udOrUKU12+/7oo48AuHPnjp0jEUkZp0+fpnPnzlStWtX6wdOECRMICAjglVdesXN0IiIi9htDLiKPpoTcgbm4uDB//nw2bdpEzpw5AYiMjOTXX3/F2dmZxo0bc/DgQTtHmXBHjhwB4OrVqw69HJ1IUvz1119UqFDBumJCjRo1uH79Oh9++KG9QxMREbHQGHIRh6OEPA2oXr06V65cYe3atRQoUACwTIy2bNkySpUqRdasWalfvz4rVqywc6RPFhkZad2fOHGiHSMRsZ2rV69Sp04d2rZty927d8mfPz8TJkxg9erV5MiRw97hiYiIPMRo401Ekks/SWlIrVq1OHXqFLt376ZSpUrW8jt37rB69WpefvllDAYD3t7elCxZkoCAAPsF+xQ//vhjulu+Tp4t9+7do1OnTuTKlYu1a9cC0L59e/bt28eHH36Is7OznSMUERH5P2ohF3E4SsjToPLly7Njxw6ioqL44osvKFeuXJzlk+7evcuhQ4coV66cw04EFxoayqeffmrvMEQSLTo6miFDhpAtWzZ+/fVXAPLly8e2bduYPn06Hh4edo5QRERERNIKJeRpWIYMGRgyZAh79uwhIiKCw4cP069fvziTRw0dOpRq1aoRHBxsx0gf7ZdffuHcuXP2DkMkwQ4fPkyDBg346quviIqKIkuWLEyaNInTp09TpUoVe4cnIiLyZGohF3E4SsjTkWLFijFy5EiWLl3KuXPncHNzA2Dr1q1kz56du3fv2jfA+9zc3PDz8wOgR48edo5G5Om2b99O1apVKVGiBGvXrsXZ2ZmvvvqK69ev06lTJwz6o0RERNIEjSEXcTT6SUqn8uTJQ0hICEWLFgUgIiKCvHnzcvHiRbvFFBMTY90fPXo0AIsWLWL27Nn2CknksaKiovj111+pVKkSL7zwAtu2bQOgRIkSrFu3jkGDBmmcuIiIpC1qIRdxOErI0zGj0ciRI0d49dVXAQgKCiJPnjz89ttvdolnw4YNADg5OdGqVSvatm0LQMeOHTl06JBdYhJ5lOnTp+Pm5kanTp3YtWsXAHXq1GH79u0cPHiQatWq2TlCERGRpNIa5CKORAn5M+Dvv//mjz/+wGAwYDabef/993nhhRdSvQv7tWvXAPDz88NgMDB16lSKFStGREQEL7/8MqGhoakaj8ij/PLLL3Ts2BGTyYSTkxPvv/8+27dvZ82aNVSuXNne4YmIiIhIOqKE/Bnx1ltvcfbsWby9vQHLmNicOXOyePHiVIvhwTJn2bJlAyxjyVesWIGbmxsXL16kUaNGDjn5nDw7hg8fTvfu3QHo0qULoaGhTJ48WYm4iIikD+qyLuJwlJA/Q/LkycPNmzdp1aoVYBlX3rx5c3LlykWDBg0wmUwpev+TJ08C4OnpaS3z9/dn+fLlZM6cmQ0bNtC6dWvMZnOKxiHy/06dOkXjxo0ZOHAgAEOGDOGXX36Js5ygiIhI2mer7urqti5iK0rInzFGo5F58+axfPly3N3dAbh69SqrVq3C1dWVb7/9NkXuO3fuXKKjowHo1q1bnGM1a9Zk7ty5AKxcuZIff/wxRWIQ+X9ms5m5c+dSvnx5li1bBsB3333HF198oZnTRUQk/VELuYjDUUL+jGrYsCFXr16lZ8+e1i7k0dHR9OvXj0KFCjFu3DhrAp1cJpOJDz/8EABXV1eaNGnyyHh69+4NQN++fZk6dapN7i3yKGazmT/++AM/Pz/atGlDUFAQRYsW5d9//6VPnz72Dk9ERCSFaNkzEUejn6RnmKenJz/++CM3b95kypQp5MiRA7B0Le/SpQuurq60a9eOoKCgZN2nWbNm3L59G4D+/fs/9rxRo0bx/vvvYzKZePfdd/nll1+SdV+R/xcdHc2wYcPIlSsX7du35+rVqwC8/fbb7N69m0aNGtk5QhERkRSkFnIRh6OEXAB45513uHz5Mp07dyZjxoyApWV75syZeHl5Ubp0aRYtWpToet966y3++ecfACpVqsQXX3zx2HOdnJyYNGkSvXr1AqB79+6MGDEi8Q8j8n9u3rzJl19+iY+PD59//rl1xv93332Xq1ev8vvvv1u/70VEREREUovBnM5n0AoKCsLLy4vAwMA4k4nJk504cYLq1atz48aNOOW1atUie/bslChRgnfffZc8efI8to6ff/6Znj17ApAhQwbu3buHm5vbU+9tNpv58ssv+fLLLwEYOHAgX3/9tcb0SqLduXOH77//npEjR1qHYDg7O9OnTx+6dOlC7ty57RyhPKv0u0lEUtOD95y7pzfh6ZHZNnXeCyZLgRf1PiaSTErI5YkWL17MhAkTWL16NVFRUfGO58iRg+zZs8cpCw4O5vr160RERFjLTp8+Tf78+RN173bt2jFz5kwAWrRoweTJk+PdS+RRrl27xieffMKff/5pLcuWLRvvvvsun3/+ud4LxO70u0lEUpM1IT+z2bYJef7qeh8TSaYM9g5AHFuzZs1o1qwZkZGRtGrViv379xMUFERgYCAAN27ciNeK/jCDwcDq1asTnYwDTJs2jSJFivDFF1+wcOFCjh07xurVq/Hz80vy80j6de/ePaZMmcI///zDqlWrrOUeHh4MHDiQnj174urqascIRURE7M2Wy5Wp56KILSghlwRxcXFh6dKl1tcmk4lBgwaxdevWR57v4+NDnTp1aNKkSZITaGdnZwYPHkzVqlVp164dR44coWzZskyZMuWRM7XLsycsLIyTJ08yZ84cfv75Z+7du2c9ljt3boYPH86bb76Jk5OTHaMUERFxFLacjE0JuYgtqMu6pAlnz56lbt26nD59GoDmzZszceJEfH197RyZ2MPu3bsZN24c06dPJyYmxlqeKVMmOnToQMOGDWnSpAlGo+atFMek300ikppiu6xvxdPTRl3Wg4LJkr+q3sdEkkl/rUqakC9fPnbs2EHbtm0BWLRoEXnz5mXUqFFxEjJJn0wmE+PGjaN58+Zkz56dihUrMmXKFOv/faFChRgyZAgXLlxg7NixNGvWTMm4iIhIPAYbbyKSXGohlzRn3bp1vPHGG9Y1pPPmzcuMGTOoXr26nSMTWwkJCeG///7j6tWrrF27loULFxIWFhbnnHLlytG9e3fat2+v5FvSHP1uEpHUZG0hP7vdti3k+arofUwkmTSGXNKcWrVqce7cOQYOHMiPP/7IuXPnePHFF3nrrbcYMWKElrJKo/bs2cOaNWvYsWMH8+bN4/8/KzQYDHTs2JGGDRtSo0YNcuXKZadIRURE0iojtusgqw/DRWxBLeSSpl28eJH333+fFStWWMuaNGlCixYtaNOmjf7PHVRQUBBHjhzh999/Z+HChVy/ft26TvgDRqORatWq4ePjwyuvvMLrr79OpkyZ7BSxiG3pd5OIpCZrC/m5XbZtIc9bUe9jIsmkhFzShfnz59OjRw8uXrwYp7x58+bUqlWLRo0aUbhwYQw2m1lUEuP69etMnDiR69evs337dnbu3PnI80qWLEmNGjWoWrUqbdq00TJlkm7pd5OIpCYl5CKOSwm5pBtms5nFixcza9YsFi1aRHh4eJzjmTJl4sUXX6Ry5cpUrFiRxo0bkyGDRm3Y0oNlyAAOHjzIkiVLOHDgAAcPHnzk+RUrVuSNN96gSZMmZMuWjWzZsqVmuCJ2o99NIpKaYhPy3TZOyCvofUwkmZSQS7pkNpuZP38+//zzDxs3brQmiQ/LnDkzH330EZ06daJw4cJ2iDJtCw8PZ+3atdy9e5fg4GDWr1/PX3/9Fa/r+QN58uShadOm5MyZk9q1a2sSPnmm6XeTiKSm2IR8j40T8vJ6HxNJJiXk8ky4e/cu69atY/369Rw8eJDVq1fHOe7n50eZMmXo2LEjrVq1Usv5I+zZs4fJkyeze/duoqKiCAgIeOy5vr6+ODs7U6lSJerWrUvVqlUpV66chgyI3KffTSKSmqzvOef34OnpYaM67+GVRwm5SHIpIZdnUkhICD/88AMzZ87k6NGj8Y7ny5ePpk2bUqxYMVxdXalfvz7+/v52iDR1rFq1ilOnTllfHzlyhCVLlliXlgsPD4836/kDL7zwAhkzZsTb25tGjRrRsWNHnJycUiVukbRKv5tEJDXFJuR7bZyQl9P7mEgyKSGXZ97FixfZsGEDixYtYu7cuZhMpkeeV61aNcqWLWtt5S1atCht27aN933l5OTkMAlpTEwMMTEx1te7du3in3/+ITAwEIA7d+6wZs0arl27lqD6SpcuzbvvvkvBggXJnDkz1atXV28CkSTQ7yYRSU3W95wLAbZNyP3L6n1MJJmUkIs8JDIykmPHjrFs2TJr1+zNmzdz/fr1BNeRKVMmXn31Vdq0aYOfn1+845kzZ6ZQoUI2iffEiRMEBwfHK79y5Qpz585lzpw5hISEJKiul156iRw5cgCQIUMGKlSoQKNGjaw/N56ennh7e9skbpFnnX43iUhqUkIu4riUkIs8hdlsZt26dWzZsoWIiAgALly4wNKlS7l582aS6syWLRs1atRI8rra169fZ/PmzQlOth9wcnKiQoUKvPTSS2TMmBGAHDly0LZtW2syLiIpT7+bRCQ1xSbk+2yckJfR+5hIMqmvqchTGAwGateuTe3ateOUm81ma9fvB2JiYli4cCEzZszg+PHj8eqKjo7m2rVr3Lp1iwULFtgkPl9f30d2Gy9UqBDt2rWjZcuW1i70rq6uuLu72+S+IiIiksYYjJbNVnWJSLIpIRdJIoPBQJYsWeKVv/fee7z33nuPve7atWssXbo0XjKfWHny5KF27dpau1tEREQSyHB/s1VdIpJcSshFUpmvr+8TE3YRERGRFGEwWDZb1SUiyaa+JiIiIiIiIiJ2oBZyEREREZFngrqsizgaJeQiIiIiIs8CdVkXcThKyEVEREREnglqIRdxNErIRURERESeBWohF3E4mtRNRERERERExA7UQi4iIiIi8kxQl3URR6OEXERERETkWWAwWjZb1SUiyaaEXERERETkmaAWchFHo4RcRERERORZoEndRByOEnIRERERkWeCWshFHE26T8jNZjMAQUFBdo5ERETE4sHvpAe/o0REUkNQ0D2HrEvkWZbuE/J79yxvFv7+/naOREREJK579+7h5eVl7zBEJJ1zcXEhZ86c+BcqbdN6c+bMiYuLi03rFHnWGMzp/ON5k8nE5cuX8fDwwJBOxroEBQXh7+/PhQsX8PT0tHc4KepZedZn5Tnh2XlWPWf6Y8tnNZvN3Lt3Dz8/P4xGzVQsIikvPDycyMhIm9bp4uKCm5ubTesUedak+xZyo9FI7ty57R1GivD09Ez3fwA/8Kw867PynPDsPKueM/2x1bOqZVxEUpObm5uSZxEHpI/lRUREREREROxACbmIiIiIiIiIHSghT4NcXV0ZMmQIrq6u9g4lxT0rz/qsPCc8O8+q50x/nqVnFRERkdSR7id1ExEREREREXFEaiEXERERERERsQMl5CIiIiIiIiJ2oIRcRERERERExA6UkIuIiIiIiIjYgRJyB7ZhwwaaNm2Kn58fBoOBhQsXWo9FRUXx6aefUqpUKTJlyoSfnx/t27fn8uXL9gs4iZ70nABms5nBgweTK1cu3N3dqVevHidOnLBPsDYWExPDoEGDyJ8/P+7u7jz//PN8/fXXpMe5Fi9dusRbb71FtmzZcHd3p1SpUuzatcveYaWob775BoPBQM+ePe0dis2NGDGCSpUq4eHhgY+PDy1atODYsWP2DivFjB07lnz58uHm5kaVKlXYsWOHvUMSERGRdEAJuQMLCQmhTJkyjB07Nt6x0NBQ9uzZw6BBg9izZw/z58/n2LFjNGvWzA6RJs+TnhNg1KhRjB49mgkTJrB9+3YyZcpEw4YNCQ8PT+VIbW/kyJGMHz+eMWPGcOTIEUaOHMmoUaP45Zdf7B2aTd25c4fq1avj7OzMsmXLOHz4MN9//z3e3t72Di3F7Ny5k4kTJ1K6dGl7h5Ii1q9fT5cuXdi2bRurVq0iKiqKBg0aEBISYu/QbO6vv/6id+/eDBkyhD179lCmTBkaNmzI9evX7R2aiIiIpHFa9iyNMBgMLFiwgBYtWjz2nJ07d1K5cmXOnTtHnjx5Ui84G/r/5zSbzfj5+dGnTx8++eQTAAIDA/H19WXatGm0bdvWjtEmX5MmTfD19eW3336zlrVu3Rp3d3f+/PNPO0ZmW/3792fz5s1s3LjR3qGkiuDgYMqXL8+4ceMYOnQoZcuW5aeffrJ3WCnqxo0b+Pj4sH79emrUqGHvcGyqSpUqVKpUiTFjxgBgMpnw9/enW7du9O/f387RiYiISFqmFvJ0JDAwEIPBQJYsWewdis2cOXOGq1evUq9ePWuZl5cXVapUYevWrXaMzDaqVavGmjVrOH78OAD79u1j06ZNNGrUyM6R2dbixYupWLEibdq0wcfHh3LlyjF58mR7h5ViunTpwiuvvBLn+za9CwwMBCBr1qx2jsS2IiMj2b17d5z/S6PRSL169dLFe5CIiIjYVwZ7ByC2ER4ezqeffsobb7yBp6envcOxmatXrwLg6+sbp9zX19d6LC3r378/QUFBFC1aFCcnJ2JiYhg2bBjt2rWzd2g2dfr0acaPH0/v3r0ZMGAAO3fupHv37ri4uNChQwd7h2dTs2fPZs+ePezcudPeoaQak8lEz549qV69OiVLlrR3ODZ18+ZNYmJiHvkedPToUTtFJSIiIumFEvJ0ICoqitdeew2z2cz48ePtHY4kwpw5c5gxYwYzZ86kRIkSBAQE0LNnT/z8/NJVomoymahYsSLDhw8HoFy5chw8eJAJEyakq+e8cOECPXr0YNWqVbi5udk7nFTTpUsXDh48yKZNm+wdioiIiEiaoi7radyDZPzcuXOsWrUqXbWOA+TMmROAa9euxSm/du2a9Vha1rdvX/r370/btm0pVaoUb7/9Nr169WLEiBH2Ds2mcuXKRfHixeOUFStWjPPnz9spopSxe/durl+/Tvny5cmQIQMZMmRg/fr1jB49mgwZMhATE2PvEG2ua9euLF26lLVr15I7d257h2Nz2bNnx8nJKd2+B4mIiIh9KSFPwx4k4ydOnGD16tVky5bN3iHZXP78+cmZMydr1qyxlgUFBbF9+3aqVq1qx8hsIzQ0FKMx7o+hk5MTJpPJThGljOrVq8dbEuv48ePkzZvXThGljLp163LgwAECAgKsW8WKFWnXrh0BAQE4OTnZO0SbMZvNdO3alQULFvDff/+RP39+e4eUIlxcXKhQoUKc9yCTycSaNWvSxXuQiIiI2Je6rDuw4OBgTp48aX195swZAgICyJo1K7ly5eLVV19lz549LF26lJiYGOuY6qxZs+Li4mKvsBPtSc+ZJ08eevbsydChQylUqBD58+dn0KBB+Pn5PXHG+bSiadOmDBs2jDx58lCiRAn27t3LDz/8wLvvvmvv0GyqV69eVKtWjeHDh/Paa6+xY8cOJk2axKRJk+wdmk15eHjEG0OdKVMmsmXLlu7GVnfp0oWZM2eyaNEiPDw8rO8/Xl5euLu72zk62+rduzcdOnSgYsWKVK5cmZ9++omQkBDeeecde4cmIiIiaZ1ZHNbatWvNQLytQ4cO5jNnzjzyGGBeu3atvUNPlCc9p9lsNptMJvOgQYPMvr6+ZldXV3PdunXNx44ds2/QNhIUFGTu0aOHOU+ePGY3NzdzgQIFzAMHDjRHRETYOzSbW7JkiblkyZJmV1dXc9GiRc2TJk2yd0ipombNmuYePXrYOwybe9z7z9SpU+0dWor45ZdfzHny5DG7uLiYK1eubN62bZu9QxIREZF0QOuQi4iIiIiIiNiBxpCLiIiIiIiI2IESchERERERERE7UEIuIiIiIiIiYgdKyEVERERERETsQAm5iIiIiIiIiB0oIRcRERERERGxAyXkIiIiIiIiInaghFxERERERETEDpSQi0iK+OKLLyhbtmyirjEYDCxcuPCJ59y6dQsfHx/Onj2b5NiS6vDhw+TOnZuQkJBUv7eIiIiIpD9KyEWeoGPHjhgMBgwGA87OzuTPn59+/foRHh5uk/rPnj2LwWAgICDAJvU9C4YNG0bz5s3Jly9fqt+7ePHivPDCC/zwww+pfm8RERERSX+UkIs8xcsvv8yVK1c4ffo0P/74IxMnTmTIkCGpGkNkZGSq3s9RhYaG8ttvv/Hee+/ZLYZ33nmH8ePHEx0dbbcYRERERCR9UEIu8hSurq7kzJkTf39/WrRoQb169Vi1apX1eEREBN27d8fHxwc3NzdefPFFdu7caT1+584d2rVrR44cOXB3d6dQoUJMnToVgPz58wNQrlw5DAYDtWrVAiwt8y1atGDYsGH4+flRpEgRAA4cOECdOnVwd3cnW7ZsfPDBBwQHBz/1GZYsWUKlSpVwc3Mje/bstGzZ0nrsjz/+oGLFinh4eJAzZ07efPNNrl+/bj0+bdo0smTJEqe+hQsXYjAY4pR98803+Pr64uHhwXvvvRevF8HOnTupX78+2bNnx8vLi5o1a7Jnz56nxv6wf//9F1dXV1544QVr2bp16zAYDKxYsYJy5crh7u5OnTp1uH79OsuWLaNYsWJ4enry5ptvEhoaar2uVq1adOvWjZ49e+Lt7Y2vry+TJ08mJCSEd955Bw8PDwoWLMiyZcvixFC/fn1u377N+vXrExW7iIiIiMj/U0IukggHDx5ky5YtuLi4WMv69evHvHnzmD59Onv27KFgwYI0bNiQ27dvAzBo0CAOHz7MsmXLOHLkCOPHjyd79uwA7NixA4DVq1dz5coV5s+fb613zZo1HDt2jFWrVrF06VJCQkJo2LAh3t7e7Ny5k7///pvVq1fTtWvXJ8b8zz//0LJlSxo3bszevXtZs2YNlStXth6Piori66+/Zt++fSxcuJCzZ8/SsWPHRP27zJkzhy+++ILhw4eza9cucuXKxbhx4+Kcc+/ePTp06MCmTZvYtm0bhQoVonHjxty7dy/B99m4cSMVKlR45LEvvviCMWPGsGXLFi5cuMBrr73GTz/9xMyZM/nnn39YuXIlv/zyS5xrpk+fTvbs2dmxYwfdunWjc+fOtGnThmrVqrFnzx4aNGjA22+/HSeRd3FxoWzZsmzcuDER/0IiIiIiIo9gFpHH6tChg9nJycmcKVMms6urqxkwG41G89y5c81ms9kcHBxsdnZ2Ns+YMcN6TWRkpNnPz888atQos9lsNjdt2tT8zjvvPLL+M2fOmAHz3r17493X19fXHBERYS2bNGmS2dvb2xwcHGwt++eff8xGo9F89erVxz5D1apVze3atUvwM+/cudMMmO/du2c2m83mqVOnmr28vOKcs2DBAvPDbx9Vq1Y1f/zxx3HOqVKlirlMmTKPvU9MTIzZw8PDvGTJEmsZYF6wYMFjr2nevLn53XffjVO2du1aM2BevXq1tWzEiBFmwHzq1Clr2Ycffmhu2LCh9XXNmjXNL774ovV1dHS0OVOmTOa3337bWnblyhUzYN66dWuce7Zs2dLcsWPHx8YpIiIiIpIQaiEXeYratWsTEBDA9u3b6dChA++88w6tW7cG4NSpU0RFRVG9enXr+c7OzlSuXJkjR44A0LlzZ2bPnk3ZsmXp168fW7ZsSdB9S5UqFacl/siRI5QpU4ZMmTJZy6pXr47JZOLYsWMAZM6c2bp99NFHAAQEBFC3bt3H3mf37t00bdqUPHny4OHhQc2aNQE4f/58guJ8EFuVKlXilFWtWjXO62vXrtGpUycKFSqEl5cXnp6eBAcHJ+o+YWFhuLm5PfJY6dKlrfu+vr5kzJiRAgUKxCl7uCv+/1/j5OREtmzZKFWqVJxrgHjXubu7x2k1FxERERFJigz2DkDE0WXKlImCBQsCMGXKFMqUKZOoicUaNWrEuXPn+Pfff1m1ahV169alS5cufPfdd0+9b2I9PFu7p6cnYEkeH+dBN/iGDRsyY8YMcuTIwfnz52nYsKF1Ijmj0YjZbI5zXVRUVKJj69ChA7du3eLnn38mb968uLq6UrVq1URNWJc9e3bu3LnzyGPOzs7W/Qez4j/MYDBgMpkee82jrnswTv7/r7t9+zbPP/98guMWEREREXkUtZCLJILRaGTAgAF8/vnnhIWF8fzzz+Pi4sLmzZut50RFRbFz506KFy9uLcuRIwcdOnTgzz//5KeffmLSpEkA1hbwmJiYp967WLFi7Nu3L84a2Js3b8ZoNFonfStYsKB18/HxASytwGvWrHlknUePHuXWrVt88803vPTSSxQtWjRea3COHDm4d+9enPv+/zJtxYoVY/v27XHKtm3bFuf15s2b6d69O40bN6ZEiRK4urpy8+bNpz73w8qVK8fhw4cTdU1KOHjwIOXKlbN3GCIiIiKSxikhF0mkNm3a4OTkxNixY8mUKROdO3emb9++LF++nMOHD9OpUydCQ0OtLeiDBw9m0aJFnDx5kkOHDrF06VKKFSsGgI+PD+7u7ixfvpxr164RGBj42Pu2a9cONzc3OnTowMGDB1m7di3dunXj7bfftnatfpQhQ4Ywa9YshgwZwpEjRzhw4AAjR44EIE+ePLi4uPDLL79w+vRpFi9ezNdffx3n+ipVqpAxY0YGDBjAqVOnmDlzJtOmTYtzTo8ePZgyZQpTp07l+PHjDBkyhEOHDsU5p1ChQvzxxx8cOXKE7du3065duye23j9Kw4YNOXTo0GNbyVPD2bNnuXTpEvXq1bNbDCIiIiKSPighF0mkDBky0LVrV0aNGkVISAjffPMNrVu35u2336Z8+fKcPHmSFStW4O3tDVhawT/77DNKly5NjRo1cHJyYvbs2da6Ro8ezcSJE/Hz86N58+aPvW/GjBlZsWIFt2/fplKlSrz66qvUrVuXMWPGPDHeWrVq8ffff7N48WLKli1LnTp1rLO758iRg2nTpvH3339TvHhxvvnmm3hd6bNmzcqff/7Jv//+S6lSpZg1axZffPFFnHNef/11Bg0aRL9+/ahQoQLnzp2jc+fOcc757bffuHPnDuXLl+ftt9+2LhWXGKVKlaJ8+fLMmTMnUdfZ0qxZs2jQoAF58+a1WwwiIiIikj4YzP8/OFRExIH9888/9O3bl4MHD2I0pu5nipGRkRQqVIiZM2fGmchPRERERCQpNKmbiKQpr7zyCidOnODSpUv4+/un6r3Pnz/PgAEDlIyLiIiIiE2ohVxERERERETEDjSGXERERERERMQOlJCLiIiIiIiI2IESchERERERERE7UEIuIiIiIiIiYgdKyEVERERERETsQAm5iIiIiIiIiB0oIRcRERERERGxAyXkIiIiIiIiInaghFxERERERETEDv4HQbyujdWqsBYAAAAASUVORK5CYII=", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# plot heatmap (all types of cells pooled)\n", + "fig_heatmap = hq.display.plot_2D_distributions(df_coordinates, cfg)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "hq", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.7" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/demo_notebooks/density_map.html b/demo_notebooks/density_map.html new file mode 100644 index 0000000..973695b --- /dev/null +++ b/demo_notebooks/density_map.html @@ -0,0 +1,2492 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + Density map - histoquant + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + + + + + + + + +

Density map

+ + + + + + + + + + + + +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/demo_notebooks/density_map.ipynb b/demo_notebooks/density_map.ipynb new file mode 100644 index 0000000..3318604 --- /dev/null +++ b/demo_notebooks/density_map.ipynb @@ -0,0 +1,523 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Draw 2D heatmaps as density isolines.\n", + "\n", + "This notebook does not actually use `histoquant` and relies only on [brainglobe-heatmap](https://brainglobe.info/documentation/brainglobe-heatmap/index.html) to extract brain structures outlines.\n", + "\n", + "Only the detections measurements with atlas coordinates exported from QuPath are used.\n", + "\n", + "You need to select the range of data to be used, the regions outlines will be extracted at the centroid of that range. Therefore, a range that is too large will be misleading and irrelevant." + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [], + "source": [ + "import brainglobe_heatmap as bgh\n", + "import matplotlib.pyplot as plt\n", + "import numpy as np\n", + "import pandas as pd\n", + "import seaborn as sns" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [], + "source": [ + "# path to the exported measurements from QuPath\n", + "filename = \"../../resources/cells_measurements_detections.tsv\"" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Settings" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [], + "source": [ + "# atlas to use\n", + "atlas_name = \"allen_mouse_10um\"\n", + "# brain regions whose outlines will be plotted\n", + "regions = [\"root\", \"CB\", \"MY\", \"GRN\", \"IRN\"]\n", + "# range to include, in Allen coordinates, in microns\n", + "ap_lims = [9800, 10000] # lims : [0, 13200] for coronal\n", + "ml_lims = [5600, 5800] # lims : [0, 11400] for sagittal\n", + "dv_lims = [3900, 4100] # lims : [0, 8000] for top\n", + "# number of isolines\n", + "nlevels = 5\n", + "# color mapping between classification and matplotlib color\n", + "palette = {\"Cells: marker-\": \"#d8782f\", \"Cells: marker+\": \"#8ccb73\"}" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n"
+      ],
+      "text/plain": []
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    },
+    {
+     "data": {
+      "text/html": [
+       "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
ImageObject IDObject typeNameClassificationParentROIAtlas_XAtlas_YAtlas_Z
0animalid0_030.ome.tiff5ff386a8-5abd-46d1-8e0d-f5c5365457c1DetectionNaNCells: marker-VeCBPolygon11.52304.27244.2767
1animalid0_030.ome.tiff9a2a9a8c-acbe-4308-bc5e-f3c9fd1754c0DetectionNaNCells: marker-VeCBPolygon11.52024.27844.4186
2animalid0_030.ome.tiff481a519b-8b40-4450-9ec6-725181807d72DetectionNaNCells: marker-VeCBPolygon11.50604.31724.3563
3animalid0_030.ome.tifffd28e09c-2c64-4750-b026-cd99e3526a57DetectionNaNCells: marker-VeCBPolygon11.52844.25744.3364
4animalid0_030.ome.tiff3d9ce034-f2ed-4c73-99be-f782363cf323DetectionNaNCells: marker-VeCBPolygon11.54874.20334.2943
\n", + "
" + ], + "text/plain": [ + "\n", + " Image Object ID Object type \\\n", + "\u001b[1;36m0\u001b[0m animalid0_030.ome.tiff \u001b[93m5ff386a8-5abd-46d1-8e0d-f5c5365457c1\u001b[0m Detection \n", + "\u001b[1;36m1\u001b[0m animalid0_030.ome.tiff \u001b[93m9a2a9a8c-acbe-4308-bc5e-f3c9fd1754c0\u001b[0m Detection \n", + "\u001b[1;36m2\u001b[0m animalid0_030.ome.tiff \u001b[93m481a519b-8b40-4450-9ec6-725181807d72\u001b[0m Detection \n", + "\u001b[1;36m3\u001b[0m animalid0_030.ome.tiff \u001b[93mfd28e09c-2c64-4750-b026-cd99e3526a57\u001b[0m Detection \n", + "\u001b[1;36m4\u001b[0m animalid0_030.ome.tiff \u001b[93m3d9ce034-f2ed-4c73-99be-f782363cf323\u001b[0m Detection \n", + "\n", + " Name Classification Parent ROI Atlas_X Atlas_Y Atlas_Z \n", + "\u001b[1;36m0\u001b[0m NaN Cells: marker- VeCB Polygon \u001b[1;36m11.5230\u001b[0m \u001b[1;36m4.2724\u001b[0m \u001b[1;36m4.2767\u001b[0m \n", + "\u001b[1;36m1\u001b[0m NaN Cells: marker- VeCB Polygon \u001b[1;36m11.5202\u001b[0m \u001b[1;36m4.2784\u001b[0m \u001b[1;36m4.4186\u001b[0m \n", + "\u001b[1;36m2\u001b[0m NaN Cells: marker- VeCB Polygon \u001b[1;36m11.5060\u001b[0m \u001b[1;36m4.3172\u001b[0m \u001b[1;36m4.3563\u001b[0m \n", + "\u001b[1;36m3\u001b[0m NaN Cells: marker- VeCB Polygon \u001b[1;36m11.5284\u001b[0m \u001b[1;36m4.2574\u001b[0m \u001b[1;36m4.3364\u001b[0m \n", + "\u001b[1;36m4\u001b[0m NaN Cells: marker- VeCB Polygon \u001b[1;36m11.5487\u001b[0m \u001b[1;36m4.2033\u001b[0m \u001b[1;36m4.2943\u001b[0m " + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "df = pd.read_csv(filename, sep=\"\\t\")\n", + "display(df.head())" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Here we can filter out classifications we don't wan't to display." + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [], + "source": [ + "# select objects\n", + "# df = df[df[\"Classification\"] == \"example: classification\"]" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [], + "source": [ + "# get outline coordinates in coronal (=frontal) orientation\n", + "coords_coronal = bgh.get_structures_slice_coords(\n", + " regions,\n", + " orientation=\"frontal\",\n", + " atlas_name=atlas_name,\n", + " position=(np.mean(ap_lims), 0, 0),\n", + ")\n", + "# get outline coordinates in sagittal orientation\n", + "coords_sagittal = bgh.get_structures_slice_coords(\n", + " regions,\n", + " orientation=\"sagittal\",\n", + " atlas_name=atlas_name,\n", + " position=(0, 0, np.mean(ml_lims)),\n", + ")\n", + "# get outline coordinates in top (=horizontal) orientation\n", + "coords_top = bgh.get_structures_slice_coords(\n", + " regions,\n", + " orientation=\"horizontal\",\n", + " atlas_name=atlas_name,\n", + " position=(0, np.mean(dv_lims), 0),\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n"
+      ],
+      "text/plain": []
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    },
+    {
+     "data": {
+      "text/plain": [
+       "\u001b[1;35mText\u001b[0m\u001b[1m(\u001b[0m\u001b[1;36m2\u001b[0m, \u001b[1;36m7.9\u001b[0m, \u001b[32m'1 mm'\u001b[0m\u001b[1m)\u001b[0m"
+      ]
+     },
+     "execution_count": 16,
+     "metadata": {},
+     "output_type": "execute_result"
+    },
+    {
+     "data": {
+      "text/html": [
+       "
\n"
+      ],
+      "text/plain": []
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    },
+    {
+     "data": {
+      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAgMAAAGFCAYAAABg2vAPAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAAEAAElEQVR4nOyddXgVV7eH3+PnxN2JAcHd3R2KS6FYi9Sd9tbdS0sVKpTiWkpxLRQo7tKQBIi7J8dt7h+BfKVYAklOIPPe53t6n5w9e9ackJnf7L3Wb0kEQRAQERERERERqbFIHR2AiIiIiIiIiGMRxYCIiIiIiEgNRxQDIiIiIiIiNRxRDIiIiIiIiNRwRDEgIiIiIiJSwxHFgIiIiIiISA1HFAMiIiIiIiI1HFEMiIiIiIiI1HBEMSAiIiIiIlLDEcWAiIiIiIhIDUcUAyIiIiIiIjUcUQyIiIiIiIjUcEQxICIiIiIiUsMRxYCIiIiIiEgNRxQDIiIiIiIiNRxRDIiIiIiIiNRwRDEgIiIiIiJSwxHFgIiIiIiISA1HFAMiIiIiIiI1HFEMiIiIiIiI1HBEMSAiIiIiIlLDEcWAiIiIiIhIDUcUAyIiIiIiIjUcUQyIiIiIiIjUcEQxICIiIiIiUsMRxYCIiIiIiEgNRxQDIiIiIiIiNRxRDIiIiIiIiNRwRDEgIiIiIiJSwxHFgIiIiIiISA1HFAMiIiIiIiI1HFEMiIiIiIiI1HBEMSAiIiIiIlLDEcWAiIiIiIhIDUcUAyIiIiIiIjUcuaMDEBG5WwRBwGazIZPJkEgkjg5H5B5DEAT0ej0GgwGFQoFSqUSpVCKTyRwdmohIlSGKAZFqTW5uLmfOnCEmJobY2FhiY2NJTk4mLy+v9AZuNBoRBAEAqVSKp6cnUVFRtGjRgnbt2tGmTRvq1auHVCouhNV0iouL+fvvv9m/fz/nzp0jOjqapKQkjEbjdWPd3Nzw9/cnIiKC+vXrU69ePerUqUO9evUIDQ0VhafIfYVEuHoXFRFxMIIgcOHCBfbu3cu+ffvYt28fSUlJAMhkMiIjI4mKiiIsLAxvb2+cnJzQaDQ4OTmhUCiw2WxYrVZycnKIjo7m2LFjxMTEAODi4kLr1q0ZO3YskyZNwsnJyZGXKlKFnDt3jqVLl7J7926OHTuGzWbDz8+P5s2b07BhQyIiIvDx8cHJyQmLxYLZbMZkMpGXl0d6ejqXL1/mwoULXLx4EavVCkCtWrXo3r073bt3p2fPnoSHhzv2IkVE7hJRDIg4lISEBLZt28aOHTvYu3cv2dnZyGQyWrZsSZcuXWjbti1NmzalTp06KBSKcs9fUFDA8ePHOXbsGPv27WPLli14enry+OOP89xzz+Hp6VkJVyXiaCwWC+vXr+e7775j9+7d+Pj40Lt379IHeFRUVLnf7K1WK8nJyZw9e5a9e/eyZ88eTp48id1uJzIykj59+tC/f3969+6Ni4tLJV2ZiEjlIIoBkSrFZrOxd+9e1q9fz9atW7lw4QIymYz27dvTvXt3unbtSseOHSvtZhofH8+cOXOYP38+3t7eLFu2jE6dOlXKuUQcw7Fjx5g4cSIXLlygY8eOPPnkk4waNeqOxOTtKCgoYM+ePezcuZPt27cTFxeHSqWiZ8+eDBkyhCFDhhASElLh5xURqWhEMSBS6QiCwMmTJ1myZAkrVqwgPT2dkJAQBgwYQP/+/enVqxfu7u5VGlNSUhITJkzgwIEDvPLKK7z55psolcoqjUGkYrHZbHzyySe89dZbNG/enHnz5tGqVasqjeHixYts2LCBDRs2sHfvXmw2G61bt2b06NGMHj2aiIiIKo1HRKSsiGJApNLIyMjg119/ZdGiRURHR+Pn58e4ceMYP348bdu2dXgCltVq5aOPPuLdd9+lXbt2rF69msDAQIfGdD8jCAIGq558UzbF5nyKzYXoLVqMNj0mqwGL3YzVbkG48n8yiQypRIZSqkIpU6OWO+Ekd8FF6Yar0gM3pSeuSg+kEilJSUk89NBD7N+/n1deeYW33367UlYCykNBQQFbtmxhzZo1bN68GaPRSOfOnZk0aRJjx47Fzc3NofGJiPwbUQyIVCiCILB7927mzZvH77//jlwuZ8SIEUycOJHevXsjl1e/ApaDBw8ycuRIAH777Tc6dOjg4IjufQRBoNhcQJoukQxdEln6VLL16Rht+go9j0wiRy24cHT3SfKSi3lk7KP0bjcAtVxToee5W7RaLX/88QeLFy9mx44dqNVqxowZw/Tp0+nQoYPDhbGIiCgGRCoErVbLr7/+yjfffENsbCwNGjTg0UcfZeLEifdEkl56ejqjR4/myJEjbNq0iT59+jg6pHsOs81IfGEMCUUxJBXFUWTOv+E4V6UH7kovXJTuOCtc0cidUcnUKKRK5FIFEklJCahdsGOzW7HYTZhsRgxWPQarFq25iGJzPoXmfOyC7Ybn8FL7EewSQS3X2oS61cVZ4Vpp111eUlJSWLhwIfPnzyc+Pp6mTZvy6KOP8tBDD+HqWn3iFKlZiGJA5K5ITEzk22+/5aeffkKr1TJy5EieeOIJunTpcs+97ZjNZoYNG8aBAwc4ePAgDRo0cHRI1R6L3cKlgvNcyDtJQmEMNsFa+pkEKX5OQQS6hOHvFIyvUzBeKl8UsorJzdi2fRsPPzaZTn3b8cRLMyiy55KpS6HQnHfdWF9NELU9GhLp3oAA51qlgsOR2O12duzYwdy5c9mwYQPOzs5MmzaNZ599ltDQUEeHJ1LDEMWAyB1x5swZPvroI1atWoWbmxszZszgiSeeuOdvYkVFRXTq1AmdTsepU6fEfd2bkGvI4FTWAf7JO4HZ9j/DHg+VD7U9GhLmFkWISwQKmapSzn/1jbpLly789ttvaDT/2xbQW3Sk6RJILb5MUvFFsvSp1xzronCnrmcT6ns1J9A5rFqI1uTkZObNm8fcuXMpLi5mwoQJvPTSSzRs2NDRoYnUEEQxIFIujh8/znvvvccff/xBeHg4L774IpMnT76v6qovX75MvXr1mD17Nk8//bSjw6k2CIJAcvEljmT8SWJRbOnP3ZSeNPBuST3P5vhoAir94Wq1WunatSvp6emcPn36toJNbykmvjCGy4X/EF8Yg8VuKv3MU+VDQ+/WNPRpjZvSo1LjLgtarZaffvqJ2bNnk5qayrBhw3j99dervCpCpOYhigGRMnH06FHeeusttmzZQt26dXnttdcYP368wzO2K4tx48Zx9OhRYmJiqmXSY1WTWhzPvtTNpGrjAZAgobZHI5r7dSLUtXaVLrvPnz+fGTNmsG/fPjp27FiuY612C4lFscTmnyEu/ywWu/nKJxIi3OrR3K8jEe71Hb6NYDabWbJkCR9//DFxcXEMHTqUd999l6ZNmzo0LpH7F1EMiNySxMRE/u///o8VK1bQoEED3njjDcaMGXPfN3E5fvw4rVu35o8//uCBBx5wdDgOo9CUy57kDVwsOAeUZO839mlLm4DuuKu8HBLT4MGD0Wq17Nmz567mMdtMxOWf4VzOUVK0l0t/7qHypoVfFxr7tEFZSdscZcVms7F8+XLefvttLl26xPjx4/n0008JDg52aFwi9x+iGBC5Ifn5+Xz88cd8/fXXeHh48MEHHzB58uT7XgT8m4YNG9KhQwfmz59fJeczm82kpaURHx9PcnIyVqsViUSCVCrFz8+PkJAQQkNDq8SgyWa3cjRjD4fTd2IVrCCAPMcN6yUNmKQolUo8PDzw8vLCx8eHiIgI/Pz8Kj0uAB8fH5588knefvvtCpsz35jN6eyDnMs5gulKDoRKpqGFXyda+HXBSeFcYee6EywWC7/++iuvv/46Op2OV199leeffx61Wu3QuETuH0QxIHINVquVefPm8dZbb2EymXj++eeZNWtWjSx5mjFjBocOHeLMmTMVOq8gCCQkJHDw4EH+/vtvTp48yaVLl8jKyirT8U2aNKFPnz4MHz6cTp06VfgefXJePGujf8GqMgBw8VgSv3+6i5ykQjQaDVKpFJPJhMlkuua4kJAQWrduTZs2bUq7RVZGAmbt2rUZPXo0H3/8cYXPbbGZOJ97jBOZ+8g35QCgkCpp7teR1v7dcVI4NjemsLCQd955h2+++Ybg4GA++OADHnzwQbEjp8hdI4oBkVL27dvHk08+ydmzZ3nkkUd47733CAgIcHRYDuPxxx/nwIEDnDp16q7nEgSBI0eOsGbNGtasWUNCQgIA9erVo02bNtStW5eQkBCCgoKIjIwkNDQUpVKJIAhYrVYyMzNJTU3l4sWL7Nq1ix07dpCWlkbDhg157bXXePDBB+9aFOTn5/PDxi+R1ClGrpBhLDZjOq8i0rURLZq3oEGDBtdYNhuNRvLy8sjOziY2Npbjx49z9OhRjh07RlFRERKJhMaNGzNkyBBGjhxJixYtKkS4dOnShZCQEJYvX37Xc90MQbBzseA8h9J3llYjKKRKWvh1pk1AD4ebGsXExPDKK6/w+++/07JlS77++muxx4bIXSGKARGysrKYNWsWixYtom3btnz33Xe0bt3a0WE5nJYtWxIVFcWKFSvueA69Xs/ixYv56quvSi2ZR4wYwcCBA+nQoQM+Pj53NK/dbmfPnj3MmTOHDRs20KtXL+bNm0edOnXuaL7Va1ex9fJKGnYv8c73V4QxvOGUOzLrsdvtXLhwgcOHD/PXX3+xYcMG8vLyiIiIYNKkSTz55JN3fN0Azz33HKtXryYpKanS34gFQeByYTQH07aTqU8BQC3T0C6wF839OiOXOja59O+//+bZZ5/l2LFjjB8/ntmzZ9doAS9yFwgiNRaLxSJ8/fXXgoeHh+Dl5SX89NNPgs1mc3RY1YILFy4IgLB69eo7Oj4lJUV45ZVXBC8vL0EqlQrDhw8XduzYIVit1gqOVBA2b94shIeHC2q1WnjvvffKdY6CggLh4cemCM8ufkj4/OgLwuyjs4RjGX8Jdru9wuIzm83Cjh07hOnTpwtOTk6Cs7OzMGvWLCEjI+OO5jtw4IAACJs2baqwGG+H3W4X4vLOCgvOfip8fvQF4fOjLwg/n/lQiM07U6Hf1Z1gs9mEn3/+WfD29hbc3d2FuXPnVsq/M5H7G1EM1FB27twpNGrUSJBIJML06dOFrKwsR4dUrRg3bpzg4+MjGAyGch2XnJwsPPbYY4JCoRBcXFyEZ599Vrh8+XIlRfk/tFqt8NJLLwlSqVQYNWqUUFxcfNtj1q1bJzRt31B4Y+NM4fOjLwjfnXxTSC66VKlx5uTkCK+99prg6uoqaDQa4bnnnhPS09PLNYfdbhc6deokNGvWTLBYLJUU6Y2x2W3CmezDwtxTb5eKglUX5gk5+vJdQ2WQk5MjPPzwwwIgtGnTRjh27JijQxK5hxDFQA0jLS1NGDlypAAInTp1Eo4fP+7okKodq1atEgBh6dKlZT6muLhYePHFFwWlUil4eXkJH330kVBYWFiJUd6YdevWCc7OzkL9+vWFc+fO3XBMfn6+MGHCBCEoyk/4cM8zwudHXxDmn/1YKDDmVFmcubm5wltvvSW4u7sLrq6uws8//1yuN+wjR44IUqlU+PjjjysxyptjshqF/SlbhC+PvSx8fvQF4Ytjs4Q9SesFk9XokHj+zf79+4UmTZoIEolEePbZZwWtVuvokETuAUQxUEOw2+3C4sWLBQ8PD8HPz09YunSpw5c3qyPp6emCt7e3MHLkyDJ/P1u2bBHCwsIEjUYjvPvuu0JRUVElR3lrLly4IDRu3FhwcnIS5s+ff83Wz+bNm4XQ0FChTrMwYfahl4TPj74gLD7/paAzO+aBkZeXV/o2O2jQICEtLa3Mx86aNUtQKBTCiRMnKjHCW5NvzBF+j/uldJXgh9PvCZfyzzssnqtYLBbhs88+E9RqtRAZGSns3r3b0SGJVHNEMVADyM3NFYYPHy4Awvjx44WcnKp7A7yXsNlsQt++fQV/f38hMzPztuO1Wq0wc+ZMARD69OkjXLpUuUvs5UGr1QqTJ08WAKFp06bCo48+KvTs2VMAhAfGDhS+OfaG8PnRF4Sl/3wlGC16R4crbNiwQfD39xe8vLzKnKdhNBqF5s2bCw0aNBB0Ol0lR3hrLuX/I/x4+v1SUbDx0hJBZ779Vk1lExsbK3Tp0kUAhGeeecbh35NI9UUUA/c5+/fvF0JDQwUvLy9h7dq1jg6nWvPJJ58IgLBt27bbjj1//rzQsGFDQaPRCHPnzq22qyx79uwRRo8eLTRq1Ejo3bu3sHj5QuHnMx8Jnx99QVh47nPBYKk+D4fs7OzSLaypU6cKev3tRcr58+cFtVotTJ482eG/A7PVKOxOWi/MPvqi8PnRF4TvT74lxOadcWhMglAicr/88ktBrVYLUVFRwqFDhxwdkkg1RBQD9ylWq1V49913BalUKnTq1ElITEx0dEjVmn379gkymUx46aWXbjt27dq1gouLi9CoUSPh/HnHLwmXFavNKqy88H3pcrbWXPU5DbfDbrcLCxYsEDQajdCiRQshPj7+tscsXrxYAISvv/668gMsA+naJOHXc59ds0pQHURXdHS00LZtW0EmkwnvvPOOWHEgcg2iGLgPyczMFLp37y5IpVLhzTffrPKM63uNpKQkwd/fX+jSpcstvyu73S689957AlDmjP3qxO6kP4TPj74gfHX8VSFLV/a9eUdw6tQpISIiQvDy8hK2bt162/HPPfecIJPJhJ07d1ZBdLfHYrMIe5M3la4SzDv1rpBYGOvosASLxSK89dZbgkQiEfr27StkZ2c7OiSRaoJoOnSfcezYMYYPH47ZbGblypV0797d0SFVa4qLi+ncuTOFhYUcPnwYf3//G44zmUzMnDmThQsX8u677/L6669XeqveiiQ2/wwbLi0C4IHak6nr2cTBEd2evLw8JkyYwLZt2/j444+ZNWvWTb9zq9XKwIEDOX78OEeOHKF27dpVHO2NSdcmsjl+OQVXrI1b+XejS/AAZA42K9qxYwfjx4/HycmJP/74g+bNmzs0HhHHIxpa30csXLiQzp07ExwczIkTJ0QhcBssFgtjxowhISGBTZs23VQIaLVaBgwYwIoVK1i6dClvvPHGPSUEdJYidiSsAaC1f/d7QggAeHl5sWnTJl577TVefvllXnzxRW727iKXy1m5ciXe3t4MGzYMnU5XxdHemECXMCY2fI4mPu0AOJ75FytjvqfQlOvQuPr06cOJEyfw8fGhU6dOrF692qHxiFQDHLwyIVIBmM1m4emnnxYAYdq0aYLR6Pha5+qO3W4XJk2aJCgUCmHHjh03HVdQUCB07NhRcHNzE/bt21eFEVYMdrtdWBv785WEwdmC1XZv7hN//fXXAiA8/PDDt9zrPnfunODs7CyMGzfO4QmF/yU276zwzYnXhc+PviB8feI1ITbvrKNDEnQ6nTBu3DgBEN58803RgbQGI4qBe5zs7Gyhe/fuglwuF77//vtqdwOsrrzyyisCICxbtuymY3Jzc4U2bdoIHh4ewpEjR6owuorjQu4p4fOjLwhfHntJyNZX7zyB27F48WJBJpMJw4cPv6Uz5MqVKwVA+OKLL6owurJRYMwVlv3zTWly4d7kTYLN7liBZrfbhQ8++EAAhBEjRogmRTUUUQzcw5w/f16IjIwUfHx8hL/++svR4dwzfPPNNwIgzJ49+6ZjCgoKhNatWwve3t4ONbW5G0xWozD31DvC50dfEP5OuX0S3r3A+vXrBbVaLfTu3fuWD60XX3xRkEqlwpYtW6owurJhtVmFPxPX/cvOeG61qDa46l7Ztm1b0Z68BiImEN6jbN++ndGjRxMaGsqGDRsIDw93dEj3BGvWrGHMmDE899xzzJ49+4ZjCgoK6NevH3FxcezatYsWLVpUcZQVw8G07RxI2467ypspjV5ELlU4OqQKYc+ePQwePJj27duzefPma9oqX8VmszFs2DD27NnD3r17q+Xv8ELeKbYnrMJiN+Oh8mFonSn4aBzbcfD48eMMGjQIFxcXtmzZQt26dR0aj0jVIYqBe5AFCxYwffp0+vXrx/Lly3Fzc3N0SA5DEASKzPlkG9LJN2ZRYMxFaylEZynGZDNithmxC3YEBGxWG1npOajlGhrUboSL0g13lTceKh98nQLwUvtRVFhcKgR27txJy5YtHX2Jd4TOUsTPZz/CarcwKPIh6ns1d3RIFcpff/1F3759GTVqFIsWLUImk103RqfT0b17d1JTUzl06BChoaEOiPTWZOvTWHdxAUXmfJRSFUPrTCHUzbEP4Pj4eAYOHEh2djbr16+nY8eODo1HpGoQxcA9hCAIvP/++7z55pvMnDmTb7/9FrncsSVKVY0gCOQaM0ksiiWpKI50XRIGa8VkjsskMjIv5hN7NIHHHnyG7i363rNv03uS13M8cy+BzqE8WP+pe6r6oaysWbOGcePGMWXKFH766acbXmNmZibt27fHycmJ/fv34+np6YBIb43eomPDpYWkaC8jlcjoGzaKRj5tHBpTXl4ew4cP5/Dhw6xYsYJhw4Y5NB6RykcUA/cIdrudZ599lm+++Yb33nuP11577b68wd+MbH060XnHics/V1qzfRWpRIa32h8vjR+eKh9clR44K9xQyzQoZSqys3J48MEHcfdwZ/6Cn5BrpOgtWorNhRSYcsk3ZpNtSMNiN18zr1yqIMwtinqezajt0RClTF2Vl3zHGKw6fjzzPla7hZF1pxPuXs/RIVUaixYtYvLkybz//vu89tprNxxz4cIFOnXqRKNGjdi+fTtqdfX7PVrtFrbEryA2/zQAPWoNpaV/F4fGZDKZmDRpEmvWrOGXX35h8uTJDo1HpHKpWa+V9yhWq5WpU6eydOlSfvjhB2bMmOHokKoEq93KhbwTnMo6QKY+pfTnMomcENdIwtzqEuISia9T0E3f4HNychg1cBw6nY7Na7YTHBB83Ri73c5DDz3E3mN/8vWCz3EKUpBYFIPWUsSlgvNcKjiPXKogyrMpTX3aE+QSXq2F2Lmco1jtFnw1QYS5RTk6nEpl0qRJJCQk8PrrrxMcHMyUKVOuG1O/fn02bNhAr169GDNmDGvWrLlhnoEjkUsVDI6cwN4UT45l7mF38h+YbEY6BPVxWEwqlYply5bh7u7OlClTMBqNzJw502HxiFQuohio5hiNRsaNG8emTZtYvnw5Y8eOdXRIlY7FZuZU9t8cz9yLzlIMgFQiJdK9IfW9WhDhXh+lTHXbeYqKihgwYAC5ubns27eP4OAbC4EZM2awYsUKVq5cyYhOo4GS7YhsQxpx+WeJyTtFvimHf3KP80/ucfydQmgd0I0oz6ZIJdfvVTsSQbBzJvsgAM39OlVr0VJRvPHGG6SmpvLwww+jUCiYMGHCdWM6duzI77//ztChQxk9ejSrV6+udoJAIpHSNWQQCpnySvLnNmQSOW0DezgsJplMxg8//IBGo+HRRx/FbDbz1FNPOSwekcpD3Caoxmi1WoYOHcqBAwf47bffGDhwoKNDqlTsgp2z2Yc4mL6jVAS4KNxp4deZxj5tcFK4lHkunU7HgAEDOH36NHt27aC+nwZTZhzmzMtYCtKxFmZiMxRRmJ2O2WTA2cUVjbMLUo0bMo07Co9AFF7BKP1rowqsT45a4FzuES7knsAqWAFwV3nTIbAPDbxbIpVUDzPPpKI4Vsf+gFKq4tFmb6Iog2i6H7Db7UybNo2FCxeydOlSxo0bd8NxW7ZsYdiwYfTv379aCoKrHM3Yzd6UTQD0Dh1BMz/HJvEJgsCsWbOYPXs2c+bM4ZlnnnFoPCIVjygGqik5OTkMHDiQCxcusHHjRrp27erokCqVdG0SO5N+I0ufCoC70ov2QX1o4NUSmbR8b98Gg4FHxw7Eo+gi0we3R1mYiGA13/7AWyBz9sSpdlukdVtzyUfF6YLjpYmLPppAetR6wOFZ4ABb41dwPvcYzXw70DtspKPDqVJsNhtTp05lyZIlfPfddzz22GM3HHevCIJ9KZs5kvEnEiSMqDvN4bkfgiDw8ssv89lnn/HFF1/w3HPPOTQekYpFFAPVkLS0NHr37k1OTg5bt269Z8vbyoLNbuXvtK0czfgLEFDJ1HQK7k9Tn/blbuZiKcwk78jvxG35CV+V7ZrPZC5eqALrofKrjdwziIVrNrJkzXoenvE402Y+CoKAYDVjMxRh0+VjKUjHkpuEKT0WU0bctWJCIkVZpw3JzVtwRpKCyWYEoK5HE3qGDsdF6ZhST5vdxrzT72C06RlT7zFquVaPZj1Vid1u5/nnn+err77ik08+4aWXXrrhuHtBEAiCwPbE1ZzLOYJKpuGhBs/gofZxeEyvvPIKn3zyiSgI7jPEnIFqRnJyMj179sRoNLJ//36iou7fBLACUy4bLy0uTQ5s4NWSbrWG4KxwLdc8xtRo8vYtovjsdrDb8FWBXarAtV5HXOp1ximyDQqfMCQSCWazmccee4wFC1Ywb968MiVjClYLhuSz6C8eQnthL6a0C5jjDuMfd5ieHj7Ed+5OjKqQuIKzJBVfpHutB2jk3brK9+sz9ckYbXrUMieCXcKr9NzVBalUypdffombmxsvv/wyKSkpfPHFF9eV4A4YMIB169YxbNgwxo0bx6pVq6pdma5EIqFX6AhyDZmk6xLZEr+CsfUfc2ieikQi4aOPPkIikfD8888DiILgPkFcGahGZGRk0KVLFywWC7t37yYiIsLRIVUaiUVxbLy0CKPNgFrmRN/w0eXupmfOTiB761do/9ld+rPjKTpCek6m84QXkCo114zPzMxk1KhRHDlyhJ9//pmJEyfeUezmvBSKTmyg8OjvWIuyACj29uFc53bkyk0A1PZoRP/wsajlTnd0jjvhSPqf7EvdTB2PxgytM6XKzltdmTdvHk899RRdunRh5cqV+Pr6Xjdmw4YNDB8+nEmTJjF//vxqmXBZaMpj0fnZmO0mOgcPpF1gT0eHhCAIvPrqq3z88cfiCsF9gigGqgn5+fl0796dnJwc9u/ff18LgfM5R9meuBq7YCfQOZTBtSfhpvQo8/F2s4GcnXPJ/3sZ2K0gkRJn9eXlRft47/sljBgx4rpjTpw4wdChQ7Faraxdu5YOHTrc9XUINivFZ3eQ+9cvmDPisEskJDRuwIWoYOwIuCk9eaD2ZPydQ+76XGVhw6VFxOafoWvIYNoEdK+Sc1Z39u7dy+jRo1GpVPz222+0aXO9mc+SJUuYOHFiqUV1dRQE53KOsi1hJUqZmmlNXkVThSLzZvxbEMyePbt0pUDk3qR6pEDXcIqLixkwYAApKSls3779vhYCp7L+ZmvCSuyCnfpeLRhT77FyCQFD4ikSvhpD/r5FYLfi3KAbO537MeSz7Tz2+qc3FAJ//PEHXbt2JTAwkGPHjlWIEACQyOS4NR9A+NOrCJrwOSrPECLP/kOnXYdwNtkpMuez/MK3xOSdrpDz3Y4cQwaAw/3tqxNdu3bl+PHjBAUF0aVLFxYvXnzdmIceeohvv/2WL7/8kvfee88BUd6eRt6t8NUEYrYZOZG519HhACVbBh9++CGvvPIKL7zwAp9//rmjQxK5C0Qx4GD0ej1DhgwhOjqa7du306hRI0eHVGmcyT7ErqTfAWjl35WBEePLbPcrCAK5fy0g6cdHsOQlI3f3J3jS1+wSWvLk6x/z5ptv8uSTT15zjN1u57333itNFNu9e/cNvQbuFolEgmvj3kQ8txaf/s/gobPQedte/DPysAlWNl5ewonMfRV+3v9SbC4AwEPlXennupcICQnhr7/+Yvz48UyaNImXX34Zm+3aBNMnnniCDz74gLfeeuuGgsHRSCRS2l7ZHjifewxBsDs4ohIkEgkffPABr732GrNmzeKTTz5xdEgid0j1ypipYZhMJkaOHMnRo0fZvn07rVq1cnRIlcbFgvPsSPwNgFb+3egWMrjMy7F2i4mM396i+PRWAFybDcB/2KscOXmOGTNm8PDDD/P2229fc0xxcTGTJk1i3bp1vP3227zxxhtIpZWrfSVyBd7dpuLaqBcZa9+h9d/HOde8Hom1a7E7+Q8sdjPtAntVyrktNnOpnbJTORMwawIqlYr58+fTpEkTXnzxRc6fP8+yZcuuafL1yiuvcPHiRaZPn079+vVvuKXgSOp4NEYlU1NsLiBVm0CIa6SjQwJKBMF7772HTCbj//7v/7DZbLz66quODkuknIhiwEFYLBbGjBnD7t272bRpE506dXJ0SJVGtj6NzZeXAgJNfdqXTwiYdKQsfBpD/HGQyvF/4GXc244iISGBoUOH0q5dO+bOnXvNfAkJCQwaNIiUlBTWr1/PkCFDKunKbozSJ5Ra034k768FNN7xPWqDiZjGddifugWFVEVL/84Vfk6rYCn9/xXS6lcmVx2QSCQ899xzNGzYkLFjx9K5c2c2btxY2s1QIpEwd+5c/vnnH4YNG8axY8cIDAx0cNT/Qy5VEOpWl7j8s6TrkqqNGICS7+6dd95BJpPx2muvYbFYeOuttxwdlkg5ELcJHIDVamXChAls2bKF33//nV69KudtsTpgthlZf2khFruZUNe69AwdXi4hkLzgcQzxx5GqXAiZ+h0e7UZTXFzMwIEDcXNzY+3atdfUiP/999+0bdsWk8nEkSNHqlwIXEUileHdYxqh036kfmoRdf+5DMDu5HXE5Z+t8POJacBlp1+/fhw4cIDi4mLatWvHsWPHsJsNmPNSEXIus/rnObgrYdLEh7Dbq8dy/FX8NCXbXLlX8kOqG2+++SYffvghb7/9Nh9++KGjwxEpB+LKQBUjCAIzZsxg7dq1rFmzhgEDBjg6pErlz6R1FJhycVV6MLj2xDK7CQpWC6lLnseYeBqp2pWQh+eiqdUYQRB47LHHSE1N5dixY/j4/M+EZeHChcyYMYP27dvz22+/XfOZo3CKbE3YE0uRLXoGy8VkEurUYsulJXg2eq5CE/1U/+qoaLTqy2XdXBNp0KAB+9f8xLo5L5P5w0TifK61bf59nC86UxYH3xpAvS4P4NKkD6qAug6vNFDJS37PFrvlNiMdxyuvvILVauW1115DrVaLVQb3COLKQBXz8ssvs2DBAhYuXHjf9wiPL4zmfO4xJEgYGDG+zOVQgiCQsfYd9BcPI1FqSoUAlDzwly1bxg8//FBqyGS1Wnn++eeZMmUKEydOZMeOHdVCCFxF4RFI2MxfaWPwwTsrDws2Npyfi81uu/3BZUQmlZV6GmgthRU27/2IMeU8SXMno13zIr1DbNS5IgRsSJG5+iLVuIFEgrNKho81k9zdP5H49RgSvh5D8dntOLIa++pKhYTqV/74b954443SKoMFCxY4OhyRMiCKgSrk888/57PPPmPOnDk37Kx2P2GxW9iVtA6Alv5dyrW/WXBwBUUnN4JURvD4z0uFQHJyMk8++SRTp07lwQcfBCA1NZW+ffvy9ddf89VXX/HTTz9VS2tZqcqJWpPm0E0fiMJkJg8de458WaHn8Fb7A/8rMRS5nsITG0icNxlj8hkkCjXurYcTOP5zNjgNodHHJ3l8jwTl5MVEvXeUoMeWMu8sHM4QkMiVmDPiSFv2EknfTcCQfM4h8eebsgFwV3k55Pzl4YMPPmDmzJlMnz6dLVu2ODockdsgioEq4tdff2XWrFm8+uqrNaLj16ms/RSacnFRuNMxqG+ZjzOmRpO1eTYAvgOexbne/xIrP/nkE1QqFXPmzAFg69atNGvWjJiYGHbu3MnTTz/t8GXcWyGRKQgf8R7tDSVOeGckqSTt+b7C5vd3KjE3Si2Or7A57ye0MfvJWPMm2Ky4NOxB5IsbCBj5Fm5NevPiG++xdetWoqOjady4MZ/N/gLBoxbDZn3F5F/PkNHtHbx7zUSidMKY+g/JP0yl4MiaKr+GNG0CcG94SUgkEr799lsGDhxY6vwpUn0RxUAVsHr1ah555BGmT5/O+++/7+hwKh2TzciR9BKL4E7B/VH+az/7VtgtJtJXvlpys27UC89OD5V+ZjabmT9/PqNGjWLr1q107dqVAQMG0LZtW06fPk337t0r41IqHIlUSuuer+FnVWOXyTia8RfZ27+tkKXnCPf6AFwqPF9t6tCrC1Zdfsm/LUHAvc1wgibMRu52rT1xv379OH/+PJMmTeL1118nNDS01HNg4fI1+PR+jMhZG3Fp1BPBZiHz9/fJ2jS7yrYN8ozZZBvSkUqkDu9gWFbkcjkrVqygWbNm9O/fn3PnHLOiInJ7RDFQyWzevJnx48czduzY60rg7lfOZB/CaNPjpfajoXfZvRPy9szHnB2PzNWHgOFvXPNdJSYmYjQa+fHHHxk7dix2u521a9eycePGapUfUBakUildGkwCICUskOy9v5Cz7eu7fqjUcq2NSqZBZynmUmF0RYR631B8agt2QxFK/9r4PfAKkpt4Tri5ufHdd98RHx/P9OnTOXLkCDKZrDS/R+7iRdCE2fj0exokEvL3Ly5xw6wCzmYfAiDUtS4auXOVnLMicHJyYvPmzYSGhtK7d29iY2MdHZLIDRDFQCXy119/MXLkSAYNGsTChQuRyRzXbayqsAs2TmbtB6B1QHekkrL9EzNnJ5L71y8A+A95CZmzxzWf161blwULFjBv3jwuXbrE/v37GT58eKUbCVUWYW51cFN6YlXIyQjyJe+vBWRv/uKuBIFMKqepb3sAjqbvdmiiW3Wj+J8/AfBoMxKp/PY5JcHBwXz22WecOXMGg8HA4MGDSz+TSCR4d38Y3wElWfLZW+egjz9ROYFfwWg1cCbnMAAt/O49TxIPDw+2b9+Ol5cXPXv25PLly44OSeQ/3Jt30nuA48ePM2TIEDp37szKlStRKMpmu3uvE18YQ7G5AI3cmQZeLcp8XNamz8FmxTmqEy6N+9xwzJQpU5g5cyaRkdXHbOVOkUikNPBqCUBh624A5O9fTNaGT+/qId7SrzNyiZw0XQKXCv+pkFjvByy5yQCoa5WvMyaAQqG44YqeZ+eHcGv1AAgCGWveQrBWXrnfgbRtmG1GvNX+pdtB9xp+fn7s2rULjUZDr169SEpKcnRIIv9CFAOVQExMDP3796dhw4b8/vvvqFSq2x90n3A+5ygADb1blbnvgD7+BLqYfSCV4zf4pSrfShFsFqy6fKzFuQgVWO53O8Lc6gKQqbLgN/x1kEgoOLiczHUfINyh2Y2L0p2W/l0B+Dt1S4WWL97L2E16AKTqiltel0gk+A1+CZmrD5a8ZIrObq+wuf9Nhi6ZU1l/A9AjdCiSMq62VUcCAwP588+SVZpevXqRkSFWvlQXRNOhCiY5OZk+ffrg5+fHpk2bcHGpOeYvZpuRy1f2qht6ty7TMYIgkLP9WwDc2wxH6RtWafFdxW42UHxmG7qLhzDEn8BalPW/D6Uy5K6+qGs1xim8JS4Nu6HwrPjmRgABLiXXqrMUo245gACZgozf3qbwyBoEm4WAEW8iKaNJ079pHdCdM9mHyDFkcDRjN+2Deld06PccMicP7MZibNpc8Ku4lSWZ2gXPDuPI2f4thYdX495iUIXNDWC1W9gSvxwBgXpezQlzi6rQ+R1BrVq1+PPPP+ncuTN9+vRhz549eHuLzbUczb0rMashGRkZ9OrVC5lMxvbt22vcP/D4wgvYBCueKh98NWXzdNfHHsCQcAKJXIl3j2mVGp/dbCBnx/dc+rgfGb+9TfHprdcKAQC7DWthBtpzO8na+CmXPx1E4rzJFB5bh91qrtB4FFIFLgp3AAqMObi3GkrgmA9AIqXo+B8lS8938GavkTvRM3QYAAfTd5ChS67IsO9JVIElqzCGpIq3gnZrMfjK3GewGYoqdO6/kjeQZ8zCSe5Kr9DhFTq3I4mIiGDHjh1kZGTQv39/iooq9nsTKT/iykAFUVhYSL9+/dDpdOzbt69SWuVWd66uCtT2aFSmpX5BEMjZNQ8Aj3ZjULj7V1psxtRo0lb8H5acRAAUXrVwazEQp4jWKAPqIFOXdPqz6fIw5yRhSDyF/uJh9PHHMCaeJiPxNNnbvsGz80N4dhiHVKmpkLicFC5oLYUYbQYA3JoPBKmM9JWvUnRyI4LdRuDo95DIyvenWt+rBXH5Z4krOMvmy8uY2PBZFLKas131X5wi26I9/yfF53bi3f3hCp1b4RGAwisES14KpvQYnCIrptvhuZwjnMo+AEC/8NH3VAVBWWjYsCE7duygR48eDBo0iG3btuHkVDaXUpGKR1wZqADMZjOjRo0iKSmJ7du33xcJbuVFEAQSCktKhsqa4KS/dBhj8lkkchVe3aZWWmzF53aRNG8ylpxE5G5+BI3/jIgX1uHT+zGcardB7uyJRCZHIpMjd/PDKbI13j2mUWv6T0S+vBWf/s8gd/PDps0lZ+tXXP5sMPl/L6uQhLGreRVX2w8DuDXtR9CDn4JUTvHpLaSvfBXBVr5zSSQS+oSPxkXhTr4pm+2Ja2p0dYFr075IZApMqf9USub/1a0kS0FmhcyXpk1gV+JaADoG9SXSo2GFzFvdaN68OVu2bOHkyZOMHTsWm03McXEUohi4S642Htq7dy/r1q2jUaNGjg7JIeQZM9Fbi5FL5AS5RJTpmNzdPwPg3nYEctfK2VLRxfxN2vKXEaxmnOt3JfzpVbg26VPmvXiFuz/e3aYS+dImAka9i8IzGJs2l6yNn5Lw9Wi00X/d1UP26rHS//wpujbuRdD4T0Emp/jsdtKWvVRu8aGROzEwcjxSiZQLeSc5kvHnHcd5ryN38cKt1VAAsjfPvuMEzZtSgSWu+cYc1l1cgFWwUtujEe0D7++cj/bt27NmzRq2bNnCCy+84OhwaiyiGLhL3n33XRYuXMiCBQvo1q2bo8NxGMnFlwAIcglHLr39krb+0lEMl4+BTI5Xl0mVEpMp4yJpy18CuxXXZv0Jnvjldf4FZUUiU+De6gEiXliH/7DXkTl7Ys5OIHXRM6T++iTmnDsrk7JeWRG4UeWFa6OeBD/0JRK5Eu0/u0ld9mK58xZqudam55W95v2pWyulffK9gk/vx0rshFPOU3BweYXObS3OAUCmcburebTmQtbE/oDBqsPfKYRBEePv6eqBstK/f3+++eYbvvrqK77/vuIsukXKzv3/r6wSWbRoEW+//TYffPAB48ePd3Q4DiXlih9+WRoSCYJA9vZvgBITGIVH2ZINy4PdYiR16QvYTTo0ka0JHPXeHWXm/xeJTIFHu1FEvLger25TkcgU6GL/JmHOSLK3f4vdYizXfHqrDuCm+8Eu9bsQPHEOErkKXfRfpC15odwrBM18O9DMtyMgsPnyUlKv+NvXNOSu3vgNfA6A7K1fY0iuGGFkM2oxZ5WY6KiC7twm2GDV81vcTxSZ8/FQ+TC87sM1Ks/jscce45lnnuHpp59m27Ztjg6nxiGKgTtk9+7dTJs2jWnTpvHKK684OhyHIggCKdqSlYEQ19q3Ha+L/gtjUknXuMqqIMjZOfdKjoAvweM/RyKvWNMnmdoV3/7PEP7MGpzqdkCwWcjb/TMJc0ajiz1Qpjlsdht6ixYAZ4XrTcc5R3UkePLXJYIgZh9py2eVWxD0DB1KpHsDrIKVdXHzya2hnQ3d247CuX5XBKuJ1IVP3/GKzr/RntsJdhtK3wjkbn53NIfBqmN1zDxyDBk4K1wZFTUdZ8XdrTLci8yePZt+/foxZswYsY9BFSOKgTsgOjqaESNG0L17d77//vsa0W/gVuQZs9BZSvIFAp1DbzlWsFnJ3voVAJ4dx1/XLKYiMKZdIH//EgD8h71xx1sDZUHpG0bI1O+vNL7xw5KXTMqCx0lb+SpWbd4tjy0y5yNgRy5V3FIMADjXaUfwpDlXtgz2kLa8fDkEUomMwZEPEegchtFm4Le4nyky5Zf5+PsFiURC0LiPUAXVx6bLJ3n+zLsSBILNSt6V3gRuLQff0b3AYNXxW+xPZBvScJK7MipqJu6qmlWWfBWZTMby5csJDw9n8ODBZGZWTEKmyO0RxUA5KSgoYMiQIQQHB7N69eoaYzN8KxKLSqoISvIFbv195B9YXtKMyNkTr+4VX0Eg2O1k/vEh2G24NumDS4OuFX6O/yKRSHBt3Ivw59bi2WkCSKQUn9pMwpyRFJ3ZdtMEwzxjiceBh8qnTPvCznU7XNkyKMkhKK8gUMhUDKvzMJ5qX4rNBayOnYfOUvPqu6UqZ0KmfIfCJwxrQTqJ309Ed/HwHc2Vs/1bzFmXkWrc8Gg3utzHa81FrLzwPZn6FDRyZ8bUm3lPtCeuTNzc3Ni4cSNms5kHHngAvV7v6JBqBKIYKAd2u51JkyaRm5vL+vXrcXd3d3RI1YKr/gK3Kym05KeSs+M7AHz6Plla21+RFJ/ZVrIFodTgO+jFCp//VsjULvgNnkXoY4tQBtTFpssnffnLpC198YarBDmGdIAyGzTBlS2DuxAETgrnkjdPpRcFplzWxP6E3qIr8/H3C3JXb0JnzEcd0hi7oZCUBY+Ts+N77BZTmefIP7CcvL2/AuD/wCvlTh4sNOWyKuZ7co2ZuCjcGFvvMbxruBC4Sq1atdiwYQPnzp1jypQpNbostqoQxUA5+OSTT9iwYQOLFy+ukV4CN0JnKSap6CIAkR43L6sUBIGMte8iWIxowlvi3rokw12v1/Pxxx9z8eLFu47FbjaQvXUOAN7dH65UE6NboanVmPAnluHd61GQytGe30XCV6PRXth3zbgsfSoAvk7lS6B0jup4TZVB2or/K5cPgZvSg1H1ZuKscCPHkM6a2HkYrDVREPhQa8b8EgdBu43cP38k4atRFJ3eekuBZdXmkb76DbI2fAKAT58ncGs+gNjYWLZs2UJhYeFtz52pS2FZ9Lfkm3JwU3oytv4TohD4D61atWLJkiWsXr2aDz/80NHh3PeIYqCM7N69m9dff53XX3/9mnamNZ3o3OMI2Al0DsVLffP9/4KDK9BfPIxEoSZg5FtIpFIEQWDAgAG88sorLF9+96Veubt/wlqYicIzCM/OE+96vrtBIlfg0/tRwp5YgtK/NjZtLqkLnyJr42elD5qrNsH+TrXKPb9zvU4lKwQyBdrzu0hbOqtcb7UeKm9GRz2Ks8KVbEM6a2J/rJGCQKpQETD6PYLGf4rczRdLbjLpK/6PS58OIGvjZxSd2YYx5TyGpDMUndlGxm9vEz/7AYpObACJBK8e0/C6kgQ7e/ZsBg4cyLRpt06KjS+MZlXMXPTWYnw1QTxY/0k8amiOwO0YPnw4b7zxBm+++SZ79uxxdDj3NRJBXH+5Lbm5uTRt2pT69euzfft2ZLK7L1G7H7DYzMw/9zE6SxF9wkbR1Lf9DccZks+R9MMUsFnxG/Iynh0fBGDDhg088MADAGRnZ+Pj43PHsZgyLpLwzTiwWwl66AtcG/W847kqGrvFRM7Wr8g/sAwAdUgjPMa+w88JJVbMTzR/D7X8zuyNtTH7SVvyPILVjFOd9gRP/LJcVsm5hswrDyYtvpogRkXNxElxf9nelhWbUUv+/sUUHFmLrTj7lmNVQfXxH/oamtD/tURevHgxkyaVeGbExMQQFXV9U6GTWfvZnfQHAgK1XGsztM5UVDJ1xV7IfYbNZqNPnz7ExMRw6tQpfH0rPulYRBQDt0UQBEaNGsWePXs4c+ZMjew5cDP2p27hcPou3JSeTG388g3Nhqy6fBK/HY+1IB2XRr0ImvA5EokEs9lM48aNiYuLY9CgQWzcuPGO4xCsFhLnTsKUFo1Lw+4ET5xzF1dVeWj/2UP6mjexG4rIDg/jcKu6eKn9mNr4pbuaV3fpCKmLnkEwG1AHNyR40lflqtLINWSwKuaHK2+qgVcEQc3ptvlfBKsFbfRu9JePYUw+h1Wbi0QqR6p2wSmyDc5RHXGq0+4634qCggI8PT0BeOCBB/jjjz9KP7PZrexO/oPT2QcBaOTdhj5hI5GVwaBLBNLS0mjWrBlt27Zl48aNNb6CqzIQxcBt+OWXX3jkkUf47bffGDFihKPDqTYkFcWxOvZHQGBw5EPU82p+3RjBaiH5l0cxxB9H4R1K2JNLS5MGFy5cyJQpUwDYtm0bffv2veNYsjZ/Qf6+RUg17kQ8u/qOa72rAkt+GqlLXuC0h5mLDSKoK/jwQJv/u+t5DYmnSV30DDZ9AXJ3f4Infok6uOx+9rmGzCvVBcV4q/0ZXe/R25Y7ilzPlClTWLhwIQDx8fGEh4ejsxSz4dIiUrXxgIQuwQNoE9BDfKCVk02bNjF48GB+/PFHpk+f7uhw7jtEMXALLl++TLNmzRg9ejS//PKLo8OpNiQVXWT9pYWYbAYa+7SlX/iY68YIgkDGb29RdHw9UpUzoY8tROVfp/Tz+vXrExMTQ+PGjTlz5swd3xiLTm0mfeWrAARNmI1r4153dlFViN1sYNmhN8l0EmhyIpoWYf3w6fvUXT8czLnJpC58CnN2Asjk+PZ9Es/OE8vsvJhnzGJ1zDy0liK81H6MqfeYKAjKyeXLl6ldu8R468MPP2Tik2PZeHkJOksRSpmaQRHj79umQ1XBtGnTWLlyJefOnSMsLMzR4dxXiAmEN8FmszFx4kR8fX356quvHB1OtUAQBM7mHOG3uJ8w2QwEuYTTs9awG47N/fNHio6vB6mMoAc/vUYIFBcXExMTA5SsvNzpQ1Abs5/0NW8C4NXt4XtCCACgUJLnUuLH4JlbQN6eX8hc+w6C/e46tim9axH62CJcGvYAm5XsLXNI+n4iuktHynR8iQB4HBeFO3nGLFbFzEVnKb6rmGoakZGRzJkzB6VSQZ0eAayKKfFy8Fb7M6HBM6IQuEu++OILPD09efjhh7FXdLOpGo64MnATPv30U1555RX27t1Lp06dHB2Ow0nXJrInZQNpV3ztozybMSBi3A1NhgqO/k7m2ncA8B/22nVmLMXFxYwfP56HHnqIsWPH3lE82gt7SVs6C8FqwrVpPwLHflghvQeqgkxdCkui56CSqZlgbUnW7++DYC+5jjHvI5HdnZGVIAgUHltH9qbPsZuu9D4Ia45r84G4Nu6N3MXrlsfnG3NYFTMXraUQH00Ao6MeK00qFKwWbMZiBIsBu8WEYLOCUHJTlkjlSOQKpEonpCpnJEpNjVwKLzYXsi1hZakZVwOvlvQJG1mj+gxUJjt37qRPnz788ssvTJ1aea3PaxqiGLgBycnJ1K9fn5kzZ/LFF184OhyHYbPbSCyK4XT2wVJjIblUQfvA3rQN6HFD1zzthX2kLn4W7Da8uj+Mb7+nKzyugqNryVz3AdhtuDToTtCEz+76AVqVnMz6mz+TfifcrR4jo6ZTfG4XaSteBpsVl8a9CRr3UYVcj1WbR+6fP1FwZDXYrKU/V/iEoQ5uiMIzEJmzJxKZEolUhmCzIliN2I06Csx5bPcpxCAHd62ZTkfjkBXnI5SjEZNErkTm7Inc1Re5RwAKzyAUXiEovUJQ+kUgdw+478TCxfxzbEtchdGqRy5V0KPWMJr4tL3vrtPRPPjgg/z111/ExcXh7Fwzq18qGlEM3ICxY8eyd+9eYmJicHOrWc1CLDYTiUVxXCw4x6WC8xhtBgAkSGjo3ZpOwf1xVd7YedGQeJrk+TMRLEbcWgwmYPR7FXoTtFvNZG34lMIjawBwazmEgBFv3lNCAGDz5WVE552gQ1BfOgaVJE5qo/eStvQFBJsF1yZ9CBz7ERJZxWSaWwozKT69laIz2zCl/lPm47SuThzs2gqTWoVnTgHt959AZruyCiBXIVGokMgUVzwjALsVwWrGbjaUrhbcConSCXVgFKqg+qhDGqMJbYrCu9Y9+eA0Wg3sSf6D87nHAPDVBDEocgLeGscYX93vJCQkUK9ePV599VXeeustR4dzXyCKgf+wZ88eevTowcKFC0trhu9n9JZiMnTJpOuSSNMmkqq9jE343961k9yF+l4taObX8ZamQqasyyTNm4LdUIRzVKeSpjoV+JA2ZV0mfdXrJQ8ziQTvXo/i3XPGPfng+OXsx+SbchhRd9o1Fs7aC/tIXfIc2Ky4NhtQsmVQwVsfNl0BxpTzGNNjsBZlY9Pll7gXCjaQypEq1EhVTsicPJBq3ChyUrDBfgozFsI0EQyNmIBc7XrLuARBQDAbsOkLsGpzsRZlYy1Ix5KXiiU/DXNOIubcZLBbrztW5uKFJrQpmrDmaCJaoQ5qUGGiqLK4XBDNjsQ1aC2FgITW/t3oFNz/hqW2IhXHSy+9xHfffcfFixcJDKz4Nug1DVEM/Id+/fqRk5PD0aNHkUrvr/xKvUVHlj6FTH0KmboUMvTJFJsLrhvnpvQk0qMhUZ5NCXaJQHqbJjrWoiwS507GWpCOulZTak37oVzGN7dCsNspOLSK7C1fIlhNSDXuBI39EOd692Yeh8lm5NuTrwPwWLN3rjP4Kf5nN2lLZ4HdinvrYfgPfxOJg/8dphbHsybuR6x2Cy38OtMzdNhdzynYLJhzEjGlxWBMjcaQdAZTWvR1tspSlTOayNY412mPU2QblP61q40ANFh17E76g+i8EwB4qnzoFzGOYJdwxwZWQygoKKBOnTqMHDmSH374wdHh3POIYuBfXLx4kbp16/Lrr78yefJkR4dzx1jtVnKNmeTo08kxpJNjyCDHkHHlzeW/SPBS+xLgXIsg5zBCXGvjpfYr8w3XbtKR9MNUTOmxKHzCCH30V+TOnhVyHebcZDJ+extD/HEAnOp2IGDk2w7rOVARpBbHsyLmO1wU7sxs9sYNxxSf3U7a8v8DwY5Hu9H4DX3V4Q/AuPyzrL9UUj9/K7fJu8FuMWFKKxEGhoQT6ONPYDdc21VR5uKFU2RbnOq0xblOOxSeVW8CJggCF/JOsjv5DwxWHRIktPTvQqeg/ihkyiqPpybz6aef8vrrr3P58mVCQkIcHc49jSgG/sXLL7/MTz/9RGpqKhpNxbzZVjZWu4UsfSoZumQy9Slk6VPJNWQhcOM9W0+VD35OIfg7h+B/5b93aocq2KykLHwafdwBZC5ehD62GKXX3d+cBbuN/APLyNn+HYLFWNKBsN/TeLQf6/C35LvlbPZhtieuJswtilFRM246rvDERjLWvAGCgEeHB/Eb8pLDBcGhtJ38nbYVuVTBxIbP33LbqCIQ7HZM6THoLh5Cf/EQhsTT1yUwKjyD0ES0KtlWCG2G0i+iUqtK8o3Z7Er6vbRSwFvtT7/wMQS6iDXvjqC4uJiwsDAmTpwoloDfJaIYuILJZCIkJIQJEyYwZ84cR4dzQ+yCjRxDBunaRNJ1yWTpU8gxZN7wwa+WafDRBOLjFIiPJgBvdQC+mgBUd+iB/18EQSBz3QcUHlmDRKG+0g725l0Ly4o5O4H01W9iTD4DgFNkGwJGve2QN8DKYF/KZo5k/Elzv070Ch1+y7H/LtF0bzsS/6GvOVQMCYKdNbE/kVQcR5BLOOPqPVGlAsVuNWNMPof+0mF0Fw9hTD5/Xd6BROmEOrgBqsAoVAF1UXrXQu4RhNzVB6nizkv7rHYLRzJ2cyR9FzbBhkwip0NQH1r7d0d2j5S03q+8/fbbfPrppyQlJd1Vf5OajigGrrB8+XLGjx9PdHQ09evXv/0BVYBdsJOtTyOxKI6U4kukauMx26/vTOckdyHAuRb+zrXwdwrG1ykYV4V7pd6o8/9eRtbGT0EiKWkM1LDHXc0n2O3k/72EnO3fIljNSFUu+A58DvfWw+/51YB/c7WSoGvIYNoEdL/t+MLjf5Dx2zslPgRN+hAw+v27eqjdLUXmAhac+wSr3cKoqBmEuV3fjKeqsJv0GBJOok88iSHxFMaU8whmw03HS1XOSNWuSJUaJHIlSGVXymMF+NdtUCJXIpGrkGpckbt4k+HtzBFNLkVCiWdDuFs9eoYOx1MtPniqAzk5OQQGBjJnzhyeeOIJR4dzzyKKgSt069YNqVTK7t27HRpHkSmP+MILJBTFklx8CZPt2pubUqYm0DmUQOfQ0mV+l0p+8P8X/aWjJP/yKNht+A54Dq+uN8+viIuLIz09nc6dO980IdNSkEHG6jfQXz4KgFPdjgSMeBOFx/3X3311zA8kFccxIOJBGnq3KtMxRWe2kb7qNbBZUYc2JXjC7HI1Iqpo/kxax8ms/aU+CdUFwW7DnBWPMfU8poyLmDIvYslPw1qQjmA1l3s+g1rF+eb1yAgu6XWhMhhpllBIHdd6uDXogVOdtvdcWev9Sv/+/TGZTA6/f9/LiLUvlDQU2bt3L0uXLq3ycwuCQJ4xk9j8s8TlnyXbkHbN50qpihDXSELd6lLLtTY+msDbZvdXJpb8VNKWzQK7DdfmA/HscvPyy71799K7d28sFgvPPffcDQ2ctNF7SV/9OnZDERKFGr/Bs3BvM8Lh++OVheXKyo6yHHkabk37IXf2InXJ8xiTzpDwzTgCx7yPc90OlRXmLWns04aTWftJ0yUiCEK1+V1JpDJUAXVQBdS55ueCIGA3FmPT5WM3arGbDQhWc4n9s2AHJHD1EgSw2cycN1/imO0SFokdiQB1UguofeI0couFIs5SdHgNUo0bbs0H4dlhLErf8NvGl5+fz1NPPUXnzp159NFHK/z6azKjRo1i5syZZGVl4edXfRuVVWfElQFK/K5fffVVcnJycHGpmtatecZsLuSd5ELeSfKN/+udLkFCkEs44W71CHOri79zCFJJ9diTtFvNJM2bgin1H1TBDQmd+QtSxY0favn5+dSvX5/69evTrFkzvvvuO/R6PSpVyRK3YLOSvf0b8veWZKirQxoROPZDlD73dyLW4n++JEufyoi6jxDh3qBcx5pzEkld8gLmzIsAuLcZgU+/pyqseqOsWO1WvjpR0mlxetRzOEk1IAhIFEqkcjUS+b37tpxnzGJr/ErSdYkABDqH0idsFL5OQdh0BegTTqC/eIjic7uwaXNLj9NEtMK728M4RXW8qTiaOHEiS5YsAe6+U6fItWRnZxMQEMD333/PzJkzHR3OPYkoBoAePXrg4uLChg0bKvU8FpuZ2PwznM05fKWdaQkyiYxQt7rU9WxKbfeG1baXfNbGz8j/eylSjTvhT6+85TL+Y489xrJly4iOjiYmJoaePXsSExNDVFQUNkMRacv/D33cAQA8O47Hd8Bz9/RDpKwsv/AtadoEhtSeRJRn03Ifb7cYyd78JQWHVgIgVbvi1W0qHu1GIdNUrFumzajFnHW55H+5SVhyU7AUZZJnLeTP9nWQWm30X78H6X9uIVKVMzJnLxSegSg8g1H6RaAKjEId3LDCY6woBMHO0Yy/OJC2DZtgRSlT0zVkEE182t1wJU6w29BfPEz+wRXoYv+GK02mVEEN8On9KM71u14nCkJDQ3nwwQc5ffo0x48f59SpUwQH3x+JsdWBqrqP36/U+G0CrVbL33//zZdffllp58g3ZnMq6wDnc4+V5gBIkBDmFkUD75bU9mh0x+V9VYX2nz3k/12yjRI4+t1bCoEjR47www8/MGfOHIKCgigqKqkVz8zMJMLXmZQFT2LOjkeiUBM4+l1cm9ScNyS1rKSaw2DR3tHxUoUa/6Gv4Nq0H1kbPsaUHkvOtq/J/fNH3JoPwLXZAJzCWpRLWAmCgLUgHVPGRYxpFzClx2BKu4AlP/WG4+NalqxoeOYVXicEoMR7wm7SYclLvvYDiQSVf12cIlvj3KArTuGtqoUANFoNbIlfzuXCEqvmMLco+oaPwU3pcdNjJFIZzlEdcY7qiKUwk/x9iyk4sgZTWjSpi55BFdQAv0HP4xTZBiipVkpJSSEqKopZs2bRtGlTpk2bxubNm6vNNsu9Tu/evfn000+xWq3I5TX+0VZuavzKwKZNmxg8eHDpW2tFkqZN5FjmHuLyzwElX7O70ovGPm1p5NPmph7/1Q1rcS7xX47AbijEs/NE/Aa9cNOxdrudNm3aIAgCR44cQS6Xl/Z4/+uPpQSfX4C1KBu5uz/Bk75CHVQ9Kjeqij3JGzie+VeFOPkJdhtFpzaTt28R5oy40p+XltcF1EXhGYzM2fOKI6SAYDGV2AQX52LJT8WSm4wpOwHBrL/hOeRuvij9IlH6hKHwqkWcq5n91pKmVSNCJxDu1Riu2gXbrNjNemy6AqzaHCz5aVjyUjBlXioRF3kp18wtVTnj0rAHbs0H4lSnnUO6TuYZs/g97hcKTDnIJHJ6hg6/48ZCVl0++fsWk39weWlVg3O9LvgNeoHEAgtRUVHs2rWLnj17sn79eoYOHcrGjRsZNGhQRV9WjeTAgQN06tSJw4cP07ZtW0eHc89R4+XTn3/+Sa1atahbt26FzZlcfIlDaTtJKv7fDTrSvQEt/DoT5lb3ht3+qiuCIJD5x4fYDYWoAuvdtgvh6tWrOXHiBPv37y9V5wqFgnp+anyOfovVqkfpX5uQqd/f006CN8Jm1GItzLySuS4gVTohc/Upaed75eHiqynxUL/aCvpukEhluLccgluLwRgSTlJ4fB26mP3YtHkY4o+XOjeWCZkcpU846qD6qALrlfw3oC4yZw8AzDYTe5LXczbnNAAdg/oR4dfi2jnkCmRyd2RO7ih9wyDi2moJa3EuhoTj6GIPoL2wD5s2l6KTGyk6uRG5RyAebUbg3mYEclfvu/laykyRKZ/VMT+gtRTipvRkSO1JBDjXuuP55M6e+PZ/Gs/OD5G7cy4FR9eii9lHwsVD2BoMxEkhRa0uWQEcMmQI3bt3Z9asWfTt2xeFwvErJPc6bdq0wdnZmd27d4ti4A6o8SsD3bp1w9/fn1WrVt31XJn6VPanbCahKAYAqURKA6+WtA7ojo/m3iyTKzq9lfQV/wdSOWFPLLnlm7zNZqNJkyaEh4ezefPm0p9nxBwn/vvJeDnJUQc3JGTq96UPmXsVwW7DmHwWXewBDEmnMab8g91YfMOxUrVr6Z45EU1ZrN8GwPQmr+Km8qrguOyYsy5hTIvBlBFb2ozIbjEgkciQyBTInD2u7OkHofAKRukbgdI75IZlcoJg52LBefambKLAlANIaB/Yi45Bfe9K1Ap2O4ak0xSf3kLR6W3YDSVW2RK5CvfWw/DqOhmFZ9Adz387TDYjS6O/It+YjZfaj7H1Hq/wXB1zdiJZmz5DF7MfgNRCM069n6X9iBLnyZMnT9K6dWs+//xznnvuuQo9d02lf//+SKXSa+4/ImWjRosBu92Oh4cHr776Kv/3f/93x/PoLMXsS9lU2r5UKpHSxKcdbQN6VPjNviqx6QuJnz0Um74A716P4tP71uVQa9euZeTIkRw6dIh27doBYClI5/I3E0Cfh8k1hEbPL0emdq2K8CscwW7HkHCcopOb0UbvwabLv27MVVMbJBLsRh120/W5AQe7tCTXz4v6Fi/61p9cLd0V7YKduPwzHErfSY4hAwAXhTsDIh4k1K3ObY4u57ksJorP7qDg4HKMKedLfiiT49FmBN49piF3q/hSsQNp2zmYth0XhTsPNnjqlvkBd4MgCGij95D2+4egLakacmv1AH6DX0KmduGJJ55g8eLFxMbGEhBwb74wVCfeeOMNfv75Z9LT0x0dyj1HjRYDsbGx1KtXj+3bt9OnT59yH28X7JzOPsD+1K2YbSWe6fW9WtApqB8e94E7WeYfH1JwaBVK/9qEP7XilgYrgiDQvn17nJycSo0/bEYtSfMmY868RGy2gcCpP9C6U/cqir7iMOelUHRiI4XH/8Ba8L+bjFTtinNUxxJv/NCmKL1DkaqcrjnWbjaUdOdLj8GQeBr9xcNkyHQc7NYaid1O152H8fOOwrVpP1yb9qvyMsH/Umwu4J/c45zLOUKBqaR0TilT09KvM638u6GuIDvrGyEIAvrLR8nb/TP6S0cAkCjUeHWdjFfXKRXWCdNsM/Ljmfcx2YwMjnyIel7NK2TeW5F0OZYfZ/bgodZ+SBBQeAYRMOYDTO7hhIaG8swzz/D+++9Xehz3O1dfSNLT00VxVU5qtBi4akGcnZ1dbk/rbH0a2xNWk6EvyZj2dwqhZ+gwgu6T9qWmjIskfDMW7DZqTfsJp9ptbjl+7969dOvWjU2bNjFw4EAEu520pS+g/Wc3VqUrvb88zOFzFwkNDa2iK7g7bEYt2vO7KDy+/pq9d6nKBdcmfXBrPhBNePM7cqCz5Kfxe9x8kqWFOBfr6LT7KEqLFaRyXOp1xr3NCJyjOiKRVU1Kj8Vm4mLBec7nHiOxKI6rya5qmYYW/l1o6dcZtdzp1pNUMPrLR8ne/i3GxJIcBblHIH5DXrpr22uAlOJ4VsZ8h4vCjRlNX6+SHJ7CwkI8PDzYOP8z6mfvKhGVEik+/Z7i3bUnWbp0GcnJyfdMg7TqyqVLl6hTpw5bt26lX79+jg7nnqJGJxCePHmSsLCwcgkBu2DnaMZuDqRtxy7YUMrUdAkeSDPf9vdUYuDtyNr0GdhtuDTqdVshACWtRBs3bsyAAQMAyP97Cdp/diORKbgQOIiM4v3V3hnMWpSFNuZvtNF70MceQLBZSj6QSHCq3Q73lkNwadzrpkZLZUXhGcTgFs+y+J85aF3h+OABtDmVgDz+LNroPWij9yBz9sSt2QDcWj2AKrBehZefac2FXC6M5nJhNIlFsVjtltLPgl0iaOzThijPZihl1/ZBsJv0WPJTsWpzsekKsJt0CLaSZkFSpQap2gW5qy8KjwBkrj53HLdTZBtCZ/6K9twOsjZ/ibUgnbTFz+HSuDf+D7xyV0mGektJqaub0qvK/mbd3NyQyWQkmZzp/8wqstZ/QtHJjeRs/Yon6rVigbaARYsWiYY5d0lERASurq6cOnVKFAPlpEaLgejoaBo1KnunvSJzAZsvLy01DKrj0ZheoSNwUVZPI5U7RXfxMPqLh0Emx3fg87cdHxsby6ZNm1iwYAESiQRj2gWyt30NgN+Ql4jbfQlPT8/STOqKwm4xXvGez8Bu1mO3mJBIJCVNZq48mKQq55L/KTVwpTeC3aTHbijGUpCOJTcZY/oFjElnMWfHXzO/0jcctxaDcGsxpML7JDgpXBlRdxqrYueSa9Wzp20E3fo8hG/0OYpPbMSmyyf/wDLyDyxDGVAXt2YDcG3SB6X3nWW7W+0W0rWJJBTFEl944Trba3eVNw29WtLQpzUeKu9Sn//C1PMY0y5gzriIKesSNm1emc8p1bihCoxCU6spTrXboAlrXq6lfolEgmuTvjjX60Lunz+Rt28h2nM7MVw+hv+w13BtUv6tPQDlFa8HraXwjo6/EyQSCT4+PmRnZyNTuxIw+j00ES3JWv8xQvJxNj3egjd/+ooZM2aIvgN3gVQqpUmTJpw7d87Rodxz1HgxMHTo0DKNTSiMYVP8UoxWPUqpip6hw2jo3fq+/MPN/fNHADzajkbpdfvktoULF+Lu7s64ceMQbBYy1rwJNisujXri3nYU+Wv/Dy+vu0+kFGwWdLEH0cbsw5BwstSWt8KQSFCHNMa5XmdcG/VC6V+7Un+/vk6BTGzwLOsvLSJTn8K23B34hQfTtNX7BOcZMJ/cjjZ6D+aMOHIy4sjZ9jWqwChcGvbAuV4X1MENb9jRURDsFJhyydClkKlPJk2bSJY+BZtg+/fFEuhci0j3hkR6NMDL7oQx5SyG88tJTjyNIeX8Tb0HpBo35G5+yJw9SsompSW3EbvZgN2oxVqUibUoG7uhCMPlYxguHyPvr1+QKNS41O+Ca9P+uNTvWmbDIalSg2//p3Ft2peMNW9hSo8hbdks3FoNxX/Iy9fladyOIJcwpBIpReZ8cgwZVVbp4+vrS05ODlAiDjzajEAdVJ/URc/gV5TNh52kHN28jLaDJlRJPPcrUVFRREdHOzqMe44aKwaMRiPx8fE0aHBrf3hBEDie+Rd7UzYhIODnFMyQyIn3RYLgjTAknS3ZI5fJ8eo25bbj7XY7S5YsYcyYMajVavL2LcKUHotU447/sNeRSCTk5ubelRiwm/Tk7V9MweHV2IpzrvlMqnJB7hmITO2CRK4CQUCwmkofTDajFrtZB7Z/9b2XypCqXFC4+6PwDkHpF4mmVlM0oU2rvOTRTeXFuPpPciTjT45m7CZLn8pO/e9IJVICW4YR0OFlXLKzkVw+gz3hHNLiZPIPLsR+ZDF2JzckwVHYA8IwurlRrJJRYC8m15iJxX59lz5nhSu1nCMJkfkSpJcgzUjCdHIb2pQvyb+B2+BV8yJ1UIMrDYDqovAJLVM1iN1qxpx1GVPaBfTxx9FfOoq1MIPiszsoPrsDmasPHm1G4NFhHHKXsv3bUAfVJ+zxJeT8+QN5e36h6PgfGBJPETzhc1QBZfcJUcpURLg34FLBeQ6l7WRw7YfKfOzd4OvrS1ZW1jU/Uwc3JOyJpaQsfBqvtAuY981GV68OznXaVUlM9yN16tRh/fr1jg7jnqPGJhCeO3eOJk2asH//fjp16nTDMTa7jV1JazmbcxiAxj5t6RU6HLn0/jUISV3yPNrzf+LWcgiBo9+77fhdu3bRu3dv/v77b9o2rU/85w9gN2kJGPk27q2HAdCzZ098fX1ZuXJluWIRBIGiExvI3vpVaVMYmYsXrk364lS7LZrQZshcvMr09i7YLAiCAIIdiVxVLVd0DFYdZ7MPcyHv1HXL+OVFarPjYbDhqbfiVWTCM68QdW42dn3BTY9R+IShCWuGJrQpmtBmKP0iK8wVUBAETGnRFJ/ZTuHJjaWiTqJQ49F+DF7dpparkkIff5z0la9iLcxEolDjP/RV3Fs9UObjs/RpLP6npIvmyLrTCXevV74LugMmTpxIQkIC+/btu+4zu9nAvneGEmDPApmS4Ic+x6V+10qP6X5k1apVjB079q5fQmoaNXZl4MKFCwDUq3fjm4DFZmLDpcXEF11AgoTutR6ghV/navkQuREWuwWduRCdVYvBqsNsM2K2GbHardcsF8skUmRSOUqpCqlBR37mSVQuTgR2GV+m8/z6669ERUXRoUMHsrd8id2kRRVUH7eWJTdmQRCIjo6mY8eO5YpfsFrIXP8hhUd/B0DhVQufPo/j2rj3HfnZS2QKqvtvTiN3pm1gT9oG9iTfmEOqNp50XSL5xmy0liKMVj02uxU7dmQSGTJBgtIqoDSaUBcXo8nNwrlIi1uRFiet4bq+AfYr/5UonVB6h6Dyr4syoE7J238lNxGSSCSogxuiDm6IT98nKD7/J/l7F2JM/Yf8fYsoPLYOn96P49FuVJmqKJwiWhH21ArSV76GPu4AGWvexJgWjd/A58tU4eHnFEQz3w6czj7IlvjlTG70YqU3CAsJCbmhEICSrZDIGT+w4YWe9KrrTtqSFwie9BXOUeX7uxGh1E02Li6u1O9E5PbUWDGQkpKCRqPB2/v6rGSzzcjauPmkauORSxUMjnyI2h5lTzSsSoxWA1n6FDL1qeQaMskzZlFoykVvvbNGOHQrsZDdkzIfZboaN6UnniofPNW++GgC8HUKxEvth1Qio7i4mN9++4033ngDmy6fgkMlLo6+fZ8q3ctOSUkhIyODNm1uX5FwFbvFSOri59DHHSwpv+rzGF5dplSLpjZVhafaB0+1D419yv69CXY7Nm0ulsLM0mZBABKpHKlSg8zZE5mLFzJnT4eKWolMgVvTfrg26YsuZj85277BlBFL1oaPKTz2OwGj30UdePs3dbmzJyFTviX3zx/J3TWPggPLMWXEETxhNjKn2/f96FbrAVKKL5NrzGTj5cWMrDsdmbTybom1atUiNTUVu92O9Aa5HrXCIthQXBePnDxa+VhIXfwcIQ/PxSmiZaXFdD9Sp06JKZYoBspHjRUD8fHxhIaGXndTNNuMrIn9iXRdIiqZmuF1pxFcjbwDDFYdSUVxJBdfKr2R3Qy5VIGz3BWN3BmVXINSqkIuVSCVyJBIJAiCgF2wYROsmGxGipJOYZYJWFzdMWPFbDOSY0gnx5B+3bwBTrUoSNYT1iKAUWNHUHh0LYLFiCq4IU7/eptJSkoC/vcHejsEQSBz7Xvo4w4iUWoIevBTXOp3uYNvquYhkUqRu/kid/N1dChlQiKR4FK/C851O1BwdC0527/DlB5D4ncT8Ok1E69uD992m0IileLT+1FUgVFkrH4Dw+VjJH4/kZDJX6P0Db/lsQqpgsG1H2J59LckF19iR+Ia+oWPrTShFBISgtVqJTMzk8DAwBuOeWjSZKZMmsi5b6YiJB8nddHThD76Kyr/inV9vJ9xdXUlODiY8+fPOzqUe4oamzPQs2dPvLy8WLNmTenPrHYLa+N+Jrn4EmqZhlFRM/F3DnFglCUUmnKJzT9DXP450nVJXDWFuYq70gt/5xB8NAF4qf3xUPvgpvRELdOU+camTzhJ8g9TkapcqP3aLmxSCUXmAorMueQbc8gzZpFtSCdHn47ZbrrmWAkSPAt0+KSl06jRGCJajis979X9u/z8fDw8PG4bR/HZ7aQtewmkMkKmfi8mUtUgrMU5ZK77AO0/JQ6WTnXaEzj2wzInGJoy4khZ+DTWgnSkGjeCH/oCp8jWtz0uvvACv8fNR0CgtX83uoYMrhRBcPr0aZo3b36NXfd/0el0BAQE8PILzzEpIAlD4ikUnkGEPr6kzN+DCAwbNgydTseOHTscHco9Q41cGRAEgbNnz/Lkk0+W/swu2Nl8eRnJxZdQSlWMjJrhUCFgtpmIyTvF+dxjpb4GV/HRBBDqWpcQ10iCXSIqZK9Te24nAM4NuiJVqJAC3ho/vDV+RPxrxVUQ7OQZs0jIi+OL+R/TonsjcLKT5+FEnkdtYoXjuJ+Np65nU+p7NScpKRFXV1fc3W+/bGs3G8jc8BkA3t0fEYVADUPu6kPQQ19QdGIDmX98iP7iIRK/GVfS6jr41lU/AKqAuoQ9voTUxc9hTD5D8i+PEjjyHdxa3LpFcIR7ffqEj2Z7wiqOZf6FQqqkY3DFG9Zcdd9MSkq6qRhwdnZm9OjRLFi8lP87c4ykuZOw5CaTtuR5ak37qUZtld0NTZo0Yf78+Y4O457i/rHMKweZmZnk5OTQpEmT0p/tS9lMXMFZZBIZQ+tMvatWpndDoSmX3Ul/8OOZ99ieuJpUbTwSJNRyrU2v0BHMaPoGkxu9SI/QodT1bFIhQkCw2ym+IgZuZ+QikUjx1gRwcX8ay97azLCgGQzP9KLp8X8I0UmRSxUUmvM4lrmHJdFzsLbIYMCMrhjKkMNQdGoztuJs5B6BeHV/5K6vS+TeQyKR4N7qAcKeWILSNwJrURZJP0yl+PyfZTpe7upNrek/lvw7tllJX/UaObt+4HYLoE182tK9VknS68H0HRxM237X1/JfPDw80Gg0pKZeX8b5byZNmsTly5c5dPI8wZO+Rqp2wZB4isyNn1Z4TPcrjRo1Ij09nfz865uJidyYGrkycPbsWYBSMXA+5yjHMvcA0D9iXIV3ZSsLecZsDqfvJDr3JMKVvG9PlQ+NfdrSwLsVrsrbv1nfKab0CyUlWkoNznXLlr28ePFi2rdvT506dbi87iChuWm07zILdb2OxBdeICb/NJcLo8HdQttx9fnhzPtEeTaluV+nm+ZgFJ8tuQF7dhiLVKG64Zh7GUEQEKxmBLMBZCXthKtrmeONsFvNWPPTMOelYNPlY9MXItgspa6Pcldv5G5+KP3rIFPfnUhV+dch9PFFpC17GX3cAdKWvoD/0FfxaDf6tsdKFWoCx32C3DOI/L0Lyd05F2thJv5DX7llpUEr/67YBTt7UzZyIG07Je2ae1fY70cikRAcHExKSsotx3Xt2pWwsDCWLFlC53nzCBz7EamLnqbw8GqcwprfdqVDhFJn2XPnztGli5hzVBZqpBg4d+4carWayMhIMvWp7Ez8DYD2gX2o79WiSmPRW7QcTNvO6exDpSIgzC2KVv5dCXeLqhLvdF3s3wA412lXpodwdnY227ZtY86cOVgKM7HkJoNEilNkG2QyFVFezYjyaobJZmTqS+No0DMMJ3+4kHeSC3knCXIOp01gD2q7Nyy90QqCgDG1pNzTqXbbyrvYKsJuMWFMOoP+8lGMqdGYcxKxFqT/r9/BFSQKNXIXb+SegSh9wlH5RaAKrIcqqJ5DWz0LVssVm+YzGJLPYUqPwZydAIL9tscCKLxDca7bHpcG3XGKbHNHy9sytSshk78mc/3HFB5ZQ+a6D7AZtXh3m3rbYyVSKX4DnkPhGUzW+o8oPLoWS0E6wRNm39KxsE1Ad+yCnf2pmzmQtg2b3Uqn4P4VJgiCg4NvuzIglUoZO3Ysv/zyC9988w0u9bvg3XMGubt+IGPd+6hDGqP0DauQeO5X6tWrh1wuF8VAOaiRYuDUqVM0bdoUGxY2XFqEVbAS4V6fjkF35nV+JwiCnTPZh9iXuhnTlfbHke4N6BDUhwDnqu3sp7tYYqrkVMZVgVWrSkoIx44dizHlDACqgOvfBlUyNcc2/EOQpA4z3nmWk1l/cyHvBGm6BP64uABfTRAdgvpQx6MR2O3YDSVe8QqPoIq6tCpHn3CSwqNrKT6366Z2vv9GsBix5KdiyU/FcPnYNZ8pfcNRhzRGE9YMdWgzVP61K8wE6L/YzQYMSacxxJ9An3ACY/I5BIvxunESpQaFVwhyVx9kGnckCmXJ785iLClrzE/DWpiJJTeJgtwkCg6tQubijXub4Xi2H4PcrXzNqiQyOf7DXkPu7Enu7p/I2foV2G1495hWpuM9249B4eZH2or/Qx93kKSfphE88UsU7v43PaZdYE/kEjl7UtZzOGMXdux0CR5YIYIgMDCQjIyM244bO3Ysn376KX/++Sf9+vXDu+eMkt/N5aOkrXiZ0McWIZUr7zqe+xWlUkm9evVKV4FFbk+NFQPt27fnr+SNFJpycVV6MDBifJV1MMszZrEtfhVpugQAfDVBdK/1gEO2J+xWM8akkge6cxnfyJcsWUL//v3x8fEh51QsAKqg+teNEwSBlJQUgoOD8XcOoX/EWDoHD+BE1j5OZx0g25DG+ksL8XcKoWvQgH8dV7a3z+qEIeksOdu/QX/pSOnPZK4+OEW2RhPWHKVfJEqvYKQaN6RKp5IHqNWETV+AtSgbS14q5pwEzJkXMabFYC1Ix5ydgDk7gaKTG4ESsyBNrcaoQxqhCqqPKiAKpXdIudso2y0mzDkJmNIuYEyNxpB0BlN6DNht14yTatzRhDZFXavJFVvieshcfW/7ULTq8jEmnUF7YS/af/Zg0+aSt/tn8vctxrPzQ3h3fxipyrnM8UokEnz6PoFEoSRn+3fkbP8WiUKNV+ey2Qi7NOxOrek/kfrrU5hS/yFp7iRCpnx7SwvjVgFdkUgk7E7+g6MZu7HaLfSoNfSuBUFgYCCnTp267bgWLVpQr149Fi1aRL9+/ZBIZQSMeZ/Er8diSrtA7s65+PZ/5q5iud9p1qwZp0+fdnQY9ww1TgyYTCb++ecfps2ayJmcQwD0Dx9XJf3aBUHgXM4R/kxeh9VuQSFV0Tl4AM39OiJ1UPtjY8p5BKsZmYsXCp/bLz1evHiRQ4cOsWLFCgDMuSU+AkrfiOvG5uXlYTAYqFXrf8mYLko3uoYMok1AD05k7uV45j4y9SmsvvgTAV3b0uD4WcxZl++ZMiq7xUTWps8pPLwauGKo02Iwbq0eQBPW/OYPD6kMmVyBTO2C0isEwq/dnrJq8zCmnMeYfLbkjT3pLIJZj/7SkWsEB1I5Su8Q5B6BKNwDkDq5lazQSOVIJBLsFhN2kw6bLh9rYVbpKgQ3SKiTewTiFN4STUQLNOEtUfqE37AR0u2QO3vi0qAbLg26ITzwf2j/2U3e/iUYk86Qt2c+hcfWETDyrXLb7Xr3mI5gF8jd+T3Zmz5HpnErswWxplYTQp9YQuqvT2HOjidp3hQCxryPa8MeNz2mpX8XZFI5OxPXcjJrP4Jgp2fosLt6aXBxcUGn0912nEQiYerUqbz99tsUFBTg4eGBwt0f/xFvkrbkefL2LsSlQTc0Yc3vOJb7nZYtW7Ju3TpsNhsyWeWsqN1P1DgxcOrUKaRykNYrBqCFX+cqeSO32C3sTFzDP7nHAQh1rUu/iLG4KT0q/dxQ0mfBaNNhtpmw2M2l2dXFSYfQO6nxiGhepnmWLl2Kq6srQ4YMAcBaWGJ6pPC43kSloKAA4IYujxq5E52C+9PCrxMH0nZwJvsQGb5uZPVpT07COnqGN6v2PSDMeamkLX0BU9oFkEhwazkEn16PovC8+20OuYsXLvW7lBoulbQUvowh6TTG1AuY0qIxZV5CsBhLVxDKg1TtgiqwHuqg+qiv9CKo6DbNUCKOXJv0xaVxH7T/7CZ7yxwsuUmkLnwaj/Zj8R30QrmWu717Tsdu0pK/bxEZa99B7uKNc70b9xb5L0qvEEIfW0jqkucxXD5G2uLn8O41E++eM28qepr5dkAqkbE9YTWnsg9gFaz0DRt1x4JArVZjNF6//XIjJk6cyKuvvsqKFSt49NFHAXBt1BO3FoMpOrmR9NVvEP70qnK1ha5JtG7dGr1eT3R0NI0bN3Z0ONWeGmc69PXXX7Mtdg09p7TFVenBlEazUMoqN3Ndbylm3cVfSdclIkFKp+D+tA3oXinbElpzEZn6ZDJ1KeQZs8k3ZVNsLsBgvf3biFQiw1nhipvSEw+VN94af3w0Afg7heKkcEYQBKKioujUqRO//vorAPFfDMOcnUCt6T/hFHmtde7Zs2dp2rQpBw8epH379rc8d64hgx0xi0i1lnR185C707f2eGq51r6zL6KSsRRkkDRvCtbCDGTOngSO/RDnuh2qNAbBbsdalIk5JwlrYQbWwixsxmLshmIEuxUEAYlChVTljMzJHbmbPwqPAJS+EWVu8FTR2C0mcrZ+Rf6BZQBoIloRPPHLcvVFEOx2Mla/QdGpTUiUToQ9tghVQNkFvWCzkLXpCwoOLgfAKbINAaPfu6UY+if3OFvjVyAg0Nin7R0Lgi+++IK3336boqKiMo0fPHgw2dnZHD58uPRnNkMRCV+NxlqYiWenCfgNnlXuOGoCxcXFuLu7M3/+fKZOvX3SaU2nxq0MnDh3lK5TSvz3e9QaWulCoMCUy2+xP1JgykUt0zCk9iRC3crebvV2WOwWEotiiS+IJrn4IvmmnFuMlqCUKlHIlEiQAgJmbS5WmRS7XIZdsFFsLqDYXHCd0ZGHyhuZ1gnXOnIemvq/JkY2Y4nIkN4g812vL0mgc3K6/RaMtyaAMU1f5PDvz3DcDwo0hayKmUsLv850CR6IQlZ9kqXsJj0pCx7HWpiB0jeckEd+uGVCWmUhkUpReATecFWmuiJVqPAb8hJOdTuQvuIVDPHHSfphKrUe+QG5a9nagkukUgJGvo21KAv95aMllr1PLC1z10OJTIH/Ay+jDm5QYm50+SgJX43Gb9ALuLV84IarBA29WyFBypb4ZZzLOYIg2OkbPqbc23sajQaDwVDm8VOnTmXUqFGcP3++tFxOpnEjYMRbpCx4nPwDy3Bt2h9NaJPbzFTzcHV1pUGDBhw9elQUA2Wgxq0MPPLJKBr2CifIOZxx9Z+o1LejAlMuq2LmUmwuwF3pxYioaXipy5dNfSMEwU5S8SXO5RzhUsH5a3rXS5DgrfHH3ykEb00Anmpf3JWeOCvc0MidrnmbMSSdIWnuJKRqV8Jf24HRbkRrLqTQnE++MZtcQyZZhlTyjdn/iUBCoHModT0bo1r4PqqCXCKeX3edF/zu3bvp2bMnsbGxpZ3Eboe1OIe478ZxrrYPSRElDpCeal8GRUyoFtbQABnrPqDw8Grkbr6EPrbonnoYVyeM6bGk/voE1qJslP51CJ0xv0wNhq5i0xWQ+P1DWPJScKrdlpCp35ep4+G/Meckkr7yVYwpJT726pDG+A54Fk1EqxveGy7knWLz5WUI2Gnk3YZ+4aPLtUKwYMECHn74YSwWC3L57WM1m80EBwczceJEvvjii2s+S1/1OkUnN6L0r0P4k8tFd8IbMGXKFM6fP8/Ro0cdHUq1p0atDCRmXaJet5Kyva61Ksd//CrF5oJSIeCl9mN01KO4KO+uRazFbuF8zhGOZ+6lwJRb+nNXpQd1PBoT5laXEJdIVPKy7SHqYg8A4FSnHQq5GgVqXJUeBHJtIqHRqic24zxvzH6ZLg+0ReJqJV2XSLouEXo2xzs7H4vuIvW9Q5D/q+ubyVTSw0CjKfueptzVh/AJXyL/5XECUrM407ox+WSz7MI3dA0eREv/Lg416TFlXixNFgwY84EoBO4CdWAUtWb8QtIPD2POvEjqkuep9fC8Mj/UZM4eBE+cQ+LciegvHSFnx3flzrBX+oQR+uiv5B9YTs7OeRhTzpH80zTUIY3x7PggLg17XONLUN+rOQCbLy/lfO5RpBIpfcJGllkQqFQlK5Fms7lMYkCpVDJp0iQWLVrERx99VHo8gO+gF9DF/o058yK5fy3Ap9eMclx5zaBNmzYsW7YMk8l0zXcncj01yo54d9xGZHIpvrKQSu1EaLaZ+D3uF4rNBXiqfO9aCNjsNk5nHeDnMx+yK+l3Cky5qGRqmvl2YHz9p5ne5DV6hg6jtkejMgsBAF1MSW91l3qdbzlOLXfir98PsfnbfUxs+Bwzmr5Or9ARhLhEgkRCrp8X23K28uOZ9ziYtr00P+GqGCjvH6GmVhNCH1tEiOBB1+0H8E/Nwi7Y2JOynvWXFmKyln2ZtaLJP1BSReHSqFeZSzFFbo7Suxa1Hv4eqcoZQ/xxsjZ9Vq7jVQF1CBz1DgB5fy1Ae2FfuWOQyBR4dZlE5At/4N5uNBK5EmPKOdJXvcbFD3qSuuhZ8vYuRJ9wEpuxmPpezRkQMR4JEs7mHGZX0u+3tTsujffK38LVv42yMG3aNHJycli7du01P5c7e5bmC+Tt+RlzTmKZ56wptGnTBovFIpYYloEas01gsOr57vibSGQwuu5MQt0rbt/+3wiCnT8uLeRSwXmc5K5MaPAUbqo7L5NLLr7EzsTfyDOWJNa5KT1pHdCNxt5tUNxFvoOlMJPLH/cDiYTar+y45X6tIAg0a9aMunXr8ttvv13z2ZnP+5Hg50xak8bobCU5AnKpgua+HUk/UsyDoyZQUFBQpkZF/8VuNpCz/TvyDq4gMTyAf5pGYZdJcZe7MazedHw0VftWLggClz7oiU2XT8gjP4iNlG6B1W7FbDNgsVuw2q1c7bQpk8qRS+SoZGrkUmXpKo/2wl5SFz4NQPDkr8tddpj5x0cUHFqJzNmT8KdXltvc6JrYtXkUHFpF0anNWK6Uzv4bmasvSq9gUkL8OehvAwk0VdahW8hgFB6BtzSG2rhxI0OGDCE9PZ2AgLJXb/To0QObzcbevXuv+bkgCKT88hj6i4dwqtuhZKvkHrG3rgpMJhNubm58/vnnPPXUU44Op1pTY7YJ/sk9hkQGhWl6arWqvFLCoxl7uFRwHplEzrA6U+5YCJhtJvambOJ0dslSvkbuTIegPjT16YCsAlzois+WtPbUhDW/beLWkSNHOHv2LJ9+en2jFGerhHrRl+nV/W2SXWwczdhDlj6VY5l/IQmR0vuR9kgVd3Zzkio1+A1+Efe2I3Hd/i3ufx3lRLsmFDrD0rOz6ePTl4aRfe9o7jvBkpuETZePRK5CE161ttXVDavdSp4xkxxDBvnGbApMuaXJpwar7po8lpshlchwkrvgonTDTemJst9QZNFH0O74jKZhzVBoyi4gfQe9gCHpNKa0C6SvfoOQh+fd8UNR7uKFT+9H8e41E1PaBXQXD2FMPI0x9TzWomxsxdkYirPxToSmYUGcad2QM+aLGDY9Tf24NFSBUahDGuFcpz1OkW2u2WZQKksSYc3m238//+bxxx9nzJgxnD179poGaxKJBP+hr5AwZxT6uIMUn92OW9OK77h4r6JSqWjVqhUHDx4UxcBtqBFiQBAETmcdBECe6VZpyjldm8j+1K0A9AwdTqDLnfmH5xmz+OPir6WrAU192tM1ZFC5tgBuhSAIFJ1YD4Brk9vfOH7++WdCQ0Pp0+d6u+arNc4Sq4n6Xm2o59mc+MIL/J22lSx9Kv0f7cTyuK/pETqMup53Vuur8osg+KHZeKfH4v/Xj/zllkeunxdb8raTdmkP3Tu+hNzZ447mLg/WwpLfh8IruEZZwQqCQJ4xi1RtPOm6JDJ1KeQaM7CXwSlSLlUgk8iRUPI3ZxOsWO0WBATsgg2tpRCtpZAMXTK4AG1KMub3nnsPP5daBDqHEewSQS3X2rfs0CmVKwka9zEJ34xDf/EwBQeW49lp/E3HlwWJRFLivPiv9sk2YzHm7ASsBelY8tPwyE9Hnp7JiUA5cQ0iUZitRF48gzHpDAUHliORKXCu3xW3FoNwqd8FtVoNUGavgasMGzaMgIAA5s2bx3fffXfNZ0qfMLy6P0Lurnlkbfwc56hOd90o6n6iffv2rFu3ztFhVHtqhBjI0CWRb8rGpDfTLLBsBiXlxWa3si1hFQJ26nk1p4nPne0nJxTGsPHyYkw2Iy4Kd/pHjCXMLapCY9XHHcSUHotErsKtWf9bjtXpdKxYsYIXXnjhhi5eV9967KaSLQKJREKkRwMi3Ovx3eovyHSKhQBYf+lXojyb0jN0OM6KO2vAow6MImLc5/hnxLDz7E/EecJpTzN5O56lb52H8Gjc+47mLSt2c0mugkShrtTzVAcMVj3xhdEkFMaQWBSL/gYtqNUyDT6aQDzVvniofHBXeeKi9MBZ7oJa7oxKprphYp0gCFjsZoxWPXprMcXmIopMeeSbssnKjSXHmIFFqSBDl0yGLpmTWfsB8HcKobZHQ+p6NrnhFpHSNxzfAc+Stf5jsrfOwalOO1T+FetTIVO7oqnVBGr97+3cH3BK38X+1C380ywKvxbDCE5KRx97AEt+Ktrzu9Ce34XcPQCPiB6o5RKKi4vLdV6FQsG0adP46quv+Pjjj3F1vfZvyKvbVIpObcKSm0ze7p/xHfBsBVzt/UGHDh348ssvyczMxN+/6kuA7xVqhBi4kHcKgPN7L/HQpBcr5RzHMveSa8xEI3emV+jwO1p9iM07zab4pdgFO0Eu4TxQe/IdPzhvhiAI5OycC4BHu1HIbvNGvXr1arRaLZMnT77h51LltWLgKhKJFFu6gq/fXsHGsys4mrGH2PwzJBVdpF/E2JLmRHeIU0A9Hgj4nCPRK9mnPUJyiA/rkpbRN/sSgd1nVNrKj1RT8ruw6wsrZX5HU2wuJC7/DHH5Z0nVxiPwv3QiuUROoEsYQc7h+DvXwt85BFeF+x191xKJBKVMhVKmwk3lScC/2hQIoQKJcyeRl3cRa+ehaCPrk1x8iRxDOpn6FDL1KRxI24632p96Xs1p5N0aN9X//AU82o9Fd2Efuti/yVjzJqGPLaq05k7/pm1ATwxWHccz97JXuMDwHtOIGPoqpow4ik5upOjkJqyFGahOLWfbzAaYonchtGxZru9vxowZfPTRR/z666/XLXlLFSr8Bs0iddHT5P29BPfWw8XOhldo164kt+fQoUMMHTrUwdFUX+77BEJBEJh/9iMKzXmsenMHhzadqvCHhd5SzPyzH2O2m+gfPo5GPq3LPUdc/lk2XFqMgJ36Xi3oHz4WmbTitVrx2e2kLXsJiUJN5IsbkLv53nJ8x44dcXV1Zdu2bTf8PGXh0+gu7MV/xFt4tBl+zWfvv/8+3377LRkZGWTqU9kWv5JsQxpQYgPdNWTwNaWId8LlvHNsuLgQq1TAtVBLb0MwEYNerxRBYNXmcemDniCRUOfNfffFUqzFZiI2/yznc4+SXHzpms98NIFEujcg3C2KQJfwu/5dlZWr/0blbr5EvrQFiUyOzlLM5cJoLuafJbEoFptwtamShHC3KFr4dSLCvT4SiRRrURbxX47AbtTiO+A5vLreWMhWNIJgZ3P8ci7knUQpUzOu3hP4OpWsYNgtJopOrCdn93xshSVdCzXhLQkY/W5Jb4oyMmHCBA4cOEBcXNx1pYmCIJD665PoYv/GqW5HQqZ+JyYTUvK9BAcHM2XKFD788ENHh1Ntue9LC/NN2RSa87BbBZwtlWPBejj9T8x2E/5OITT0blnu41O1CWy6vAQBOw29WzEg4sFKEQI2o5asTSXGJV5dJ99WCJw7d46DBw8yffr0m46RKkoqGgTL9aVSxcXFpcuZ/k7BTGjwNK38uwFwMms/q2K+R2sumy3rzYj0asyDjZ/FSVBQ7O7CFrdMLu2be1dz3gy5ixcKrxAQhGubBd2DZOiS2Z6wmrmn32VrwopSIRDkHE73Wg8wrckrTG70Al1CBlLLrU6VCQEA5wbdkWrcsRZlY7jaUVPhShOftgyv+wiPNnubfuFjr1hVCyQUxfD7xV9YcO5TTmcdABcvfAe+AEDOju8wZV2ukrglEin9wscS4hKJ2Wbk94vz0VlK/n1LFSo82o0m/LnfmbM3A5tEjiHhBAlfjaHw+Poyn2PWrFkkJCSUthG/9vwS/Ia8jESmQB93AF3M/gq7tnsZiURC69atOXnypKNDqdbc92IgpbjkRpAek0PTRs0qfH6DVVfa/bBz8IBy+5VrzYVsuLQQm2Cjjkdj+oWPrZQOhoIgkLnufayFGSi8QvDqOuW2x/z000/4+fnxwAO36Ax35SEh2C3XfaTX66+xIpZJ5XSvNYThdR5BLdOQrktiafRXZOpSyn09/8bPKZgJTV/CQ1BjdFKzSR5DzJnVdzXnzXBp1BOAolObK2X+ysRmt3Eh7yTLor9hafRXnM05jMVuwkPlTaeg/kxv8hoPNniSVv5dcVdd31yqqpDKlaXNh3Sx1z/Q1HINjX3aMKbeYzzc+P9o5d8NpUxNvimHnUlrmX/2Qy6H+qCu1wnBaiZjzdsI/2nPXFnIpXIeqDMFT5UvxeYC1sUtwGL7X+WAXKVhTayNbZq+aMJbIpj1ZKx5k8x1HyDYrv8b+i/Nmzend+/efP311zf8XOkTimenCQBkb/kSwWatmAu7x2nSpAlnzpxxdBjVmvteDFz12P/n0EVaty7/8v3tOJN9GKvdgq8mqNyJfiXLisvQWYrx0QQwIOLBSmtlnHtkJUnJB0kODyZp0Cj+TN/MxstL2Hh5CVvil/Nn0joOp+8iOvckOYZ0irRFLFq0iKlTp5aWQ93kIgBuKIL+KwauEunRgPENnsZL7YfWUsjKmO9JLIq7q+tzU3kyvsWr+JrlWJUKNhsOEp2y9/YHlhP3liXdGrXn/8Scd3cipqow2YwczdjD/HMfsenyUtJ1icgkMhp4tSx9oLYP6n3N3rujcYos+Vu9ahN8MzzVPnSvNYSZTd+gR62huCjc0VqK2J38B9ua+5MaGYYh+QwFhypHHN4IjdyJ4XUfQS1zIkOfzNaEldeYEoWGhhKdnEOt6T/h0+cJkEgoOLyalF+fxGa8fWLhE088weHDhzl+/PgNP/fq8QgyJw/MWZcpPPZ7hV3XvUzDhg1JS0src4Oomsh9n0CYri0xDUk8k0ajGXeetHYjBMHO2ZySbmIt/TuXewvidPYhkosvIZcqeKD25ApvmlRsLuCf3ONczDxGpiQToceVroL6c6C/9bHYJYz9oDfdu7cm35iDp/rGXgSCtaRESnKDUjuDwXBTK2JPtS/j6z/F+kuLSCqO4/e4nxkU+RB1Pe+84YpG7sSDbd5kze6XSPNSszn9DwwKCS39u9zxnP9FFVAX56hO6GL/Jmfr1wSNv957obpgsOo5kbmPk1n7MdlKKiGc5C408+tIM98OFZ6cWpGo/EtMwcramlkpU9HSvwtNfTtwLucIh9J3Umwp4mSLusSH+tHk0Hya1+9crv35u8FT7cPQOpNZHfsjsfmnOZIRRLvAXkCJGEhJSUEileHdczpK/9qkr3wV/cXDpPw8k5BH5t2yi+PgwYMJCQlh7ty5/Pzzz9d9LlO74t1rJlkbPiFn51zcmg+6xuugJlK/fn0AYmJiaNOmzW1G10zu65UBk9VAvqmkyU7S+QzCwio2uzZVm0ChKRelTE09z/JtQRitevanbgGgS/AgPNW33r8vDxm6ZH6P+4WfznzA/tQtZFizEaRS1FYIda1LM98OdAj8f/bOMzCqMm3D15maSSYzk957AqF3UDrSERERRUUBxV53V3fdXXfVXbe4365rW8UuKCKoiArSe+89hPTe2yTT6/l+TBJBEphJggW5/qA5c97zziRzzvM+7/Pc90TGxs1gXNyNjI69nqGR19EzZBBRAQkoJEqQiKQNTSDDvJ8PTr/IsszXOFV7EOf3tgNcFs9KRtLGzctoNBIQEHDBz1tQylTclLaQNF0fXKKLNfkfk9NwulPvXS73Z2bfx0nILwNBYFvJ1+woWYPoRU+8t4ROeRwECYZTG1v9HX5KmB0mdpWu5d2Tf2d/xSZsLgvBfuFMSriF+/o+w/DoST/pQABAFugR63KZGnw7TyKjf/hwFvb+PSNjpiGXKNCHaNk1qi/r9r+IzXGpKLjriA1MYXy8p6h2d9l6ChuzANBqteetUAN7XUf8Ax8i9ddhLTtDyfsP4rK0v4KVyWQ88MADLFu2jIaGtj8f3bDZyEPicBnradjzSRe+q58nKSmeFtOCgoJLvPKXyxUdDNRZqwAQbRIkLhlBQV2bBs1pOAVAqq6Xz9LAByu3YnNZCFVF0T98eJfMx2DX83XuYj7JfJX8xjOIiIQ0mOhzNJMpp+p4cOAL3NL9ASYk3MzwmMkMihjNwIhRDIkcx6jYaUxNup07ejxGP9Nk/j1nMVGmdBI13REQqDAVs7HwM945+Tf2l29u3Qd16isA2pR/NRqNF/RDfx+ZRMb0lLvoETwQt+hmTf7H5OszO/U5qCK7MVpzDd1P5wJwuGo7a/KX4mijrqEj+EV1R3ftHAAqv/zLRW/cPyRWp4U9Zet579Q/OFi5FYfbRpgqmhuS72JBr6foEzYMmeRn4mzXsu3UwWYnuVTBsKjruKf303RXp4MgkBvux4fH/0ZRU3YXTvTi9A27hj6hwwCRbws+ocnukeb+/kPcL6YHcfe9hzQgCFvZGco+egJ3G0W5Ldx77704HA4WL17c5nFBKid0wsMA1O/+GJf1Qp2IXxJarRaFQkFVVdWPPZWfLFd0MFDfbL1rrXOQmJjY5Z0EBY1nAUjV+aasZ3NaOF7tWVGOjJnaJXUC+fpMPjrzX3L1pwGBHto+TDxcwrVb95FqkJF+68tIFd4pGP7v9f+hk4dy26h7uLnbfTzQ71lGx04nUKHD4jSxp3w9H2b8H5lVB7DrPW1SipC4C8YxGAyo1Zduv5MIEqYkzaFbUD/coovV+R9RYeyc6UrodffTo9JK/0OnkYgC2Q0n+TzrrU53L7QQNvlx5MFxOBurqPziOa+Nai4HDpedAxVbee/UP9hfsbk1CLgxZQF39fw13YL7+VzY+mPjMukBkHSyfVOt0DI9/V4m2VNQmSyYBDtfZL/DtuKvuyw4vBTXxc8k3D8Gq9PMt3lLiYgMb/OhpIxMJXbh20j81FgKj1H15V/b/buKjIzk5ptv5q233mr3NYF9J6EIS8RtaUK/f0WXvqefG4IgEBERcTUYuAhXdM1Ak90TfTdUGEhMTOzSsU2OpuYtCKG5xcl7MuoO43DbCfGLIFnb49InXIIDFVvZXeapbg/3j2Fy7E1Ylv4Za0kWMk04sXe/eUlxoRZKSkr48ssveeWVV5BIPA+QAHkgQyLHMihiFFn1J9hVthaDXc/aks+JuKYPA3Nq2vQ3aGhoQKfz7roSQcq0pDtwuGwUNJ1lVe4H3JH+GLp2ahUuOZ5CReiEB3GufJ4At5zDw/tTYSrik8xXmJGygCh1fIfGPXf86NtfpPitBRjPbKN+xweEjF3YqTF9xeV2crL2AAcqNmNyeLZrQvwiGB4zmTRd7x80ADA7TDRYq9HbajHYGzE6mrA4TdhdVhxue6t0sVSQIpPIUUpV+Mn8Ucs1aJRB6JQhhPhFtEpu2yo8KXVFeHKXzK/3Nffj/949HNPWUpQSx9HqXZQYcpmeMo/gLtyiawuZRM4NKfNYeuZlyk2FaPuHUFdXh91uv6A41y+qG9FzX6L0w4dpOv4tyqhu7eokPPzww4wZM4atW7cyfvz4C44LEinB4+6j8rNnqN/5EUHD72iVD/8lEhMTQ2npz6Po98fgig4GjHaPUlxlUU2XBwMVphIAQlUR+Ml8K845U+epAu4XPrzT2Yrj1XtbA4H+4SMYHT2N6k+fxlpyColKS+w9i1AEx3g93htvvIFarWbBggUXHJMIUnqEDCQ1qA+HKrdxoGwjVdFhbA8PQ2csIvp7Xgw1NTWEhXl/o5VKpExPuYvPshZRZS7l67zF3J7+KAppx+R/NQOmU7fjQ4JKi5imn8yOMDP11mpWZL3JuLgZ9A27tlOfv19sL8Jn/J6qVS9Qu/F/KCO7oU7vumLF9nCLbjLrjrK3fENrwKtVBDM8ZjLpwQMuW0dKC063k0pTEaWGAspNhdSYyzE6uibjEqjQERkQR0DVCQJ1gQQl9u+ScQWJlPhb/on7tVsJr6zl1LWDqbFU8MmZV5iSdFunCle9QacMYXLiHL7JW4I1rI7UIfFUVVURF3dhRi0gdRjh1/+W6tUvUrPhdVSJA1HFXzi/UaNG0atXL9588802gwEATb8p1G15C0ddCY2HvyJo+O1d/t5+LiQnJ5OXl3fpF/5CuaKDAavTUyxUVVpD315dsy/fQq3Zs1ce7u/9gxagyVZPlbkUAYHuQX07NYc8fQZbij2tQ9dGTWR4zGSq1/4X45ntCDIFMfNe8Umb3Ww2884777Bw4cKLpvflEjnXRo5HtWoRB3tEYNSo+SzrTaYm3U734P6Ax5WtqanJp2AAPFXhM1PvZmnmq9RaKllfsIIbUuZ1TPZWKiN0wkNULP89rh3LmfPkl2ys+pY8fQabi7+k2JDHxISbfQ7mzkU39GasZWdoPLiSiuV/IP7hj1B20Wr2+4iimxz9afaWbWithwmQBzIsagJ9Q4ddFqGqFkwOA7kNp8hvzKTEkNeGK6GARqFDpwxFowwiQB6Iv0zdalUsESQICLhEF063HZvLitlpxGhvpMneQIO1FqOjsdX5kAgJRAzjkKSKpPxlpAb1JknTvVO23fKgaCJm/gn38t+jXb+TjBtupMJVyzd5S7g2ehLXRk28rIp9aUF96Bt2DSdr9nP7X6ZS21jdZjAAoLt2DpaiYxhObqDi8z+R+PgKJN/zxBAEgYceeognnniC0tJSYmMv7JQQJFKCRt5F9df/oGHvMnTXzEGQ/Ly2jLqKlJQUtm3b9mNP4yfLFR0M2Fyetrf6moYuN6ho6VII9vPNN73Y4ClqiwpIwL8TFd1Wp4WNhZ8DIn3DruHa6Ek0nVhPw66PAIi85QX8fbTZXbp0KY2NjTz66KOXfK0pazf+pQWM1jeQdctd5DVl8m3+J7hEFz1DBmEymQAuWUDYFmqFlhkp81mR9SY5+lMcr9nLgPCOGUwF9plE/fYPsFVmY9q7ghsnPcqRqp3sKvuW7IYTlBsLmJgwm2Rdzw6NDxBxw++xVxdgKTxK2UdPkPDoMqR+XVetL4pucvUZ7Cvf1Crn7CdVMSRyHAPCR3TqAXkxPFLFJ8moO0yJIR/O8SrwlwUSG5hMjNrjVRCmiup0a6zVaaHGUk723nepsFVQFxGKFSuZ9UfJrD+KXKKgW1BfeocOIUad3KEHt6bfFEw5e+HINwxa/S0lt97HCeNJ9pVvpMFaw+TEOZdVbXFs7Axya85AGJy27mUAg9p8nSAIRMx8BkvhURy1RdRtfqtN86G77rqL3/3udyxZsoRnnnmmzbG0A6ZTu/5VHHUlmPMPEZA6rCvf0s+GpKQkKioqsNlsKJWX5zvzc+aKDhFb2uAcNieRkZFdOrbBrgdAo/CtQ6G8uTAuJjCpU9ffV74Rs9NIkF8Y4+Jm4qgvpWrVCwAEj13YIU/zd999l2nTppGUdPG5iW53q9lRyMAbmZF2N31ChyEisr5gOXn6M9hsnkrojn7potUJjImdDsCOkm+oac7E+IogkRAy4UEA9PuW47YaGBw5htu6P0KQMhSjo4lVuR+wOu9jmmy+tbG1XkMmJ3ruf5DponDUlXgU77qgoNDldpFZd5QlGS/xTd4SaizlKKR+XBM1kYV9/sjQqOsuSyBQZ6lmS/Eq3jrxV9YXrmiWKhaJ9I9jZMxU7ur5ax7s9yw3pNzFwIhRxKgTu0Qjw0+mQpufQ+z29QzZf5KFkfOY0/0hBkWMQasIxuG2k1F3mBVZi/jozEucrNl/QaurN0TM/BOqxAFgMZD8zXKuC5+MRJBwtv4Yq3Lew+7yzV7YF+RSBQNUY3G73FRTdNFWWqlKQ8TMPwFQv3tpm5oLGo2G2bNns3jx4nb/5iRKfwL7TwOg8fBXnX4PP1dangE1NTU/8kx+mlzRwUCL65roEgkP920FfynMDk+rjq/92rUWT/V9hI/bC+dic1paxY7Gxd2IVJBS+eVfcNtMqBIHEDrhIZ/HPHPmDIcPH+buu+++5Gsbj3yNrfwsEmUAwaMXIBEkTEy4mV4hgxERWZv/CTUmz8O7MxH4gPCRJGt74BJdrCv4FJe7Y9Kq6h5jUUSm4baZWnuuo9QJ3NXzNwyKGA0IZDec4MOM/2N36TosTt970WXqYI8AkVSGMWMLjYdWdmiu4NneOtysGLi2YBl11ioUUj+GRY3n3j5/ZETMZPxkXV8IVmYsZFXO+yzO+D+OV+/Bfo5U8b19/sjcnk8wLGo84f4xlyWdbsrdT+XnfwYgeMw9qBP6ERuYwti4G1jY5w/c1v0R+oR62iNrLZVsKvqC9079kyOVO33qDJDIFETf+V/kwXE4GsrRLHuJ6aFTkUuUFBty+Tzr7Q79DXhLnC6FbR8fAmBL8cqLXkvdYwwB3UeB20nNxv+1+Zq7776b3Nxcdu9u34tAO8jj1mfM2OKVyuGVSMszoLq6+keeyU+TKzoYEPDcsASpQHBwcJeO3aLoppT6dlNutNUBoOtEBXNm/bHWboRETXeajn2LJf8wgtyPyFv+hiD1Pc25ZMkSgoODuf766y/6OkdjFTVrPWZHIeMfQBbgyYwIgoSJCbM9Ji1uG3sbv0Uqk3QqGBAEgUmJt+An86fGUs6Bii0dG0ciIfQ6j9lSw55PWnUB5FIFY+NmcFfPXxGrTsbpdnCgcgvvnfw7O0pWo2/+XXmLKq4PYZOfAKD625dwNLddeoMouikx5LG+YDlvn/grO0rXYLDr8ZepW30DRsZMRdWJ+ob2qDAW83nW2yw/+z/yGzMBgRRdL2Z3u79Vqlir7Nrvz/cxnNlG2Ue/QnQ5UPccd0FAKwgCMYFJTEq8hQf6PsvYuBkEKnSYHE1sL/2GD069yOnaQ61dC5dCFhBE3L1voQhLxNlYCYuf5Xpp/1YJ4c+z3rpsAYFGo2HTu/uQ2f0wOQzsKFl90deHTXkCBAHj6c1YKy7USBg9ejSJiYksWbKk3TH8YnuhCE9GdNoxZmzt9Hv4ORIa6ulMupoZaJsrOhho2fuTK2QXVcLrCC03HYngvVe6KIpYnJ699ABZx/eUW0RTeoQMBJeT2k1vAHikTX3oHGjB5XKxdOlSbrvttos+vEWXk4rlf8BtNeAX05Og4Xecd1wqkXFDyjz8ZWqMbj1j5w3Bz69jnQAtBMg1TIifBXiEmlq0I3xF3WsCiohU3FbjBYps4f4x3Nr9IWakLCBMFY3dbeNw1Q7eP/UiX2S/Q0btIaxOi1fXCRoxF1VCf0S7pfX30h5u0U2ZoYDtJat579Q/+SxrERl1h3GKTsJUUUxMmM19fZ/hmugJlyUT0GCt5ZvcJSw7+xrFhhwkgpTeoUO5u/fvmJl6NwmabpfdAld0u6jd/BblH/8a0WEloNsIom7/10UDWj+ZikERo1nY+/dMTJhNoEKH0dHIhsIVfJL5KpWmYq+uLQ+KIf6Bxfgl9MNtNeBc/nfGZFSjEvyosZSzMvsdbF7+3n1BJpPhtLvQVnraWzPqDlFuLGz39crIVAJ7TwSgYc/SC45LJBLmz5/PZ599htncdgAjCAKBfSYBYDzzyyyia1kQ1tfX/8gz+WlyRQcDLfupSn/FZSgY8dwkRbzfG3a67a2v78wea4v5UlxgKo3H1uDUVyANDL3g4ewtW7Zsoby8nPnzL+77XrP+VSyFR5EoA4i67cU2b9j+cjVj4zwuhxPuuQYUnXeL6xbUj0RNd1yii63Fqzq0Hy9IJIS0ZAf2forbdv5NUxAE0oJ6c1fPXzMz9R4SNd0BkaKmbNYXrmDRief49Oz/2FO2gXx9Zmtff1vXCbveY5/bdGzNeWZGNqeFkqZcDldu56vcD3nz+LMsz3qDI1U7aLI3oJD60Tt0KLenP8pdPX9D37BrLotioMNlY1fpWpZk/Jsc/SkEBHqFDOae3k8zOfHWy95334K9toiSdxZSt+UtAHTDbydm3itI2vC5aAupREbfsGu4p/fTjI6djlLqR7W5jE8yX/daVEgaoCNu4TuEjH8AQaZAnrGfIRu3oXC4qDKXsvLkK1gbKy+LqJTCqqZXiEcnf0vxqotmNYJG3gWA4fg6XObGC47PmzcPg8HAqlXtGxOpe44FwJSzH9H5wwgu/ZRo0XRwOH55790bruhuApXMkw0ICFJ1eTCgkCowOz03Vq/pgv5vl9vZml3QKUOpal7lBo+8q8OCIosXLyY9Pf2iBh6NR76mYffHAETe/DyK0PZFe9KDB7Azbz1GZT2lQhZDubZD82pBEATGx9/E4ox/U9SUTV7jGVJ1vptOBfaeQG1IPI66YvSHVhLcfIP9/rVSdD1J0fVEb60ls/4oWfUnqLNWUW4sPG8F5yf1R6cMQa3QopIFoJSqkEqkCBKBhtGjsTZVcTLzbZzBEehtdZidFwYQSqmKZG0PT+uctgfyyywXnK/PZEvxl636BAmaboyNm0GoqmsLbC+G22GjYffH1G17D9FhRVD4EzHj92gHXcQq+yLIJHKGRI6lZ8ggdpSsJrP+KEerd1HYlMW0pDuICLi4OZFEriR0wkNoBs6gbuvbCCc3MmzHIfaNGUyFvI6V23/H4KO5KEPikAdFIdNGIQ+OQREciyIiBXlQjE/tei3ZFrfbzejYG8jVn6baXMbJmn30b6drRhXfB2VkN2yV2RhObUI3bPZ5x5OTkxk9ejSLFy9m7ty5bY6hjOyGNCAIl6kBS+lpn7uNfu7I5Z7v1tVgoG2u6GCgpbhPE6q+uA1vB2ipFbC6vN9XlJ6zpeB02zuUHWipVQCgqgB7VS6C3A/tkJt8HgtAr9ezatUq/vKXv7SbEjblHqDyS0+nQsi4+wjsM/GiYwqCQKgpEWNgPSXOLBxuR6cfcjq/UAZFjOFg5VZ2lqwhWZvu0xYNNCuyjZ5H1aq/0bBnGUHX3oYgbX9eOr9QT/959CQabXUUNeVSasijylxKvbUGq8tMpdkM5pILTw5TQFgcYAFTYeuPAxU6IvxjiQqIJ16TSrh/jM/voyNYnWa2lXzdKngVqNBxXdxMUnS9LvtWQAuiKGLK3OGpp6j3fGb+qdcQOetZ5EHRnR4/QB7ItOQ76BEygA2Fn1FvrebTs68zLn4mfUOvueT7VATHEDX7r0Tc8DSGjK0oyg+wLdxCZUw4Z0wWep7KalVGPBdB4Y8qvi8B3Uag7nXdJbfqZDLPbdfpdOIvD2REzBS2Fq9iT9l60oMHtrslFNh/Krb12Rgytl4QDAAsWLCAhQsXUlxcTHz8hcG6IJGgSuiP8cw2rCWnfnHBgEQiQSKRXA0G2uGKDgZa2v6CozVdfsNTK7RUmUtpam4x9AaJIEElC8DiNGFyGDqkMyCXfBfU6E9v8swlffRFLU8vxvLly3E4HNx114WrZABbVR7lnzwJbieBfacQ4mWngqtWRoOxiaAoDYWNWaQF+ebf0BZDo67jZO1+Gmw1nKk7Su9Q361INQNuoHbTmzj1FRhOb0HTb4pX52mVIfQNC6FvmKdH2+GyobfVo7fVYnIYsDiN2Fw23KILUXQjdYs07f4Ehc1OwvV/JFgTj84vFGUH1RQ7Q2FjFhsKV2B0NCHgsXQeET35sukTtIWl5DQ1617GUuAJRqSBYYRP/RWB/ad1+XczSduD+b2eYmPh5+TqT7O5aCUVxiImJNzs1baLRBmAduAN9B94A371x/k2fyn53RKI630jKSY5Tn0FjoYy7HUl2KvzEe1mzLn7Mefup2bdf1H3Gk/w6Pmo4tpWNWyR+Xa5PFto/cKu5UT1XuqsVRyq3Mao2GltnqfuMZba9a9iyT+E22G9QIRo9uzZPProo3z00Uf86U9/anMMv9henmCg7MwlP4crDVEUEQThR/UR+SlzRQcDOmUIAGHxQZjNZvz9u64SuyXQaLT5VozSYvbTaKsnzN/31ZBMokAmkeN0O6grPoQCUPcc5/M4LSxevJgpU6YQFRV1wTGnsZ6yJY/hthpRJQ4gcvZfvE6HNuobOXU2h9G3D6Kw6WyXBANKqR9DI8exs/RbDlRspmfIQJ9X1RK5Et2wW6nb8hYNe5d5HQx8H7lUSZh/FGH+F35uLeR++hYuQw0JLi1+l0hVXw6cbge7StdytHoXAEHKMKYkzSFanfiDzcFeU0TtpjcwnNoIgCBTEjRiLiHjFiJRdm1R77moZAHMSJnPocrt7C5bS0bdYRpt9dyYusAnxcn04P7UW6rYV7GJ3Y5TxPV97LxtB9HlxF5TgDnvIMbMHZ5/T2/GeHoz2qGzCZ/+WyTy84Mup9PTItuSIZAIEkbGTOXrvMUcrd7FgPCRqBUXBveKsESkgaG4DLVYS8/gnzTwvOOBgYHceOONfPHFF+0GA8rINADsVflefwZXCk1NTbhcri53r71SuKKDgZDmfdDgGB1llaWkJXfrwrE9ioZ1Fu/bxwBCVZFUm8uosVSQ2oEHpCAIhKmiqTAVUe1qIBbwTxnq8zgARUVFHDhwgGXLll1wzO2wUfbREzgaypEHxxF9538vuKldDL1eT02ep9Cp2lzWofm1Rf+w4Ryq3I7eVsfZ+uP0DGlbwe1i6IbNpm7bu1iLT2KrLkAZ3jkBqPaQqYNwGWraLPi63NRba1iT93GrYmH/8BGMjp1+WWsSRNFNnbWaGnM5Vfo8asqOYrDUYouW44obhVuhRCpXIZPq8ctdhL9MTaBCR5BfOKGqSKIC4vGXd86l8FwEQWBo1DjC/WNYnbeEUmM+y8++wc3d7iNQofN6nGujJ1FtKSdPn8HqvI+4q+evWw2VBKkMZWQaysg0gkbMxVaVS/2OxTQd/5bGg19gLc0gZt4ryLXfKaC2pKlb9rABUnS9iApIoMJUxP6KTUxIuLnN96OK64PxzDZs5WcvCAYAZs2axaeffkp+fj7JyRfKYivCPH/r9toiRLf7FyVNXFHh0T5pa+FzlSu8myBAHogCPyQSgYLqrvUwD1N5/qCqzKU+pZ1avAwu1kp0KWKaV3bVkSHIg6KRBYZ0aJwvv/wSpVLZprZA9TcvNpsdaYhd8HqrnoC3NDY2Yqv3rID0Vt/69S+GXKpsFgqCw5U7OpTykwWGEtB9JOCp+L9s/EjZyKz6E3xy5hVqLOWoZAHclHoP4+NvuiyBgMlh4GTNgebuiOdZkvEf1hYs40jDAYr9HTSEaDGr/bGplDikYHVbMDqaqLVUUmzIJaPuMLvL1vJV7gcsOvE87596kS3FqyhozOywyNT3SdR247b0R1DLtdRZq1iRtcgntUlBEJiSOAetIphGe32rH0hbKCNSibr1b8QueAOpvw5beSZlix/Dbf+u1qetYEAQhNbtgVO1B9vdfmxxcbTVFLR5fMqUKSiVyna7CuRBUSBIEJ02XMba9t/0FcjVYODiXNGZAYBwVSylllzKTUVdO65/DFJBisVpQm+rJcjLdqz4wFQASo35ON3ODumgdw/uz+GqHVRGhyFYOu658MUXXzB58mQ0mvNTko2Hv6Lx8CoQBKJv/xeKsESfx9br9a3p2AtNbTpH37Br2V+xmRpLOWXGfGJ9tJAG0PSfhilzB4ZTGwmd9OhlKaJzmT0PHKm/tsvHbvN6bhc7SldzrNqjRBerTub65DvbTDl37jpOcvSnOV17kKKmHM6NeqROF1p9E4GNRnTyICJ6TiEoph8KqQKpIEfE3dwRY8bsNNBoq6fBWkO1uYw6axV6Wy3Hq2s5Xr0HP6k/3YP70TfsWsI7sKV2LmH+0dye/iifZb9Fo62Oz7IWMSf9EQIV3v1u/GT+TEu+g+Vn3ySz/ijJuh6kB7dfgBfQbTgJj35C0ZvzsFVmU/XNP4ma/Veg7WAAIC4whbjAFEoMeRyu3M518TMvGFce5HmQOZvaVtFTq9VMnjyZVatW8eSTT15wXJDKkaqDcRlqcRrqkGm6Vpn1p8zVYODiXPHBQLwuhVJLLo2urlWdkknkRAUkUGrMp6gp2+tgIFQVSYBcg8nRRFFTFikdaJGL8I9FZ5egV0BeXBAdSXKXlZWxd+/eC1TLbNUFVH3zomeuEx4mIK1jbYF6vR5tkOdG29UPWpXMnx7BAzlVe4BTtQc7FAyou49CkClx1JVgr8pDGZnapXN0O2w4DZ6MiEx7+dv2TA4Da/I+ptTo2QseGnkdI2Imd2mngs1p4WTtfo5W7TrPsjjU7U9oXg4hJWVo9QZUkWmETnqMgO4jffrdW50WSg15FDSdJU9/BpOjiRM1+zhRs4/4wFSGRI7rlBCSRhnErd0f4vOsRehtdazMfofb0h/xuoYgWp3INVHj2VexiS3Fq4gPTLvotoY8KIbo2/9FyXv30XTkG3RDZqFK6N9uMAAwLGo8JYY8TtUeYHj0pAvmJg3wCOe4TO1nNm666SbuueceKisr2/RkkQYE4TLUXnSMK5GcnBzCw8M7ZJ72S+CK3iYAiNM0p9VUxi6vIk3UpgOe3m1vEQQJ3YP6AZBZd6xD1xUEgfQyT8/6GVVTuwI4F2PVqlXI5XJuuOGG1p+JbjeVK59DdFjxTx1G8NiFHZofeIp1QqJ1AD7tz3pLr5DBAGQ3nOyQsYxE6Y9/iqcbwXh2Z5fODcBeUwCiG4lKg1R9eaV8K03FLD3zMqXGfBQSJTemLGBU7LQuCwRcbidHqnby3ql/srP0W4yOJgLkGgYQx8Q92Vyz6htST2YSLtESM+efJDy6HHX6KJ8f2n4yFalBvZmYMJv7+/6Jm9Pup1tQPwQkFBtyWZnzLp9nv0WlqY1WTi/RKHTc0u0B1HINddYqvs5d7NN2xLCo8YSpolpbNS+Ff/JgtINmAlC39V3Aoy8A33UVnEt8YBphqiicbgfHq/decLylg0B0tK9vcsMNNyAIAmvWtL0F1qJH4nZcPkOmnyKZmZmkp6f/2NP4yXLFBwORAfG4HG6kKqi1dMz5rj1SdZ4CwCJDNmaHyevzeoZ6HmQ5+lOYzllh+UJkYSnahiYcuNhQuMLnQOeLL75g/Pjx51XWNh76EmvxSQSFP5E3e9850BaNjY2Ep+kACPXr+pVxtDqRIGUYTreDPH3H2qQCunnqBsw5+7pyagCtrVt+0emXtY8/o/YwK86+idHRRLBfOHf0eKJDhantUdiYzeKM/7C95BusLjPBfuGMkfVm4tZjxKz8EGVlMTJNOBE3/YmkX3+Jpt+ULilKkwgSErXduCHlLu7t8wcGho9CKsgoMeTxSeZrbC76ssNSwRplMLPS7kMhUVJqzGdryVdenyuVyJiUeCsgcLb+WLOj48UJGjUPAFPeAdw2U+t3ta1gQBAEhkR6uoOO1+y5MFBp+Z5f5G8qJCSEYcOGsW7dujaPt2prdFFNxs+Fs2fP0qNHjx97Gj9ZrvhgQCaR46z1vE2PCUvXEaIKJ9w/Brfo5my996v8CP8YogIScIuuNqN/b3AZauh3OAOpIKWg8SyHKrd7fW5tbS07d+7k5pu/q1h2WZqobXZFC5v0CHJd5x7g9fX1hKZ7WseStF0fjQuCQPdgT4Ylq+FEh8YISLsGAEvxCdwXWWl1BGuJx5rWL6Znl47bglt0s71kNesLl+MUnSRre3BHj8cJUXXNHrDNZWV9wXJW5ryD3lZLgDyQMapBjN1+nMAVr+CsLkDqryNs6q9JeuobdENnX1TAqTNolEGMi7+Re3o/TY/ggYDIiZq9LM74D6VePIzbIsw/iuuT7wQETtbs53TtIa/PjQyIo1+Y529nW/FXlzRHUoQlItNFgct5Xn9/ewF8t6C+zVuJBrIbTp13zO30/J0K0ouLqE2ePJmtW7e2ahm0xS+p397lcpGVlXU1M3ARrvhgACAUT1/w2drjXT52i/DNyZp9Pn25hkSOBeBI1S6fsgoAbrsF0WFF02RidORkAHaVfet1QLJlyxZEUWTq1KmtP6vfsRiXWY8iPBndNXN8mk9baJP8UARLkEnkHaqL8IbUII+oS3FTTocqz+WhCUjVwYhOe5eLsLQGA+0Iz3QGi9PElznvcaRqBwDXRE1kZurdXSZoVGkqYemZl8moOwwI9FH1YNLRcgKX/gt72RkEhT8h191P0m9XEzx6/gXiN5cLjTKIacl3cEu3B9ApQzA6Gvks620OVGxF9NKt8FySdT0YEe35/mwtXkW91Xtr2xExU1BK/aixVJDZrOrYHoIgoGzuArDXlbRmitq7X0glMvqEesStTtcePO9YS5uqVHXxfe8JEyag1+s5cuTCuYlOT0Gv4KUHxJVAYWEhVqv1ambgIvwigoFekYNwOd3U2ip8+sJ7Q4/gQcgkcuqsVV6lDFtI1fUi3D8Gh9vGvoqNPl2zxYIXiYwB0eMYEO5Jd6/N/5RTNQcuef6GDRvo3bs3MTExrePp968AIHTyYx2yQD4Xu8vKqAWeVXu/sGu7tHf8XMJVUahkATjcdio6sI8sCAKqeM88rSWnLvFq73E7bNiqPX8LfrFdGwjVWSr5JPM1ipqykUnkTE++ixExkxG6wPcC4HTtIZaf/R96Wx2B0kAmFIskLH0dR/YBBKkc3fDbSf7tGkInPozU78cpxIrXpHFXz9/QI3ggIm52l61lbcGnHQoIh0ZdR3xgKg63nbX5y3CL3hlrqWQBDI0cD8Ce8g04L3FtidJTCCg67K1iQxeTxfUsMgSKDTk0nSNs5mysAkCmvXgGaOjQoQQGBrJp06YLjrW0OUoUXW+H/VPl8OHDAPTv3//HnchPmF9EMNC/50Cy9xcCF0bancVPpmotZjtY6b1PuCBIGB07HYAT1XupMpVe4ozvcFuNgEc2VRAExsXNoFfIEETcbCz6nD1l69tNXYqiyMaNG5k0aVLrzxqPfI3bZkIRnow6fYzX82hv/PUFnxEar0OwyxgWNaFT410MQZC0qulVm73//M7FL74vAJbik101Ley1ReB2IVFpkGk73vr5fbLqT/BJ5ms02urQKoK5I/2x1q2SziKKbnaVrmVD4Qpcoos4i5xrv16H36HNIAhoBt5A0pNfEXHD08guc0GkNyikSqYm3c7EhNlIBAln64+xKvcD7L4Yh+GpTZiSdDtKqYoqcymHK70vJh0YMRK1XIPBriej7uLbDC0umYJcQUiIRxekrq59/Q2tMpi4QE82IfOcjJ+j2QVTrrt4q6VcLmfs2LFs3rz5wrlYPQXHUr/LE6T/FNm2bRvdu3cnIqLrvo9XGr+IYCAgIIC6M55oOLPuqNfRv7cMiRyLgISipmxKDW2LgbRFgiaN7sH9ERHZULjikquLFtx2z42lZbUhCBImJ97KsOaVyv6KzazIehO97cKbTWZmJmVlZa3BgCiK6Pd/DkDQiDs6VfzldDtZX7icHP1JXE4XYTXdUPkg/doRWkScqs3lHTq/JTNgKTreZXuoLTdsRUhclxQPukUXu0rXsib/YxxuO3GBKdzR4/EOyVm3Pb6bDYWftwaz3bJL6bt2HQqblYDuo0h8/DOibnkBedDFDXh+aARBoG/YNcxMvQeZRE5RUzZf5X6A0wvr4nMJVGgZG+fpqtlXsdFrvxGPW6Kn2O9QxbaL1g7YawoBkAfHIpfL0Wg0Fw0GAHo2LzIy6g63/m3aqj2toy3iQxdjwoQJ7N27F5Ppu21IURRxmfQASPx1lxzjSmHbtm2MG9dx2fZfAr+IYAAgWdsTS6MNo6PJp1ZAb9AqQ1prB3aWrvHpoTIubgYqWQA1lgp2l6316hzR7mkJOteyWBAERsZOZVrSHSgkSsqNhSzJ+A/7yjedZ7O8ceNGlEolo0aNAjwPQUddMYLCH02/tg1SvMFgb+SL7Lc5U3cEAYHPXthIrObyyPyei1YR3Hx9fYfO94vtiSCV4zLU4qjreMvaubjMnrlIA0M7PZbJYeCL7HdaH9SDI8Ywu9v9Xbb14hbdrCv41LOyFUX6Hc6g26mz+EX3IO7ed4ld8Hqrnv1PlSRtOrd0exCFREmJIY81+UsvWdT3fXqFDCFGnYTT7WBnqfeqlH1Ch+En9afRXk+ePqPN19jrS3E0lIFEil+0p4AtJCTkksFAWlAfZIKMBmsNNZZyRKcDe2UOgFe/k4kTJ2K329m1a1frz9w2E2JzEeJPIcPzQ1BeXk52dvbVYOAS/GKCgZHDR7L/K0/VeYtxS1cyPHoyMomcClORT50FAXINkxM9BXtHqnZytv74Jc9prShuowCoR8hA5vV6krjAFJxuB3vLN/DeqRc5ULEFq9PMxo0bGT16dKtpk+G4JwAJ7DOhNdPgCw63g33lm/jg9IuUGQtQSP3oZruGI2vPEBbmnRBTZ2ixqbY4jR06XyL3ay3yM+d1zRZSa7Am65wrYElTLkvPvEKJIQ+5RMn1yXMZE3dDl+kHiKLI+sz3OFt/DMHtZuCBUyTp3UTd+ncSHvmkVYfhp47odBBidjFZORgpAnn6DDbu/z/qd31M49E1mHIP4DRe3FBMEATGxc8EBLLqj3u9bSeXKujb3FnQovz4fRoPeaSBVQn9W91Fw8PDKSu7uGeHUupHktZT8JbdcBJrxVlElwOJSoM8JO6Sc0tPTycmJua8ugGX0ROACAr/8xYTVzLbtm0DYOzYsT/uRH7iXPEKhC2MHTuWex+5m3F3DaXEkEe5sYhodUKXja9WaLgmagK7y9axvWQ1Sdoe7fqSf58UXU8GR4zlcNV2NhSuQKcMJjLgQj/yFi5VDaxVBnNLtwfJajjB7tK1NNrr2V22jgMVWwgeLqFf1GicbidSQYrhzHYANH0m+/R+G6w1nKk7wsma/ZibH8TRAYlMSryF919fgr+/P2lpP8SKUvjev74TkHYtlsKjmLJ3t+kT7/OMFJ7q+o6KurhFF/vKN7O/YjMgEuwXzoyUBV3WNggeR8rNB14iU2sDUWTgkSx697iZ4FHzftIPCVEUsVfnY84/jLXkFNayM601GgD9YsI5ek1fMuS1KI9sJbrsu4JhmS4K/6RBBPaZiH/qNRcYb0X4x9AjeACZ9UfZU7aeWd3u9WpO/cKHc6hyGyWGPOosVa0mZgAOfSUNez8FIGjkna0/Hz9+PK+99hr19fUEB7e/Qk8N6k2O/hT5+jP0rPO8F//EgV5tPwmCwIQJE84LBpxNHiVWWRdkrX4ubN26lV69ehEe/suRXu4Iv5hgICgoiAE9B1N2rJ6YQcHsL9/k9ZfdWwZFjCGj7jAN1hq2lXzF1KTbvT53VOw06qyVFDSe5cuc95nT/eHzbirnIro8e6IXaw0SBIH04P6k6fqQ1XCcQ5XbqLVUMmBKOqDnjeN/JloeiV+MGp1BRlhsCn5uJ9I2vBIcLjtN9nqqzeVUmIopbMyiwfadvLNGEcSo2Gl0D+qPIAhs2rSJMWPGoFR6brZut5vc3Fz2799PcHAwaWlpJCUloVB0vrXJ7vLUgnjjU98eAemjqN30Bqbsfbht5g5lSM5FrvH83lpqB3yhwVrLuoJPqWj20ugdOpTr4m5ELu1clqEF0eVEf+BzjmesIGOAR4J5aI2Ua25/v9PaEpcLl9WAKXsvpqzdmLL3tq5uz0VQqFCExJEWEIalQUJmkJvTQ/oSozYiqy3HUV+CU19B07E1NB1bg8QvEO2gG9EOuQllxHdy1tdGT+Js/XEKms5SbS5rrUm5GBqFjiRtD/Ibz5BRd6i1MFh0uyj65GlEuxmHLgl3zHcug0888QQvv/wyr732Gs8//3y7Y3s0OgRqLBXUFno6VFRJ3jt1XnfddSxZsoS6ujpCQkJaJYh/KVsEDoeDr7/+moULO66m+kvhFxMMgEez+6//fI6nv7ibgqazVJqKL7oC9xWZRMbkxDmsOPsGZ+qOkKrrTVqQd33mEkHC9OQ7+SzrLarMpXyR/Tazuz3Y5mpQdDYHA16YHEklUnqGDKJH8ED++sqfyGo4zqhZQzE7DRTbSqCX50Z4MPM/gIBK5o9cokAiSHGJThwuG1bXhUpvEkFCfGAavUOHkKrrg1TiSV0fPXqUbdu28dprrwGwcuVK7r77bgyG8yWTBw4cyM6dOwkI6JynfV1zq2iwl94QbaGM6o48OA5HfQnGzB1o+k+99EkXQdHsc2CvKcRprPfqxiuKbo7X7GNX6bc43HYUUj8mxM+iR8iFNrUdxZR3kOrV/6LGWs3xcZ7itAGqnoyadk+XXaOrcJn0GDK2YDi9BXP+QXB9V1wryJSoEvqjSuyPX2wvlFHdkWnCW1fLUW4X9Wdfp8pcyukRg7kpdSFumwlraYbHnCpjC87GKhr2LKVhz1KP9PbIefh3G06QXyjdgvuSVX+cI1U7vQ7oe4UOJr/xDGfrjzMqZhq43Rx/8yH8y09gcbiZ+a+1VDwbzvPPP89jjz1GeHg4999/P6+88gq33norPXu2LU6lkgUQ7h9NtbmMUksJMXwnluUNY8Z4uoN27drFzJkzv6tnCdB5PcbPmW3btlFXV8ecOZ3XTrnS+cXUDIDH67u2pAFpnWefeVfp2i5X4YpRJzK4WVBoQ+GKNiv620Mh9WNW2n2EqiIxOppYkfUGVeYL9xVbMwM+KL4JgsCmlTuwn1HxYL9nmdfzSQZUuYkpqkDnViITZICIxWmiyd6A3laLwa5vDQQUEiXRAYkMCB/JDcl38XC/v3Bzt/voHty/NRAwm83MnTuXvn37Mm/ePH71q19x6623MnHiRDZu3Eh1dTUlJSV89dVXZGVlMX/+fK/n3x75zVLE4f6xHR5DEITWAKArLI3l2giUMT1BdGM40bYk7LnUW2v4LOstthavau0WmN/zyS4LBOy1xZQt/Q2l792Pua6Qo9f2wy2VkqRJZ2zPBV1yja7AbTPTeHQNJR88TO4/xlO16gXMOXvB5UQRnkzQqHnE3vsOqc/tIu7etwmd8BDq9NHItRHnpc2lEilTk25rVefMb8xE6qcmIHUY4Tf8juTfrSNm/muoe44FQYI59wClix+h4KUZ1O34kP7qZmXL+hNYnGav5p6s7YFCosRg11NWfYqzr8/Dv/wQLhG01/+eNTuPcP/99/PnP/+Z+Ph4Xn311db/njRpEkVF7buqtjid1garkWnCUUR4b6qVkJBAQkICO3Z4BKpaNEokqh/GSfPHZsWKFaSmpjJgQPsOk1fx8IvKDERFRTFhwgTWvrGDqc8NptiQS0FjJsm6rpWMHRE9hVJDPhWmIlbnfcRt3R9Bfgn50Bb85QHc0u0hVua8Q7W5jBVn3+T65LmknDvH5hZEX8SBTCYTBw8e5JVXXkEQBEJVkcSfOEmMoZa4QU+hSuiP2WnE4jThcNlxiS5kEhlyiRy1XIvyEvUPDoeD++67j8LCQo4ePcozzzzDokWL+Otf/8rvf/97pNLvit5iY2N57bXXWLhwIWfPnu2wRGilqZhKcwkSQUJ6cP8OjdGCZsB06ra+gylnL/baYhShncsYaQfPpLrsDHU7PkQ7ZFab+/BOt4MDFVs4WLkNt+hCLlEwKnYa/cOGd4mIkNPUQP32D2jY96lnZS1IyJkwBVOADbVcy9TkO5B0kVhRRxHdLsx5B2k6ugZDxhbEc+oslNHpBPaZRGCv8SjCfKvvCVFFMihiDAcrt7KjZDVJ2u6thZeCRII6fTTq9NE4Gspo2PMpjYdX4agroXb9q4gbpeimjEWvcpJRvpPB8VMueT2ZRE6CfyI5xiyObvkH3auysDpF4u/8D0H9JgLw+uuv89RTT/Hiiy/yq1/9ir179/L1118zYcIEJkyYwNdff91mhiAuMIXDVTuoCwsiQOq718W4cePYutXTjdKidyBVdi4j93PAYrGwcuVKHnvsscvqD3Kl8IsKBgAWLFjAHXfcwYMvzCPfcYqtJV8Tr0nr1J7z95FKpExPuYulZ16m2lzG+sLlTE++0+sbvL88gFu7Pcg3eUsoNuTyVe6HjIyZwtDIcQiCBLFFb1zifVX5nj17cDgcre01LkMNLkNta7uTIAgEyANbq/N9oampiTlz5rBlyxYWL17MokWLeP311/nf//7HI4880uY5c+bMYeHChezevbtDwYDT7WRD4WcAdA/q3+lWO0VoPAHdRmDK3kP9riVE3vTnTo2nG3wTDTuX4Ggoo3rN/xE567nWY6Iokt1wgl3NxZ3g2RseH38TWmVIp64Lnvax+t1Ladj1EW6bp8c8oNsILNfNJq/mW0Dg+uQ7LrsGxMWw1xbReOQbmo6taVXVA5CHxKPpPw1Nv6k+BwDfZ2jUdZyqPUCDrYas+hNtZlrkQTGET3+K0IkP03Ryg8esq+QUMVnZ6Pt350TmF4SsfAe/mJ6e7SRdhMdGWBAQXU6c+grstUWYcw8QIG2AIb2oDtNiq7DQ0HMO/ZoDgRYSEhJYtGgRY8aMYcGCBfj5+bFhwwZuvPFGBg0axHvvvcfcuXPPOydanQSiiFntjyRsmM+fw4QJE1i8eDGVlZVImj04BHnX1KD8lPnmm29obGzkrrvu+rGn8rPgFxcMzJo1i9DQUHZ/coJuc4NotNVxqHIb10ZPuvTJPqBR6JiRsoDPs98iu+EkO0vXMiZuutfnK2UqZqXdx7aSrzhRs4/dZesoNeQzJWkOYgcyA5s2bSI6Orr1wWstzwJAEZrQqerxffv2cffdd1NRUcG6detISEhg7ty5PPPMMzz88MPtnldbWwt4sgS+4nI7WVfwKbWWSlSyAMbGzejw/M8leOxCTNl7aDz8NcGj5ncqOyDI5ETMepbSDx6k8dAqZJoIQsY/QKWphJ2layg1esRj1HIN4+Jnkqbr0+nVi8ukp2HfcvT7lrfuDSujuhM25QkUqUNYfPr/ABgQPoLYwJSLjHR5cNvMGE5vovHw11gKj7b+XKLSoOk7Gc3AG/CL6/zn0IJS6segiNHsLlvHwcqtpAcPaHdsidIf3ZCb0A25CVt1PqoT35AhlqAP0aE3nsb/WD5cYgspTOnJ/jUGafj1NyWsXTix3dfedtttNDY28uCDD/KnP/2JQ4cO8dBDD3HnnXdy4sQJnnvuue/qaSrzCWwyYdCq0UeE42tN/MSJnnls2LCBqcHN+gu/gJXy+++/z4gRI+jWrduPPZWfBb+4YECpVLJgwQLef+99tv9mHZtKP+dAxRa6BfVrt3q/o8QGJjEp4RbWFy7ncNV2/GT+DIu6zuvzpRIpExJuJtw/lm3FqyhsymJJxksMFYJR410BYQsbN25k4sSJrTdDe7OSmdKH/cdzqaqq4rnnnuOdd95h8ODBfP3113Tv3r21jSk8PByTyYRa3faKffv27QAkJfkmTGR32Vid9xGFTVlIBClTk27vMgEe/6SBrdmBmvWvEHPnfzs1XkDqMEInP07t+lcpOPQx2+QFFAd4sjot6nVDIsZ0ulPAVpWHfv9nNB79BrFZd14emkDoxIcJ7D0RQSJhf/lmmuwNqOVaRsZ0rkDSF0RRxFp8ksbDX9F0cgNis3omgoSAtGvRDr6RgB5jkVwm05x+YcPZX7GZWkslZcZCYgMv/femDE8mfuKviDn7BmXGAhw3PkxItRl7dT5OQ02rZoEgkXr28EPi8IvtRUC3ERwr+YhaSwWJ/WMoKbm4iFVqque7l5OTQ1paGosXL6Znz54899xzLFu2jL///e/ceOONOE5vQWdoxKBVU2OrxtdHW3h4OIMHD2bdunVMnTcU8HSVXMkUFRWxefNm3n///R97Kj8bfnHBAMCDDz7ISy+9xP7VJ0gam05B41nWFy7n9vRHu0zQpYVeoYMxO43sLF3D7rK1SARJq2Oht/QNG0a0OoG1+cuosZSzQ2kifHh/hrogyovzq6qqOHnyJL/73e9af2avLQQ89qq+cPz4cf7973/zxRdfoFKpeO2113jooYdaawLGjh3LxIkTeeKJJ3j66ae5//77mT9/Pn379kUmkyGKIlu3bm0tLvQlai9szGZT0ec02RuQSeTcmLKARG13n+Z/KcKm/RpT7n6MGVsxZu5A3aNzXg3ya24kS1VNjlANggtEkTQhkjE970Hr1/EtAaepAcPJjTQd+xZryXe+Csqo7gSPvYfAXuNbM0dmh4EDlVsAGBM3HUUXtSledH6GWpqOraHx8NfYa76T6JaHxKEddCOagTcg70Lfhvbwk6lIDx7A6dqDZNQd8ioYaCFJm06ZsYAKfzdDJzzo1Tkx6kRqLRX0GJbCa6+9hkQiwel00tDQQGNjIzabDbvdztGjR9m8eTMqlYr4eE8GShAEnn76aW655RZ+85vfsGDBAiQSCVsf7YumjyeDVt5UDB1QhZ46dSr/+9//4J7RwHe1A1cqH374IQEBAdxyyy0/9lR+Nvwig4GUlBRmzpzJi/98kUO376fcWESlqYQDFVu5Nrr91F5HGRI5FrvLxv6KTewsXYPL7WRY1Hif0qGhqkjm9nicg5Vb2V+2keqoUNaKVipKvmFo5Hj85e0XBLWYlUyY8J1pkKPe06UgD2k7FS6KIsXFxeTl5ZGVlcWRI0fYu3cvmZmZJCYm8o9//IN77rmHoKCg886Ty+Vs3LiRnJwcli1bxquvvsprr71GQEAAcXFxWK1WCgsLGTx4MIsWLbrkZ+CyNFFddID9DXvJl3vaE9X4MS3+NuK6OBAAT6YkaOSdNOxcQuWqF0iM69OhnmyDvZH95Zs4XXcIt8QFCERXN5F6IgNNk4naLVux95+KOn00ypiel1wZu6xGrKWnsRQex5S7D2vxKWiR3JVIUfcYg+6aW/FPGXbBZ3qwchtOt4MI/1i6B/X3+b14i+hyYMzaTdPhrzFm7WoVAhLkfgT2mYh28ExUXgrmdCU9ggdyuvYgufrTTBRv9jrgj2veSikzFiCKolfzjgyI50TNPsbdMJJXVy3l9ts9rYlKpRKtVoufnx8KhYLw8HA++eQTbrzxxgvaa5OTk/nqq68oLCxk/9rlRJYsp6LB87d/JPMA/zfvXWbNmsWvf/1r/Py8s4+eNm0aL7zwAiW1jaihTa2GKwWDwcBbb73FHXfc0W5m8ioX8osMBgBeeOEF+vbty7IPVzDhjptYW7CMfeWbiAtM9Wn14C0jYiYjEQT2lm9kT/l6zE4jY+Nm+FTNLZXIuDZ6EuFZWew1HqE6KpQjVTs5WXOAgeEjGRgxqs2U+aZNm+jbt+95jl0OfSVAm0IzpaWlPPzww6xevRrwrFi0Wi1RUVHMmjWLBx98sHUfsj3S0tJ47rnnePrpp1sDicrKStxuN+PHj+f666+/6M3V7bCSvfNNjhuOUx4diiiXgCiSmFdK+ulczO5vKYrrg+6aOWj6TEKQdV0BaOiEhzCd3YW9Op+Kz54hdsEbXhs42VxWDlVs40j1zlbDnPjANEbETCGyXyQNAcuo3/4BTn0F9ds/oH77BwgyBYrwZOS6KKTq4ObtHxGXpQmXsR57bdF5RXYtKKPT0fS/Hk2/Kcg0bessWJwmTtTsA2i2Ou76B7G1IpumI9/QdPzbVlEb8DhCagfPJLDPpB/VIS82MAk/mT9Wp5lyYxGxgZc2+QFPu6pUkGFxmmi01aHzu7RqX4tIkUtl48yZM+j1elQqFSqV73U5iYmJKBOUNJWAiOf3GxqrIyo6kueff54VK1awfPlyrwpwhwwZQnBwMIcz8hkLOPQVPs/n58Lf//53GhsbeeaZZ37sqfysEMSubrT/GXHPPfewZs0acnNz2VW7mrP1x1DLNdzV89f4d6Cq3huOVO1ke8k3AKTqejM16Xaf07a1mxdRt+VtzKNncjpBS3WzFoFMkNEzZDD9w0cQ5u/ZQBBFkdjYWG6//Xb+85//tI6R/dxwRLuZpCe/RhH6XdV2SUkJAwcORCqVkpSUxP79+xkzZgwymYyGhgYyMzOxWCwUFRW1pje7EpvLytnibRzNX0O99rsbaKRZYKA5CF2jCVtVDraK7NZjMk0YwePuQzf0ZgQfOiwuOo+qXIreuBPRYSVo1DzCp/3moq9vEQ3aW74Ba3Nveow6iZEx0y4ILt0OK6azO2k6uRFLwZHzHqAXQx4UjV98P/yTBxHQbQRy3aU3iQ5UbGF32TrC/WO4s8evuiwYcBrqaDqxjqajq7FVZLX+XKoOQTNwOtpBN6L0wlnvh2J13kdkN5xkRPQUron23lb74+aOoBkp870SEHO4Hbx29I+AyEP9nuvUfSQnJ4eiV24mTiPhqW+KGPHOfORKGf+48V36pw8mPz8fu91OZmYmGo3mkuPdfvvtGMqyeWmEC0HuR9pzu30qQv45kJeXR8+ePfnDH/5wUWXHq1zIlfWX4CN/+ctfWLZsGS+99BLPPPtHqs1l1FurWZO/lNnd7u/y+gGAQRGjUcs1rCv4lFz9aT49+zo3pizwatXRSnP8Fm1X0r/Hr8jTZ7C/YjNV5lJO1u7nZO1+IgPi6B06FGr8KC8vP28lL7ocrYVc0u/ZmD788MP4+fnRs2dP9uzZw7Jly1pTnQB6vZ5evXrx0EMP8e2333b8gzgHi9NMQWMm2Q0nKWw8i0t0gVaF4BZJkcUwrPstRAacb8ziaKyi6eg3NOxbgbOphuqv/0HjwS8In/47/JMHd3pOyohUImc9R8WKP9Cw6yPkuiiChretRtdkq2d94QpKDB652GC/cEbFTCNF16vNh69E7ufpn+8zCVEUcdQWYa8twtFQgcvS2Kq2J/HXIPUPQhEShyIsEam/b0IxouhuzQoMihjd6UDAbTNjyNiK4cQ6TLn7v9sGkMoJSB+NdtAMAroN90kM64ciNjCZ7IaTlBsLfTovTBVFtbmMOkuVV8GAXCInUKHFYNfTYKvrcDBw+PBhHrr9BpbOjkCUyPhifz6fFL5Dg62Gf/z3b/zrDy9TV1eHy+XimWee4fXXX7/kmFOmTOGeu5fz0rhrEe1mbNX5+EVdOZX2oijy+OOPExERcV591FW84xcdDMTFxfHkk0/y4osvcssttzAjZR6fZL5GiSGPnaVrWz3Ou5ruwf1RK3SszltCraWSpZmvMjlxDmlBvX0bSBAQBIHUoN6k6HpRZizgWPVucvWnqTSVUGkqAREeePMWdL3kNNrq0CpDziseOleHPzc3lzVr1nD//ffzzjvv8PXXXzNjxvltezqdjn//+9/MnTuX/Px8kpN9X/053U4qTcUUG3IpasqmwliEyHcJKnWTifg6K9dOeB5dUNu95nJtBCHj7iN41AL0B1dSu+kNbBXZlLx7L7rhtxM2+fFOG+5o+k/F0VBK7cY3qF79LwSZAt3Qm897Ta4+g3UFn2J3WZFJ5IyOvZ5+Ydd6HUgKgoAiLNHnQk5vKDXkY7DrUUj9SAvq26Ex3A4bpuw9GE5uwJi54zxRIL+4PmgGTEfTb4rPgcoPTbjKk76vsfiWHm/RffBFSVSjCMJg12PsoK02eASKJqXrAFCnXYsyMIgAeSANthpGTxjJrZPuJCkpiQEDBrBo0SKeffbZS7qETp48GbcIjfJQtPZiLIXHrqhgYOnSpaxdu5Zvvvmm1ZX1Kt7ziw4GAP785z/z1VdfMX/+fPbt28eUxDmszv+YI1U7CPYLa7Un7Wpi1InM7fErVud9RIWpiG/yFtMvbDhjYqd7rVbIOTs8giAQG5hMbGAyZoeBM3VHOFt/nCpzKWlD4tlduZbdlWvRKoKJ8YtBlhiNrsGAKJG0+v29++676HQ6vvjiC2677bYLAoEWZsyYgVKp5KuvvuI3v7l4+tzldqG31VBtLqfKXEqFqZgqUyku8fzWpjBVFJE1BoL2bULrkJL4yCcogi5t0yrI5AQNv43AfpOp3fg/Gg+uRL/3U0xZe4ie+2/8ojpXZBg89l5c5iYadn9M1aoXcNstBDe7z+U2nGZ1/ke4RTdRAQlMTbqdIF8yPJeZ7AZPl0G3oL7IfRDVcjusmHL2YTi5EdPZna3CRdC1okA/JC1tw0ZHIw6X3evvmFbpKR41+PBgV8u1zddq8m2S53Ds2DEWTg4GTKh7edqR/c+x6w6KCOKhhx7i9ddfRxRFvvnmm0ua8URGRjJw4ECOlFm4Tgfm/EMEXXtlaPZXVFTwxBNPMHfuXG644fIs4q50fvHBgJ+fHx9//DHXXHMNzzzzDP/+978Zbq1ib/lGNhd9SaBC1+wc1vUEKrTM6f4Qu8vWc7hqOydq9lLclM2kxDkXL2JsTfe2Xe7hLw9kcORY+oWMILVPIg8/u5DEgZGUGQtptNd7VO8GeWRP9xz9I8F+EQQpQ8l1HmPc7cMozinjuf/7IwZ7I35SFTKJ/LwUs1qtZty4cWzYtIEHH3sAm8uM2WnC7DBgsOtpsutptNXRYK2hwVaLW3RdOEeZmrjAVOI0KSRpuqNs1FO47FZwO4me/xoKL/zaz0UWEETkTX9G3XMcVatewFFXTPGb8wif8TTawTd1OEUuCAJh034DokjDnqXUfPsfj+rcqJtYk/8xbtFNevAApibddlm2lTqKKIrkNXp8G1J0vS75erfdgilrF4bTWzCe3fWdHgAg00YS2HcSmr6TUcb0/FlKuyqlKuQSJQ63DaOjkSCpd8ZW/jJP4WOLTbc3tCg7Wr30Nfg+JpOJhpIcImTdQRBa21u/P26L82FUVBQ7d+70yplv6tSpfLryfa6bGYE59wCiy/mzrxsQRZGFCxeiUCh45ZVXfuzp/Gz5ef8VdBEDBw7kn//8J0899RQTJkxg0qRJ6G11nKk7wjd5S5iddj8xl6HDADwdAmPippOgSWND4Wc02GpZkfUmfUOHMTJ2WtuSsc0PHdF94UP2XLZt20ZxVjmTetzEgPQB2F1WyowFFNedoeDstzQGaXDKocZSTo2lnOG3e1LJI+jNt1VL4JwCdpkgQxCkCIKAW3Qx4a+9QIBFJ55r5+rfIZcoCVNFEREQS4R/DNHqJHTKkPMeKqXrnge3E3WPsajTR1/6g2sHdfeRqB5bQcVnz2DK3kPVl3/FWpZJxA2/6/BetiAIhF3/JFJ1MLUbXqN+zyfs0ZTj8pc2F4H+tAIB8KS1DXY9UkFKgqbtVLDLpMd4dgfGjG2YcvYhOm2tx2TaCAJ7jSew72SPKqCX3RQ/VQRBwF+uptFmw+wwEuSly6VK5mn78+XB3uLj0ZbbpzccPnyYCWmeIESVMKC1tVUh9bQR2lyerZrIyEimT5/O/v372blzp1djT506lRf/8Xfc8iSwGrCWnkaV0L9D8/yp8NJLL7Fu3Tq+/fZbQkN/Opm5nxtXg4Fmfv3rX7Nx40bmz5/PyZMnmZRwC2aHkcKmLFblvs8t3R4kIqDjzniXIlHbnfm9nmJH6WpO1x7kZO1+cvSnGBkzld6hQ8572LRE8i3uhe2xcuVKkpOT6d+/P+C5mSRpe5CgSiTy3RcQgYg/fkudS8/2/ZtYv/NbwmKDGTJyEFa3CavTgoinl90pOuHc1P45i0O5RIm/XI2/TE2gQkugQodWGUyQMoxgvzACFUEXXU2a8w5hOrsTJDLCpv7atw+uDaQBOmLmv079zg89WwcHPsdeU0DMHf/psHWrIAiEjL0HRWg8R3a/gt5fiszhYrgj5icXCACUGz1CPxEBcedtETj0lRjPbMd4ZivmgiOtRYAA8uA4AnuPR91rPH6xvX5WAYDbbsFWmYO9Oh97bTHOpmqcxnpEhwXRYfNk0/qEgb+Mis1vIEWHLDAEmSYMuTYKmS4SeVD0BXUmLZ4lTrfd67nIhJZzLv79bI+DBw8yvbenViGw73cy6XKJ4oJxr7nmGlavXo3dbqeqquq89uG2GDZsGBpdECWuIBIwY8ra87MOBjZt2sTTTz/N7373O6ZNm/ZjT+dnzdVgoBmJRMKSJUvo168fd955J2vXrmVGynxW5rxLmbGAL7LfZna3By5rQOAnUzE58VZ6hQxic9GX1Fmr2FT0BUerdjEq9nqStT0QBAGhWaBGdLZ/g3K5XKxatYq77777ggexIPdDkCnBaSPAAUHBvfg2azOr/rWVOXPmcM/DnkpcURRxuG043Q4cbgciIqIoIhEkSAUp1wwbzpgRY3njf/9pawpeIYoiNRs8ldC6obO6bB9akEgIGbsQZXgK5Sv+iCX/MMXv3EPs3W941ZLXHoG9J2CRFoEpk/iCUupP/RbngOmETf01ssDOmwx1FS2FchH+sdgqczCe2Y4hYyu28szzXqeM7Ia61zjUvcajjEz72WwBiKKIrSIL4+ktmHL2YS3PPC+waZNuQ8Ffg6XoGI1VbRcESgPDPN0boQkowhKwBnsyCO4WgScvaLH0bmt7zBuyDm5jRqofSKQE9vkuGJAKntv1ufU2Q4YMwW733AeOHDlyyQeiTCZj0qRJrD+VwwO9wJS9h9BJbZuJ/dTJyclptUj/+9///mNP52fP1WDgHCIjI1m2bBmTJ0/m0UcfZdGiRdyUtpAvs9+j3FTI59lvMyvtXqLVl7dwKjYwhbt6/oYTNfvYV76ROmsVX+V+QFRAPMOjJ6NVeHQJRLu13TF27dpFTU0Ns2fPvuCYIAjINGE46ktx6itQBMd4HM0kEuLi4s57nULq15qe/D6D+w3hwP4DnXqv5rwDWEtOIsiUhFx3f6fGagt1z7EkPPQRpYsfwV6dT/Gi+cTe/SbKyI55MgDUip7CsNiwfiDk0nRsDcYz2wket5Cga2/rdBdDZxGdDmrrPDoM4s7PKcx4/ruDgoAqob9nO6bXdT7XZvzYOBqrPD4HR9fgqD9f+18aGIoyIgVFaCIybQSywBAkygBP8CyC1LwNRANBw24lxOjCaazD2ViNs7EKR0M5bpsRl6EGi6Gm1UjJqPaHycNxW03kv3Sjp/MjNKE5WEhCEZ6ELCDoe7PseEBlt9uJM50BdAR0H3me+mWLQJnrnCBj4ECPE6NKpeLUqVNerY6vv/56nnr4Hh7o1QtreSZOU0Mb7+GnTWNjIzNmzCAiIoLly5cjk119lHWWq5/g9xg/fjzvvPMOCxcuJD4+nj/+8Y/M6nZva0DwRfbbzEy9h3hNxx8m3iCVSBkYMZKeIQM5ULGV4zV7qDAVszLnXYIlauLjIkmxt1/U9PnnnxMfH8/gwW333MtD4nHUl2KvLcQ/eTCVlZWIoniBvPDFGDJkCJ988gl2ux2FwnejGVEUqdvyNgDaobOQBV6e/T5lZCrxDy6h9MOHsVfnU/LuvcTe+3aHOw1cza6REcPmEJZ+I9Vf/xNr2Rlq179Kw+6PCRpxJ9rBMzskY9xRHA3lmHL2Ycregzn3APoRvSBIg7yuEkGmxD91GIG9riMgffQPOq+uwl5TSN2OD2g6thZaXDtlSgK6j0DdYwz+yUOQB0VfdAzHyZ1gh5A+UwlVny+YJYoibksT9roSHHXF2GsKsdcWY2kW9JK6XDhqi3DUFmH63rjSgCAU4ckowpNRhiVh1XpW6hJ83z46fXAXM3p4ugaCht/xvaOegmHhnGAjMDCQHj16UF9fz+nTp726xtSpU7nbImJUhKC212HOPYCm3xSf5/pj4XK5uP3226moqODgwYPodLofe0pXBFeDgTa45557KCkp4ZlnniEmJob58+dzc7f7+Dp3McWGHL7MeZepSXfQPbjfZZ+Ln8yfMXHTGRw5mkOV2zlZs596t5H6ob05a3MyqHwzvUKHEKj4rs/b5XLx5Zdfcscdd7Sb9lVGpWHO2Yu17Czgac1xuVw+BQPp6ek4nU6Ki4tbHdh8wZy7H0vhMQSZguDRC3w+3xfkukjiH/iQ0g8fxlqaQcm79xN379v4RfveKdKSKbE6zaji+hH/8Mc0HV9L3ea3cDSUUbvhNeo2L0LdezyaftMISLu2S+WSAZxNNZgLj2LOO4Q57yCOuuLzjjuUnuxR9LiHSU6f9qNnKzqKQ19JzfpXMZxc39pKq0oahHbILAJ7jjtPJ+NiiKKIxeEJnlVt+HgIgoDUX4vKX4sq7ju9D7chD7IWodJEErvw7eYgoRBHbTG26nyc+gpcpgYsBUewFBwBoKFnMvRIxnh0NcUb16GM6o4yqhvKyDSUEant/i7sdSWIm/5JgEKKIroH/ilDzzvubn7/3/9O9+vXj61bt5KXl+fVZxEaGsrYsWM5WGLiuggw5x/+2QQDoijyyCOPsHHjRr799tur9sRdyNVgoB2effZZSktLuffeewkODuaGG27gprR7+Db/E3L1p1mT/zEGewODIsb8IPusAXINY+NmMCxqAodzVnGidj9WlZI95evZW76BJG06PUIGkaLrxb49+6isrGxzi6AFVWxvGgBL0XHAEwwAPgUDiYmJABQWFvocDJxfKzD7B3Gwk/priV34FqUfPIy15BSlHzxE/IOLz5Nj9oZQVSQVpiLKTcV0C+6HIJGiHXgDmn5TaDq+Dv2+5VjLzmA4sR7DifVIlGr8kwejSh6EX0xPlFHdvdbqF11OHPVl2GsLsVVmY6vIxlJyGuf3teUl0mYb3ZGou49AWrcKHHrUKUN/loGA22GjYddH1G1/v1XoSN1jLMFjF6KKv7QS4PcxOw04RScCQqsOgDeYmgMIf6WWgNRhBKQOO3+edgv2mgJs1QXYq/OwVxfgDvRsI8ksZiyFeVgKj313giAg10UhD03weFGoNIiiG3ttEebcA6gdVhptIv3m/OOC+0pLrUBLgWILqamprFmzhoYG72StAWbPns2Xr/yB625KwFJ8wuvzfkxaFAbffvtt3n//fSZPnvxjT+mK4mow0A6CILBo0SLq6+u5+eabWb58ObNmzeKGlHlsL/mGY9W72VG6hjprNePjZyGT/DAfpUrmzzWR4wj9+D9UxEdTPXYaZcYC8hszyW/MRCH1o77CxOhZQxk0ZGD74yQPBkHAXpWLs6kag8HjivZ9B7WLERcXhyAIFBUV+fw+jKc3Yys7g6DwJ3jcvT6f31GkfoHE3vMmJe/eh638LKUfPEz8wx/7lDqPC0zhVO0BChozGRM7vfWmLUjlaAfNQDtoBpaS0xiOr6Xp1EZchlqMmdsxZm7/bh7qYOS6aKQBOiR+6vOKQt1WEy5zo6ci3lDbmhY/D0GCMjIV/+Qh+CcPQZU8+LwAQ6j/CvCt8O2ngrX8LBUr/oi9Oh8AVeIAwqf/Dr+YHh0es95aA0CgQufTd9XULByklret/S9RqPCL6YlfTM/Wn53IXwb1RwkfehuRvfyxVWRhq8jGVpmDy1iHo6EcR0N5m+Od1UtZb0xkUfiFrcwtXQSy7wlIuVyuVu8Qb7npppt4/nePA2CvzsftsCGRX35r644iiiKPPvoob775Ju+88w733HPPjz2lK46rwcBFkMlkfPrpp9x1113ccsstfPDBB8yfP59xcTeiVQazo8TTBlhnqWJGyjzUih9GklUaGIpEFIkpKmN07O00yVycqT1MZv1RmuwNqFOkzPjDKBadeI64wFQStekkaLoR7BfW+uCSBQThF9cHa/FJDKe34nR6Hji++FYpFAqioqIoLCz0af5up52a9a8CEDzyzh98D1vqF0jsgjcofms+jvpSyj56grj737+kjXALydoeyCRy6q3VlBrzW61uz0UV1xtVXG/Crn8SW0UW5ryDmAuPYSvPwtlYictYj8tY79X1BLkfitAElBGpKKPSUEb3QBXXG4my/cDNT+ZPk72hw8I3Pwai20Xd1nep2/YeuJ1I1SGEX/8Ugf2mdDr7Vm3y7P23uAp6S4sMsUbh/d+oyeEJrLUhyWi7DYIB17cecza7UNprCnE21eC2NIHoRh6agDIylTHXTOOhh9tW/mzRF/h+Qa/JZEKpVLZ+h70hIiKCHoOGY3E1osKFo74EZcTlrYPqKG63m8cee4w333yTd999l3vv/eEWD78krgYDl0ChULBs2TI0Gg0LFiygsbGRxx9/nEERownxi2BN/lIqTEV8fOZlpiXPJUGTdtnnJJEpkAaG4TLU4NRXEBzbi5GxUxkRM5nFq97lq93LmTR3NFbRREHTWQqaPHUBarnWI1msTiJKnUBAnwlYi0/SdPQb3G7PCrLlX29JTEz0ORho2LUER30p0sCwy14r0B6ywBBiF/yPokXzsJacombty0TMeNqrc5UyFT2DB3Gydj8HKra0GQy0IEikrSvHlvfqsjS1rg5d5kbcViNiS1GcVIbULxCJXyAyTVhzVXyYzz3/Ac3StQaH3qfzfiycxnoqP/8zpuw9AKh7TyBi5jNdVuVebioEPK2WvqC31gKg8/O+bbTlM28rmyBTByNTB+OfOODCa+n1VFVXt7sPbnV5Ajs/6fnbPiaTCalU6nNF/a23zqHg0Cv0jFDhaCj/SQYDdrudBQsWsGLFCt577z2vVBav0jGuBgNeIJVKeeedd9DpdDzxxBMUFBTwr3/9i0Rtd+b2eJzVeR9RY6ngi+x3uCZqPNdGT7zsQjSKkFgshhrsdSX4xbbIzQq89a8PCAwM5OGXnqfOWkW+PpOipizKjAUYHY2crT/G2XrPHqZUJSPwuqFoGpoYf1MqO3aKOETvxVUAEhISKC4uvvQLm7HXFlG39T0Awqf9xusCsMuBIiyRqFv/RtmSx9Hv+5SAbsNRp4/y6tyhUeM4XXeIoqZsChrP+iRZLVVpkKo0HSpe9JZgvwgKGs9SZ6m69It/ZKxlmZR99DjOphoEuR8RM/+EduD0LhtfFN2tjpIXC9zaokWvIdQv0utrNdk8GZ8WkyNvyc3NBWg3GGgpgPSXn19vYjQakclkKJW+pfnnzJnDqp0vAXidpfohqa2t5dZbb2XPnj189tln3HzzzZc+6Sod5mow4CWCIPDvf/+b+Ph4nnzySXbt2sWnn35KWloat/d4nG3FX3Gq9gD7KzZT1JTDtOQ70Pl4M/AFRWgilsJjrfuqAPv37+fgwYOsWbMGQRAIVUUSqopkaNQ4HC475aYiygz5lBkLqTKXYHNZ0Qdp0Adp6JscS9/5gylkP4uOZxDkF4pOGYJOGYpGGYRGEUSgQkuAXHvenmtiYiJ79uzxas6iy0nFF88iOm34p15D4E+gglmdPpqgEXNp2PMJVV/9DdWvVnpV3KdVhjAgfARHqnayuWgl83s92a4ew49BuL+nza7C6Hs9xw9J47FvqVr1AqLDiiI8majbXuxyJ70KUwkWpwmFRElkQPylT2jG7DBgdDQCnqJRb2iy63GJLqSC9LwOH29oqb1pKcz9Pi3GR98PBgwGA1Kp1GenvuDgYCJjEoA6rCYDPyXfySNHjjB79mxMJhObNm1i9OiOS5RfxTuuBgM+8thjjzF8+HBuu+02BgwYwGuvvcbdd9/NpMRbiNeksqloJRWmIj7K+C9j4qbTN/Say9JtoIjwWAfbKnNaf/bKK6+QlpbG1KlTL3i9XKogQZPWuo0him4abHWUV50kd8/bNGn8KZb7oQpRY3YaMBsNlDVL2n4flSwAtVxLoEJL5GgV6bUxHK3Yg1YVhFqhRS3X4C8LQBDOT23XbX0Ha9EJJMoAIm9+7iejdhc66VGMmTtw1JfSsHspoRMe9Oq84dGTyWk4RZO9ge0lq5mUeMtlnqn3tKyAq8ylWJ1m/NryuPgeoijiMjXgMtXjshgQbWZEtxPR7UKQyBCkMiTKACSqQGSBoUj8Ajv8OxRdTmrWvUzDnk8A8E+7lug7/g+pX2CHxrsYOc3ujUm6Hq3qgN5QbvJkvEL8Ilr9Bi5FraUSgGC/cJ+zg0VFRfj7+xMc3HZ9gtHuCUzUct15PzcYDAiC4FPxbwvdunXDXbCPvXv2cNOYu3w+v6sxm80899xzvPzyy/Tr148dO3YQH+99AHeVjnM1GOgAgwYN4ujRozz++OMsXLiQd999l7/97W+MHz+eqIAE1hV8SpmxgM1FK8muP8nEhJvRdbG1rV+UJ8Vsq/AozeXl5bFy5UpeffVVJF7sLwuChGC/MIITxhNx5hT1OxcT22inetRTjJ0xkQZrDY22+mbDmwaa7A0Y7I24RCcWpwmL00SNpRxCYdL9w9lWtuq88aWCtDlg8PgU+DU14c75hoAgDakTf9spSeCuRqJQETr5MSo+fZqG3UsJHnXXRYvzWlBIlUxOnMPn2W9zqvYA0eoEeocOveR5PwSBCh0hfhHUWavI0Z+mzznzEkURR30p1rIz2MqzsNfkY68pxNFQcZ5Z0aUQFP7Ig2Oa1fgSW/voFaEJF3XCs5afpWrV37CWekRyQq67n5DxDyD48KD2FrfoIrN5W6x7kG+6IKXNWwvR6kSvz6k2lwIQqvL977uwsJCEhIQ2AyyL04zd7fndaL6XcTCZTFit1vPUQ73FTypiBlav38S0J20+bzV0FaIosn79eh555BHKy8t54YUXeOqpp5DLu1af4yrtczUY6CCBgYF8+OGHzJ07l2eeeYYJEyYwfvx4nnvuOW4Z8SDHa/awu2wdxYYclmT8h2uiJzIoYkyXtSAqm1OpjoYyXJYm/vCHPxAZGcndd9/t81gh193P2Q2LidEqsBz9lIg5C4gMuPDGIooiFqcJo6MJo70Ro6ORkuoiFi97n4nXX4dKp8Rob8LsNOISXa12yaXG5q2MoR4xl92unQSdyiAyIJ4odTyx6hRCVZE/aqYgsPdEakPfxFFbRNPJjeiG3OTVefGaVIZHT2Jv+QY2F31JkF84MT48PC4n6cED2FO+nrN1R0mXxmI8uwtz3gEshcdwmdpvQ5P665CoApEo/D1OjxIJuF2ITgdumwmXpQm31YBoN2OvzMF+TnYKPMqAiogUFKHx+EWnewyAlGocDWWYcvZ7WizdLiRKNZGznyew94TL9hnk6zMxOZpQyQJI1vrWmljU5Am0fSkKrjR5JJLb+v5civz8fFJS2q5paClkVMs1yKXnP7DLysqwWq0kJyf7fE1no6emJLu0hpdffpnf//73Po/RGVwuF19//TX/+te/OHjwoMcafcMG0tIufyH2Vc7najDQSVqCgK+//ppnnnmG0aNHk5aWxrx58xg5cQLV2hxKjLnsLlvH6dpDjIm7gRRt5z3hpf5a5MGxOOpL2bHyAz7//HMWL17s874hgETpz0f5gfyqRxOpshqqvn2JiOlPXWhw1GwD6y9Xt+5J9wwazKz/zGNM1Azuf/RRAFxuFyZHI032RuqrMig58DEmhQRrWCQmnRaz00iDrZYGWy2Z9R4NeJUsgCRtOqm63iRquiOX+i5v3BkEiQTt4JnUrn8V4+nNXgcDANdEjafKXEqePoOvcj7gtvRHCFFdfhGlS5HiDmavCMWGXI5/eQuapu+EdAWp3KOKF53uWc2HJSIPiUOmCfeqxdJtt+BsrMZeX+JR5avOx1aZi60qB9FuwVZ2Bluz8FJbBPaZRPj0p5Bpwrvs/bbFkSqPtW/v0CFIfQjEG2111FoqERCI9zIYEEU35c01Gr7UJrSQn5/PxIkT2zxWb60GuMB62Wg0UlVVhSAIJCX5ZrPudtiwN/s7TJo9n+eff56ZM2eSnn75ClvBs6g4efIkK1eu5NNPPyU3N5exY8eybt06Jk+e/JPZPvylcTUY6AIEQWDmzJnMmDGD7du3s3jxYl588UVMfzbh7+/PTQ9Ood9NSeip5evcD4kPTGNs3A2E+V9cS/1S+MX3xVFfysaPX+f6669n3rx5HR7LpI7j7dOZPNJXpHHvJ0jlCkInPXrJ1K1MJiMtLY3MzO/c8KQSKRplMELeCcwr/kGq3YxffF/iZvwNiTIAs8NAlbmMClMx5cZCyowFWJwmztQd4UzdERRSP3oED6Bv2LWtQccPQUDatdSufxVz4bHmfXLv0taCIOH6pDv4PPttKkzFfJH9Drd2f/CCG/cPgcvSRNOxtTQe+Qpb+VkihvWhMjaCvG6JDK9VENB9JP5Jg1DG9PRaV6EtJAoVijCPsx/dR7b+XHS7cdSXYqvKxV5TgLUsE5exHrfViMRfg3/yUAK6XYsqzncVQV8pNxZSasxHIkgYEO5dl0gLOQ2eLYzYwGRUMu/24mstVVhdZuQShc8tjG63m4KCgnZX93VWTy1CiN/5QWZOjicrI4oi3bv75rVhLTsDLifSgCCe+s2/+OTrjcydO5edO3d2qP6gPVwuFydOnGDnzp3s27ePffv2UVJSgk6nY8aMGSxdupRhw4ZdeqCrXFauBgNdiEQi4brrruO6667j/fff5+jRo+zatYs9e/bw6txl9JuRyujbB3q2Dk6/hF9jEGMSp9M7tV+HouEqgvAHhsT585t/fNCpiLpHjx7897/rkDnDeWCgivodH2KryCbq1r8jDdBd9NxevXpx6tSp1v93O6zUbX2H+u0fAOCfMpToO19q3Yf3lweSpE1vbcdzuZ2Um4rI02e0FuSdqNnHiZp9xAemMTTquh9Ev0EZmQYSGaLdjNNQ65NEslyqZGbqQlZkvUG9tZrPshZxa/eHfrCAwFqaQcOeZRhOb/5u318qo489hEqgLCEK5dRfE+Kj6I6vCBIJitB4FKE/btGXKIrsKfNkJXqGDPa5sj+r/jgAaUHeBy1FTVkAxKiTfCpUBE8bndVqJSGhbWnsarNHsfD7C4iMjAzAsyDp37+/T9c0Ze4APN9Pf39/VqxYwciRI7nhhhtYuXKlT9LkLVgsFk6ePMnRo0c5efIkp06d4sSJExiNRpRKJYMHD+bWW29l/PjxjB8/vkMGZ1e5PFwNBi4TcrmcYcOGMWzYMJ566ilEUSQ3N5edB7dRIs8gMFmOLUjP2tol/Ht5AbIKLdf0H8Hw4cPp3r37RQtnSkpKeP311/n8g/+x/r5u9I5QEKLpnP78tGnTePbZZ6kMmcpftu7i+cnRmLL3UPDyTQSPXYhu2C3typUOHDiQv/3tbzjtNixZO6hZ9yqOBo/im+6aOYRPf8qz99wOUomMuMAU4gJTGBM7nRJDHidq9pPTcIpiQw7FhhwSNd0ZGzfjsqbfBYkUmToYZ1M1LmOdz34J/vIAbu3+EJ9nvUWdtYrlZ99gVtq9RAT4tkr0FtHtxpS9m/pdH2HJP9z6c0VkGrrBN6HpPw1pgI6S/E84W3+MrcWruK37wxd0eVyJ5DdmUmzIRSpIuTbKt5qEemsNleYSBCR086HosLC1xsD31sgWKeG2OglEUaTK5ClM/H7G4eTJk/j7+9OjRw80mrYlk9tCdDlpOrEOgMDe4wHo378/69atY8aMGfTs2ZOnn36au+++G6227UDK4XBw9uxZjh49yp49e9i3bx+ZmZmt8sjp6en07duXGTNmMHz4cIYMGfKjFShe5dJcDQZ+IARBIC0trbUwpsJYxPaiNZRTQL+pqbhdbrZ8+yXPXP979OUGUlJSSE9PJyEhAblcjtvtpqGhgfz8fHbt2kVAQABPPfU0cvVRj61q9l40fTtu3DFw4EASExOpqalh88FSbn3gKfo17sBenU/Nt/+hfseHrRa4ivBk5NoIRLcTt8XAuFQt1YMCyXlxChKL56Ym00YQPv23PheHCYKEeE0a8Zo0Gm31HK7awcma/RQ2ZbEk4yUGRYxieMwU5JLLVGXc8qD0QZb5XALkgdzS/UFWZr9LjaWcFVmLuDF1foceEO0hiiKmzB3UbnoTW6XnAYREhqbvZHTDb8Mvtvd5WaJRMdPI05+h3FjI8Zq9DAgf2c7IVwYOl52txZ7uloERo9AofZO7PlVzAIAkbfdWJcdLYXfZWrsPfBGgaqG62lMTEBp6YddRg60Gq8uMTJCdp3dQU1PDBx98gNvtZty4cT5dz5CxBWdjFdKAIAJ6jG39+ahRozh9+jR//OMf+e1vf8tvf/tbhgwZQp8+fYiLi6Ouro6SkhLy8vI4c+YMdrtHpKx3794MHz6cxx9/nIEDB9K7d++rD/6fGYLoixj9Vbqc4qZcDlRsptjgUR9DBGlDAOUHGzm1J4uSkhKcTieCIKDRaIiLi2PKlCnMmTOHwMBAqte9TMPOJQT2mUj0Hf/u1FxWrFjBbbfdRr9+/SgtLeXA/r2E1J+ibsvbOJuqvRpDGhCEbuhsgsfc3WXqgg3WGnaUriFP70mJBvuFMy3pjsuy4s55fiRum5HEX69C2YZZjLfYXFa+yV1MsSEXAQnj4m9kQPiITs/PnH+ImnWvtrblSZQBaIfeTNCIuRfNZByr3sPW4lXIJHLuSH+cMP+fTmtnV7O9ZDVHqnaglmu5u/fvUEi9fyg53A7eOfkCVqeZG1MWkBrU+9InAdkNJ1md9xFaZQgLe//e5y27Dz74gHvvvRez2Yyf3/niVadqDrCx6HNi1Enclv5I68/nzp3LV199hdVq5cyZM17XDIhuF4Wv3oK9Op+Q8Q8QOuGhNl9XVlbGN998w65du8jIyKCsrIywsDBiYmJISkqib9++9OvXj759+6LT6Xx6v1f56XE1M/AjE69JJV6TSpmxkIMVW8lvPIMr2ETEFBl9Z01mQPgIugcPaLclUdNnEg07l2A8uwu3zdypB/CcOXPYuHEjn3/+OWFhYdwwYyb79+8neeAMzHkHMWRsxlJ4HEdDGaLzO9liRVgi2zLKKHEF8+f3VneqMK0tgvzCmJl6N3n6M2wq+px6azWfnn2dMXEz6B82vMuqj902E26bR/JVpuncXr9S6sdNafeysfAzMuuPsrV4FXWWSsbF3ehTVXsLDn0FNWv/i+HUJsBjXhQ0/A6CR89H6n/p/fD+YdeSrz9DYVMW3+QtYW6Px70SIvq5UdKU29pBMCHhZp8CAYDMuiNYnWY0iiCSdd63IrbWGOj6dOjvMTc3l9jY2AsCAaBV/CtG/V1wunbtWpYtW4ZWq2XWrFk+FQ827P4Ye3U+EpWWoJF3tvu6mJgYHnroIR56qO1g4SpXFlczAz8xaszlHKnaxdn6Y63+5f4yNb1Dh9IrdAjB3ytIE0WRgpdm4KgrIWrOP9H0v1B90Kfr19SQnJzMrbfeyooVK7j//vv573//e/413W5cZj2CTIFEoUKQSHnqqadYuXIlBQVtqxZ2FRaniY2Fn5Or96yMe4cOZUL8rA49YL+PtTSDojfmIlUHk/rM1k6PB57fz6HK7ewqWwuIRAbEcUPyPDRK74qzRLcb/b5PqdnwOqLDCoIE3bDZhFz3ALJA3+SuzQ4TSzNfxmDXE6tO5uZu911gh/tzxmBvZOmZlzE7jfQJHeazIqRbdPHh6X+jt9UyKnQcfYRYRLcLaYAORVhSuw95m9PCWyf+glN0cmePX3UoY3XbbbdRWVnJ9u3bLzj2/qkX0dtquSn1HpJ1PTEYDPTu3RuJREJlZSVZWVleq/RZy89SvGgeotNO5M3Pox080+e5XuXK5MqvJPqZEeYfzZSkOdzf98+MjJmKWu7pyz9YuZUPT/+LT8/+j9O1B3G4PBXjgiCg6ecJABqPftP564eF8eSTT/LJJ5/w+OOP89prr7Fs2bLzrI0FiQSZOhipn7q1/W7gwIEUFhZSX395DU9UsgBmpMxnTOx0BARO1x5kZc67WJ2WTo9tq/Ls+SrCOr498H0EQWBo1Dhmpt6Nn1RFpamEjzNfpqAx85LnOhrKKXnvPqrX/BvRYUWVNIiEx5YTceMffQ4EwFPgODP1HhRSP0qN+azNX4bL7erI2/rJ4XQ7WJ23BLPTSJgqinFxbdsAX4ys+hPobbUoXRDw/vMUvzWfknfuofDlWeT/3zSqvnkRe33pBeedbTiOU3QS4hfhs0VyC5mZmW329xvsevS2WgQEYtRJ1NfXM2bMGGpraykvL+d3v/ud14GA01hP2ce/RnTaCUgfjWbQjR2a61WuTK4GAz9R/OUBDIsaz319/8iMlPkkadMRECg3FrKh8DMWnfgLa/OXUdB4loAB0wAw5+5v82blK7/5zW9axYtmz57N3Llzee211y56jtFoRCqVtpnm7GoEQWBw5FhuSrsHhURJiSGPFVlvYrQ3dWpcW5WnbkMZ2fVtjCm6ntzZ81eE+8dgdZr5Mud9tpd8g8vdtge9KWcfha/fjqXgCIJCRcTMZ4i7771Om/iE+0dzY8oCpIKUHP0pVud/hLOdOfxccIuuZivxYpRSFTNSF1yg0ncpXG4ne0rXApCYmYvM6UCmi0IemoAgU+LUV6Dft5yCl2ZSufIv59XQnK45CECv0CEd2iJwu91kZ2e3GQy0qCBGBMTSWG9gwoQJlJSU8NRTT+FwOHjqqae8e3+WJko/fBinvgJ5cBxRt/7tqrjPVc7jajDwE0ciSEkL6sOstHu5r++fGBkzDZ0yBIfbTmb9Ub7MeY8PSj7gzNgx1IboqN+3vNPX1Gg09OrVi9LSUpYvX869997LX//6V7744gscDkeb5+zbt48+ffp0SAGxoyRpezAn/REC5IHUWipYkfUGTbb2ZXYvhb2mEABFuO+yrt6gVYZwe/qjrdX8R6p2suzs6xfYDDfs/ZTSDx/BbWnEL6YniY9/hm7YLV12847XpDIjZQFSQUaePoNVOe9j64LMyo+BW3SzofAz8vQZSAUZN6bM75Bb6Ima/TQ69CitNrrVOYh/cDEpT68j+cmvSf3zdmLmvYZ/2nBwO2k8vIqC/86ifvfHVBmKqDSXIBGk9AoZ3KH30GIyZDAYLjiWVeMxWTq7p4CkpCRKS0vZsmULTU1NpKSkEBh46W4Hh76SknfuxVZ+FmlAEDHzX0Oq8r4N8Sq/DK4GAz8jAhVahkVdxz29f89t6Y/SL2w4/jI1VpeZ/BA5+8cM4gttMZvyPqWwMavdVac3REZGUlHh8XL/y1/+QlpaGrfccgtqtZqPPvrovG0Di8XCli1bGD58eKffo6+E+0dzW/qjaBXB6G11rMh6k0Zbx7YqWrQRFCG+68p7i0wi57r4mdyYejd+Un+qzWUsPfMyR6t24Xa7qNnwGtWr/wWiG+3gmcQ98OFlmU+yrgc3pS1EJpFTbMjhk7OvUW+t6fLrXE6cbidr85dxpu4IAhKmp9xFnCbV53HMDhN7yz0CRWmZ+cTd8iKqhP6txyUKFeoeo4m7503iH1yMX2xv3DYjNd++xK4d/wAgVdf7Amthb2kRDPrkk09oavouu1VRVU5WjUfM66NXVjB79mxOnTpF3759yc3NpVu3S2eJzIXHKHpjLrbKbKTqEOLufbdTXTJXuXK5Ggz8DBEEgRh1IhMSZvFAv2eZ3e1+eoUMQe50Y/NTcLLhCCtz3mXRiedZV/ApefozON1tr+jbQyaTtfYQ63Q6XC4XISEhuN1u5s+fzwMPPMDBgwfZtm0b119/PTU1NTzyyCOXGPXyoFOGMCf9YXTKUJrsDXyWtahDGQJnk+dheLn18gFSdb2Y3+tJEjXdcYpOtpV8zfL9z1J2wGPpGzrpUSJmPdeu0FNXkKBJ47buj6CWa2mw1rAs81XONlfF/9SxOs2synmPrIbjSAQp1yfPJVXXq0Nj7Sr7FpvLSqDeQKrZH1V8+6qDqoT+xD+0hIhZz+EICqMkzJMJSzid6XX7bVu8/vrrVFRUMGXKFJYuXcqf/vQnrr9zAkp/OdZGBzKrP9u2bUMm8xTKBgYGYjKZ2h3P7bBRve5lSt5ZiMtYhzKqGwkPf4wy0vdg6Sq/DK52E1xBNJxYx6nt/6E6NpqalBTMTmPrMblESZI2nRRdT5K1PS7ZVjZs2DB69erF+++/z2233caaNWvYtWsXoaGh9OrVC7PZjNvtBiAqKopPP/2UMWPGXNb3dymM9kY+y1pEg60WnTKUOd0fQu2DDG32s9cgOqwk/24t8qAfxhNBFEWO1+xlR9FXuAQRmcPJNdI0hg55+Afb0zU5DHyTt4RyYyEAPYIHcl38TfjJOqdqebmoMpWyOv9jGm11yCVKZqTMI1Hrmy5/C0VN2XyR/Q4Aw7cfIqXXTMKn/tqrc7cXrORI3T50dXpGbj+MoFARPGoeQSPmdigNv2XLFn71q19x+vRpNBoN1z85gkHTejIgfCRpwiAGDBjA2LFj+eKLL/jtb3/LqlWryM3NPW8MURQxZmyhZv2rOOo8JkSaAdOJuPGPXab7cZUrk6s6A1cQuj6Tidv2PhGHT6FT9sUxZh5ZDSfIbTiN0dFIdsMJshtOIBGkJGjS6B7Un1RdL5Tfu+mLokhOTg4zZsxgxYoVfPbZZ3zxxRcMHDgQgAceeIDFixfzySefkJSURFRUlFd7l5cbtULLLd0fZMXZN9Hbavk8+23mdH/Y6/StIJEiwnkaCpcbQRBIKqrCvXEPJwb1pCFUx24KKM15j4kJN/usntcRAuSB3NrtIfZXbOJAxRYy649S1JTD6Njr6Rky6CdTaOYWXRyt2sXusnW4RBcaRRAzU+/usOGXzWVlY+HnAKRUWwmua8Qvyjv1QIvTxMkGj+PmiJTZ+OXbsRafpG7L2zTs+YSg4Xegu/Y2ZGrvf3/jx4/n1KlTlJaW8tY7i1CN9tQQdA/qR0xgHK+++ip33nkne/bsITo6msrKytZzRZcT45lt1O9cjLXUI84lDQwlcuafUPcc6/UcrvLL5Wpm4ArDlL2X0g8fBomMxMdXoIxIQRTdVJpKyWvMIE+fQa3lu5uIVJCSoOlO9+B+pOl6I5cqycvLIzU1lW+//ZZnn32W0NBQ1q//zop23759DB8+nJ07dzJqlG9ucD8EjbZ6lp99A6OjkXD/GG7t9uAFAU9b5L90I47aImIXvkVA6jU/wEybf19LHgO3i6Dr7qOoT0/2lG3AJTqRSxSMir2e/mHX/mB+AmXGQjYUrqChuX4gKiCB0bHTiA1M+UGu3x6VphI2FX1BtdlT15Gi68WUxDmdEk5am7+MzPqjaBXBjNy4B6GujPiHPkIV3/eS5+4qXcvByq2EqaK5q+evQRQxZmymdsvb2JtbVAWpnMC+k9EMnI5/0mAEqfdrr3t+ewe95kQTINdwf98/IREkuN1u+vfvT0JCAnfccQd33HEHdfmncOVsp+nYtzj1nhofQe5H8Kh5BI+e32oOdpWrXIqrmYErjIBuw1H3GIsxcztVX/2NuPveR5BIiFLHE6WOZ2TMVOosVWTVHyer4QT11mryG8+Q33iGLRIl3YP7U3nSU8SkUCg4cuQIq1evPu8aQ4cORSaTcfr06Z9kMKBVBjO72wOsyHqDanMZq3I/4Oa0+5BLL66M6BedjqO2CEvhsR8kGLBV5VK+7LfgdqEZMJ2wCQ8TLgik6HqxsfBzyowFbC1eRWbdUSYlziZUdfklhGPUiczr+SRHq3ayv2IzFaYiVmQtIi4whcERY0nSdv9BjY7qrdXsKdtAdsMJAJRSFaNjp9MndGinMhanag6QWX8UAQnTku/AaFiNCEi9WMkb7Y0crd4FwPCYyZ55CAKBfSah7jUBY8Zm6ncuwVqaQdOxNTQdW4NUHUxA91EEpF2Lf9LAS9alqFM8t+buQf2QNH/eEomEJx++l4//+yxJNXGsvz+dmne+UxCU+uvQDbvFk5HogA7FVX7ZXM0MXIE49BUUvDwL0W4h7PonCR55V7uvrbVUklV/grP1R9Hb6lp/Xp1fj6vEjy8XrSMnKxep9HxL1sjISB555BH+/Oc/X7b30VmqzWV8lrUIm8tKoqY7M1PvvqhSof7QKqq+/AvykDiSfvM1guTyPfScxnqK37wLR0MZqqRBxN6z6DwZZ1F0c6x6L7vL1uFw25AIEoZEjGNY9ITLZ9L0PYz2JvZXbOJU7UHcokecKMgvjD6hw+gZMpAA+eVpTxNFNyWGfI5V7yZPn4GI5xbVI3ggY+Kmd/q6laZilp99E5foZGTMVIZGjCP7Gc8WWMqftiELuLg65IbCzzhde5CogARuT3+03aDEUnKKxkOrMGZsxWXWn3dMGhiKMiIVeXAMcl0kEpUWqZ8aJFJsgovFpk1IZFKmG2LR6g046kqx1+S3Frm24EZCYPcRaAZcj7rnWCTyy6/zcZUrk6vBwBWK/uAXVK36G4JMQfyDS/CLubjOuii6KTXkc6r2IBnVh5HIPA9C0SowNvV6+oVde56QS58+fRg3btwlxYh+bMoMBXyR8w5Ot4NuQf24Pnlu60rr+7htZvJenITbaiRy9l/RDvJdxc4b3DYTJe/eh7XsDPLgWBIeXoo0QNfmaw12PVuKV7WaNOmUIVwXf1OHnPE6SpOtgaPVuzlVsx+7u1n5slkRL1XXmwRtN0L8Ijq1Une5XVSaisnVZ5DVcByDXd96LEXXixHRkztcG3AuTbZ6lp19HZPDQIquFzemzEd02Mh57loA0p7fe9FCuypTKUszXwVEbk9/jGh1wiWvKbocmAuOYMrZhzlnH7bKXBDd7b4+PzWOM/26o9EbGL3lwAXHy81SCs0K9hVbkMUP4M13P7z0G7/KVS7B1WDgCkUURco//jXGzO3Ig2KIf2TpJVc8LfQd2JvJ80ejTHESFOlZhfnL1AyLmkD/8GuRCFLGjRtHVFQUy5Ytu5xvo0sobMxiVe4HuEUXvUIGMznx1nZT3XXb36d2w+tIlAHEP/wxyi4WIHI77ZQtfgxz3gGkAUHEP/AhirDEi54jiiK5+tNsLf4Ko6MRgG5B/RgbdwOBCl2Xzu9i2FxWztYfI6P2MBWmovOO+cvURAbEE+4fTbBfBFplMGqFFj+pCrlEgSAIiKKIw23H5rJgsOtptNVTa6mkylxKubEIR3OgAZ7ul54hAxkQPpIQVftujL5gdVpYfvZ/1FmrCFNFMSf9EZRSP1yWJnL/OhqAbi8cQpC1nXkRRTfLz75JuamQ9OABXJ88t0PzcNst2CqysdcU4Ggox9lUjcvShNtqwu12sq5HICaVjG5ZjQxRxSHThCHXRaEIT0YRnsSrb77LH//4R26//XaOHz/OsWPHOvyZXOUqLVytGbhCEQSByFv+StH/7sBRX0rZx78ibuE7l+xbF0WRnMw8JhZP5sWnXuHr/cupUOTSaKtjW8lXZNQdYmLCzYSGhlJbW/sDvZvOkajtzvXJc1mTt5SMusPIJQqui7+pzZVs8OgFmLL2YCk8Ssm79xF379soI7qmN9tlNVK+9EnMeQcQFCpi5r9+yUAAPL/LtKA+JGjS2Fu+kaNVu8luOEFBYybDoiYwKGJ0u66WXYlS6ke/sGvpF3YtjbZ68vQZ5OnPUG4qxOw0ttaetPEOEKA52d/+2sNP5k9CYDe6B/cjUZvepdshNpeVL3Pepc5ahVqu4aa0hSilzSn1c9dDF8lunKo9SLmpELlEwejY6R2ei0ShQpXQD1VCvwuOFTflYMp+G6vJTli3u4kccqGQ16hRo7DZbISFhXH69GmsVusPIgN+lSubq8HAFYxUpSFm/msUL5qPtegEFZ8+TfQd/2535QNQX1+P1WrF398fl9NN79ChTImbxenaA+wqW0e1uYxlma/TfUo06xbl/4DvpnN0C+rLlKQ5rCtYzvGavUgEKWPjZlwQEAgSKTF3/peS9+/HVpFN0Rt3EjblCXTXzOlUDYGjoYzSj36FvTIHQeFP7LxXUcX19mkMhdSPsXEz6BkyiC1Fqyg3FbK7bC0ZtQcZE3cDydqeP1gboFYZzMCIUQyMGIXT7aTKVEKVuYwaSzl6ay2N9npMjibcohtad/09SAQJarkWjSKIYL9wwv2jiVQnEK6KuizFiXaXlS9z3qPCVIyf1J9Zafedn1HxIhgw1ho10wAAYB5JREFU2PXsKF0DwIiYKQT6oF/hC8er9wJwdN0Zxt7QduDUv39/VCoVJpMJp9NJQUEBPXp4b7d8lau0xdVg4ApHGZ5MzF3/pfTDRzBmbv//9u47Oqpya+Dw70xLMmmT3gsBElroRUCkE0ARUEAUPwUUKyJiu4qgqCiiXBHFLmBBQEFApUvvvZdAeie9TJLp5/sjEs1NgABpwPuslbWSM6e8ZwiZfd6yN2lLXsHvwQ8qTFb7t0tP+5cynbm4uKBUKGnj3Y2mbpFsS/6Ds7lHcGujpudzrSgxF6FV13+Ogepo4dEBi83MpsTlHMnciSRJ9AwcUukDVOmoI/Cxr0hf8h9KYveT+ccHFB75A/de43Fq0bu8UmN1yFYLeXuXkr1pPrKpFKWzJ4GPfnrVORxX4q0NYHSzZzmbe4QdKX+SZ8xmVcxCgp2b0itoSI2MrV8LlUJFgHMjApwrprm9NCxgKq+wCRqFHaq/hw3qQolZz8oL35FRkoyd0oER4U/gpb22VRmyLLMh4RdMVgN+jsHltSVqWr4hu7w0957lx3iit77K/dRqNW3btiUtLQ2AtLQ0EQwIN0ykI74NaMM6EfB/c5FUGvRntpK6aCLW0qor/F1KQezp6QlATs4/Kwy0amcGhz3EkMaPIFsgoKUXi8/eXDntW3vdQf+QEUBZoaCtyauRq5jMpXJ0I3D8F3gPfR1Jo8WQeoa0xS8R98EgLv7xAcWxB7AZq04HK8syptwUcrZ+Q/ycoWSt+QjZVIpDaDtCnvnphgKBSyRJooVHB8a1epXOvn1QSkqSii7w45mP2ZjwK3pTwQ1foybaqFHa4aRxwUnjgqPaBbXSrs4CgTxDNkvPzSejJBl7lZYR4U/g4xhYVUP/+b6K34VjWXtILDyPSlIRFTr6shNQb9ShizuQkQlwCCMjNueK6YYdHf/JH3Cphogg3AjRM3CbcAzvRsCjn5L642RKYg+Q9MUj+D/830oT5C79ofbwKFunnJaWRpMmFcfMw91aIx/2IDcgDgJh2bnPGRXxNB4OtZ/Tvya09roDGZm/EldwNHMXFpuZfiH3V/ojLykUuN0xCudW/cjfu5S8vcuwFGaSv2cJ+XuWgCShdg9E5eKNUqtDtpqxGYsxXYytsJRM4eCK18BJuHYcXuPLFe2U9vQIHExrry7sSFnD+bwTnMwuW0Pf3rsHnXx73VBinptVQsF51sT9hMFagovGjfvDJ+Buf5nfz38FA7Is8+9QJbMkje3JZXk2egTeXWu/48XmQk5ll5VC7uTbu2zbFYKBmJgYhg0bVittEW5PIhi4jTg26ULwkwtJ/eF5TFkJJM5/GJ97/4NL+3+6yi8NDzg5laXwzcqq+qnfmGfl57kbeHvVZLJK01h+/iseaj6p1sZSa1obr66oJBUbEn7hZPZ+jFYDgxo9WOVEPJWTO579n8G912OUxOyj6OQmSuIOYSnIwJyTXJ4DvgKFCoeQNrh2HIZzq34oNLWb59/VzoMhjR8htSieHSlrSCtO4EDGFo5n7aWjT0/a+dz5z4S5W5hNtnEgfQt70jYgI+OrDWJok3E4aS6fm6DCsM+/egYMllL+jP0Bq2whzLV5rQ0PABy5uAurbMHPMYRGbhEolcrLBgPFxcUkJCTg7182HOTjUzOrLYTbmwgGbjP2/s0ImbiEtCWvUBp3iIzl09Gf3YbP0NdROXsSHByMJElkZGSgVCovGwxkZmbibO/KiPAn+SX6c3IMF1kds5AHIp65aqa/hqKlZydUCjVr45dwPu84pRY9QxuPvWzqYoXaDqfmPXFqXlaQyVKUgykzDktxLtbifCSVGoXaAbVHEHa+TWu14uDlBDg3YnSzZ4ktOMPu1HVkl2awO209hy/uoIPPXbTz7l6t1Mw3owJjDuvil5KqjweglWdn+gYPR3W1VQn/CgZkqwXUZUHF2vjF5BmzcdboGNhodK0Nb5SYizmauRuAzr69USgUuLm5VRii+7djx44B/wzl+fr61kq7hNuLCAZuQyond4Ie+4rcHYvI/usL9Ke3UBJ7AM8BE9F1GUlISAhnz57F09OzfJLS/8rMzMTb2xut2pFhTcez+OwnXCxJYXvKH/QLub+O7+j6Rbi3xV6lZXXM9yQXxbI0+nOGNxlXrQJBKmePBpn2VZIkmuhaEubanPN5x9mTtpE8Qxa709Zz8OI22np1o533nVd8Wr6Z2GQrRy/uZnfaBsw2I2qFHX2Ch9HKs1O1jpeU/wQLsrWs1PfOlLXEF5xDJakY2ngsDqray/F/6OJWzDYj3toAGv9dhjkkJISEhIQq99+7dy8ODg4kJSXh5OREeHh4rbVNuH2IpEO3OUPaOTJ+extjatn6cI1PExZHw7frDtGpUydOnz7N6dOnKz0V9ezZE39/f5YsWQJULAX7QMTT9V7Y5lpdLE5hZcx3FJuL0KqcGNpkLP5OofXdrBphk21E5x5jf/pmcgwXAVBISpq7t6OdTw98tAH13MLrl1wYw9bk1WSVlk2iC3BqxKBGo3G1u7YgLfqNjmC1EPbqes6Y4vgr6TcABjd6iOYe7Wu83ZcUmvJZcHIWVtnCsCbjaaxrAcDIkSPJzc1l8+bNlY7p0qUL7u7upKSkEBkZeVMk/hIaPrGa4DZn79+MkGd+xHvo6ygcXDBdjGGkLoZ3uqvo2cyHs2fPsmPHjgrHWCwWTp48SYsWLcq3hbiE09qzrLjPpsQV5bnsbxY+joE81GwSXg7+lFj0/BL9BSey9nErxMoKSUFzj/Y82vJFhjYuC3JsspXTOYf46czHLDn7GWdyDmO2meu7qdWWUZzMivPf8Mv5L8kqTcdeqaV/yAgeiHj6mgMBAIWmbJJlTN4pNietBKCbf1StBgIAe9M2YpUtBDqFEeb6zyqTpk2bcuHChUr7//XXXxw4cIBOnTpx6tQpxo0bV6vtE24fomdAKGctLSRn67fk71lS3l16NFNmS54HX/+2pXy/hQsXMn78eI4cOUK7du3KtxsspXx36n0MlhL6hdxPG6+udX4PN8pkNbI+fikX8k8C0NKjE32Dh1Woy3ArSNMncjSzLJOh7e9Jc3ZKByLc2tDCowP+TqF1tgSwumTZRkJhNIcytpNUFAOUBTqtPe+gq38UWvX1d+XHfTiENFUxB3t0xEZZsq0BISNr9T3IKknjhzMfU1bnYGKFnqhFixYxbtw4iouL0WrLAhWz2Uzbtm1xc3PDaDRib2/Pjh07Gty/k3BzEsGAUIk5P53TP7+LKmEXamXZH5oLBhe8Bz2Pe1gbevXqRbdu3fjll18qHXvk4k62Jq/GRePGY5Gv1dqa7NokyzIHM7ayK3UdMjLu9t7cHfYw3nWczKcu6E0FnMo+yMns/RSa8sq3O2t0hLu1oalbJH6OwfX671hozOVs7lFOZu2nwJQLlAUBzdzbcYdff9zsPW/4Ggd+foLdjR2xKZU0dYvknrCHUUjVTy51rWRZ5tfzX5JcFEu4W2uGNH6kwuunTp0iMjKSRYsW8eijjyLLMlOmTOGzzz7j448/5rnnnmPjxo3079+/1too3F5EMCBc1mOj7qGtFEf/MDskZKw2mZUnc5m3K5MdB08QERFR6RiLzcxXJ97BYCnh3sZjaep2bSl3G5KkwhjWxf+M3lyIUlLS1X8AnXx71eqHRG0wGAysXbuWgIAA2rVrh0ZTebVHWdngWE7nHOJC3knMNlP5a/YqLaEuEYS4hBPs0hSXWi6OJMsyOYYM4vLPEpN/ukJRJDulPS09OtHB5y5c7KpXeOtqYvNP8/v5hdgUEGR25P4u065Y6romnMs9xpq4n1BJKsa2ernKoY2RI0eydetW3nnnHTZu3MiqVauYM2cOCxYswM3NTfQKCDVKBAPCZZ04cYI2bdqwYsGndFbHU3y6bDKTTWWP3z0v4trp/iqT6OxMWcuBjC2EuTZneNPH6rrZNarEXMyGhGXlBXh8HYMYEDLqmlPa1pc///yTxx57jMzMTABatGjBwYMHy7ueq2K2mUkoOEd03nESCqIxWksrvO6s0eHnGIKPNgBvbQDu9l44a3TXVVdAlmVKLXqySzPILEklvTiJlKJ4SixF/9pLIsg5jObu7Wnm3rZGh2xOZR9kY8KvyNjwSc3kriJPgh/+b42dvyomq4GFpz5Eby6gm/8AuvoPqHK/7Oxs7r//fnbu3ImPjw9ffPEFeXl5jB8/nkOHDtGhQ4dabadwexHBgHBFAwYMICsri8OHD2NMPknmn7MxpJwGQNvkDvweeA+VU8VleDmlmSw6PRuFpOCpNm/W6rKsuiDLMmdzj7AlaSVGqwEJibbe3ekeMLBBJ/LJysqiZcuWtG7dmnnz5pGens6QIUOYMGECn3zySbXOYZOtpOkTSCg8T1LhBTKKU5CpnLJXKalw0ehw0rjiqHbBXqXFTmmPUlKhkJTIsg2bbMVkM2KwlFJiLkJvLqTAlIvJaqh0PpWkIsilCWGuzWmia4VTDSezkmWZvemb2Ju2EYAIuzAaL/kGlZ0TTd7YUmG5YU3blvw7hy/uQGfnwSMtX7pqdcZL8wZsNhuRkZE0bdqU1atX11r7hNuTCAaEK9q1axc9evT4Z+zSZiV/71KyNnyKbDag0vkR8Mgn2PtVXOv8w+n/klWaxsDQ0bT07FhPra9ZRaYCtiWv5nzeCQAcVI508x9ApOcdKK+heFFdmTVrFu+88w5xcXHlWeqmTZvG3Llzyc/PR6m89jabrUbSi5NJL04iqyStrEqhMecGV49IuGrc8HYMwEcbSIBTGL6OQbVWltlsNbEh4Rei844B0Mm3F3f6DSTu/f5Yi/MIeOST8sRSNS1dn8iSc58hI3Nf08do5Fr9OhU///wzY8aMYe/evdxxxx210j7h9iWCAeGqRo8ezc6dO4mNjS2vm268GEvqjy9gzklCYe9E0IRvsfdvVn7MrtR17E/fTIR7W+4Je7i+ml4rEgvPsznxN/KMZRUedXYedPUfQDP3dg1qwuQLL7zAxo0bOX36dPm2DRs2MHDgQGJjYwkLC7vC0dVnk60UmvIp+vur1FyMwVqC0WrAarNgla0oJAUKSYFGaYed0gGtygknjQvOGjd0dh5XzxJYQ/IMWfwR+wNZpekoJCX9gu8j0qsLAJnrPiZvx/fYh7Qh+ImFNV5HwmKz8NOZj8kxXKS5e3sGhz1U/WMtFlq0aEFERAR//PFHjbZLEEAEA0I1REdH07x5c+bOncukSZPKt1tLC0n9fhKlicdQOnsS/NT3aNzLEtgkF8XyS/QXOKldebLNtPpqeq2x2qyczN7HnrSNlFrKcsi723vTwecumnt0uGrXb1145JFHiI+PZ+fOneXbUlJSCAoK4vfff2fIkCH12Lq6F517jI2JyzFZDWhVTgxp/H8VkmOZCy4S/99hyKZSvIe8ilu3B2v0+jtS1nAwYytalRNjW718TcNnP/zwA48++mil5byCUFMazmOM0GBFREQwYcIEXnvttQqJUJQOLgQ8Og+Nb1OsRdmk/TQF2VKWn8BHG4iEhN5cgN5Udbnkm5lSoaStd3cmRL7OnQGDsVM6kGvIZFPicr458S67UzdQbK7f+87NzcXdveJ8joCAAOzt7YmNja2nVtU9o9XAuvgl/Bn3EyargQCnRvxfixcqZclUu/rgNfB5ADLXzqE4Zn+NtSG1KJ5DGdsA6Bcy4poCAbPZzKxZsxgyZIgIBIRaI4IBoVrmzJmDj48PkydPrrBd6eBC4NjPUGp1GNOjyd25CACN0g7d3+u/s0sz6ri1dUettKOLXx8mRL5Oz8AhuGjcKLUUsy99E1+fmMnqmEVcyDuJxWap87bl5uaWl6K+RJIk3N3dKSgoqPP21If4grN8f/ojzuQcRkLiDr9+jAx/6rITEnVdRuEc2R+sFlJ/nIz+7I4q97sWRkspa+N/RkamhUeHa15uO3PmTM6fP8/06dNvuC2CcDkiGBCqxcnJiVmzZrF27Vo+//zzCq+pXX3wvudlAHK2LcBSVDaW7mFfNmkt15BZt42tB3YqBzr69mR8q/9wT9jD+DuWpfyNyT/F77Hf89WJt9mStIqM4qQ6S3Gck5NTqWcAwNXVlfz8/DppQ33RmwpZG/czv134jiJTPq4ad0ZFPEP3gIFXnOwpKRT4jpqJtmlXZFMpqT8+T87Wb5Bt1zdBUpZlNiWtoNCUh6udB32Ch1/T8X/99RczZ87kjTfeoGPHW2MirtAwiaqFQrWNHDmSffv2MXHiRIxGI5MnTy5PeuLcdjB5e5ZgSDlF7vZFeN/zEq5/V/4r/Dtr3O1AqVAS4d6WCPe2ZJWkcybnMOdyj6A3F3I0cxdHM3fhrNHRRNeKxrqWBDk3rrVJh3l5ebi5VU7Mo9PpbtmeAavNwrHMPexJ24DJZkRCor1PD7r7R1U7P4FCpSHwkXlk/jmb/P2/kr1xPsXn9+B7/1toPEOuqT0nsvYSnXsMCQWDGj14TUtR165dy9ChQ+nbty+vv/76NV1XEK6VCAaEapMkiY8++giVSsWUKVM4cOAA3377LY6OjkiShGe/p0lZ9Cz5B3/Do99TOP+dqa7IdGt+8FyNl9aPntp76BE4iMTC85zKPkRcwRmKTPnlgYGj2pkmulY0dWtNoFNYjS5RNBgMODg4VNp+K/YMyLJMbP5pdqT8Wb7Kw1cbRN+Q+/B1DLrm80kqNT7DpmIf2JKLf8ymNOEoCfMewKPPBNzvfARJdfUJoheLU9ia/DsAPQIHE3ANVTB/+uknJkyYwODBg1m+fDlqdf1PSBVubSIYEK6JQqFg9uzZdOjQgccff5zu3buzatUqQkND0YZ3Q+0Zgjk7Ef3Z7WiDy7L0lVr09dzq+qWQlDRybU4j1+aYbWYSC6KJLThDTN4pis1FHM/ay/GsvWiU9oS6hNNY15ImulZobjDTnsViqTKXgE6n4+LFizd07oZClmUSCy+wJ2096cVJAGhVTnQPGESkZ6fryor4b64dh6Ft3JmM32ZQErOf7A2fUnh0DT7DpqJtdPkMgAZLKX/E/YhVttBY15KOPtXLW2CxWHjllVf4+OOPefTRR/nyyy9FICDUCREMCNflgQceoEWLFgwbNoyOHTuyePFioqKicGkdRc6Wr9Gf2oRD2NNA2R9GoYxaoaaJWyuauLWiX/B9JBVd4HzeSWLzT1NqKeZ83gnO551ArdDQWNeSCPe2hLpEXFcCHqvVWmUw4OLiQkxMTE3cTr2RZZmEwnPsS99Mmj4BAJVCTXvvHnTx64OmBjNDqt38CRz/JYVH15C1dg6mzDiSv34Mlw5D8R70AkpH3f+0zca6+J8pMObgonFjYOgD1aohkJmZyQMPPMDOnTuZN28eEydOFLUHhDojggHhukVGRnLw4EEefvhhBg0axPTp03nlsZHkbPma4pj9aHkWALPNWM8tbZiUClV5j4Es28goTiGu4Aznco+Rb8zmXO5RzuUeRaO0p7FrC1p7dSXgGkoLXy4YUKlUWCx1v7qhJlhtFs7lHuXwxR1klaYDoJSUtPHqRme/3jiqXWrlupIk4dr+Hpya30XW+k8oOLCCwsOrKY7eic/waTi36F2+7560TcQVnEUlqbi38aPYqy5fB6L8mD17GDVqFGazmc2bN9OzZ+1kQBSEyxHBgHBD3N3d+fPPP3n//feZNm0a586e4d1Id6zFudgyy6rN/bsCnlA1SVLg5xSMn1Mw3fyjSC9OJDr3OOfzjqM3F3I29whnc4/g5eBPG++uNHNvd9XJaDabDUUVWfSUSiVW642kD657elMBJ7L3czJrH/q/8zeoFGraeHWlo0/PGq9dcDlKBxd8h0/Dtf0QMn57G1NmHGk/voBLh6H43PsfYvTn2Ze+CSjLJ+DjGHjF81ksFt5//31mzJhBly5d+OWXXwgICKiLWxGECkQwINwwhULB1KlTadGiBaNGjWKEdxcincCUcgacy7L1CdUnSRL+TqH4O4XSK2gIacVJnMo+wLmcI2SVpvFX4gq2Jf9Oc/f23OHX77KlfLVaLSUlJZW2KxQKbLbKxYYaGptsJb4gmhNZe4kvOIdM2ZJMR7Uz7b17EOl1Bw7VeOquDQ4hbQmZuITsvz4nb+cPFB5ezcWCWLa3Lfvwb+/d46o1OTIyMhg5ciR79uxh6tSpTJ8+HZVK/EkW6of4zRNqzPDhw/n1119ZMfNJIvv5YUw5A82dsFVR5U6oHklSEOAUSoBTKHcF3sOZ7EOcyN5HriGTk9n7OZ1ziFYenejs1xtXu4oJhuzt7TEaKw/RKBSKBtszIMsyGcXJROcd42zO0QqljP2dQmnn3Z2mukiUtVTE6Foo1HZ4D3oBp4g7iVv+Orub6rDIFoLtAukZdM8Vj42JiWHAgAEYDAa2b9/OnXfeWUetFoSq1f//KOGWMmzYMOyKM+DUlxQmnITmXeu7SbcMB5WWDr530d6nB6n6ePakbSC5KJYT2fs4mb2fVp6d6RU0pHzynFqtxmSqPETT0IYJZFkmsySV6LxjROcep9CUV/6ag8qRFh4dae3VBXd773ps5eVpQttxYvAgDIY0HIuKabnxd0weAysU7vq3uLg4evXqhZOTE9u2bSM4OLiOWywIlYlgQKhxAx+cwNlpC9Ao/u4RELWwapQkSQQ6hzEq4mlSiuLYl/4XiYXnOZm9n4TCaHoEDKaZe1ucnJzQ6ysv61QoFHWWBfFyTFYjKUVxxBecJa7gbIUAQK3Q0Mi1Oc092tPIpVmDLA99iSzLbE76jXRDGhqFHXfG56AsyiVlwdOEPPsTareK4/8pKSn06dMHrVbL1q1b8fPzq6eWC0JFIhgQapykUOIc1p7SiycAKNaXYDQasbO7sXXzQmWBzmGMcH6ClKJY1sUvpdCUx9r4nzmfdwJXnSuFhZWLJSmVyjpfTSDLMrmGLBILo4kvOEdSUQw2+Z/eCZVCTZhrc8Ld2hCma9Egqj5Wx5GLOzmVfQAJiSGNHyGohT/J3zyBMe0sqT+9RPDT36NQaQBITEykb9++AGzevFkEAkKDIoIBoVY4BEUiXzwJgMlkonv37nz11Vd06HD5RC3C9Qt0bszYli9zJHMne9I2EJN/ih6PR3JxR+VgwGQyodFoarU9NtlGZkkq6cWJpOoTSCmKq1TF0UXjRqhLBGG65gQ7N6l2uuCGIqEgmu0pfwDQM2gIoa4RAAT8339J/OwhjGlnyd2+EM++T7J//35GjRqFUqlk27ZtBAVde1ZEQahNIhgQaoV9SBvkw0sA0LnqMJvNdO7cmWeffZZXXnmFwMArL7kSrp1aqaGLX19c7dxZE7eYwA4elGZVzjR4uZoFN8JiM3OxOIW04rIP/lR9PEarocI+SklJgFMYoa4RhLm2wMOhYc4BqI48QzZ/xv2IjEwrz8609+5R/ppa54f3kFdJX/ofcrZ+y9w/jzLr02/p2LEjy5cvF7/7QoMkggGhVjiEtEFWlq1x16jUHDp0iP/+97/MmjWLL7/8kkcffZRp06aJyVM1wCbbKDHrKTYXkmfM5kTWPuDvmflx2ZX2z8/Px9X1+tfly7KNiyWppOkTyS5N52JJCtml6djkiqtG7JT2+DuG4ucUTKBTGL5OITdN9/+VmK1Gfo/9HqPVgL9jKH2D76uUCMro34F02R0/ay6a8xt49913efHFF0VqYaHBEsGAUCuU9s6ofRqX/WAxoVarefXVV3nmmWf46quvmD17Nj/88APPPfcc06ZNu6EPp1uFLMuUWMo+1IvNhZRaSjD8/WW0GjBaSzFZjeXfG60GDJZiDFYDUHFCoEJSUnpMw+4/DlW6Tk5ODt7e1/ZUXmwuJL4gmoTCaJIKL1BqKa60j1bljL9TCAFOoQQ5N8FL619rFRnr0+aklWSXpqNVOTOk8f9VSBWdn5/PnDlzmDt3Lp0D7fl8WACjO/nT5KUpKKpR3EgQ6osIBoRaYx/SFkgG8z9r3Z2dnXnppZd48skn+fjjj5k9ezY//vgjs2bN4tFHH60yY96tRpZlikz5XCxJIaskjWxDBjmlFyk05WGxma/rnBISWrUTTmpXgpyb0MbrDtZf+Ivs7Gzy8/PR6XRA2XyBEydOMHHixKue0ybbOHJxJ9G5x8goSa7wmlphR5BzGF4O/vg4BuKjDcBZ43bL59I/nX2I0zmHkJC4p/HD5ZkPS0pK+Pjjj/noo48wGo1MnDiRl19+iYJvxmAtyqIk9gBOESKXgNBwiWBAqDXaRh0hKxnZbMBaWojS4Z+88c7OzkyfPp3HHnuMl19+mfHjx/P111+zePFiwsLC6rHVtcNsMxOXf4b4gnMkFp5Hb666rLMsg6XURkleKYU5xRQXlFKcX4JBb0Q2S/Tp2Y9+vfpjp7RHo3TAQaXFQaXFXuVY6Sm8ceOynpm4uDjat28PwNy5cyksLGTUqFFXbfOhjO3sTF1T/nNBSgnFyRbMmQqUxVYK3dPx8DCR6VNKlm8Rbm5uKBQK/P39cXZ2vt63qsHKN+awOWklAF39BxDkXPb+Hj16lIceeoi4uDiefPJJXn/9dXx9fQGwhHej8PBqDInHRTAgNGgiGBBqjcYjELIAZAqPrcWt6+hK+wQEBPDzzz/z1FNPMX78eDp16sTy5cvp3bt3pX1vRpklaRzN3MX53OOY/lWwyWaVKUgrJu18JnEnk0mPySInJR9rqUR4k3CaNGlCQEAAOq0WB60DSmcl+/btY/Ko1/njj0gGDx581Ws3atQIKMsMOXz4cNLT0/nll1+YNGkSrVq1uuKxFpuFwxd3ALB54X5KYxS4O3mSn59PUVERRUVF5ObmkpOTU2UCI51OR0BAACEhIXTs2JFu3brRs2dP7O1rrppgXZJlG+vjl2K2GQlwakQXv77Issz8+fOZMmUKLVu25OjRo7Ro0aLCcfb+zSk8vBrjxQv11HJBqB4RDAi15lKXsYxEwcHf0N1x+VKud911FwcOHOCBBx5gwIABfPvttzz66KN12dwalapPYE/qBpKK/vkQyE0r4MSWC2SfL8TB5EpwYAjBwa24466BhPxfCC1atCAwMPCy75HVamX48OGMGTOGuLi4q64I8PDwYMeOHfz444+sWrUKjUbDq6++yksvvXTV9ucZMstTAT/c9wke/OzhKttls9nIy8sjIyOD/Px8LBYLqampJCcnk5qaSmxsLPPnz+ftt98mNDSUWbNmMWrUqJtuOOFk9gFS9fGoFXYMajQai9nCc889x9dff83zzz/PBx98UGUeDZVr2dwMS1FuXTdZEK6JCAaEWqOQyn69bEoFxvTzlMYdQtu402X3d3d3Z+3atTz99NOMGzcO4KYLCIrNhWxP/pOzuUfKNsgSJ7ecpzROweRxrzBlWjgeHh5XPsllKJVKvv32W0JDQ/n000+ZPn36FfeXJIkePXrQo0cPZFlGluVqz8lwsDmTejaLgOZeOLW2UTZBsfIHuEKhwMPD44r3JMsyJ06cYPr06YwePZoTJ04wc+bMarWjISi1lLAzdS0A3QOi0Ni03H3v3Wzfvp3vvvuO8ePHX/ZYhaosQJCt1zcXRBDqyq0/W0uoN8q/gwFZU9Y1nL35y6umwVWr1Xz99dc8/vjjjBs3jp9++qnW21lTEgvP8/3pOX8HAhIt3Tvyw8R1nF+dxcKPF9P1jq7XHQhc4u3tzYQJE5g7dy5FRUVXP+BvkiRd0+TMn35azPL3NwISF/JPsiVp1bU39l/XbtOmDatXr+aDDz7gvffeY/369dd9vrp2IH0LBksJHvY+tNR1YsSIEezevZuNGzdeMRAAsFnKhoYkpXjuEho2EQwItebSmnKLQoGksqM0/jD6s9uuepxCoeDLL79k7NixPProoyxdurSWW3rjDmZsZfn5byi1FOPl4MeY5pPQH1Fx4sBpPv30U7Tamiu1+/LLL6PX6/niiy9q7Jz/67fffqNZYCSDGo0GJI5l7eFE1v4bPu/LL79Mp06d+Oqrr268kXVAbyrkWOYuALr7DeLhMf/HX3/9xerVq+nVq9dVj7cUleV5UDnfWBAoCLVNBANCrblUPc+GFZc7HwIg84/Z2EylVz1WoVDwzTff8PDDD/Pwww+zevXqWm3rjdifvpkdKWsAmUjPLjzYfBK+jkF8+umn9OrVq8ZTMAcGBjJmzBg+++yzWqkxkJ2dzdatWxk2bBgtPDrQ3T8KgL8Sl3Mh7+QNnVuSJIYNG8amTZswmxt+1/nxrD1YZAt+jiHMeuVjVq1axfLly+nfv3+1jjdlxgOgdhfph4WGTQQDQq2xU9oh/T3OrL3zQVQ6Pyz56WSt/W+1jlcqlXz33Xfcd999jBo1ig0bNtRmc6/L8cw97EpdB8CdAYMZEDoStUKN1Wrl4MGD3HvvvbVy3eHDh5OcnExWVlaNn/v333/HZrMxYsQIALr49aWVZ2dkZNbE/URKUfwNnb9Tp04UFxeTnJx89Z3rkdVmLe8NObMxkQULFvD9998zZMiQap/DkHIaADu/iFppoyDUFBEMCLVGkhQ4qBwBMEgWfO9/E4D8/b9SdOqvap1DpVLx008/MWDAAIYPH8727dtrrb3X6mJxCluSVwHQ1a8/Xfz6lL+WnZ1NaWlpreVMuLSSoKqqhDfq0KFDRERElGcplCSJ/iEjaKJrhVW2sjpmIbmGzOs+/6UiPSkpKTXS3tqSXBRDiaUI2STx/osfM2/ePMaMGVPt462GIgypZcGANkwU6BIaNhEMCLXKUV2WaEhvKsCxyR249XgEgPRfp2FIO1etc2g0Gn799Ve6devGvffey7Fjx2qrudUmyzY2JPyCTbbRVBdJV/8BFV6/1H1fW7noL03ErI1gYOfOnXTv3r3CNoWkYHCjh/BzDMZgLeG3899SbK7+BMZ/u/SeNPRhgui84wDs/f0ob05/k+eee+6aji8+uwNsVjRejVDrRLlioWETwYBQq5w1OgAKTXkAeEVNQtukC7KplJSFz2LKSqjWeezt7Vm5ciXh4eEMHDiQ2NjYWmpx9ZzPO0lWaRoapT39Qu6vtG7ew8MDlUpFYmJirVx/yZIl+Pn50bZt2xo/d3JycpU9GmqlhmFNxqGz86DAlMufsT9ikysnHLqa+PiyYYaAgIAbbmttkWWZs+nHAGjqFsm0adOu+RxFJzcB4NSqb002TRBqhQgGhFqlsyubRZ1vzAHKllj5P/Qhdn4RWPU5JH87AePFmGqdy9nZmbVr1+Lq6kr//v1JS0urtXZfzcGMrQB08O6BVu1U6XV7e3siIyM5dKhyoaAbUVBQwHvvvceXX37JE088USs9DwEBAUybNo2oqChmzpzJ0qVLOXjwIHq9Hq3amWFNHkOtsCNFH8fu1Gufx7Fr1y7c3NwIDw+v8bbXlFXrV2BVm7BZZWZMef+akyRZ9Lnoo8tWIbi0GVQbTRSEGiWCAaFWudt7AZBruFi+TengQuD4L9D4NMZSmEXSl+MoiT9SrfN5eXmVz0SPiooiJyenVtp9JfnGHC6WpCAh0da7+2X369ChA0eOVO++qlJaWsrvv//OxIkT6d+/P6Ghobi5uTFjxgyGDx/O2LFjr/vcV7Jx40Y+/vhjrFYr//3vf3nwwQfp3LkzOp2O9u3bM/e9T+ns2g+AAxlbiC+o3nDPJdu2baNnz54NtijV9u3beXdu2fwWX6dA7NTXnkK54NBKsFmwD2yJ3aXqnYLQgDXM/43CLcPDoWysNKskvcJ2lZM7wRO+wz64NTZDEcnfPUHe7p+vmpQIIDg4mE2bNnHx4kWioqIoKKi66E9tSSw8D0CAU6MqewUuadSoEYmJidW6p0tkWWbt2rWMGTMGLy8vhg4dyoYNG3BxcWH06NEsWLCA2NhYfvvtN0JDQ8uPsxlLMKRHoz+7g/z9y8nZtoCsDfPIXPcxWevmkr3pc3J3/UjBkT8piT+MOT/jsu0KCAjgueee46+//iInJ4e8vDwOHjzI559/TmRkJHPnzuWu5lHknykb89+Y8Csmq6Fa92cwGNi3b1+11ujXh4MHD3LPPffQuXc7ALy0/td8DtliJn/fLwDo7nigRtsnCLVFpMUSapW31h+Q0JsLKDYX4aj+p5qd0lFH0GNfkf7rNPSn/iLzz9mUxB7AZ/gbqJw9r3jeZs2asXHjRnr37s0999zD+vXrcXR0rOW7KZNvKEsk46298ph3u3btyMvL4/z580REXH1pWUFBAU8++STLli2jVatW/Oc//2HEiBE0a9aswn42YzHFF/ZiSD6FIeU0hvRoLPnplznr5SnsnLDzj8AhpA3asE44hLRFoXGotJ9Op6Njx4507NiRJ554gnnz5vHll1/y31fn8NiXQyEAtietoX+j+696zS1btmA0Gunbt+GNox87dowBAwbQunVrBt8fxfmC47jZX/n3sCqFx9ZgKbiI0tkL5zYDa6GlglDzRDAg1CqN0g53ey9yDZlkFCfRWNeywusKjQP+D31I/t6lZK6dg/7sNkriD+E5YCK6LiORFMrLnrtt27asW7eOfv36MXz4cFavXo2DQ+UPs5p2aRa9k8blivv16NEDtVrNpk2brhoM7N+/n4ceeoisrCyWLFnC6NH/VHi0GvSUxh+mJPYgJfGHMKafB9lW6RxKRzdUOj/ULt4otK4o7LRIyrI5BZfKSFv1eZjz0zDnp2Mzlp23NP4wudsWIKns0DbuhFOLXjhHDqhQcvrfXF1defXVV3n66aeZ+/1sCDBwLGsPDnke3Nm+1xXv85dffiEiIoKWLVtecb+6durUKfr160fTpk1Zu3YtGzPKsl5emgBbXbLVQs7W7wBwv/NhFCpNTTdVEGqFJF9LH6YgXIcNCb9wKvsAnXx7cVfgPZfdz5AezcUVMzCkngFA4x2GZ/9ncGrRB+kK48vbtm3j7rvv5o477uD333+v9R6CS/dzZ8Aguvhd+Qm3d+/eODo68ueff1b5uizLzJo1i6lTp9KxY0eWLl1Ko5AgSpNPURKzn5LY/ZQmnQRbxUyDajd/7INbYx/YCvuAFtj5NEapda32PchWM8bMeIypZyj5O9CwFGSUvy4p1Ti16IVrl5FowzpdcQLdD4c/IUtO5tS2GLq6DOaJJ56ocj+j0YiPjw/PP/88M2bMqHZba9u5c+fo2bMn/v7+bNmyBTc3N344/V+yStO4v+kEQl2rnzCo4NAqMla8hdLRjbBX1lbZ0yIIDZHoGRBqXaBTGKeyD5BUeOVVA/Z+EQQ/8yP5+38le9PnmDLjSFv8EhqfJrjf+TDObQahUFcuE9urVy/WrVvH3XffzcCBA1mzZg0uLld+ar8R9sqyP/B689XX+N99991MmzaNkpKSSvUJiouLGT9+PL/+8gsfTp3Eo1EdMez4mAvxh5FNJRX2VXsEoW3cBW1YRxxC26F29bmhe5CUauz9wrH3C8e14zBkWcaUGYv+7A6Kjq/HmHGeopObKDq5CY1XI9x7jcelzaAqC+7c3eIBFp3+iJY9G/P68FcJCwujX79+lfbbsGEDBQUFjBo16obaXpMuXLhAnz598Pb2ZtOmTeXJnAzWsvffTln9D3ObqZTsv8rqRbj3HC8CAeGmInoGhFpXbC7ky+NvA/BUmzcrzBu4HKuhiLxdP5G36ydsxmIAlFodzm0G4tLubuwDW1V6Wt23bx8DBw4kIiKCdevW4e7uXvM3A5zNOcLa+J/xcwzmoeaTrrhvXFwcTZo04auvvmLChAlA2QSzwoTjzH7pcYI0enpEeKOyVPzwV2p1aBt3RtukM9omXdG41+2afEPaOQoOrKDg6JrywETtEYRH36fKgoL/6an5NforkoouELc1kyXv/8n27duJjIyssM+YMWM4evQoZ86cqbP7uJKYmBj69OmDVqtl+/bt+Pj8E2DNPzYdg6WEsS1fwsPBt1rny/7rC3I2f4VK50ejKauqDFwFoaESwYBQJ346M5eLJSn0DxlBa687qn2ctbSQgoMryduzpEI3tkrnh3OL3mibdkXbqD0Ku7KhgcOHDxMVFYWfnx8bN27Ez6/mM78VGnP55uR7gMSE1lNxucK4smw18+zDwzFnxvDO8+MwpZ3FkHoW+e/StpdIanscQtujbdwJx6ZdsfMNv+LQSF2xGvTk7/+VvJ0/YC0uSxxlHxSJz73/wT7wn3H/c7lHWRO3GJ3ak/njfiEtLY3Tp0+Xl2zOyckhICCAd999l5deeqle7uXfduzYwYgRI3B3d2fz5s2VEiB9cuQ1LDYzj0e+hqvd1SsOmnKSSZg7AtlixP+h2ThHDrjqMYLQkIhgQKgTB9K3sDN1LcHOTRgZ8dQ1Hy9bLZTEHqDgyO/oz25H/nflQ4USO78IHILbYB/YgrRSNYMffBxJpWHlypW0adOmBu+kzLJzn5Oij6OrX3+6+g/AVlqIKScZc24KpqwETFkJGDNjMWXFg7VyZcF8g5VsyYM7hj6KNrQ99gEtkFQ1n0AoNzeXI0eOkJycjCRJtGnThlatWl1zsiKbqZS8PUvI2fptWU+BJOHW9UE8o55DoXHAYCnh82NvIiMz3O9JOrTqzP/93/8xb948AN577z1mzJhBSkoKXl5eNX6f1WW1Wnn//fd58803ueuuu/j111/x9Ky8YuC/h15BxsaTrafhpLnyXAxZlklZ+CwlF/agbdyFwMe+vOYkRYJQ30QwINSJAmMu3156mo58DRe76+/Ct5kNFF/YS/G5HZTEHMCcl1p5J0nBxWIb8Vl6vMNa0L57PzSuXii1OpQOLijsnZA0DijUdkgqDUgKJEmBLNvAZkW2mJGtJmymUmymEmylRVgNRVhLCrAW5xEnZ7Hbx4zKYqPP5kNo9JefP6Cwc+R8tpEkvYKHnn+TIo0XQa268MsvvzBy5Mjrfh8up6ioiKVLl7JkyRJ27NiB1VoxZbCHhwdPPPEETz/9dHnRoOqyFGaRue5jio6tBUDtGYL/A+9hH9iSH07PIas0neFNxrP40xW89957JCQkoNfrad26NRMmTGDu3Lk1dZvXLD4+nrFjx7Jz507eeOMNpk+fjkpVeQ6ELNv47+FXAHi6zVtXzCUBkH9gBRdXvoOk0hA66Vc0XiG10n5BqE0iGBDqzK/RX5JUFEM3/wGVCvvcCHNeGqXJJylNPIYx/TzG9GhsBn2Nnb8qMrCzT2cK3VwISkijzeEzKJ290LgHoPEK/fsrDDvfJqhcfVm+YgWjRo1i5syZ7Nu3jy1btnDq1KkKiYNuhNVqZefOnfz4448sW7aM0tJS+vXrx3333Ufv3r0JDQ3FarVy+PBhli9fzoIFCygpKWHEiBE8//zz3HHHHdf0NFscvZuM397CUpgFShVeA59np6+VmPxT9A4aRiNNS4KCgmjTpg2pqamoVCqOHTuGk9OVP1hrg81m45tvvuHFF1/E09OTRYsWXTHpkdVmYe6R/wDwbNt3sFddfiKgKSuBhM8eRDaV4jV4Cu5/F+IShJuNCAaEOnNp4p2T2pXHI19HeYUcAjdClmWs+hxM2UmYc1NIPHuU7etWYivJp1moP6EBPqhtJmzmUmSzEdlqRrbZytbuKxRIkhJJpUZSqlFotEh2WpT2TigcXFDaO6N0ckfp6Ea2k5o/5WMADAweQUvvy8+FkGWZcePG8eOPP+Lg4MDs2bN55plnbug+CwoK2LlzJxs2bGD58uVkZGTQqFEjxo8fz9ixYwkMDLzssYWFhSxatIh58+YRGxtL69atGTp0KF26dKFTp07l5YuvxFpSQMbKd9D/XY76ZL8+JLoq6Bl4Dx19e7FhwwbGjBmDt7c369evJzg4+Ibu91pdyub49ttvc+DAAR5//HHmzJlz1ZUmJquRT49OBWBSu/dQK6vOFWAzlZL0xaMYM86jDetE4GNfNYh5HoJwPUQwINQZq83C1ydmUmIpYnCjh2ju0b7Orm2xWFiwYAEzZszg4sWLDBs2jCeeeILevXvfULGf3akb2Je+CZVCzYimTxDg3KjK/WRZprCwkNOnT5ORkUFubi5Go5GCggLy8vJQqVTY2ZXNPjcYDFgsFmRZRpZlbDYbVquVkpISSkpKyMjIICEhoTzVcVBQEPfffz8PPPAAXbp0uaYnfKvVysaNG1m4cCFbt24lO7ssu6Krqys+Pj74+Pjg7e2No6MjCoUCpVKJJElYrVasVisqlZKOTrnc5ZDIsa6RZAR4Y3dOhY5W5ccGBQXh5uZWJ+PoJpOJI0eOlPeSnDx5km7duvHuu+/Su3fvap2j1FLM58fKahNMbv9BlUGrbLORtvhF9Ge2onRyJ/S5ZahcrjwXwmazYTKZrv2mBOEK1Go1SuWNP1iJYECoU/vS/mJ32no87H14tOWLSFLdPkmVlpayYMECPv/8c86cOYOnpyd9+vShVatW6HQ6tFot9vb22NnZVfrSaDQolUoUCgUKheLvD2sbR0ybyZZTUdiUuCU3Rp9uIi0tjbS0NFJTU0lJSSE5OZni4uLydkiShEqlwtXVFZ1Oh9VqxWQyIcsy9vb2qFQqJEkqv5ZCoUCr1aLVavHy8qJRo0Y0a9aMHj16EBYWViMftLIsk5CQwJEjR4iJieHixYtkZmaSmZlJaWlpeQAAlAcGVqsVi8VCiKOF3tPvwODiSLvth/nyxxP8ejy3/NwODg74+/sTFhZGkyZN8PPzw9XVFUdHRxwdHdFqtTg4OODg4IBGo0GtVqPRaNBoNOUFjcxmc/lXYWEhubm5ZGdnk5mZSVJSEmfOnOHw4cMYDAYcHBzo168fU6ZMoWfPntf0/hSZ8vn6xLsoJAUvdJhd5fuU+ccH5O9diqRUE/j412hD213xnCaTifj4eGy2ypkjBeFG6XQ6fH19b+jvgAgGhDpltJTyzcmZGK0G7g4bQzP3K/8RrS2yLHPkyBF++eUX9u7dS3R0NAUFBRiNxqsf/D/UdiomzLufsPaBGEtMLH1zA4XxRvz9/fH39ycoKIjAwEACAwMJCAggODgYf3//Kiev3az+mSAKA/7YjsZkRhHWndyI4SRn5pcHRTExMcTFxZGRkUFhYSEGQ/UKHF2OQqHAy8sLf39/mjVrRqdOnejevTvt2rW77h6fXEMWC099gJ3Snont3q3wmizLZK2fS96O70GS8Bv1Hi5tr1yiWJZlkpKSMJvN+Pv7N9hqjcLNR5ZlSkpKyMzMRKfT3dBS6lvnr5FwU7BTOdDBpyd70jawJ3UDTXWta23uwJVIkkSHDh3o0KFDhe02mw2j0Vjll8lkwmq1YrPZsNlsSJJU/uXo4sAx8zYySOTRD+/lzoBBdPbtVec9H/XlRNY+AIKdm+LfpyXZGz/DFrcbj6xoWg6fhtOIEVUed2n4o7S0tPzLbDZjMpkwmUwYjcbyp2m1Wl3+5erqipubG25ubjX+4Wq0lC1b/d/sg7LVwsXV71Fw8DcAfIZNvWogAGVDVCUlJfj7+1fKQikIN+pSPZbMzEy8vb2ve8hABANCnevg04OjmbvIM2ZzLGs3HXzuqu8mlVMoFOXd1deqma0FW5JWciJ7H7tS15JQcI6BjR6oVtKam1mBMZejmbsAaOvdDY+ISLRhncj4dRqmrHhSf3gepxa98Lr7JTTuFSc1KpVKnJ2dcXa+elbKulJVKmJLcR7pS/5DSex+kBT4DH0dXeeqA5z/dWloRaMRRYuE2nEpyDSbzdcdDNwejy1Cg6JR2nNnQNkT1Z7UDehNV8/xfzNQKpT0C7mf/iEjUSs0pOjjWHT6Iw5mbMNqq5x46FZgsVlYF78Es81EgFMjmvxdldIhqBUhzy3B7a5HQaFEf2YbCf8dzsU/PsBSmFnPrb6y4r9rTlxKm118fg+J80ZRErsfSeOA/8Nz0HWpXiDwbyIRkVBbauJ3SwQDQr1o5dkZX20QJpuRLUkr67s5NUaSJFp7deGRFlMIdArDYjOzI+VPFp7+kLM5R8qSGt0irDYLf8R+T6o+HrXCjoGNRlcYFlGo7fEe9AKhk35B2+QOZKuZ/D1LiJt9N+m/TsOQdq4eW395RaYCALRoSP/lDVIWPoOlMAuNVyghT/+Ic4vqrUoQhJuJCAaEeqGQFPQPHYlCUnAh/yTnc4/Xd5NqlM7ek1ERTxEVOgpHtTMFxhzWxv/MD2f+y6nsg1hu8p4CvamAFRe+Ia7gLCpJxbAmY9FdZjjEzqcxQY99SeBjX+IQ2g7ZaqbwyB8kfjqahHkPkLvzR8z5GVUeWx/y9GkAWPf/SeHRP0GS0HV7kJCJS7DzbVLPras9kiSxatWqWr/Otm3bkCSJ/Pz88m2rVq2iSZMmKJVKJk+ezKJFi9DpdLXell69ejF58uRav87NQKwmEOrVrtR17E/fjL3Sgf9r+eIVi/7crMxWI0cyd3EgYysma9nsea3KiUjPLrT26nJDqZnrmizLnMs9ypakVRisJagUaoY1GUeIS3i1z1GadJK83YspOv1XhboNdgEtcIq4E22TO3AIiqyVWg2XI9tslCYeo+Dwata6pJPv7kL7fScIU/jifc/LOARHXv0kl2EwGIiPj6dRo0bY29vXYKuvTUZGBjNnzmTNmjWkpqbi7e1N27ZtmTx5Mn379kWSJFauXMmwYcNqtR0mk4nc3Fx8fHzKu7d9fHwYN24ckyZNwtnZGZVKRVFRUbWSX1XHtm3b6N27N3l5eRWCjNzcXNRqdYOas3I9auJ3TEwgFOpVV7/+JBREc7EkhbVxixkZ/lS9rC6oTWqlHV38+tLGqysns/dz5OIu9OYC9mdsZn/GFgKdGhHh3oYmukicNFfOjldfZNlGQmE0+9I2k1acAICPNpDBYQ/hbn9tf7AdgiNxCJ6FtTifwhMbKDq+jtKk4xhTz2BMPUPOlq+RVHbYB7bEPjgSe79m2Pk3Q+MRhKSsuT9Z1tJCShOOUnx+D/pzO7DkpyMDRUPLhgGa9JxIYKsht8RYf0JCAt27d0en0/Hhhx8SGRmJ2Wxmw4YNPPvss5w7V3dDNhqNBl/ff8pC6/V6MjMziYqKwt/fv3z79UzivVa1Veb8ZiR6BoR6l2fI5qczH2OyGengcxe9gu6t7ybVKqvNSmzBaY5n7iGpKKbCa36OwTRybU4j1wi8tYEo6nlpYrG5iOjcYxzL3EOeMQsAlaSii18/Ovn2QqmomQ9nS1EOxdE7Kb6wj5LY/eXlkitQqtB4BKPxDEbtFohK54PKxRulo1t58SmFyg5JWdajIMu2skJTxmKs+hwshVllVSWzEzGmR2PKSqhweoWdI6b2vVnvb0CjsOPZdu/UyPvfEHoGBg8ezIkTJ4iOjsbR0bHCa/n5+eh0uko9A6+++iorV64kJSUFX19fxowZw/Tp08vzNxw/fpzJkydz6NAhJEmiadOmfPXVV3Ts2JHExEQmTpzIrl27MJlMhIaG8uGHHzJ48OAKT+nHjh2rlBly69atJCQkMHny5ApDCX/88Qdvv/02J0+exMnJiR49erByZdl8ox9//JFPPvmk/P769OnD3Llz8fb2JiEhgUaNKmYGffTRR8trVLRt27a8gFZeXh7PP/88f/zxB0ajkZ49ezJv3jyaNm0KwKJFi5g8eTLLli1j8uTJJCcnc+edd7Jw4cJaKZdeXaJnQLgluNl7MrDRaH6P/Z7DF3fgow2s01TFdU2pUBLu1ppwt9YUGvOIzjvO+bzjZBQnk16cRHpxEnvSNqBW2OHnGIy/Uwg+2kC8HQNxVrvW6pOq2WriYkkySYUxJBZeIK04kbKyTGWrQCI9O9PRp1eN92ConD1w7TgM147DkGUZc3YipYnHMKScxpAWjTHjPLLZgCkzDlNmXI1dV+0ehLbpHTg27YpjeDeO5R6E5NX4O4XWeyBWU3Jzc1m/fj0zZ86sFAgAlx2bd3Z2ZtGiRfj7+3Py5EkmTJiAs7Mzr7xSVtFxzJgxtGvXji+++AKlUsmxY8fKA4Vnn30Wk8nEjh07cHR05MyZM1UWqerWrRvR0dFERESwYsUKunXrhru7OwkJCRX2W7NmDcOHD2fq1Kn88MMPmEwm1q5dW/662WzmnXfeISIigszMTKZMmcLYsWNZu3YtQUFBrFixgvvvv5/o6GhcXFwu2+swduxYLly4wO+//46LiwuvvvoqgwcP5syZM+X3VlJSwkcffcSPP/6IQqHg4Ycf5qWXXmLx4sVX/bdoyEQwIDQITd0i6ezbhwMZW9iQsAxnjY5A57D6blatc7Fzo5NvLzr59kJvKiCu4CzxBedILorBaDWQVHSBpKIL5fvbKe1xt/fB3d4LnZ0nLnZuOKtd0aqdcVA5Yq9yQCFdfphFlmXMNiOllhKKzUXoTfnkGbPJNWSSVZJGdulFZCquePDVBtHSsyMtPDqiUdrV2ntxiSRJ5ZUfXTsOK2u3zYalIANTZjym3BTMealYCjOxFGZhLc7DWlqEzVCEbDGVFZy6dC61PQo7LUpHN1TOnqjd/NF4hqLxDsM+qBUqR7cK144vKOsuD3a5dSYKxsTEIMsyzZo1u6bj3njjjfLvQ0NDeemll1i6dGl5MJCUlMTLL79cft5LT8+XXrv//vuJjCybaxEWVvX/ZY1GUz4vwN3dvcLwwb/NnDmT0aNHM2PGjPJtbdq0Kf9+/Pjx5d+HhYUxb948OnXqhF6vx8nJqXw4wNvb+7LBz6UgYPfu3XTr1g2AxYsXExQUxKpVq8rLjZvNZr788ksaN24MwMSJE3n77berPOfNRAQDQoNxZ8BA8gxZXMg/yeqYhYyKeAYvbf11vdU1J40rrb3uoLXXHdhkGzmlGaTqE8goTiazJIUcw0WMVgPpxYmkFyde9jwqSYVKoUEhKf9+upWRkTHbzJitpkof9v/LUe1MoFNjgl2aEOoSgYud2xX3rwuSQoHazR+1mz+Vn23/Icsy2KwgKeDv7JDVZbQaSC6KBSDMtfkNtrjhuN6R4GXLlpVXtdTr9VgslgoVH6dMmcLjjz/Ojz/+SL9+/Rg5cmT5B+SkSZN4+umn2bhxI/369eP++++ndevW130Px44dY8KECZd9/fDhw7z11lscP36cvLy88qyVSUlJtGjRolrXOHv2LCqVii5dupRv8/DwICIigrNnz5Zv02q15fcJ4OfnR2Zmw86dUR0iGBAaDElSMKjRg+jPF5JenMiKC1/zQMSzuNl71nfT6pxCUuCl9cdL+8+EKovNQp4hixzDRfIN2eQbsyk05aE3FVJq0WOwlqXRtcgWLNYrL11USiq0aiec1K642rnjYe+Dh4MPvo5BONXyUERtkiQJrnOSYUzeKayyBTd7L9ztfWq4ZfWnadOmSJJ0TZME9+7dy5gxY5gxYwZRUVG4urqydOlS5syZU77PW2+9xUMPPcSaNWtYt24db775JkuXLmX48OE8/vjjREVFsWbNGjZu3Mj777/PnDlzeO65567rHq40mbC4uJioqCiioqJYvHgxXl5eJCUlERUVVStVIv+35oUkSdcdcDUkIhgQGhS1UsN9TR9jWfQXZJem80v0F4yKeAo3+yuXh70dqBQqvLR+l+0tsclWjFYjZqsBs82EVbaVJTmSJCQk1Ao1KoUae6UDKoXmpv3Ary2ncw4C0My93S313ri7uxMVFcX8+fOZNGnSZScQ/tuePXsICQlh6tSp5dsSEyv3RoWHhxMeHs4LL7zAgw8+yMKFCxk+fDgAQUFBPPXUUzz11FO89tprfPPNN9cdDLRu3ZrNmzczbty4Sq+dO3eOnJwcZs2aRVBQEACHDh2qsM+lVNCXUkNXpXnz5lgsFvbv318+TJCTk0N0dHS1exduZrfGDBnhlmKv0jIi/Anc7b3RmwtYFv0FOaUX67tZDZ5CUuKg0uJi546Hgy/eWn98HAPx0QbgrfXHzd4LZ40OtdLulvqwqwnZpekkF8UiIdHKo1N9N6fGzZ8/H6vVSufOnVmxYgUXLlzg7NmzzJs3j65du1bav2nTpiQlJbF06VJiY2OZN29e+cx9KCsFPnHiRLZt20ZiYiK7d+/m4MGDNG9eNrwyefJkNmzYQHx8PEeOHGHr1q3lr12PN998kyVLlvDmm29y9uxZTp48yQcffABAcHAwGo2GTz/9lLi4OH7//XfeeeedCseHhIQgSRJ//vknWVlZ6PX6Ku956NChTJgwgV27dnH8+HEefvhhAgICGDp06HW3/WYhggGhQXJUO/NAxNN4OvhSbC5k6bn5pOkT6rtZwi3qYMY2AJroWjWIORI1LSwsjCNHjtC7d29efPFFWrVqRf/+/dm8eTNffPFFpf3vvfdeXnjhBSZOnEjbtm3Zs2cP06ZNK39dqVSSk5PDI488Qnh4OKNGjWLQoEHlE/ysVivPPvsszZs3Z+DAgYSHh/P5559fd/t79erFr7/+yu+//07btm3p06cPBw4cAMDLy4tFixbx66+/0qJFC2bNmsVHH31U4fiAgABmzJjBf/7zH3x8fJg4cWKV11m4cCEdOnTgnnvuoWvXrsiyzNq1a6+7HPbNROQZEBq0EnMxK2O+JaM4GZVCzd2NxtDErVV9N0u4heQaMll06kNkZMY0fx5fx6AaPX9DyDMg3Npq4ndM9AwIDZpW7cio8Kdo5NIMi83M6tjv2Z++5ZaYsCM0DNuT/0BGJsy1RY0HAoJwsxDBQAOyY8cOhgwZgr+/f50VDbkZqJV2DG0yjjZeXQGZXalrWRv/M2arsb6bJtzk4vLPEldwFoWk4K7Ae+q7OYJQb0Qw0IAUFxfTpk0b5s+fX99NaXCUCiX9Qu6nb/BwJBScyz3K4rPzyCm9+df3CvXDYCllU+JyANp534mHQ80UxRGEm5EIBhqQQYMG8e6775YvzamOt956i7Zt27JgwQKCg4NxcnLimWeewWq1Mnv2bHx9ffH29mbmzJkVjpMkia+++op77rkHrVZL8+bN2bt3LzExMfTq1QtHR0e6detGbGxsTd/mDWnr3Z1REU/iqHYmx3CRxWfncjJrvxg2EK6JLMv8lbQCvbkAnZ0n3f2j6rtJglCvRDBwC4iNjWXdunWsX7+eJUuW8N1333H33XeTkpLC9u3b+eCDD3jjjTfYv39/hePeeecdHnnkEY4dO0azZs146KGHePLJJ3nttdc4dOgQsixfdtZtfQp0bsz/tXiBYOcmmG0mNib+yu+x31NirrxcSBCqcjRzF9G5x5BQMKjRaNR1kGZZEBoykXToFmCz2ViwYAHOzs60aNGC3r17Ex0dzdq1a1EoFERERPDBBx+wdevWCqk2x40bx6hRo4CyCmVdu3Zl2rRpREWVPSU9//zzVSb5aAgc1S7cH/4EhzK2szttPTH5p0jVx9MneDgRbm3EOnrhshILz7M95Q8Aegbdg79TaP02SBAaANEzcAsIDQ3F2dm5/GcfHx9atGiBQqGosO1/82f/O1e4j09Z+tVLhUUubTMYDBQWFtZW02+IQlLQ2a83DzWfhKeDH6WWYtbE/cTKmO8oMObUd/OEBuhicQqrY77HJtto7t6e9t496rtJgtAgiGDgFlBVruyqtl0q3lHVcZeepKva9r/HNTQ+2gAebv48Xf36o5CUxBecY9GpD9mTthGzteZzkws3p6ySNFZc+AazzUiwcxMGhI4SPUiC8DcRDAi3BKVCRbeAKB5p8SJBzo2xyBb2pm1k4enZnM05UpajX7htpeuT+CX6C0otxfhoA7m3yVhUCjFKKgiXiGCgAdHr9Rw7doxjx44BEB8fz7Fjx0hKSqrfht1EPBy8GRn+FPeE/R8uGjeKTPmsjf+Zn85+QkJBtFh1cBuKyTvFL+e/wGAtxc8xhBHhT2KnFJkA68qlFU+XjB07lmHDhtVbe25Ur169mDx5cn03o8aJYKABOXToEO3ataNdu3ZAWb3wdu3aMX369Hpu2c1FkiQi3NswttUr3BkwCI3SnsySVFZc+Ial0fNJLDwvgoLbgCzb2Jf2F6tjv8diMxPiEs6I8CewV12+HK5QUUZGBs899xxhYWHY2dkRFBTEkCFD2Lx5c303Tahhop+sAenVq9c1f0i99dZbvPXWWxW2LVq0qNJ+27Ztq/Dz/14nNDS00rbraU9Dolao6eLXl0jPO9if/hfHs/aSpk9g+fmv8XUMootvXxrrWiBJIia+1RSbi9gQv4z4wnMAtPHqRu+goSgVynpu2c0jISGB7t27o9Pp+PDDD4mMjMRsNrNhwwaeffZZzp07V99NrFMmk6m8FPLNcN5rJYKBemSz2cjJuTlnvXt4eFRYrdCQadWO9A4eSiffXhzI2MrJrH1kFCezOnYRbnZedPC9ixbuHVAr6/8/pHDjLuSdYlPir5RailFJKvoEDyfSq8vVDxQqeOaZZ5AkiQMHDuDo6Fi+vWXLlowfP7785/z8fF566SVWr16N0WikY8eOfPzxx7Rp06Za11m+fDkzZswgJiYGrVZLu3btWL16dYVrXsnYsWPJz8+nc+fOfPLJJxiNRqZMmcLrr7/Oa6+9xnfffYdWq+Wdd96psFT61VdfZeXKlaSkpODr68uYMWOYPn16+STqt956i1WrVjFx4kRmzpxJYmJilZOp16xZw0MPPcTnn3/OmDFjSE5O5sUXX2Tjxo0oFAp69OjBJ598QmhoaIX2durUifnz52NnZ0d8fHy17rU2iWCgHuXk5ODtfXOmQM3MzMTLy6u+m3FNnDSu9AkeRhe/vhy+uIMTWXvJM2bxV+IKdqWspaVnZ9p43YGb/c11X0KZQmMeW5JXEZt/GgAvBz8Ghz2Ep4NfPbesIlmWkc2Germ2pLav1gqK3Nxc1q9fz8yZM6v8UNbpdOXfjxw5EgcHB9atW4erqytfffUVffv25fz587i7u1/xOunp6Tz44IPMnj2b4cOHU1RUxM6dO8t7JLdt20bv3r2Jj48v/zCtypYtWwgMDGTHjh3s3r2bxx57jD179nDXXXexf/9+li1bxpNPPkn//v0JDAwEwNnZmUWLFuHv78/JkyeZMGECzs7OvPLKK+XnjYmJYcWKFfz2228olZV7lX7++Weeeuopfv75Z+655x7MZjNRUVF07dqVnTt3olKpePfddxk4cCAnTpwo7wHYvHkzLi4ubNq06YrvT10SwYBw23FUO3NX4N3c4deXU9kHOZK5iwJjDocvbufwxe0EOTcm0rMLTdwiUStu/TrmNzuT1cihi9s5mLEVi82MQlLQ0acXXf37o2qA/36y2cCFN7vWy7WbztiLpLn6nImYmBhkWaZZs2ZX3G/Xrl0cOHCAzMxM7OzKsjh+9NFHrFq1iuXLl/PEE09c8fj09HQsFgv33XcfISEhQMVcJ1qtloiIiEpLpf+Xu7s78+bNK0+yNnv2bEpKSnj99dcBeO2115g1axa7du1i9OjRALzxxhvlx4eGhvLSSy+xdOnSCsGAyWTihx9+qPLBZ/78+UydOpU//viDnj17ArBs2TJsNhvffvttedC1cOFCdDod27ZtY8CAAQA4Ojry7bffNojhgUtEMCDctjRKe9r79KCtd3cSCs5xLGsPCQXRJBfFklwUiybJngi3NkS4tyXIuTEKMbegQbHYzJzMPsD+9L8oNhcBEODUiH4h9+Pp4FvPrbu5VXeu0PHjx9Hr9Xh4eFTYXlpaWq26Jm3atKFv375ERkYSFRXFgAEDGDFiBG5ubgB07ty5WnMTWrZsWSnJWqtWrcp/ViqVeHh4VEi8tmzZMubNm0dsbCx6vR6LxYKLi0uF84aEhFQZCCxfvpzMzEx2795Np06dyrcfP36cmJiYCkngAAwGQ4X3IzIysjwQWLx4MU8++WT5a+vWraNHj7pPhiWCAeG2p5AUhOlaEKZrQaEpn1NZ+zmdc4hCUx4ns/dzMns/jmpnmrq1JsKtDf5OoSIwqEcGSykns/dx+OJOis1l2TFd7TzoETCYcLfWDT6RkKS2p+mMvfV27epo2rQpkiRd9YNYr9fj5+dXaYIyVBxKuBylUsmmTZvYs2cPGzdu5NNPP2Xq1Kns37+fRo0aVautcO2J1/bu3cuYMWOYMWMGUVFRuLq6snTpUubMmVPhmMvNW2jXrh1HjhxhwYIFdOzYsfx3Tq/X06FDBxYvXlzpmH8HFf8+77333lshTXxAQEB1brnGiWCgHv1vpHoz+d8ngVuFi0ZHt4Aouvr3J6UojrO5R7mQd5JicxHHMndzLHM3DipHwlxbEKZrTohLuFizXkeyStI5kbWX0zmHMNvKMks6qV3p4teHVp5dbpokQpIkVaurvj65u7sTFRXF/PnzmTRpUqUPxfz8fHQ6He3btycjIwOVSnXFMf0rkSSJ7t270717d6ZPn05ISAgrV65kypQpNXAnVduzZw8hISFMnTq1fFtiYmK1j2/cuDFz5syhV69eKJVKPvvsMwDat2/PsmXL8Pb2rtTLcDnOzs6VehLqw83xv+cWpVAobrpJeLcLSVIQ5NKEIJcm9A0eTmLhBc7nHScm/zSllmJO5xzkdM5BFJKCAKdGhLpEEOIagbeDn1iqWINKzMVE5x3jTM4hMoqTy7d7OvjS3ucuWri3R3mTBAE3m/nz59O9e3c6d+7M22+/TevWrbFYLGzatIkvvviCs2fP0q9fP7p27cqwYcOYPXs24eHhpKWlsWbNGoYPH07Hjh2veI39+/ezefNmBgwYgLe3N/v37ycrK4vmzZsDcODAAR555BE2b95co0/MTZs2JSkpiaVLl9KpUyfWrFnDypUrr+kc4eHhbN26lV69eqFSqZg7dy5jxozhww8/ZOjQobz99tsEBgaSmJjIb7/9xiuvvFI+ebEhEv+LBOEqlAoVYbrmhOmaY7VZSdXHEZt/hviCc+QZs8rnGOxMXYu90oEA5zACnEIJcArDRxsgPqyuUaExj9iCM8TknSK5KBaZsq5dhaSgsa4lbby6EuzctMEPB9zswsLCOHLkCDNnzuTFF18kPT0dLy8vOnTowBdffAGUPdWvXbuWqVOnMm7cOLKysvD19eWuu+4qL352JS4uLuzYsYO5c+dSWFhISEgIc+bMYdCgQQCUlJQQHR2N2Wyu0Xu79957eeGFF5g4cSJGo5G7776badOmVcrZcjURERFs2bKlvIdgzpw57Nixg1dffZX77ruPoqIiAgIC6Nu3b7V7CuqLJN/MWWUEoZ7lGbJIKIwmoSCalKI4TDZjhddVkgofxyD8HIPxdQzGxzEQV427+CD7F7PVSKo+gaSiCyQURJNVml7hdW9tAC08OtDMvR2O6vrvTr1WBoOB+Ph4GjVqhL29GFISal5N/I6JRxZBuAFu9l642XvRzvtObLKVi8WppOhjSdUnkKqPx2ApIVUfT6r+n6QiGqU9Xg5+eDr44engi6eDLx4OvjiotPV4J3VDlm3kG3PJKE4ivTiJNH0CmSVp5U//ABISfk4hNNG1oqmuFTp7z3pssSDcHkQwIAg1RCEp8XMKxs8pmE6ULc/KM2aRpk8goziZjOJkskvTMVkNlQIEAK3KCXd7b3T2nujsPNHZueOiccfFTodW5XRTzUWwyTaKTPnkGbLJM2aSU3qR7NIMskrSKvWeADhrdAQ7NyHYpSmhLs3QqquXfU4QhJohggFBqCWSJOFu7427vTetPDsDYLVZyDFkkl2aXvZVkkG2IYMiUz4lFj0lej0p+rhK51JISpzULjiqXXDSuOCocsZR7YJW7YSDygkHlSMOKgfslFrsVA6oJFWtDEVYbBaM1hIMlhJKLMWUmPUUmwspNhdRZMpHby6g0JhHkTkf22XKRislFd7aAHwdg/BzDCHAKRQXO7cab6sgCNUnggFBqENKhQpvrT/eWv8K201WA7mGLHINmeQbc8g3ZFNoyqPAmEuxuRCbbKXQlEehKQ+Kr34dhaRAo7BDrbRDrdCgUqhRSipUChUKSYlCUiChqBAwyLKMLNuwylassgWrbMFis2C2mTBbjZisBiyypdr3qpCU6Ow8cLP3wsPeBw8HH7y1/rjbe6OQRMEgQWhIRDAgCA2ARmmPr2MQvo5BlV6z2qwUmwspMhdQbC5EbyqkxFJEsbmIErOeUoueUksJBksxRqsBGRmbbMNgLcVgLa2F1krYK+3LeiTUjv/0WKhdcda44qzR4WLnjpPaRSRnEoSbhAgGBKGBUyqUuNi5VasrXZZtmGwmjFbD30/zRiyyGbPVVP7Eb5Otf3/JgIyMjIQESCglBQpJiVJSolSoUCk0qBVq1Ao77JR2aJT22Cntb6r5C4IgXJ0IBgThFiJJCuz+/sAWBEGoLhHeC4IgCMJtTgQDgiAIgnCbE8GAIAiCUGveeust2rZtW/7z2LFjGTZsWL2150b16tWLyZMn13czapwIBgRBEIQqZWRk8NxzzxEWFoadnR1BQUEMGTKEzZs313fThBomggFBEAShkoSEBDp06MCWLVv48MMPOXnyJOvXr6d37948++yz9d28Omcymer0vKGhoWzbtq1WrlkVEQwIgiAIlTzzzDNIksSBAwe4//77CQ8Pp2XLlkyZMoV9+/aV75efn8/jjz+Ol5cXLi4u9OnTh+PHj1f7OsuXLycyMhIHBwc8PDzo168fxcXVyKz1t0vDDu+99x4+Pj7odDrefvttLBYLL7/8Mu7u7gQGBrJw4cIKx7366quEh4ej1WoJCwtj2rRpFaojXhre+Pbbb69YAGjNmjW4urqyePFiAJKTkxk1ahQ6nQ53d3eGDh1KQkJCpfbOnDkTf39/IiIiqn2vtUksLRQEQahDsixjsdXOU+bVqBSaaqWpzs3NZf369cycORNHx8p1InQ6Xfn3I0eOxMHBgXXr1uHq6spXX31F3759OX/+PO7u7le8Tnp6Og8++CCzZ89m+PDhFBUVsXPnTi4V0922bRu9e/cmPj6e0NDQy55ny5YtBAYGsmPHDnbv3s1jjz3Gnj17uOuuu9i/fz/Lli3jySefpH///gQGBgLg7OzMokWL8Pf35+TJk0yYMAFnZ2deeeWV8vPGxMSwYsUKfvvtN5TKylkzf/75Z5566il+/vln7rnnHsxmM1FRUXTt2pWdO3eiUql49913GThwICdOnECj0QCwefNmXFxc2LRp0xXfn7okggFBEIQ6ZLGZmHd0ar1ce1K7maiVdlfdLyYmBlmWadas2RX327VrFwcOHCAzMxM7u7LzfvTRR6xatYrly5fzxBNPXPH49PR0LBYL9913HyEhIQBERkaWv67VaomIiECtVl/xPO7u7sybNw+FQkFERASzZ8+mpKSE119/HYDXXnuNWbNmsWvXLkaPHg3AG2+8UX58aGgoL730EkuXLq0QDJhMJn744Qe8vLwqXXP+/PlMnTqVP/74g549ewKwbNkybDYb3377bXnQtXDhQnQ6Hdu2bWPAgAEAODo68u2335YHBw2BCAYEQRCECi49mV/N8ePH0ev1eHh4VNheWlpKbGzsVY9v06YNffv2JTIykqioKAYMGMCIESNwcyvLttm5c2fOnTt31fO0bNkSheKfUW8fHx9atWpV/rNSqcTDw4PMzMzybcuWLWPevHnExsai1+uxWCy4uLhUOG9ISEiVgcDy5cvJzMxk9+7ddOrUqXz78ePHiYmJwdnZucL+BoOhwvsRGRlZKRB46qmn+Omnn8p/LikpYdCgQRV6JPR6/VXfi+slggFBEIQ6pFJomNRuZr1duzqaNm2KJElX/SDW6/X4+flVOdHt30MJl6NUKtm0aRN79uxh48aNfPrpp0ydOpX9+/fTqFGjarUVqNRzIElSldtstrJKmnv37mXMmDHMmDGDqKgoXF1dWbp0KXPmzKlwTFVDJADt2rXjyJEjLFiwgI4dO5b3Auj1ejp06FA+f+Df/h1UVHXet99+m5deeqn85169evHBBx/QpUuXK916jRHBgCAIQh2SJKlaXfX1yd3dnaioKObPn8+kSZMqfXjl5+ej0+lo3749GRkZqFSqK47pX4kkSXTv3p3u3bszffp0QkJCWLlyJVOmTKmBO6nanj17CAkJYerUf4ZrEhMTq31848aNmTNnDr169UKpVPLZZ58B0L59e5YtW4a3t3elXoar8fb2xtvbu/xnlUpFQEAATZo0uabzXC+xmkAQBEGoZP78+VitVjp37syKFSu4cOECZ8+eZd68eXTt2hWAfv360bVrV4YNG8bGjRtJSEhgz549TJ06lUOHDl31Gvv37+e9997j0KFDJCUl8dtvv5GVlUXz5s0BOHDgAM2aNSM1NbVG761p06YkJSWxdOlSYmNjmTdvHitXrrymc4SHh7N161ZWrFhRnoRozJgxeHp6MnToUHbu3El8fDzbtm1j0qRJpKSk1Og91DQRDAiCIAiVhIWFceTIEXr37s2LL75Iq1at6N+/P5s3b+aLL74Ayp7q165dy1133cW4ceMIDw9n9OjRJCYm4uPjc9VruLi4sGPHDgYPHkx4eDhvvPEGc+bMYdCgQUDZuHl0dHSFJX814d577+WFF15g4sSJtG3blj179jBt2rRrPk9ERARbtmxhyZIlvPjii2i1Wnbs2EFwcDD33XcfzZs357HHHsNgMFxzT0Fdk+TqzhQRBEEQrpnBYCA+Pv6Ka9UF4UbUxO+Y6BkQBEEQhNucCAYEQRAE4TYnggFBEARBuM2JYEAQBEEQbnMiGBAEQagDYq62UFtq4ndLBAOCIAi16FI62doqgSsIJSUlQOVMjNdCZCAUBEGoRSqVCq1WS1ZWFmq1ukIOfUG4EbIsU1JSQmZmJjqdrsrKitUl8gwIgiDUMpPJRHx8fHlufEGoSTqdDl9f32qVp74cEQwIgiDUAZvNJoYKhBqnVqtvqEfgEhEMCIIgCMJtTgxeCYIgCMJtTgQDgiAIgnCbE8GAIAiCINzmRDAgCIIgCLc5EQwIgiAIwm1OBAOCIAiCcJsTwYAgCIIg3OZEMCAIgiAItzkRDAiCIAjCbU4EA4IgCIJwmxPBgCAIgiDc5kQwIAiCIAi3OREMCIIgCMJtTgQDgiAIgnCb+3+rYN8/O+/5jgAAAABJRU5ErkJggg==",
+      "text/plain": [
+       "\u001b[1m<\u001b[0m\u001b[1;95mFigure\u001b[0m\u001b[39m size 64\u001b[0m\u001b[1;36m0x480\u001b[0m\u001b[39m with \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m Axes\u001b[0m\u001b[1m>\u001b[0m"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "# Coronal projection\n",
+    "# select objects within the rostro-caudal range\n",
+    "df_coronal = df[\n",
+    "    (df[\"Atlas_X\"] >= ap_lims[0] / 1000) & (df[\"Atlas_X\"] <= ap_lims[1] / 1000)\n",
+    "]\n",
+    "\n",
+    "plt.figure()\n",
+    "\n",
+    "for struct_name, contours in coords_coronal.items():\n",
+    "    for cont in contours:\n",
+    "        plt.fill(cont[:, 0] / 1000, cont[:, 1] / 1000, lw=1, fc=\"none\", ec=\"k\")\n",
+    "\n",
+    "# see https://seaborn.pydata.org/generated/seaborn.kdeplot.html to customize\n",
+    "ax = sns.kdeplot(\n",
+    "    df_coronal,\n",
+    "    x=\"Atlas_Z\",\n",
+    "    y=\"Atlas_Y\",\n",
+    "    hue=\"Classification\",\n",
+    "    levels=nlevels,\n",
+    "    common_norm=False,\n",
+    "    palette=palette,\n",
+    ")\n",
+    "ax.invert_yaxis()\n",
+    "sns.despine(left=True, bottom=True)\n",
+    "plt.axis(\"equal\")\n",
+    "plt.xlabel(None)\n",
+    "plt.ylabel(None)\n",
+    "plt.xticks([])\n",
+    "plt.yticks([])\n",
+    "plt.plot([2, 3], [8, 8], \"k\", linewidth=3)\n",
+    "plt.text(2, 7.9, \"1 mm\")"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 17,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/html": [
+       "
\n"
+      ],
+      "text/plain": []
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    },
+    {
+     "data": {
+      "text/plain": [
+       "\u001b[1;35mText\u001b[0m\u001b[1m(\u001b[0m\u001b[1;36m2\u001b[0m, \u001b[1;36m7\u001b[0m, \u001b[32m'1 mm'\u001b[0m\u001b[1m)\u001b[0m"
+      ]
+     },
+     "execution_count": 17,
+     "metadata": {},
+     "output_type": "execute_result"
+    },
+    {
+     "data": {
+      "text/html": [
+       "
\n"
+      ],
+      "text/plain": []
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    },
+    {
+     "data": {
+      "image/png": "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",
+      "text/plain": [
+       "\u001b[1m<\u001b[0m\u001b[1;95mFigure\u001b[0m\u001b[39m size 64\u001b[0m\u001b[1;36m0x480\u001b[0m\u001b[39m with \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m Axes\u001b[0m\u001b[1m>\u001b[0m"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "# Sagittal projection\n",
+    "# select objects within the medio-lateral range\n",
+    "df_sagittal = df[\n",
+    "    (df[\"Atlas_Z\"] >= ml_lims[0] / 1000) & (df[\"Atlas_Z\"] <= ml_lims[1] / 1000)\n",
+    "]\n",
+    "\n",
+    "plt.figure()\n",
+    "\n",
+    "for struct_name, contours in coords_sagittal.items():\n",
+    "    for cont in contours:\n",
+    "        plt.fill(cont[:, 0] / 1000, cont[:, 1] / 1000, lw=1, fc=\"none\", ec=\"k\")\n",
+    "\n",
+    "# see https://seaborn.pydata.org/generated/seaborn.kdeplot.html to customize\n",
+    "ax = sns.kdeplot(\n",
+    "    df_sagittal,\n",
+    "    x=\"Atlas_X\",\n",
+    "    y=\"Atlas_Y\",\n",
+    "    hue=\"Classification\",\n",
+    "    levels=nlevels,\n",
+    "    common_norm=False,\n",
+    "    palette=palette,\n",
+    ")\n",
+    "ax.invert_yaxis()\n",
+    "sns.despine(left=True, bottom=True)\n",
+    "plt.axis(\"equal\")\n",
+    "plt.xlabel(None)\n",
+    "plt.ylabel(None)\n",
+    "plt.xticks([])\n",
+    "plt.yticks([])\n",
+    "plt.plot([2, 3], [7.1, 7.1], \"k\", linewidth=3)\n",
+    "plt.text(2, 7, \"1 mm\")"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 18,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/html": [
+       "
\n"
+      ],
+      "text/plain": []
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    },
+    {
+     "data": {
+      "text/plain": [
+       "\u001b[1;35mText\u001b[0m\u001b[1m(\u001b[0m\u001b[1;36m0.5\u001b[0m, \u001b[1;36m0.4\u001b[0m, \u001b[32m'1 mm'\u001b[0m\u001b[1m)\u001b[0m"
+      ]
+     },
+     "execution_count": 18,
+     "metadata": {},
+     "output_type": "execute_result"
+    },
+    {
+     "data": {
+      "text/html": [
+       "
\n"
+      ],
+      "text/plain": []
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    },
+    {
+     "data": {
+      "image/png": "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",
+      "text/plain": [
+       "\u001b[1m<\u001b[0m\u001b[1;95mFigure\u001b[0m\u001b[39m size 64\u001b[0m\u001b[1;36m0x480\u001b[0m\u001b[39m with \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m Axes\u001b[0m\u001b[1m>\u001b[0m"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "# Top projection\n",
+    "# select objects within the dorso-ventral range\n",
+    "df_top = df[(df[\"Atlas_Y\"] >= dv_lims[0] / 1000) & (df[\"Atlas_Y\"] <= dv_lims[1] / 1000)]\n",
+    "\n",
+    "plt.figure()\n",
+    "\n",
+    "for struct_name, contours in coords_top.items():\n",
+    "    for cont in contours:\n",
+    "        plt.fill(-cont[:, 0] / 1000, cont[:, 1] / 1000, lw=1, fc=\"none\", ec=\"k\")\n",
+    "\n",
+    "# see https://seaborn.pydata.org/generated/seaborn.kdeplot.html to customize\n",
+    "ax = sns.kdeplot(\n",
+    "    df_top,\n",
+    "    x=\"Atlas_Z\",\n",
+    "    y=\"Atlas_X\",\n",
+    "    hue=\"Classification\",\n",
+    "    levels=nlevels,\n",
+    "    common_norm=False,\n",
+    "    palette=palette,\n",
+    ")\n",
+    "ax.invert_yaxis()\n",
+    "sns.despine(left=True, bottom=True)\n",
+    "plt.axis(\"equal\")\n",
+    "plt.xlabel(None)\n",
+    "plt.ylabel(None)\n",
+    "plt.xticks([])\n",
+    "plt.yticks([])\n",
+    "plt.plot([0.5, 1.5], [0.5, 0.5], \"k\", linewidth=3)\n",
+    "plt.text(0.5, 0.4, \"1 mm\")"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": []
+  }
+ ],
+ "metadata": {
+  "kernelspec": {
+   "display_name": "hq",
+   "language": "python",
+   "name": "python3"
+  },
+  "language_info": {
+   "codemirror_mode": {
+    "name": "ipython",
+    "version": 3
+   },
+   "file_extension": ".py",
+   "mimetype": "text/x-python",
+   "name": "python",
+   "nbconvert_exporter": "python",
+   "pygments_lexer": "ipython3",
+   "version": "3.12.7"
+  }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 4
+}
diff --git a/demo_notebooks/fibers_coverage.html b/demo_notebooks/fibers_coverage.html
new file mode 100644
index 0000000..35cb33a
--- /dev/null
+++ b/demo_notebooks/fibers_coverage.html
@@ -0,0 +1,2297 @@
+
+
+
+  
+    
+      
+      
+      
+        
+      
+      
+        
+      
+      
+      
+        
+      
+      
+        
+      
+      
+      
+      
+    
+    
+      
+        Fibers coverage - histoquant
+      
+    
+    
+      
+      
+        
+        
+      
+      
+
+
+    
+    
+      
+        
+      
+    
+    
+      
+        
+        
+        
+        
+        
+      
+    
+    
+      
+    
+      
+    
+      
+    
+    
+    
+      
+
+    
+    
+    
+  
+  
+  
+    
+    
+      
+    
+    
+    
+    
+    
+  
+    
+    
+    
+    
+    
+ +
+
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + + + + + + + + +

Fibers coverage

+ + + + + + + + + + + + +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/demo_notebooks/fibers_coverage.ipynb b/demo_notebooks/fibers_coverage.ipynb new file mode 100644 index 0000000..b6d0a61 --- /dev/null +++ b/demo_notebooks/fibers_coverage.ipynb @@ -0,0 +1,511 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Plot regions coverage percentage in the spinal cord.\n", + "\n", + "This showcases that any brainglobe atlases should be supported.\n", + "\n", + "Here we're going to quantify the percentage of area of each spinal cord regions innervated by axons.\n", + "\n", + "The \"area µm^2\" measurement for each annotations can be created in QuPath with a pixel classifier, using the Measure button.\n", + "\n", + "We're going to consider that the \"area µm^2\" measurement generated by the pixel classifier is an object count. \n", + "`histoquant` computes a density, which is the count in each region divided by its aera. \n", + "Therefore, in this case, it will be actually the fraction of area covered by fibers in a given color.\n", + "\n", + "The data was generated using QuPath with a pixel classifier on toy data." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "import pandas as pd\n", + "\n", + "import histoquant as hq" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "# Full path to your configuration file, edited according to your need beforehand\n", + "config_file = \"../../resources/demo_config_fibers.toml\"" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "# - Files\n", + "# not important if only one animal\n", + "animal = \"animalid1-SC\"\n", + "# set the full path to the annotations tsv file from QuPath\n", + "annotations_file = \"../../resources/fibers_measurements_annotations.tsv\"" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "# get configuration\n", + "cfg = hq.config.Config(config_file)" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
ImageObject typeNameClassificationParentROICentroid X µmCentroid Y µmFibers: EGFP area µm^2Fibers: DsRed area µm^2IDSideParent IDArea µm^2Perimeter µm
Object ID
dcfe5196-4e8d-4126-b255-a9ea393c383aanimalid1-SC_s1.ome.tiffAnnotationRootNaNRoot object (Image)Geometry1353.701060.00108993.195315533.3701NaNNaNNaN3172474.09853.3
acc74bc0-3dd0-4b3e-86e3-e6c7b681d544animalid1-SC_s1.ome.tiffAnnotationrootRight: rootRootPolygon864.44989.9539162.89065093.2798250.00.0NaN1603335.74844.2
94571cf9-f22b-453f-860c-eb13d0e72440animalid1-SC_s1.ome.tiffAnnotationWMRight: WMrootGeometry791.001094.6020189.04692582.4824130.00.0250.0884002.07927.8
473d65fb-fda4-4721-ba6f-cc659efc1d5aanimalid1-SC_s1.ome.tiffAnnotationvfRight: vfWMPolygon984.311599.006298.3574940.410070.00.0130.0281816.92719.5
449e2cd1-eca2-4708-83fe-651f378c3a14animalid1-SC_s1.ome.tiffAnnotationdfRight: dfWMPolygon1242.90401.261545.0750241.380074.00.0130.0152952.81694.4
\n", + "
" + ], + "text/plain": [ + " Image Object type \\\n", + "Object ID \n", + "dcfe5196-4e8d-4126-b255-a9ea393c383a animalid1-SC_s1.ome.tiff Annotation \n", + "acc74bc0-3dd0-4b3e-86e3-e6c7b681d544 animalid1-SC_s1.ome.tiff Annotation \n", + "94571cf9-f22b-453f-860c-eb13d0e72440 animalid1-SC_s1.ome.tiff Annotation \n", + "473d65fb-fda4-4721-ba6f-cc659efc1d5a animalid1-SC_s1.ome.tiff Annotation \n", + "449e2cd1-eca2-4708-83fe-651f378c3a14 animalid1-SC_s1.ome.tiff Annotation \n", + "\n", + " Name Classification \\\n", + "Object ID \n", + "dcfe5196-4e8d-4126-b255-a9ea393c383a Root NaN \n", + "acc74bc0-3dd0-4b3e-86e3-e6c7b681d544 root Right: root \n", + "94571cf9-f22b-453f-860c-eb13d0e72440 WM Right: WM \n", + "473d65fb-fda4-4721-ba6f-cc659efc1d5a vf Right: vf \n", + "449e2cd1-eca2-4708-83fe-651f378c3a14 df Right: df \n", + "\n", + " Parent ROI \\\n", + "Object ID \n", + "dcfe5196-4e8d-4126-b255-a9ea393c383a Root object (Image) Geometry \n", + "acc74bc0-3dd0-4b3e-86e3-e6c7b681d544 Root Polygon \n", + "94571cf9-f22b-453f-860c-eb13d0e72440 root Geometry \n", + "473d65fb-fda4-4721-ba6f-cc659efc1d5a WM Polygon \n", + "449e2cd1-eca2-4708-83fe-651f378c3a14 WM Polygon \n", + "\n", + " Centroid X µm Centroid Y µm \\\n", + "Object ID \n", + "dcfe5196-4e8d-4126-b255-a9ea393c383a 1353.70 1060.00 \n", + "acc74bc0-3dd0-4b3e-86e3-e6c7b681d544 864.44 989.95 \n", + "94571cf9-f22b-453f-860c-eb13d0e72440 791.00 1094.60 \n", + "473d65fb-fda4-4721-ba6f-cc659efc1d5a 984.31 1599.00 \n", + "449e2cd1-eca2-4708-83fe-651f378c3a14 1242.90 401.26 \n", + "\n", + " Fibers: EGFP area µm^2 \\\n", + "Object ID \n", + "dcfe5196-4e8d-4126-b255-a9ea393c383a 108993.1953 \n", + "acc74bc0-3dd0-4b3e-86e3-e6c7b681d544 39162.8906 \n", + "94571cf9-f22b-453f-860c-eb13d0e72440 20189.0469 \n", + "473d65fb-fda4-4721-ba6f-cc659efc1d5a 6298.3574 \n", + "449e2cd1-eca2-4708-83fe-651f378c3a14 1545.0750 \n", + "\n", + " Fibers: DsRed area µm^2 ID Side \\\n", + "Object ID \n", + "dcfe5196-4e8d-4126-b255-a9ea393c383a 15533.3701 NaN NaN \n", + "acc74bc0-3dd0-4b3e-86e3-e6c7b681d544 5093.2798 250.0 0.0 \n", + "94571cf9-f22b-453f-860c-eb13d0e72440 2582.4824 130.0 0.0 \n", + "473d65fb-fda4-4721-ba6f-cc659efc1d5a 940.4100 70.0 0.0 \n", + "449e2cd1-eca2-4708-83fe-651f378c3a14 241.3800 74.0 0.0 \n", + "\n", + " Parent ID Area µm^2 Perimeter µm \n", + "Object ID \n", + "dcfe5196-4e8d-4126-b255-a9ea393c383a NaN 3172474.0 9853.3 \n", + "acc74bc0-3dd0-4b3e-86e3-e6c7b681d544 NaN 1603335.7 4844.2 \n", + "94571cf9-f22b-453f-860c-eb13d0e72440 250.0 884002.0 7927.8 \n", + "473d65fb-fda4-4721-ba6f-cc659efc1d5a 130.0 281816.9 2719.5 \n", + "449e2cd1-eca2-4708-83fe-651f378c3a14 130.0 152952.8 1694.4 " + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# read data\n", + "df_annotations = pd.read_csv(annotations_file, index_col=\"Object ID\", sep=\"\\t\")\n", + "df_detections = pd.DataFrame() # empty DataFrame\n", + "\n", + "# remove annotations that are not brain regions\n", + "df_annotations = df_annotations[df_annotations[\"Classification\"] != \"Region*\"]\n", + "df_annotations = df_annotations[df_annotations[\"ROI\"] != \"Rectangle\"]\n", + "\n", + "# have a look\n", + "display(df_annotations.head())" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
NamehemisphereArea µm^2Area mm^2area µm^2area mm^2density µm^-2density mm^-2coverage indexrelative countrelative densitychannelanimal
010SpContra.1749462.181.74946253117.370153.117373.03621130362.1139731612.7556450.0365350.033062Negativeanimalid1-SC
010SpContra.1749462.181.7494625257.10255.2571030.3004983004.9820815.7974990.0307660.02085Positiveanimalid1-SC
110SpIpsi.1439105.931.43910664182.982364.1829824.45992144599.2063282862.510070.0235240.023265Negativeanimalid1-SC
110SpIpsi.1439105.931.4391068046.33758.0463370.5591215591.20585444.9887290.0289110.022984Positiveanimalid1-SC
210Spboth3188568.113.188568117300.3524117.3003523.67877836787.7832164315.2199350.0280470.025734Negativeanimalid1-SC
\n", + "
" + ], + "text/plain": [ + " Name hemisphere Area µm^2 Area mm^2 area µm^2 area mm^2 \\\n", + "0 10Sp Contra. 1749462.18 1.749462 53117.3701 53.11737 \n", + "0 10Sp Contra. 1749462.18 1.749462 5257.1025 5.257103 \n", + "1 10Sp Ipsi. 1439105.93 1.439106 64182.9823 64.182982 \n", + "1 10Sp Ipsi. 1439105.93 1.439106 8046.3375 8.046337 \n", + "2 10Sp both 3188568.11 3.188568 117300.3524 117.300352 \n", + "\n", + " density µm^-2 density mm^-2 coverage index relative count relative density \\\n", + "0 3.036211 30362.113973 1612.755645 0.036535 0.033062 \n", + "0 0.300498 3004.98208 15.797499 0.030766 0.02085 \n", + "1 4.459921 44599.206328 2862.51007 0.023524 0.023265 \n", + "1 0.559121 5591.205854 44.988729 0.028911 0.022984 \n", + "2 3.678778 36787.783216 4315.219935 0.028047 0.025734 \n", + "\n", + " channel animal \n", + "0 Negative animalid1-SC \n", + "0 Positive animalid1-SC \n", + "1 Negative animalid1-SC \n", + "1 Positive animalid1-SC \n", + "2 Negative animalid1-SC " + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# get distributions per regions, spatial distributions and coordinates\n", + "df_regions, dfs_distributions, df_coordinates = hq.process.process_animal(\n", + " animal, df_annotations, df_detections, cfg, compute_distributions=False\n", + ")\n", + "\n", + "# convert the \"density µm^-2\" column, which is actually the coverage fraction, to a percentage\n", + "df_regions[\"density µm^-2\"] = df_regions[\"density µm^-2\"] * 100\n", + "\n", + "# have a look\n", + "display(df_regions.head())" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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iE35o48+alEqlRaDwVAjrks9gKKjoy2AzUP/Yvr162e5+uqrLb/99pu17MCBAxYnJyfLXXfdZS273H8LFovFolKpan1AnavjzjvvrPHZuYfg+datW3dFSa8QrZE8p/+nuTynLZYLJ4qdO3e2Sbo3bNhgASwvvviixWKxWL777jsLYHn33XcvWr8kig1Hup5rMX36dJvtG2+8kd9++w2j0QjA+++/T1VVFePHj+fMmTPWL19fX4KDg/n0009tjm/bti0TJkywbnfv3p327dsTGhpKWFiYtfzc9z///PMFY2vfvj0AH3744SWb+8eOHUvnzp2t29dffz1hYWFs27btsq75/DjeffddPD09GTZsmM01X3vttbRt27bGNQcGBhIZGWlT9u6773LjjTfi5eVlU8fQoUMxm8189tln1n1XrVqFxWIhICDgotd47mfSrl27i+4H1d0k+/fvZ8qUKWg0Gmt5nz59GDZs2GXfl/P/LVyOv9cB2IwDKi0t5cyZMwwYMACAb7/99rLrFqK1kud083lOX8xdd91l8/y+44476Nixo/X6PT09Adi5c2etQwtEw5PJLLXw9/e32fby8gKgqKgItVpNdnY2FouF4ODgWo93dna22e7SpQsKhcKmzNPTEz8/vxpl585zIREREdx+++3MmzePpKQkbr75ZsaOHcvEiRNrDOatLb6QkBA2bNhgU+bm5oaPj49NmZeXl00c2dnZFBcXc/XVV9ca16+//mqzHRgYWGOf7Oxsvv/++xrnulAdl0OtVgPw+++/Wx/OF3Ls2DGg+j+AvwsNDWXnzp01Jptc6t/C5ajtXhQWFjJv3jzWr19f47rPH3cjhKidPKebz3P6Yv5+/QqFAq1Wax3vGRgYyIMPPsgLL7xAamoqN954I7feeitxcXHWn4VoWJIo1uJCs9csFgtQPVhYoVCwffv2Wvf9+8KoF6rvUuepjUKhYOPGjezdu5ctW7awc+dOpk2bxvPPP8/evXvrtCjr5czWq6qq4uqrryY1NbXWz//+UKlt5lxVVRXDhg3j4YcfrrWOkJCQy4jWVo8ePQD44YcfuPHGG6/4+Eupy8/o72q7F+PHj+err75i9uzZ9OvXj7Zt21JVVUVUVFSNAeNCiJrkOV1TU31O19fzzz/PlClT+O9//8tHH33EAw88wKJFi9i7dy9dunRp9HhaG0kU6yAoKAiLxUJgYKBDfmkABgwYwIABA3j66ad55513iI2NZf369dxzzz3WfbKzs2scd+TIkTp1EwQFBfHxxx8zaNCgOi+fEBQUxB9//MHQoUPrdHxtxowZw6JFi1i7du0lE8Vza5wdPny4xmc//fQT3t7edVq65u+tEJdSVFTErl27mDdvHk899ZS1vLaflxCibuQ53XSe0xfz9+u3WCzk5OTQp08fm/LevXvTu3dvnnjiCb766isGDRrEypUrWbhwYaPE2ZrJGMU6+Oc//4lSqWTevHk1/qq0WCwNusRJUVFRjXP269cPgLKyMpvyTZs2ceLECev2vn37yMzMZMSIEVd83vHjx2M2m1mwYEGNzyorKzl79uxl1ZGRkcHOnTtrfHb27FkqKyut25e77EJ4eDhRUVG88cYbtS56XV5ezqxZswDo2LEj/fr1Y/Xq1Tbx/vjjj3z00UeMHDnyktdQG5VKdVnXf865loG//xyXLVtWY9+SkhJ++umnJvW6MiGaA3lO23Lkc/pi1qxZw++//27d3rhxIwUFBdbrNxqNNueE6qTRycmpxr08X0VFBT/99BMFBQV1jk1UkxbFOggKCmLhwoUkJiaSl5fH2LFjadeuHUePHuWDDz7gvvvusyYn9rZ69WpeeeUVoqOjCQoK4vfff+f1119HrVbXSHS0Wi033HAD999/P2VlZSxbtoyrrrrqgl0KFxMREcG//vUvFi1axP79+xk+fDjOzs5kZ2fz7rvv8uKLL3LHHXdctI7Zs2ezefNmRo8ezZQpU7j22msxmUz88MMPbNy4kby8PLy9vQFITExk9erVHD169JJ/Wa9Zs4bhw4fzz3/+kzFjxjBkyBBUKhXZ2dmsX7+egoIC61qKS5cuZcSIEYSHh3P33Xfz559/8vLLL+Pp6cncuXOv+L4AXHvttXz88ce88MILdOrUicDAQJvB73+nVqu56aabWLJkCRUVFXTu3JmPPvqIo0eP1th33759DB48mDlz5tQ5PiFaI3lON63n9IVoNBpuuOEGpk6dyqlTp1i2bBlarZZ7770XqF73dsaMGYwbN46QkBAqKyt5++23USqVta6de86JEycIDQ1l8uTJrFq1qk6xiWqSKNbRo48+SkhICElJScybNw8APz8/hg8fzq233tpg542IiGDfvn2sX7+eU6dO4enpyfXXX09qamqNgcl33XUX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GRkGQIm2CwAq/SFKhg9wZGiN4vbbb6e8vJzVq1fTrVs3Tp06xa5du/jtt99q3b+iooKsrCxGjhzJ448/zpo1azhx4gTTp0/HbDbz3HPPNfIViNbITX+IorCenI6q/h0993ubuiGNxFmzHRmaaCUkURSilcjOy8MY0dOmzKTtgvpIhoMiajxnz57l888/Z/fu3URERADQtWtXrr/+eus+CoWCV155he3bt7Nr1y5mz55NeXk5ffr04amnngJAq9WyZMkSxo8fz5w5c2jXrp1Drke0HsrCYkwDbH9vjUGdObIny0ERidZGup6FaCWCAwJQ556wKVPl5GNuBWMU27ZtS9u2bdm0aRNlZWUX3G/u3LlER0fzww8/MG3aNMrKynBzc7PZx93dndLSUr755puGDlsIzBpPVDn5NmXq3BOEBAY6KCLR2kiiKEQrERczgQ76w/juzMQjJx+fHXvxysyiVBfq6NAaXJs2bVi1ahWrV6+mffv2DBo0iMcee4zvv//eZr+JEycydepUunXrhr+/P5GRkXz11VesW7cOs9nMiRMnmD9/PgAFBQWOuBTRypTqQvHKzMJnx148cvLx3ZlJB/1hYsfHODo00UpIoihEK+Hv709y0jKinTV03JaB6owRY8ywJjfr2Wg02nxdrAXwStx+++388ssvbN68maioKHbv3s0111zDqlWrrPvodDqbY4YPH87SpUuZPn06rq6uhISEMHLkSACcnOz3+CwrK6tx3UIAVGk8McYMQ3XGSPieLKKdNSQnLZNZz6LRKCwWi8XRQQghWocdulEX/MxkruCO/ek1yufMmcPcuXMbJJ577rmH9PR0jh07hkKh4IMPPmDs2LE19rNYLBQUFODl5UVeXh49e/Zk3759XHfddXaJY+7cucybN69G+cZ+w1Apne1yjnOi9FvtWp8QomWTySxCiCbl+PHjqNVq67arq2uDnatnz55s2rTpkvspFAo6deoEwLp16/Dz8+Oaa66xWxyJiYk8+OCD1m2j0Yifn5/d6hdCiLqSRFEI0eAMBgNpa1M52K4SjRl0pUo0VYpa91Wr1TaJoj389ttvjBs3jmnTptGnTx/atWuHXq9nyZIl3HbbbRc9dunSpURFReHk5MT777/Ps88+y4YNG1AqlXaLz9XVtUETYoBCJwt6NzNbpt5NQLCWmLhY6b4UQlySJIpCiAZl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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# plot distributions per regions\n", + "fig_regions = hq.display.plot_regions(df_regions, cfg)\n", + "# specify which regions to plot\n", + "# fig_regions = hq.display.plot_regions(df_regions, cfg, names_list=[\"Rh9\", \"Sr9\", \"8Sp\"])\n", + "\n", + "# save as svg\n", + "# fig_regions[0].savefig(r\"C:\\Users\\glegoc\\Downloads\\nice_figure.svg\")" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "hq", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.7" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/demo_notebooks/fibers_length_multi.html b/demo_notebooks/fibers_length_multi.html new file mode 100644 index 0000000..8172586 --- /dev/null +++ b/demo_notebooks/fibers_length_multi.html @@ -0,0 +1,2163 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + Fibers length in multi animals - histoquant + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/demo_notebooks/fibers_length_multi.ipynb b/demo_notebooks/fibers_length_multi.ipynb new file mode 100644 index 0000000..eab398a --- /dev/null +++ b/demo_notebooks/fibers_length_multi.ipynb @@ -0,0 +1,372 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Fibers length in multi animals\n", + "This example uses synthetic data to showcase how `histoquant` can be used in a [pipeline](../guide-pipeline.html).\n", + "\n", + "Annotations measurements should be exported from QuPath, following the required [directory structure](../guide-pipeline.html#directory-structure).\n", + "\n", + "Alternatively, you can merge all your CSV files yourself, one per animal, adding an animal ID to each table. Those can be processed with the `histoquant.process.process_animal()` function, in a loop, collecting the results at each iteration and finally concatenating the results. Finally, those can be used with `display` module. See the API reference for the [`process` module](../api-process.html)." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "import histoquant as hq" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "# Full path to your configuration file, edited according to your need beforehand\n", + "config_file = \"../../resources/demo_config_multi.toml\"" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "# Files\n", + "wdir = \"../../resources/multi\"\n", + "animals = [\"mouse0\", \"mouse1\"]" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "# get configuration\n", + "cfg = hq.Config(config_file)" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Processing mouse1: 100%|██████████| 2/2 [00:00<00:00, 15.24it/s]\n" + ] + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
NamehemisphereArea µm^2Area mm^2length µmlength mmdensity µm^-1density mm^-1coverage indexrelative countrelative densitychannelanimal
0ACVIIContra.9099.040.009099468.03810.4680380.05143851438.18468824.075030.000640.022168marker3mouse0
1ACVIIContra.9099.040.0090994260.48444.2604840.468234468234.4950681994.9057620.00190.056502marker2mouse0
2ACVIIContra.9099.040.0090995337.71035.337710.586623586623.456983131.2260690.0101040.242734marker1mouse0
3ACVIIIpsi.4609.900.0046100.00.00.00.00.00.00.0marker3mouse0
4ACVIIIpsi.4609.900.0046100.00.00.00.00.00.00.0marker2mouse0
5ACVIIIpsi.4609.900.0046100.00.00.00.00.00.00.0marker1mouse0
6ACVIIboth13708.940.013709468.03810.4680380.03414134141.08603615.9793290.0002840.011001marker3mouse0
7ACVIIboth13708.940.0137094260.48444.2604840.310781310781.4608571324.0795660.0009340.030688marker2mouse0
8ACVIIboth13708.940.0137095337.71035.337710.38936389359.8119182078.2898780.005340.142623marker1mouse0
9AMBContra.122463.800.12246430482.781530.4827820.248913248912.5888637587.5480590.0417120.107271marker3mouse0
\n", + "
" + ], + "text/plain": [ + " Name hemisphere Area µm^2 Area mm^2 length µm length mm \\\n", + "0 ACVII Contra. 9099.04 0.009099 468.0381 0.468038 \n", + "1 ACVII Contra. 9099.04 0.009099 4260.4844 4.260484 \n", + "2 ACVII Contra. 9099.04 0.009099 5337.7103 5.33771 \n", + "3 ACVII Ipsi. 4609.90 0.004610 0.0 0.0 \n", + "4 ACVII Ipsi. 4609.90 0.004610 0.0 0.0 \n", + "5 ACVII Ipsi. 4609.90 0.004610 0.0 0.0 \n", + "6 ACVII both 13708.94 0.013709 468.0381 0.468038 \n", + "7 ACVII both 13708.94 0.013709 4260.4844 4.260484 \n", + "8 ACVII both 13708.94 0.013709 5337.7103 5.33771 \n", + "9 AMB Contra. 122463.80 0.122464 30482.7815 30.482782 \n", + "\n", + " density µm^-1 density mm^-1 coverage index relative count relative density \\\n", + "0 0.051438 51438.184688 24.07503 0.00064 0.022168 \n", + "1 0.468234 468234.495068 1994.905762 0.0019 0.056502 \n", + "2 0.586623 586623.45698 3131.226069 0.010104 0.242734 \n", + "3 0.0 0.0 0.0 0.0 0.0 \n", + "4 0.0 0.0 0.0 0.0 0.0 \n", + "5 0.0 0.0 0.0 0.0 0.0 \n", + "6 0.034141 34141.086036 15.979329 0.000284 0.011001 \n", + "7 0.310781 310781.460857 1324.079566 0.000934 0.030688 \n", + "8 0.38936 389359.811918 2078.289878 0.00534 0.142623 \n", + "9 0.248913 248912.588863 7587.548059 0.041712 0.107271 \n", + "\n", + " channel animal \n", + "0 marker3 mouse0 \n", + "1 marker2 mouse0 \n", + "2 marker1 mouse0 \n", + "3 marker3 mouse0 \n", + "4 marker2 mouse0 \n", + "5 marker1 mouse0 \n", + "6 marker3 mouse0 \n", + "7 marker2 mouse0 \n", + "8 marker1 mouse0 \n", + "9 marker3 mouse0 " + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# get distributions per regions\n", + "df_regions, _, _ = hq.process.process_animals(\n", + " wdir, animals, cfg, compute_distributions=False\n", + ")\n", + "\n", + "# have a look\n", + "display(df_regions.head(10))" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAApQAAAH0CAYAAACD0737AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAAEAAElEQVR4nOzdd3hTZfvA8e/JaJLuvWihpYO9EZmyl6KgvqAsKSIoS5GXrbJEURTBAaIgW2Up6AuyRBRkI3tDGS2jdDcdadIk5/dHfwRDWygdtMDzua5e9Jyc85z7pOX0zjMlWZZlBEEQBEEQBKGIFGUdgCAIgiAIgvBwEwmlIAiCIAiCUCwioRQEQRAEQRCKRSSUgiAIgiAIQrGIhFIQBEEQBEEoFpFQCoIgCIIgCMUiEkpBEARBEAShWERCKQiCIAiCIBSLSCgFQRAEQRCEYhEJ5V1MnjwZSZJITEws61BsFi9ejCRJXL58uVTKj4qKwtnZuVTKFgRBKA3iWS3kJyQkhKioqLIO47EhEkrhkZSdnc2sWbN48skncXNzQ6vVEhkZybBhwzh37lypXvvDDz9k3bp1pXoNQRCEh50kSQwbNqyswxBKiEgoHzJ9+/bFYDBQqVKlsg6l3EpMTKR58+aMHDkSX19fpk6dypw5c+jWrRu//vorNWvWLNXri4RSEATxrC57Z8+eZf78+WUdxmNDVdYBCPdHqVSiVCrLOoxikWWZ7OxsdDpdqZQfFRXF4cOHWbNmDS+++KLda++//z7vvPNOqVy3KDIzM3FycirrMARBKGHiWV32NBpNWYfwWBE1lIWQmppKVFQU7u7uuLm50b9/f7KysvIct3z5cho0aIBOp8PT05OXX36Z2NhYu2NatWpFzZo1OXbsGC1btsTR0ZHw8HDWrFkDwF9//cWTTz6JTqejSpUq/P7773bn59cv5+DBg3Ts2BFvb290Oh2hoaG8+uqrttcvX76MJEl8+umnzJo1i0qVKqHT6WjZsiUnTpzI956vXbtGt27dcHZ2xsfHh1GjRmGxWOyOsVqtzJ49mxo1aqDVavHz8+P1118nJSXF7riQkBC6dOnC5s2badiwITqdjm+++cb23o4YMYLg4GA0Gg3h4eF8/PHHWK1WuzJu3LjBmTNnyMnJyTfeW/bt28eGDRsYMGBAnmQSch8wn376qd2+P/74gxYtWuDk5IS7uztdu3bl9OnTdsfc6qN14cKFu/4uSJJEZmYmS5YsQZIkJEmy9eG5VcapU6fo1asXHh4eNG/eHIBjx44RFRVF5cqV0Wq1+Pv78+qrr5KUlHTX+xUE4TbxrH54ntX5+fPPP5EkiZUrVzJhwgT8/f1xcnLiueeey/PzOX/+PC+++CL+/v5otVqCgoJ4+eWXSUtLs7sf0YfyAZKFAk2aNEkG5Hr16skvvPCCPHfuXPm1116TAXnMmDF2x06bNk2WJEl+6aWX5Llz58pTpkyRvb295ZCQEDklJcV2XMuWLeXAwEA5ODhYHj16tPzll1/K1atXl5VKpbxixQrZ399fnjx5sjx79my5QoUKspubm6zX623nL1q0SAbkS5cuybIsyzdv3pQ9PDzkyMhI+ZNPPpHnz58vv/POO3K1atVs51y6dEkG5Fq1askhISHyxx9/LE+ZMkX29PSUfXx85Li4ONux/fr1k7VarVyjRg351Vdflb/++mv5xRdflAF57ty5dvf82muvySqVSh44cKA8b948eezYsbKTk5P8xBNPyCaTyXZcpUqV5PDwcNnDw0MeN26cPG/ePHn79u1yZmamXLt2bdnLy0ueMGGCPG/ePPmVV16RJUmS33rrLbtr9evXz+6+CzJhwgQZkHfs2HHX427ZunWrrFKp5MjISHnGjBm2n5uHh4fdtQr7u7Bs2TJZo9HILVq0kJctWyYvW7ZM3r17t10Z1atXl7t27SrPnTtXnjNnjizLsvzpp5/KLVq0kKdOnSp/++238ltvvSXrdDq5UaNGstVqLdS9CMLjSjyrH75ntSzLMiAPHTrUtr19+3bb/deuXVv+7LPP5HHjxslarVaOjIyUs7KyZFmWZaPRKIeGhsqBgYHytGnT5AULFshTpkyRn3jiCfny5ct299OvX797xiGUDJFQ3sWth9Srr75qt//555+Xvby8bNuXL1+WlUql/MEHH9gdd/z4cVmlUtntb9mypQzIP/zwg23fmTNnZEBWKBTy3r17bfs3b94sA/KiRYts++58SK1du1YG5AMHDhR4H7ceUjqdTr569apt/759+2RAfvvtt237bj0Mpk6daldGvXr15AYNGti2d+7cKQPy999/b3fcpk2b8uyvVKmSDMibNm2yO/b999+XnZyc5HPnztntHzdunKxUKuWYmJg8cd3rIfX888/LgN0fhrup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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAApMAAAH0CAYAAABhD6aCAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAAC7e0lEQVR4nOzdd3gU1frA8e/sbrIpm2xCEggJaRBC70pHipSg0kRQFKXZUFFUikGKIBBBELxKUek2BJFykaqAIgiIEIr0mkJoAbLpZXd+f/BjdU1oySa7XN7P88zzMGfOnPOe5N7xzcycOYqqqipCCCGEEEIUgcbRAQghhBBCiHuXJJNCCCGEEKLIJJkUQgghhBBFJsmkEEIIIYQoMkkmhRBCCCFEkUkyKYQQQgghikySSSGEEEIIUWSSTAohhBBCiCKTZFIIIYQQQhSZJJO38N5776EoCpcvX3Z0KFYLFixAURTOnDlTIu337dsXg8FQIm0LIURJkGu1KEx4eDh9+/Z1dBj3BUkmxf+k7Oxspk2bRqNGjTAajbi5uREVFcVrr73GsWPHSrTviRMnsmLFihLtQwgh7nWKovDaa685OgxhB5JM3mOeffZZsrKyCAsLc3QoTuvy5cs0b96ct956i7JlyzJu3DhmzJhB165dWbVqFTVr1izR/iWZFELItdrxjh49yhdffOHoMO4LOkcHIO6OVqtFq9U6OoxiUVWV7Oxs3N3dS6T9vn37snfvXr7//nu6d+9uc+z999/n3XffLZF+iyIjIwNPT09HhyGEsDO5VjueXq93dAj3DbkzeQeuXbtG37598fHxwWg00q9fPzIzMwvU++qrr2jQoAHu7u6UKVOGp556ioSEBJs6rVq1ombNmuzfv5+WLVvi4eFBZGQk33//PQC//PILjRo1wt3dnSpVqvDTTz/ZnF/Yezi7d++mQ4cO+Pv74+7uTkREBP3797ceP3PmDIqiMGXKFKZNm0ZYWBju7u60bNmSgwcPFjrmpKQkunbtisFgICAggCFDhmA2m23qWCwWpk+fTo0aNXBzc6NcuXK89NJLXL161aZeeHg4jz32GOvXr+eBBx7A3d2dzz77zPqzHTx4MCEhIej1eiIjI5k0aRIWi8WmjeTkZI4cOUJeXl6h8d6wc+dOfvzxRwYMGFAgkYTrF5cpU6bYlG3atIkWLVrg6emJj48PXbp04fDhwzZ1bryTdeLEiVv+b0FRFDIyMli4cCGKoqAoivWdnRttHDp0iKeffhpfX1+aN28OwP79++nbty8VK1bEzc2NwMBA+vfvT0pKyi3HK4T4m1yr751rdWG2bNmCoih89913jBgxgsDAQDw9PencuXOB38/x48fp3r07gYGBuLm5UaFCBZ566ilSU1NtxiPvTJYSVdzUmDFjVECtV6+e+vjjj6szZ85Un3/+eRVQhw0bZlN3/PjxqqIo6pNPPqnOnDlTHTt2rOrv76+Gh4erV69etdZr2bKlGhQUpIaEhKhDhw5VP/nkE7V69eqqVqtVFy9erAYGBqrvvfeeOn36dDU4OFg1Go2qyWSynj9//nwVUE+fPq2qqqpeuHBB9fX1VaOiotQPP/xQ/eKLL9R3331XrVatmvWc06dPq4Baq1YtNTw8XJ00aZI6duxYtUyZMmpAQIB6/vx5a90+ffqobm5uao0aNdT+/furs2bNUrt3764C6syZM23G/Pzzz6s6nU594YUX1NmzZ6vDhw9XPT091QcffFDNzc211gsLC1MjIyNVX19f9Z133lFnz56tbt68Wc3IyFBr166t+vn5qSNGjFBnz56tPvfcc6qiKOobb7xh01efPn1sxn0zI0aMUAH1119/vWW9GzZu3KjqdDo1KipKnTx5svX35uvra9PXnf5v4csvv1T1er3aokUL9csvv1S//PJLdfv27TZtVK9eXe3SpYs6c+ZMdcaMGaqqquqUKVPUFi1aqOPGjVM///xz9Y033lDd3d3Vhg0bqhaL5Y7GIsT9Sq7V9961WlVVFVBfffVV6/7mzZut469du7b60Ucfqe+8847q5uamRkVFqZmZmaqqqmpOTo4aERGhBgUFqePHj1fnzJmjjh07Vn3wwQfVM2fO2IynT58+t41DFJ8kk7dw4wLVv39/m/Ju3bqpfn5+1v0zZ86oWq1WnTBhgk29AwcOqDqdzqa8ZcuWKqB+88031rIjR46ogKrRaNQdO3ZYy9evX68C6vz5861l/75ALV++XAXUP/7446bjuHGBcnd3VxMTE63lO3fuVAH1zTfftJbduBCMGzfOpo169eqpDRo0sO5v3bpVBdSvv/7apt66desKlIeFhamAum7dOpu677//vurp6akeO3bMpvydd95RtVqtGh8fXyCu212gunXrpgI2/1G4lbp166pl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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "figs_regions = hq.display.plot_regions(df_regions, cfg)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "hq", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.7" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/guide-create-pyramids.html b/guide-create-pyramids.html new file mode 100644 index 0000000..a32a6c9 --- /dev/null +++ b/guide-create-pyramids.html @@ -0,0 +1,1483 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + Create pyramidal OME-TIFF - histoquant + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + + + + +

Create pyramidal OME-TIFF#

+

This page will guide you to use the create_pyramids script, in the event the CZI file does not work directly in QuPath. The script will generate pyramids from OME-TIFF files exported from ZEN.

+
+

Tip

+

The create_pyramids.py script can also pyramidalize images using Python only with the --no-use-qupath option, but I find it slower and less reliable.

+
+

This Python script uses QuPath under the hood, via a companion script called createPyramids.groovy. It will find the OME-TIFF files and make QuPath run the groovy script on it, in console mode (without graphical user interface).

+

This script is standalone, eg. it does not rely on the histoquant package. But installing the later makes sure all dependencies are installed (namely typer and tqdm with the QuPath backend and quite a few more for the Python backend).

+

Installation#

+

You will need a virtual environment with the required dependencies.

+

Follow those instructions to install miniconda3 if you didn't already.

+

Then, install the required dependencies.

+
+
+
+

Install the histoquant package by following those instructions.

+
+
+

Alternatively, if you don't plan to use the histoquant package, you can create a minimal conda environment with only the libraries required for create_pyramids.py. +

With QuPath backend
conda create -n hq python=3.12
+conda activate hq
+pip install typer tqdm
+
+
With Python backend
conda create -n hq python=3.12
+conda activate hq
+pip install typer tqdm numpy tifffile scikit-image
+

+
+
+
+

Export CZI to OME-TIFF#

+

OME-TIFF is a specification of the TIFF image format. It specifies how the metadata should be written to the file to be interoperable between softwares. ZEN can export to OME-TIFF so you don't need to pay attention to metadata. Therefore, you won't need to specify pixel size and channels names and colors as it will be read directly from the OME-TIFF files.

+
+
    +
  1. Open your CZI file in ZEN.
  2. +
  3. Open the "Processing tab" on the left panel.
  4. +
  5. Under method, choose Export/Import > OME TIFF-Export.
  6. +
  7. In Parameters, make sure to tick the "Show all" tiny box on the right.
  8. +
  9. The following parameters should be used (checked), the other should be unchecked :
      +
    • Use Tiles
    • +
    • Original data ⚠ "Convert to 8 Bit" should be UNCHECKED ⚠
    • +
    • OME-XML Scheme : 2016-06
    • +
    • Use full set of dimensions (unless you want to select slices and/or channels)
    • +
    +
  10. +
  11. In Input, choose your file
  12. +
  13. Go back to Parameters to choose the output directory and file prefix. "_s1", "_s2"... will be appended to the prefix.
  14. +
  15. Back on the top, click the "Apply" button.
  16. +
+
+

The OME-TIFF files should be ready to be pyramidalized with the create_pyramids.py script.

+

Usage#

+

The script is located under scripts/pyramids. Copy the two files (.py and .groovy) elsewhere on your computer.

+

To use the QuPath backend (recommended), you need to set its path in the script. To do so, open the create_pyramids.py file with a text editor (Notepad or vscode to get nice syntax coloring). +Locate the QUPATH_PATH line : +

51
+52
+53
+54
QUPATH_PATH: str = (
+    "C:/Users/glegoc/AppData/Local/QuPath-0.5.1/QuPath-0.5.1 (console).exe"
+)
+"""Full path to the QuPath (console) executable."""
+

+
+

Info

+

The AppData directory is hidden by default. In the file explorer, you can go to the "View" tab and check "Hidden items" under "Show/hide".

+
+

And replace the path to the "QuPath-0.X.Y (console).exe" executable. QuPath should be installed in C:\Users\USERNAME\AppData\Local\QuPath-0.X.Y\ by default.
+Save the file. Then run the script on your images :

+
+
    +
  1. Open a terminal (PowerShell) so that it can find the create_pyramids.py script, by either :
      +
    • open PowerShell from the start menu, then browse to the location of your script: +
      cd /path/to/your/scripts
      +
    • +
    • From the file explorer, browse to where the script is and in an empty space, Shift+Right Button to "Open PowerShell window here"
    • +
    +
  2. +
  3. Activate the virtual environment : +
    conda activate hq
    +
  4. +
  5. Copy the path to your OME-TIFF images (for example "D:\Data\Histo\NiceMouseName\NiceMouseName-tiff\")
  6. +
  7. In the terminal, run the script on your images : +
    python create_pyramids.py "D:\Data\Histo\NiceMouseName\NiceMouseName-tiff\"
    +
  8. +
+
+

Warning

+

Make sure to use double quotes when specifying the path ("D:\some\path"), because if there are whitespaces in it, each whitespace-separated bits will be parsed as several arguments for the script.

+
+
+
+

Tip

+

create_pyramids.py can behave like a command line interface. In the event you would need to modify the default values used in the script (tile size and the like), you can either edit the script or, preferably, use options when calling the script like so : +

python create_pyramids.py --OPTION VALUE /path/to/images
+
+Learn more by asking for help : +
python create_pyramids.py --help
+

+
+

Upon completion, this will create a subdirectory "pyramidal" next to your OME-TIFF files where you will find the pyramidal images ready to be used in QuPath and ABBA. You can safely delete the original OME-TIFF exported from ZEN.

+

You can check the API documentation for this script here.

+ + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/guide-install-abba.html b/guide-install-abba.html new file mode 100644 index 0000000..2dbce50 --- /dev/null +++ b/guide-install-abba.html @@ -0,0 +1,1650 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + Install ABBA - histoquant + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + + + + + +
+
+ + + + + + + + + + +

Install ABBA#

+

You can head to the ABBA documentation for installation instructions. You'll see that a Windows installer is available. While it might be working great, I prefer to do it manually step-by-step to make sure everything is going well.

+

You will find below installation instructions for the regular ABBA Fiji plugin, which proposes only the mouse and rat brain atlases. To be able to use the Brainglobe atlases, you will need the Python version. The two can be installed alongside each other.

+

ABBA Fiji#

+

Install Fiji#

+

Install the "batteries-included" distribution of ImageJ, Fiji, from the official website.

+
+

Warning

+

Extract Fiji somewhere you have write access, otherwise Fiji will not be able to download and install plugins. In other words, put the folder in your User directory and not in C:\, C:\Program Files and the like.

+
+
    +
  1. Download the zip archive and extract it somewhere relevant.
  2. +
  3. Launch ImageJ.exe.
  4. +
+

Install the ABBA plugin#

+

We need to add the PTBIOP update site, managed by the bio-imaging and optics facility at EPFL, that contains the ABBA plugin.

+
    +
  1. In Fiji, head to Help > Update...
  2. +
  3. In the ImageJ updater window, click on Manage Update Sites. Look up PTBIOP, and click on the check box. Apply and Close, and Apply Changes. +This will download and install the required plugins. Restart ImageJ as suggested.
  4. +
  5. In Fiji, head to Plugins > BIOP > Atlas > ABBA - ABBA start, or simply type abba start in the search box.
    +Choose the "Adult Mouse Brain - Allen Brain Atlas V3p1". It will download this atlas and might take a while, depending on your Internet connection.
  6. +
+

Install the automatic registration tools#

+

ABBA can leverage the elastix toolbox for automatic 2D in-plane registration.

+
    +
  1. You need to download it here, which will redirect you to the Github releases page (5.2.0 should work).
  2. +
  3. Download the zip archive and extract it somewhere relevant.
  4. +
  5. In Fiji, in the search box, type "set and check" and launch the "Set and Check Wrappers" command. Set the paths to "elastix.exe" and "transformix.exe" you just downloaded.
  6. +
+

ABBA should be installed and functional ! You can check the official documentation for usage instructions and some tips here.

+

ABBA Python#

+

Brainglobe is an initiative aiming at providing interoperable, model-agnostic Python-based tools for neuroanatomy. They package various published volumetric anatomical atlases of different species (check the list), including the Allen Mouse brain atlas (CCFv3, ref.) and a 3D version of the Allen mouse spinal cord atlas (ref).

+

To be able to leverage those atlases, we need to make ImageJ and Python be able to talk to each other. This is the purpose of abba_python, that will install ImageJ and its ABBA plugins inside a python environment, with bindings between the two worlds.

+

Install conda#

+

If not done already, follow those instructions to install miniconda3.

+

Install abba_python in a virtual environment#

+
    +
  1. Open a terminal (PowerShell).
  2. +
  3. Create a virtual environment with Python 3.10, OpenJDK and PyImageJ : +
    conda create -c conda-forge -n abba_python python=3.10 openjdk=11 maven pyimagej notebook
    +
  4. +
  5. Install the latest functional version of abba_python with pip : +
    pip install abba-python==0.9.6.dev0
    +
  6. +
  7. Restart the terminal and activate the new environment : +
    conda activate abba_python
    +
  8. +
  9. Download the Brainglobe atlas you want (eg. Allen mouse spinal cord) : +
    brainglobe install -a allen_cord_20um
    +
  10. +
  11. Launch an interactive Python shell : +
    ipython
    +
    +You should see the IPython prompt, that looks like this : +
    In [1]:
    +
  12. +
  13. Import abba_python and launch ImageJ from Python : +
    from abba_python import abba
    +abba.start_imagej()
    +
    +The first launch needs to initialize ImageJ and install all required plugins, which takes a while (>5min).
  14. +
  15. Use ABBA as the regular Fiji version ! The main difference is that the dropdown menu to select which atlas to use is populated with the Brainglobe atlases.
  16. +
+
+

Tip

+

Afterwards, to launch ImageJ from Python and do some registration work, you just need to launch a terminal (PowerShell), and do steps 4., 6., and 7.

+
+

Install the automatic registration tools#

+

You can follow the same instructions as the regular Fiji version. You can do it from either the "normal" Fiji or the ImageJ instance launched from Python, they share the same configuration files. Therefore, if you already did it in regular Fiji, elastix should already be set up and ready to use in ImageJ from Python.

+

Troubleshooting#

+

JAVA_HOME errors#

+

Unfortunately on some computers, Python does not find the Java virtual machine even though it should have been installed when installing OpenJDK with conda. This will result in an error mentionning "java.dll" and suggesting to check the JAVA_HOME environment variable.

+

The only fix I could find is to install Java system-wide. You can grab a (free) installer on Adoptium, choosing JRE 17.X for your platform.
+During the installation :

+
    +
  • choose to install "just for you",
  • +
  • enable "Modify PATH variable" as well as "Set or override JAVA_HOME" variable.
  • +
+

Restart the terminal and try again. Now, ImageJ should use the system-wide Java and it should work.

+

ABBA QuPath extension#

+

To import registered regions in your QuPath project and be able to convert objects' coordinates in atlas space, the ABBA QuPath extension is required.

+
    +
  1. In QuPath, head to Edit > Preferences. In the Extension tab, set your QuPath user directory to a local directory (usually C:\Users\USERNAME\QuPath\v0.X.Y).
  2. +
  3. Create a folder named extensions in your QuPath user directory.
  4. +
  5. Download the latest ABBA extension for QuPath from GitHub (choose the file qupath-extension-abba-x.y.z.zip).
  6. +
  7. Uncompress the archive and copy all .jar files into the extensions folder in your QuPath user directory.
  8. +
  9. Restart QuPath. Now, in Extensions, you should have an ABBA entry.
  10. +
+ + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/guide-pipeline.html b/guide-pipeline.html new file mode 100644 index 0000000..97ceeb1 --- /dev/null +++ b/guide-pipeline.html @@ -0,0 +1,1512 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + Pipeline - histoquant + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + + + + +

Pipeline#

+

While you can use QuPath and histoquant functionalities as you see fit, there exists a pipeline version of those. It requires a specific structure to store files (so that the different scripts know where to look for data). It also requires that you have detections stored as geojson files, which can be achieved using a pixel classifier and further segmentation (see here) for example.

+

Purpose#

+

This is especially useful to perform quantification for several animals at once, where you'll only need to specify the root directory and the animals identifiers that should be pooled together, instead of having to manually specify each detections and annotations files.

+

Three main scripts and function are used within the pipeline :

+
    +
  • exportPixelClassifierProbabilities.groovy to create prediction maps of objects of interest
  • +
  • segment_image.py to segment those maps and create geojson files to be imported back to QuPath as detections
  • +
  • pipelineImportExport.groovy to :
      +
    • clear all objects
    • +
    • import ABBA regions
    • +
    • mirror regions names
    • +
    • import geojson detections (from $folderPrefix$segmentation/$segTag$/geojson)
    • +
    • add measurements to detections
    • +
    • add atlas coordinates to detections
    • +
    • add hemisphere to detections' parents
    • +
    • add regions measurements
        +
      • count for punctal objects
      • +
      • cumulated length for lines objects
      • +
      +
    • +
    • export detections measurements
        +
      • as CSV for punctual objects
      • +
      • as JSON for lines
      • +
      +
    • +
    • export annotations as CSV
    • +
    +
  • +
+

Directory structure#

+

Following a specific directory structure ensures subsequent scripts and functions can find required files. The good news is that this structure will mostly be created automatically using the segmentation scripts (from QuPath and Python), as long as you stay consistent filling the parameters of each script. +The structure expected by the groovy all-in-one script and histoquant batch-process function is the following :

+
some_directory/
+    ├──AnimalID0/  
+    │   ├── animalid0_qupath/
+    │   └── animalid0_segmentation/  
+    │       └── segtag/  
+    │           ├── annotations/  
+    │           ├── detections/  
+    │           ├── geojson/  
+    │           └── probabilities/  
+    ├──AnimalID1/  
+    │   ├── animalid1_qupath/
+    │   └── animalid1_segmentation/  
+    │       └── segtag/  
+    │           ├── annotations/  
+    │           ├── detections/  
+    │           ├── geojson/  
+    │           └── probabilities/  
+
+
+

Info

+

Except the root directory and the QuPath project, the rest is automatically created based on the parameters provided in the different scripts. Here's the description of the structure and the requirements :

+
+
    +
  • animalid0 should be a convenient animal identifier.
  • +
  • The hierarchy must be followed.
  • +
  • The experiment root directory, AnimalID0, can be anything but should correspond to one and only one animal.
  • +
  • Subsequent animalid0 should be lower case.
  • +
  • animalid0_qupath can be named as you wish in practice, but should be the QuPath project.
  • +
  • animalid0_segmentation should be called exactly like this -- replacing animalid0 with the actual animal ID. It will be created automatically with the exportPixelClassifierProbabilities.groovy script.
  • +
  • segtag corresponds to the type of segmentation (cells, fibers...). It is specified in the exportPixelClassifierProbabilities script. It could be anything, but to recognize if the objects are polygons (and should be counted per regions) or polylines (and the cumulated length should be measured), there are some hardcoded keywords in the segment_images.py and pipelineImportExport.groovy scripts :
      +
    • Cells-like when you need measurements related to its shape (area, circularity...) : cells, cell, polygons, polygon
    • +
    • Cells-like when you consider them as punctual : synapto, synaptophysin, syngfp, boutons, points
    • +
    • Fibers-like (polylines) : fibers, fiber, axons, axon
    • +
    +
  • +
  • annotations contains the atlas regions measurements as TSV files.
  • +
  • detections contains the objects atlas coordinates and measurements as CSV files (for punctal objects) or JSON (for polylines objects).
  • +
  • geojson contains objects stored as geojson files. They could be generated with the pixel classifier prediction map segmentation.
  • +
  • probabilities contains the prediction maps to be segmented by the segment_images.py script.
  • +
+
+

Tip

+

You can see an example minimal directory structure with only annotations stored in resources/multi.

+
+

Usage#

+
+

Tip

+

Remember that this is merely an example pipeline, you can shortcut it at any points, as long as you end up with TSV files following the requirements for histoquant.

+
+
    +
  1. Create a QuPath project.
  2. +
  3. Register your images on an atlas with ABBA and export the registration back to QuPath.
  4. +
  5. Use a pixel classifier and export the prediction maps with the exportPixelClassifierProbabilities.groovy script. You need to get a pixel classifier or create one.
  6. +
  7. Segment those maps with the segment_images.py script to generate the geojson files containing the objects of interest.
  8. +
  9. Run the pipelineImportExport.groovy script on your QuPath project.
  10. +
  11. Set up your configuration files.
  12. +
  13. Then, analysing your data with any number of animals should be as easy as executing those lines in Python (either from IPython directly or in a script to easily run it later) :
  14. +
+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
import histoquant as hq
+
+# Parameters
+wdir = "/path/to/some_directory"
+animals = ["AnimalID0", "AnimalID1"]
+config_file = "/path/to/your/config.toml"
+output_format = "h5"  # to save the quantification values as hdf5 file
+
+# Processing
+cfg = hq.Config(config_file)
+df_regions, dfs_distributions, df_coordinates = hq.process.process_animals(
+    wdir, animals, cfg, out_fmt=output_format
+)
+
+# Display
+hq.display.plot_regions(df_regions, cfg)
+hq.display.plot_1D_distributions(dfs_distributions, cfg, df_coordinates=df_coordinates)
+hq.display.plot_2D_distributions(df_coordinates, cfg)
+
+
+

Tip

+

You can see a live example in this demo notebook.

+
+ + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/guide-prepare-qupath.html b/guide-prepare-qupath.html new file mode 100644 index 0000000..a52713c --- /dev/null +++ b/guide-prepare-qupath.html @@ -0,0 +1,1605 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + Prepare QuPath data - histoquant + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + + + + + +
+
+ + + + + + + + + + +

Prepare QuPath data#

+

histoquant uses some QuPath classifications concepts, make sure to be familiar with them with the official documentation. Notably, we use the concept of primary classification and derived classification : an object classfied as First: second is of classification First and of derived classification second.

+

QuPath requirements#

+

histoquant assumes a specific way of storing regions and objects information in the TSV files exported from QuPath. Note that only one primary classification is supported, but you can have any number of derived classifications.

+

Detections#

+

Detections are the objects of interest. Their information must respect the following :

+
    +
  • Atlas coordinates should be in millimetres (mm) and stored as Atlas_X, Atlas_Y, Atlas_Z. They correspond, respectively, to the anterio-posterior (rostro-caudal) axis, the inferio-superior (dorso-ventral) axis and the left-right (medio-lateral) axis.
  • +
  • They must have a derived classification, in the form Primary: second. Primary would be an object type (cells, fibers, ...), the second one would be a biological marker or a detection channel (fluorescence channel name), for instance : Cells: some marker, or Fibers: EGFP.
  • +
  • The classification must match exactly the corresponding measurement in the annotations (see below).
  • +
+

Annotations#

+

Annotations correspond to the atlas regions. Their information must respect the following :

+
    +
  • They should be imported with the ABBA extension as acronyms and splitting left/right. Therefore, the annotation name should be the region acronym and its classification should be formatted as Hemisphere: acronym (for ex. Left: PAG).
  • +
  • Measurements names should be formatted as :
    +Primary classification: derived classification measurement name.
    +For instance :
      +
    • if one has cells with some marker and count them in each atlas regions, the measurement name would be :
      +Cells: some marker Count.
    • +
    • if one segments fibers revealed in the EGFP channel and measures the cumulated length in µm in each atlas regions, the measurement name would be :
      +Fibers: EGFP Length µm.
    • +
    +
  • +
  • Any number of markers or channels are supported.
  • +
+

Measurements#

+

Metrics supported by histoquant#

+

While you're free to add any measurements as long as they follow the requirements, keep in mind that for atlas regions quantification, histoquant will only compute, pool and average the following metrics :

+
    +
  • the base measurement itself
      +
    • if "µm" is contained in the measurement name, it will also be converted to mm (\(\div\)1000)
    • +
    +
  • +
  • the base measurement divided by the region area in µm² (density in something/µm²)
  • +
  • the base measurement divided by the region area in mm² (density in something/mm²)
  • +
  • the squared base measurement divided by the region area in µm² (could be an index, in weird units...)
  • +
  • the relative base measurement : the base measurement divided by the total base measurement across all regions in each hemisphere
  • +
  • the relative density : density divided by total density across all regions in each hemisphere
  • +
+

It is then up to you to select which metrics among those to compute and display and name them, via the configuration file.

+

For punctal detections (eg. objects whose only the centroid is considered), only the atlas coordinates are used, to compute and display spatial distributions of objects across the brain (using their classifications to give each distributions different hues).
+For fibers-like objects, it requires to export the lines detections atlas coordinates as JSON files, with the exportFibersAtlasCoordinates.groovy script (this is done automatically when using the pipeline).

+

Adding measurements#

+

Count for cell-like objects#

+

The groovy script under scripts/qupath-utils/measurements/addRegionsCount.groovy will add a properly formatted count of objects of selected classifications in all atlas regions. This is used for punctual objects (polygons or points), for example objects created in QuPath or with the segmentation script.

+

Cumulated length for fibers-like objects#

+

The groovy script under scripts/qupath-utils/measurements/addRegionsLength.groovy will add the properly formatted cumulated lenghth in microns of fibers-like objects in all atlas regions. This is used for polylines objects, for example generated with the segmentation script.

+

Custom measurements#

+

Keeping in mind histoquant limitations, you can add any measurements you'd like.

+

For example, you can run a pixel classifier in all annotations (eg. atlas regions). Using the Measure button, it will add a measurement of the area covered by classified pixels. Then, you can use the script located under scripts/qupath-utils/measurements/renameMeasurements.groovy to rename the generated measurements with a properly-formatted name. Finally, you can export regions measurements.

+

Since histoquant will compute a "density", eg. the measurement divided by the region area, in this case, it will correspond to the fraction of surface occupied by classified pixels. This is showcased in the Examples.

+

QuPath export#

+

Once you imported atlas regions registered with ABBA, detected objects in your images and added properly formatted measurements to detections and annotations, you can :

+
    +
  • Head to Measure > Export measurements
  • +
  • Select relevant images
  • +
  • Choose the Output file (specify in the file name if it is a detections or annotations file)
  • +
  • Chose either Detections or Annoations in Export type
  • +
  • Click Export
  • +
+

Do this for both Detections and Annotations, you can then use those files with histoquant (see the Examples).

+ + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/guide-qupath-objects.html b/guide-qupath-objects.html new file mode 100644 index 0000000..e8e0116 --- /dev/null +++ b/guide-qupath-objects.html @@ -0,0 +1,1714 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + Detect objects with QuPath - histoquant + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + + + + +

Detect objects with QuPath#

+

The QuPath documentation is quite extensive, detailed, very well explained and contains full guides on how to create a QuPath project and how to find objects of interests. It is therefore a highly recommended read, nevertheless, you will find below some quick reminders.

+

QuPath project#

+

QuPath works with projects. It is basically a folder with a main project.qproj file, which is a JSON file that contains all the data about your images except the images themselves. Algonside, there is a data folder with an entry for each image, that stores the thumbnails, metadata about the image and detections and annotations but, again, not the image itself. The actual images can be stored anywhere (including a remote server), the QuPath project merely contains the information needed to fetch them and display them. QuPath will never modify your image data.

+

This design makes the QuPath project itself lightweight (should never exceed 500MB even with millions of detections), and portable : upon opening, if QuPath is not able to find the images where they should be, it will ask for their new locations.

+
+

Tip

+

It is recommended to create the QuPath project locally on your computer, to avoid any risk of conflicts if two people open it at the same time. Nevertheless, you should backup the project regularly on a remote server.

+
+

To create a new project, simply drag & drop an empty folder into QuPath window and accept to create a new empty project. Then, add images :

+
    +
  • If you have a single file, just drag & drop it in the main window.
  • +
  • If you have several images, in the left panel, click Add images, then Choose files on the bottom. Drag & drop does not really work as the images will not be sorted properly.
  • +
+

Then, choose the following options :

+
+
Image server
+
+

Default (let QuPath decide)

+
+
Set image type
+
+

Most likely, fluorescence

+
+
Rotate image
+
+

No rotation (unless all your images should be rotated)

+
+
Optional args
+
+

Leave empty

+
+
Auto-generate pyramids
+
+

Uncheck

+
+
Import objects
+
+

Uncheck

+
+
Show image selector
+
+

Might be useful to check if the images are read correctly (mostly for CZI files).

+
+
+

Detect objects#

+

Built-in cell detection#

+

QuPath has a built-in cell detection feature, available in Analyze > Cell detection. You hava a full tutorial in the official documentation.

+

Briefly, this uses a watershed algorithm to find bright spots and can perform a cell expansion to estimate the full cell shape based on the detected nuclei. Therefore, this works best to segment nuclei but one can expect good performance for cells as well, depending on the imaging and staining conditions.

+
+

Tip

+

In scripts/qupath-utils/segmentation, there is watershedDetectionFilters.groovy which uses this feature from a script. It further allows you to filter out detected cells based on shape measurements as well as fluorescence itensity in several channels and cell compartments.

+
+

Pixel classifier#

+

Another very powerful and versatile way to segment cells if through machine learning. Note the term "machine" and not "deep" as it relies on statistics theory from the 1980s. QuPath provides an user-friendly interface to that, similar to what ilastik provides.

+

The general idea is to train a model to classify every pixel as a signal or as background. You can find good resources on how to procede in the official documentation and some additionnal tips and tutorials on Michael Neslon's blog (here and here).

+

Specifically, you will manually annotate some pixels of objects of interest and background. Then, you will apply some image processing filters (gaussian blur, laplacian...) to reveal specific features in your images (shapes, textures...). Finally, the pixel classifier will fit a model on those pixel values, so that it will be able to predict if a pixel, given the values with the different filters you applied, belongs to an object of interest or to the background.

+

This is done in an intuitive GUI with live predictions to get an instant feedback on the effects of the filters and manual annotations.

+

Train a model#

+

First and foremost, you should use a QuPath project dedicated to the training of a pixel classifier, as it is the only way to be able to edit it later on.

+
    +
  1. You should choose some images from different animals, with different imaging conditions (staining efficiency and LED intensity) in different regions (eg. with different objects' shape, size, sparsity...). The goal is to get the most diversity of objects you could encounter in your experiments. 10 images is more than enough !
  2. +
  3. Import those images to the new, dedicated QuPath project.
  4. +
  5. Create the classifications you'll need, "Cells: marker+" for example. The "Ignore*" classification is used for the background.
  6. +
  7. Head to Classify > Pixel classification > Train pixel classifier, and turn on Live prediction.
  8. +
  9. Load all your images in Load training.
  10. +
  11. In Advanced settings, check Reweight samples to help make sure a classification is not over-represented.
  12. +
  13. Modify the different parameters :
      +
    • Classifier : typically, RTrees or ANN_MLP. This can be changed dynamically afterwards to see which works best for you.
    • +
    • Resolution : this is the pixel size used. This is a trade-off between accuracy and speed. If your objects are only composed of a few pixels, you'll the full resolution, for big objects reducing the resolution will be faster.
    • +
    • Features : this is the core of the process -- where you choose the filters. In Edit, you'll need to choose :
        +
      • The fluorescence channels
      • +
      • The scales, eg. the size of the filters applied to the image. The bigger, the coarser the filter is. Again, this will depend on the size of the objects you want to segment.
      • +
      • The features themselves, eg. the filters applied to your images before feeding the pixel values to the model. For starters, you can select them all to see what they look like.
      • +
      +
    • +
    • Output : +
    • +
    +
  14. +
  15. In the bottom-right corner of the pixel classifier window, you can select to display each filters individually. Then in the QuPath main window, hitting C will switch the view to appreciate what the filter looks like. Identify the ones that makes your objects the most distinct from the background as possible. Switch back to Show classification once you begin to make annotations.
  16. +
  17. +

    Begin to annotate ! Use the Polyline annotation tool (V) to classify some pixels belonging to an object and some pixels belonging to the background across your images.

    +
    +

    Tip

    +

    You can select the RTrees Classifier, then Edit : check the Calculate variable importance checkbox. Then in the log (Ctrl+Shift+L), you can inspect the weight each features have. This can help discard some filters to keep only the ones most efficient to distinguish the objects of interest.

    +
    +
  18. +
  19. +

    See in live the effect of your annotations on the classification using C and continue until you're satisfied.

    +
    +

    Important

    +

    This is machine learning. The lesser annotations, the better, as this will make your model more general and adapt to new images. The goal is to find the minimal number of annotations to make it work.

    +
    +
  20. +
  21. +

    Once you're done, give your classifier a name in the text box in the bottom and save it. It will be stored as a JSON file in the classifiers folder of the QuPath project. This file can be imported in your other QuPath projects.

    +
  22. +
+

Built-in create objects#

+

Once you imported your model JSON file (Classify > Pixel classification > Load pixel classifier, three-dotted menu and Import from file), you can create objects out of it, measure the surface occupied by classified pixels in each annotation or classify existing detections based on the prediction at their centroid.

+

In scripts/qupath-utils/segmentation, there is a createDetectionsFromPixelClassifier.groovy script to batch-process your project.

+

Probability map segmentation#

+

Alternatively, a Python script provided with histoquant can be used to segment the probability map generated by the pixel classifier (the script is located in scripts/segmentation).

+

You will first need to export those with the exportPixelClassifierProbabilities.groovy script (located in scripts/qupath-utils).

+

Then the segmentation script can :

+
    +
  • find punctal objects as polygons (with a shape) or points (punctal) than can be counted.
  • +
  • trace fibers with skeletonization to create lines whose lengths can be measured.
  • +
+

Several parameters have to be specified by the user, see the segmentation script API reference. This script will generate GeoJson files that can be imported back to QuPath with the importGeojsonFiles.groovy script.

+

Third-party extensions#

+

QuPath being open-source and extensible, there are third-party extensions that implement popular deep learning segmentation algorithms directly in QuPath. They can be used to find objects of interest as detections in the QuPath project and thus integrate nicely with histoquant to quantify them afterwards.

+

InstanSeg#

+

QuPath extension : https://github.com/qupath/qupath-extension-instanseg
+Original repository : https://github.com/instanseg/instanseg
+Reference papers : doi:10.48550/arXiv.2408.15954, doi:10.1101/2024.09.04.611150

+

Stardist#

+

QuPath extension : https://github.com/qupath/qupath-extension-stardist
+Original repository : https://github.com/stardist/stardist
+Reference paper : doi:10.48550/arXiv.1806.03535

+

There is a stardistDetectionFilter.groovy script in scripts/qupath-utils/segmentation to use it from a script which further allows you to filter out detected cells based on shape measurements as well as fluorescence itensity in several channels and cell compartments.

+

Cellpose#

+

QuPath extension : https://github.com/BIOP/qupath-extension-cellpose
+Original repository : https://github.com/MouseLand/cellpose
+Reference papers : doi:10.1038/s41592-020-01018-x, doi:10.1038/s41592-022-01663-4, doi:10.1101/2024.02.10.579780

+

There is a cellposeDetectionFilter.groovy script in scripts/qupath-utils/segmentation to use it from a script which further allows you to filter out detected cells based on shape measurements as well as fluorescence itensity in several channels and cell compartments.

+

SAM#

+

QuPath extension : https://github.com/ksugar/qupath-extension-sam
+Original repositories : samapi, SAM
+Reference papers : doi:10.1101/2023.06.13.544786, doi:10.48550/arXiv.2304.02643

+

This is more an interactive annotation tool than a fully automatic segmentation algorithm.

+ + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/guide-register-abba.html b/guide-register-abba.html new file mode 100644 index 0000000..ecd9cb9 --- /dev/null +++ b/guide-register-abba.html @@ -0,0 +1,1782 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + Registration with ABBA - histoquant + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + + + + + +
+
+ + + + + + + + + + +

Registration with ABBA#

+

The ABBA documentation is quite extensive and contains guided tutorials and a video tutorial. You should therefore check it out ! Nevertheless, you will find below some quick reminders.

+

Import a QuPath project#

+

Always use ABBA with a QuPath project, if you import the images directly it will not be possible to export the results back to QuPath. In the toolbar, head to Import > Import QuPath Project.

+
    +
  • Select the .qproj file corresponding to the QuPath project to be aligned.
  • +
  • Initial axis position : this is the initial position where to put your stack. It will be modified afterwards.
  • +
  • Axis increment between slices : this is the spatial spacing, in mm, between two slices. This would correspond to the slice thickness multiplied by the number of set. If your images are ordered from rostral to caudal, set it negative.
  • +
+
+

Warning

+

ABBA is not the most stable software, it is highly recommended to save in a different file each time you do anything.

+
+ +

Interface#

+
    +
  • Left Button + drag to select slices
  • +
  • Right Button for display options
  • +
  • Right Button + drag to browse the view
  • +
  • Middle Button to zoom in and or out
  • +
+

Right panel#

+

In the right panel, there is everything related to the images, both yours and the atlas.

+

In the Atlas Display section, you can turn on and off different channels (the first is the reference image, the last is the regions outlines). +The Displayed slicing [atlas steps] slider can increase or decrease the number of displayed 2D slices extracted from the 3D volume. It is comfortable to set to to the same spacing as your slices. Remember it is in "altas steps", so for an atlas imaged at 10µm, a 120µm spacing corresponds to 12 atlas steps.

+

The Slices Display section lists all your slices. Ctrl+A to select all, and click on the Vis. header to make them visible. Then, you can turn on and off each channels (generally the NISSL channel and the ChAT channel will be used) by clicking on the corresponding header. Finally, set the display limits clicking on the empty header containing the colors.

+

Right Button in the main view to Change overlap mode twice to get the slices right under the atlas slices.

+
+

Tip

+

Every action in ABBA are stored and are cancellable with Right Button+Z, except the Interactive transform.

+
+

Find position and angle#

+

This is the hardest task. You need to drag the slices along the rostro-caudal axis and modify the virtual slicing angle (X Rotation [deg] and Y Rotation [deg] sliders at the bottom of the right panel) until you match the brain structures observed in both your images and the atlas.

+
+

Tip

+

With a high number of slices, most likely, it will be impossible to find a position and slicing angle that works for all your slices. In that case, you should procede in batch, eg. sub-stack of images with a unique position and slicing angle that works for all images in the sub-stack. Then, remove the remaining slices (select them, Right Button > Remove Selected Slices), but do not remove them from the QuPath project.

+

Procede as usual, including saving (note the slices range it corresponds to) and exporting the registration back to QuPath. Then, reimport the project in a fresh ABBA instance, remove the slices that were already registered and redo the whole process with the next sub-stack and so on.

+
+

Once you found the correct position and slicing angle, it must not change anymore, otherwise the registration operations you perform will not make any sense anymore.

+

In-plane registration#

+

The next step is to deform your slices to match the corresponding atlas image, extracted from the 3D volume given the position and virtual slicing angle defined at the previous step.

+
+

Info

+

ABBA makes the choice to deform your slices to the atlas, but the transformations are invertible. This means that you will still be able to work on your raw data and deform the altas onto it instead.

+
+

In image processing, there are two kinds of deformation one can apply on an image :

+
    +
  • Affine (or linear) : simple, image-wide, linear operations - translation, rotation, scaling, shearing.
  • +
  • Spline (or non-linear) : complex non-linear operations that can allow for local deformation.
  • +
+

Both can be applied manually or automatically (if the imaging quality allows it). +You have different tools to achieve this, all of which can be combined in any order, except the Interactive transform tool (coarse, linear manual deformation).

+

Change the overlap mode (Right Button) to overlay the slice onto the atlas regions borders. Select the slice you want to align.

+

Coarse, linear manual deformation#

+

While not mandatory, if this tool shall be used, it must be before any operation as it is not cancellable. +Head to Register > Affine > Interactive transform.
+This will open a box where you can rotate, translate and resize the image to make a first, coarse alignment.

+

Close the box. Again, this is not cancellable. Afterwards, you're free to apply any numbers of transformations in any order.

+

Automatic registration#

+

This uses the elastix toolbox to compute the transformations needed to best match two images. It is available in both affine and spline mode, in the Register > Affine and Register > Spline menus respectively.

+

In both cases, it will open a dialog where you need to choose :

+
    +
  • Atlas channels : the reference image of the atlas, usually channel number 0
  • +
  • Slices channels : the fluorescence channel that looks like the most to the reference image, usually channel number 0
  • +
  • Registration re-sampling (micrometers) : the pixel size to resize the images before registration, as it is a computationally intensive task. Going below 20µm won't help much.
  • +
+

For the Spline mode, there an additional parameter :

+
    +
  • Number of control points along X : the algorithm will set points as a grid in the image and perform the transformations from those. The higher number of points, the more local transformations will be.
  • +
+

Manual registration#

+

This uses BigWarp to manually deform the images with the mouse. It can be done from scratch (eg. you place the points yourself) or from a previous registration (either a previous BigWarp session or elastix in Spline mode).

+

From scratch#

+

Register > Spline > BigWarp registration to launch the tool. Choose the atlas that allows you to best see the brain structures (usually the regions outlines channels, the last one), and the reference fluorescence channel.

+

It will open two viewers, called "BigWarp moving image" and "BigWarp fixed image". Briefly, they correspond to the two spaces you're working in, the "Atlas space" and the "Slice space".

+
+

Tip

+

Do not panick yet, while the explanations might be confusing (at least they were to me), in practice, it is easy, intuitive and can even be fun (sometimes, at small dose).

+
+

To browse the viewer, use Right Button + drag (Left Button is used to rotate the viewer), Middle Button zooms in and out.

+

The idea is to place points, called landmarks, that always go in pairs : one in the moving image and one where it corresponds to in the fixed image (or vice-versa). In practice, we will only work in the BigWarp fixed image viewer to place landmarks in both space in one click, then drag it to the corresponding location, with a live feedback of the transformation needed to go from one to another.

+

To do so :

+
    +
  1. +

    Press Space to switch to the "Landmark mode".

    +
    +

    Warning

    +

    In "Landmark mode", Right Button can't be used to browse the view anymore. To do so, turn off the "Landmark mode" hitting Space again.

    +
    +
  2. +
  3. +

    Use Ctrl+Left Button to place a landmark.

    +
    +

    Info

    +

    At least 4 landmarks are needed before activating the live-transform view.

    +
    +
  4. +
  5. +

    When there are at least 4 landmarks, hit T to activate the "Transformed" view. Transformed will be written at the bottom.

    +
  6. +
  7. Hold Left Button on a landmark to drag it to deform the image onto the atlas.
  8. +
  9. Add as many landmarks as needed, when you're done, find the Fiji window called "Big Warp registration" that opened at the beginning and click OK.
  10. +
+
+

Important remarks and tips

+
    +
  • A landmark is a location where you said "this location correspond to this one". Therefore, BigWarp is not allowed to move this particular location. Everywhere else, it is free to transform the image without any restrictions, including the borders. Thus, it is a good idea to delimit the coarse contour of the brain with landmarks to constrain the registration.
  • +
  • Left Button without holding Ctrl will place a landmark in the fixed image only, without pair, and BigWarp won't like it. To delete landmarks, head to the "Landmarks" window that lists all of them. They highlight in the viewer upon selection. Hit Del to delete one. Alternatively, click on it on the viewer and hit Del.
  • +
+
+

From a previous registration#

+

Head to Register > Edit last Registration to work on a previous registration.

+

If the previous registration was done with elastix (Spline) or BigWarp, it will launch the BigWarp interface exactly like above, but with landmarks already placed, either on a grid (elastix) or the one you manually placed (BigWarp).

+
+

Tip

+

It will ask which channels to use, you can modify the channel for your slices to work on two channels successively. For instance, one could make a first registration using the NISSL staining, then refine the motoneurons with the ChAT staining, if available.

+
+

ABBA state file#

+

ABBA can save the state you're in, from the File > Save State menu. It will be saved as a .abba file, which is actually a zip archive containing a bunch of JSON, listing every actions you made and in which order, meaning you will stil be able to cancel actions after quitting ABBA.

+

To load a state, quit ABBA, launch it again, then choose File > Load State and select the .abba file to carry on with the registration.

+
+

Save, save, save !

+

Those state files are cheap, eg. they are lightweight (less than 200KB). You should save the state each time you finish a slice, and you can keep all your files, without overwritting the previous ones, appending a number to its file name. This will allow to roll back to the previous slice in the event of any problem you might face.

+
+

Export registration back to QuPath#

+

Export the registration from ABBA#

+

Once you are satisfied with your registration, select the registered slices and head to Export > QuPath > Export Registrations To QuPath Project. Check the box to make sure to get the latest registered regions.

+

It will export several files in the QuPath projects, including the transformed atlas regions ready to be imported in QuPath and the transformations parameters to be able to convert coordinates from the extension.

+

Import the registration in QuPath#

+

Make sure you installed the ABBA extension in QuPath.

+

From your project with an image open, the basic usage is to head to Extensions > ABBA > Load Atlas Annotations into Open Image. +Choose to Split Left and Right Regions to make the two hemispheres independent, and choose the "acronym" to name the regions. The registered regions should be imported as Annotations in the image.

+
+

Tip

+

With ABBA in regular Fiji using the CCFv3 Allen mouse brain atlas, the left and right regions are flipped, because ABBA considers the slices as backward facing. The importAbba.groovy script located in scripts/qupath-utils-atlas allows you to flip left/right regions names. This is OK because the Allen brain is symmetrical by construction.

+
+

For more complex use, check the Groovy scripts in scripts/qupath-utils/atlas. ABBA registration is used throughout the guides, to either work with brain regions (and count objects for instance) or to get the detections' coordinates in the atlas space.

+ + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/images/hq-pipeline.svg b/images/hq-pipeline.svg new file mode 100644 index 0000000..596417a --- /dev/null +++ b/images/hq-pipeline.svg @@ -0,0 +1,4 @@ + + + +
Images
(CZI, LIF, ...)
Images...
Pre-processing
(find brain contours)
Pre-processing...
Pyramidalize
Pyramidalize
Compute & Export
Compute & Expo...
Pool & compute
Pool & compu...
Display
Display
Pixel classification
Pixel classif...
Probability map
Probability m...
Segmentation
Segmentation
Create objects
Create objects
Measure
Measure
Cell detection
Cell detection
Cellpose
Cellpose
Manual counting
Manual counting
Stardist
Stardist
Objects
Objects
Classification
Classification
histoquant
histoquant
QuPath
built in
QuPath...
ABBA
ABBA
???
???
Registration
Registration
Manual drawing
Manual drawing
Annotations
Annotations
Detections
Detections
Measure intensity
Measure intensit...
Measure aera
Measure aera
Measure length
Measure length
QuPath
custom scripts
QuPath...
Configuration files
Configuration f...
Count objects
Count objects
???
???
Measurement
Measurement
Optional
Optional
Text is not SVG - cannot display
\ No newline at end of file diff --git a/index.html b/index.html new file mode 100644 index 0000000..494318c --- /dev/null +++ b/index.html @@ -0,0 +1,1393 @@ + + + + + + + + + + + + + + + + + + + + + + + + + histoquant + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + + + + +

Introduction#

+
+

Info

+

The documentation is under construction.

+
+

histoquant is a Python package aiming at quantifying histological data.

+

After ABBA registration of 2D histological slices and QuPath objects' detection, histoquant is used to :

+
    +
  • compute metrics, such as objects density in each brain regions,
  • +
  • compute objects distributions in three three axes (rostro-caudal, dorso-ventral and medio-lateral),
  • +
  • compute averages and sem across animals,
  • +
  • displaying all the above.
  • +
+

This documentation contains histoquant installation instructions, ABBA installation instructions, guides to prepare images for the pipeline, detect objects with QuPath, register 2D slices on a 3D atlas with ABBA, along with examples.

+

In theory, histoquant should work with any measurements table with the required columns, but has been designed with ABBA and QuPath in mind.

+

Due to the IT environment of the laboratory, this documentation is very Windows-oriented but most of it should be applicable to Linux and MacOS as well by slightly adapting terminal commands.

+

Histological slices analysis pipeline

+

Documentation navigation#

+

The documentation outline is on the left panel, you can click on items to browse it. In each page, you'll get the table of contents on the right panel.

+

Useful external resources#

+ +

Credits#

+

histoquant has been primarly developed by Guillaume Le Goc in Julien Bouvier's lab at NeuroPSI.

+

The documentation itself is built with MkDocs using the Material theme.

+ + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/javascripts/katex.js b/javascripts/katex.js new file mode 100644 index 0000000..941c360 --- /dev/null +++ b/javascripts/katex.js @@ -0,0 +1,10 @@ +document$.subscribe(({ body }) => { + + + renderMathInElement(body, { + delimiters: [ + { left: "\\(", right: "\\)", display: false }, + { left: "\\[", right: "\\]", display: true } + ], + }) + }) \ No newline at end of file diff --git a/main-citing.html b/main-citing.html new file mode 100644 index 0000000..76fd0ce --- /dev/null +++ b/main-citing.html @@ -0,0 +1,1285 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Citing - histoquant + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + + + + +

Citing#

+

While histoquant does not have a reference paper as of now, you can reference the GitHub repository.

+

Please make sure to cite all the softwares used in your research. Citations are usually the only metric used by funding agencies, so citing properly the tools used in your research ensures the continuation of those projects.

+ + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/main-configuration-files.html b/main-configuration-files.html new file mode 100644 index 0000000..1fa1e9e --- /dev/null +++ b/main-configuration-files.html @@ -0,0 +1,1703 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + The configuration files - histoquant + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + + + + +

The configuration files#

+

There are three configuration files : altas_blacklist, atlas_fusion and a modality-specific file, that we'll call config in this document. The former two are related to the atlas you're using, the latter is what is used by histoquant to know what and how to compute and display things. There is a fourth, optional, file, used to provide some information on a specific experiment, info.

+

The configuration files are in the TOML file format, that are basically text files formatted in a way that is easy to parse in Python. See here for a basic explanation of the syntax.

+

Most lines of each template file are commented to explain what each parameter do.

+

atlas_blacklist.toml#

+
+Click to see an example file +
atlas_blacklist.toml
# TOML file to list Allen brain regions to ignore during analysis.
+# 
+# It is used to blacklist regions and all descendants regions ("WITH_CHILD").
+# Objects belonging to those regions and their descendants will be discarded.
+# And you can specify an exact region where to remove objects ("EXACT"),
+# descendants won't be affected.
+# Use it to remove noise in CBX, ventricual systems and fiber tracts.
+# Regions are referenced by their exact acronym.
+#
+# Syntax :
+#   [WITH_CHILDS]
+#   members = ["CBX", "fiber tracts", "VS"]
+#
+#   [EXACT]
+#   members = ["CB"]
+
+
+[WITH_CHILDS]
+members = ["CBX", "fiber tracts", "VS"]
+
+[EXACT]
+members = ["CB"]
+
+
+

This file is used to filter out specified regions and objects belonging to them.

+
    +
  • The atlas regions present in the members keys will be ignored. Objects whose parents are in here will be ignored as well.
  • +
  • In the [WITH_CHILDS] section, regions and objects belonging to those regions and all descending regions (child regions, as per the altas hierarchy) will be removed.
  • +
  • In the [EXACT] section, only regions and objects belonging to those exact regions are removed. Descendants regions are not taken into account.
  • +
+

atlas_fusion.toml#

+
+Click to see an example file +
atlas_blacklist.toml
# TOML file to determine which brain regions should be merged together.
+# Regions are referenced by their exact acronym.
+# The syntax should be the following :
+# 
+#   [MY]
+#   name = "Medulla"  # new or existing full name
+#   acronym = "MY"  # new or existing acronym
+#   members = ["MY-mot", "MY-sat"]  # existing Allen Brain acronyms that should belong to the new region
+#
+# Then, regions labelled "MY-mot" and "MY-sat" will be labelled "MY" and will join regions already labelled "MY".
+# What's in [] does not matter but must be unique and is used to group.
+# The new "name" and "acronym" can be existing Allen Brain regions or a new (meaningful) one.
+# Note that it is case sensitive.
+
+[PHY]
+name = "Perihypoglossal nuclei"
+acronym = "PHY"
+members = ["NR", "PRP"]
+
+[NTS]
+name = "Nucleus of the solitary tract"
+acronym = "NTS"
+members = ["ts", "NTSce", "NTSco", "NTSge", "NTSl", "NTSm"]
+
+[AMB]
+name = "Nucleus ambiguus"
+acronym = "AMB"
+members = ["AMBd", "AMBv"]
+
+[MY]
+name = "Medulla undertermined"
+acronym = "MYu"
+members = ["MY-mot", "MY-sat"]
+
+[IRN]
+name = "Intermediate reticular nucleus"
+acronym = "IRN"
+members = ["IRN", "LIN"]
+
+
+

This file is used to group regions together, to customize the atlas' hierarchy. It is particularly useful to group smalls brain regions that are impossible to register precisely. +Keys name, acronym and members should belong to a [section].

+
    +
  • [section] is just for organizing, the name does not matter but should be unique.
  • +
  • name should be a human-readable name for your new region.
  • +
  • acronym is how the region will be refered to. It can be a new acronym, or an existing one.
  • +
  • members is a list of acronyms of atlas regions that should be part of the new one.
  • +
+

config.toml#

+
+Click to see an example file +
config_template.toml
########################################################################################
+# Configuration file for histoquant package
+# -----------------------------------------
+# This is a TOML file. It maps a key to a value : `key = value`.
+# Each key must exist and be filled. The keys' names can't be modified, except:
+#   - entries in the [channels.names] section and its corresponding [channels.colors] section,
+#   - entries in the [regions.metrics] section.                                                                                   
+#
+# It is strongly advised to NOT modify this template but rather copy it and modify the copy.
+# Useful resources :
+#   - the TOML specification : https://toml.io/en/
+#   - matplotlib colors : https://matplotlib.org/stable/gallery/color/color_demo.html
+#
+# Configuration file part of the python histoquant package.
+# version : 2.1
+########################################################################################
+
+object_type = "Cells"  # name of QuPath base classification (eg. without the ": subclass" part)
+segmentation_tag = "cells"  # type of segmentation, matches directory name, used only in the full pipeline
+
+[atlas]  # information related to the atlas used
+name = "allen_mouse_10um"  # brainglobe-atlasapi atlas name
+type = "brain"  # brain or cord (eg. registration done in ABBA or abba_python)
+midline = 5700  # midline Z coordinates (left/right limit) in microns
+outline_structures = ["root", "CB", "MY", "P"]  # structures to show an outline of in heatmaps
+
+[channels]  # information related to imaging channels
+[channels.names]  # must contain all classifications derived from "object_type"
+"marker+" = "Positive"  # classification name = name to display
+"marker-" = "Negative"
+[channels.colors]  # must have same keys as names' keys
+"marker+" = "#96c896"  # classification name = matplotlib color (either #hex, color name or RGB list)
+"marker-" = "#688ba6"
+
+[hemispheres]  # information related to hemispheres
+[hemispheres.names]
+Left = "Left"  # Left = name to display
+Right = "Right"  # Right = name to display
+[hemispheres.colors]  # must have same keys as names' keys
+Left = "#ff516e"  # Left = matplotlib color (either #hex, color name or RGB list)
+Right = "#960010"  # Right = matplotlib color
+
+[distributions]  # spatial distributions parameters
+stereo = true  # use stereotaxic coordinates (Paxinos, only for brain)
+ap_lim = [-8.0, 0.0]  # bins limits for anterio-posterior
+ap_nbins = 75  # number of bins for anterio-posterior
+dv_lim = [-1.0, 7.0]  # bins limits for dorso-ventral
+dv_nbins = 50  # number of bins for dorso-ventral
+ml_lim = [-5.0, 5.0]  # bins limits for medio-lateral
+ml_nbins = 50  # number of bins for medio-lateral
+hue = "channel"  # color curves with this parameter, must be "hemisphere" or "channel"
+hue_filter = "Left"  # use only a subset of data. If hue=hemisphere : channel name, list of such or "all". If hue=channel : hemisphere name or "both".
+common_norm = true  # use a global normalization for each hue (eg. the sum of areas under all curves is 1)
+[distributions.display]
+show_injection = false  # add a patch showing the extent of injection sites. Uses corresponding channel colors
+cmap = "OrRd"  # matplotlib color map for heatmaps
+cmap_nbins = 50  # number of bins for heatmaps
+cmap_lim = [1, 50]  # color limits for heatmaps
+
+[regions]  # distributions per regions parameters
+base_measurement = "Count"  # the name of the measurement in QuPath to derive others from
+hue = "channel"  # color bars with this parameter, must be "hemisphere" or "channel"
+hue_filter = "Left"  # use only a subset of data. If hue=hemisphere : channel name, list of such or "all". If hue=channel : hemisphere name or "both".
+hue_mirror = false  # plot two hue_filter in mirror instead of discarding the other
+normalize_starter_cells = false  # normalize non-relative metrics by the number of starter cells
+[regions.metrics]  # names of metrics. Do not change the keys !
+"density µm^-2" = "density µm^-2"
+"density mm^-2" = "density mm^-2"
+"coverage index" = "coverage index"
+"relative measurement" = "relative count"
+"relative density" = "relative density"
+[regions.display]
+nregions = 18  # number of regions to display (sorted by max.)
+orientation = "h"  # orientation of the bars ("h" or "v")
+order = "max"  # order the regions by "ontology" or by "max". Set to "max" to provide a custom order
+dodge = true  # enforce the bar not being stacked
+log_scale = false  # use log. scale for metrics
+[regions.display.metrics]  # name of metrics to display
+"count" = "count"  # real_name = display_name, with real_name the "values" in [regions.metrics]
+"density mm^-2" = "density (mm^-2)"
+
+[files]  # full path to information TOML files
+blacklist = "../../atlas/atlas_blacklist.toml"
+fusion = "../../atlas/atlas_fusion.toml"
+outlines = "/data/atlases/allen_mouse_10um_outlines.h5"
+infos = "../../configs/infos_template.toml"
+
+
+

This file is used to configure histoquant behavior. It specifies what to compute, how, and display parameters such as colors associated to each classifications, hemisphere names, distributions bins limits...

+
+

Warning

+

When editing your config.toml file, you're allowed to modify the keys only in the [channels] section.

+
+
+Click for a more readable parameters explanation +

object_type : name of QuPath base classification (eg. without the ": subclass" part) +segmentation_tag : type of segmentation, matches directory name, used only in the full pipeline

+

atlas

+Information related to the atlas used

+

name : brainglobe-atlasapi atlas name
+type : "brain" or "cord" (eg. registration done in ABBA or abba_python). This will determine whether to flip Left/Right when determining detections hemisphere based on their coordinates. Also adapts the axes in the 2D heatmaps.
+midline : midline Z coordinates (left/right limit) in microns to determine detections hemisphere based on their coordinates.
+outline_structures : structures to show an outline of in heatmaps

+

channels

+Information related to imaging channels

+

names

+Must contain all classifications derived from "object_type" you want to process. In the form subclassification name = name to display on the plots

+

"marker+" : classification name = name to display
+"marker-" : add any number of sub-classification

+

colors

+Must have same keys as "names" keys, in the form subclassification name = color, with color specified as a matplotlib named color, an RGB list or an hex code.

+

"marker+" : classification name = matplotlib color
+"marker-" : must have the same entries as "names".

+

hemispheres

+Information related to hemispheres, same structure as channels

+

names

+

Left : Left = name to display
+Right : Right = name to display

+

colors

+Must have same keys as names' keys

+

Left : ff516e" # Left = matplotlib color (either #hex, color name or RGB list)
+Right : 960010" # Right = matplotlib color

+

distributions

+Spatial distributions parameters

+

stereo : use stereotaxic coordinates (as in Paxinos, only for mouse brain CCFv3)
+ap_lim : bins limits for anterio-posterior in mm
+ap_nbins : number of bins for anterio-posterior
+dv_lim : bins limits for dorso-ventral in mm
+dv_nbins : number of bins for dorso-ventral
+ml_lim : bins limits for medio-lateral in mm
+ml_nbins : number of bins for medio-lateral
+hue : color curves with this parameter, must be "hemisphere" or "channel"
+hue_filter : use only a subset of data

+
    +
  • If hue=hemisphere : it should be a channel name, a list of such or "all"
  • +
  • If hue=channel : it should be a hemisphere name or "both"
  • +
+

common_norm : use a global normalization (eg. the sum of areas under all curves is 1). Otherwise, normalize each hue individually

+

display

+Display parameters

+

show_injection : add a patch showing the extent of injection sites. Uses corresponding channel colors. Requires the information TOML configuration file set up +cmap : matplotlib color map for 2D heatmaps +cmap_nbins : number of bins for 2D heatmaps +cmap_lim : color limits for 2D heatmaps

+

regions

+Distributions per regions parameters

+

base_measurement : the name of the measurement in QuPath to derive others from. Usually "Count" or "Length µm"
+hue : color bars with this parameter, must be "hemisphere" or "channel"
+hue_filter : use only a subset of data

+
    +
  • If hue=hemisphere : it should be a channel name, a list of such or "all"
  • +
  • If hue=channel : it should be a hemisphere name or "both"
  • +
+

hue_mirror : plot two hue_filter in mirror instead of discarding the others. For example, if hue=channel and hue_filter="both", plots the two hemisphere in mirror.
+normalize_starter_cells : normalize non-relative metrics by the number of starter cells

+

metrics

+Names of metrics. The keys are used internally in histoquant as is so should NOT be modified. The values will only chang etheir names in the ouput file

+

"density µm^-2" : relevant name
+"density mm^-2" : relevant name
+"coverage index" : relevant name
+"relative measurement" : relevant name
+"relative density" : relevant name

+

display

+

nregions : number of regions to display (sorted by max.)
+orientation : orientation of the bars ("h" or "v")
+order : order the regions by "ontology" or by "max". Set to "max" to provide a custom order
+dodge : enforce the bar not being stacked
+log_scale : use log. scale for metrics

+

metrics
+name of metrics to display

+

"count" : real_name = display_name, with real_name the "values" in [regions.metrics] +"density mm^-2"

+

files

+Full path to information TOML files and atlas outlines for 2D heatmaps.

+

blacklist
+fusion
+outlines
+infos

+
+

info.toml#

+
+Click to see an example file +
info_template.toml
# TOML file to specify experimental settings of each animals.
+# Syntax should be :
+#   [animalid0]  # animal ID
+#   slice_thickness = 30  # slice thickness in microns
+#   slice_spacing = 60  # spacing between two slices in microns
+#   [animalid0.marker-name]  # [{Animal id}.{segmented channel name}]
+#   starter_cells = 190  # number of starter cells
+#   injection_site = [x, y, z]  # approx. injection site in CCFv3 coordinates
+#
+# --------------------------------------------------------------------------
+[animalid0]
+slice_thickness = 30
+slice_spacing = 60
+[animalid0."marker+"]
+starter_cells = 150
+injection_site = [ 10.8937328, 6.18522070, 6.841855301 ]
+[animalid0."marker-"]
+starter_cells = 175
+injection_site = [ 10.7498512, 6.21545461, 6.815487203 ]
+# --------------------------------------------------------------------------
+[animalid1-SC]
+slice_thickness = 30
+slice_spacing = 120
+[animalid1-SC.EGFP]
+starter_cells = 250
+injection_site = [ 10.9468211, 6.3479642, 6.0061113 ]
+[animalid1-SC.DsRed]
+starter_cells = 275
+injection_site = [ 10.9154874, 6.2954872, 8.1587125 ]
+# --------------------------------------------------------------------------
+
+
+

This file is used to specify injection sites for each animal and each channel, to display it in distributions.

+ + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/main-getting-help.html b/main-getting-help.html new file mode 100644 index 0000000..c642bb9 --- /dev/null +++ b/main-getting-help.html @@ -0,0 +1,1290 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + Getting help - histoquant + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + + + + +

Getting help#

+

For help in QuPath, ABBA, Fiji or any image processing-related questions, your one stop is the image.sc forum. There, you can search with specific tags (#qupath, #abba, ...). You can also ask questions or even answer to some by creating an account !

+

For help with histoquant in particular, you can open an issue in Github (which requires an account as well), or send an email to me or Antoine Lesage.

+ + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/main-getting-started.html b/main-getting-started.html new file mode 100644 index 0000000..d8d8ddb --- /dev/null +++ b/main-getting-started.html @@ -0,0 +1,1541 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + Getting started - histoquant + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + + + + +

Getting started#

+

Quick start#

+
    +
  1. Install QuPath, ABBA and miniconda3.
  2. +
  3. Create an environment : +
    conda create -c conda-forge -n hq python=3.12 pytables
    +
  4. +
  5. Activate it : +
    conda activate hq
    +
  6. +
  7. Download the latest release .zip, unzip it and install it with pip, from inside the histoquant-xxx folder : +
    pip install .
    +
    +If you want to build the doc : +
    pip install .[doc]
    +
  8. +
+

Slow start#

+
+

Tip

+

If all goes well, you shouldn't need any admin rights to install the various pieces of software used before histoquant.

+
+
+

Important

+

Remember to cite all softwares you use ! See Citing.

+
+

QuPath#

+

QuPath is an "open source software for bioimage analysis". You can install it from the official website : https://qupath.github.io/.
+The documentation is quite clear and comprehensive : https://qupath.readthedocs.io/en/stable/index.html.

+

This is where you'll create QuPath projects, in which you'll be able to browse your images, annotate them, import registered brain regions and find objects of interests (via automatic segmentation, thresholding, pixel classification, ...). Then, those annotations and detections can be exported to be processed by histoquant.

+

Aligning Big Brain and Atlases (ABBA)#

+

This is the tool you'll use to register 2D histological sections to 3D atlases. See the dedicated page.

+

Python virtual environment manager (conda)#

+

The histoquant package is written in Python. It depends on scientific libraries (such as NumPy, pandas and many more). Those libraries need to be installed in versions that are compatible with each other and with histoquant. To make sure those versions do not conflict with other Python tools you might be using (deeplabcut, abba_python, ...), we will install histoquant and its dependencies in a dedicated virtual environment.

+

conda is a software that takes care of this. It comes with a "base" environment, from which we will create and manage other environments. It is included with the Anaconda distribution, but the latter is bloated : its "base" environment already contains tons of libraries, and tends to self-destruct at some point (eg. becomes unable to resolve the inter-dependencies), which makes you unable to install new libraries nor create new environments.

+

This is why it is highly recommended to install miniconda3 instead, a minimal installer for conda :

+
+
    +
  1. Download and install miniconda3 (choose the "latest" version for your system). During the installation, choose to install for the current user, add conda to PATH and make python the default interpreter.
  2. +
  3. Open a terminal (PowerShell in Windows). Run : +
    conda init
    +
    +This will activate conda and its base environment whenever you open a new PowerShell window. Now, when opening a new PowerShell (or terminal), you should see a prompt like this : +
    (base) PS C:\Users\myname>
    +
  4. +
  5. Run : +
    conda config --add channels conda-forge
    +
    +Then : +
    conda config --set channel_priority flexible
    +
    +This will make conda download the packages from the "conda-forge" online repository, which is more complete and up-to-date. The flag -c conda-forge in the subsequent instructions won't be necessary anymore.
  6. +
+
+
+

Tip

+

If Anaconda is already installed and you don't have the rights to uninstall it, you'll have to use it instead. You can launch the "Anaconda Prompt (PowerShell)", run conda init and follow the same instructions below (and hope it won't break in the foreseeable future).

+
+

Installation#

+

This section explains how to actually install the histoquant package. +The following commands should be run from a terminal (PowerShell). Remember that the -c conda-forge bits are not necessary if you did the step 3. above.

+
+
    +
  1. Create a virtual environment with python 3.12 and some libraries: +
    conda create -c conda-forge -n hq python=3.12 pytables
    +
  2. +
  3. Get a copy of the histoquant Source code .zip package, from the Releases page.
  4. +
  5. We need to install it inside the hq environment we just created. First, you need to activate the hq environment : +
    conda activate hq
    +
    +Now, the prompt should look like this : +
    (hq) PS C:\Users\myname>
    +
    +This means that Python packages will now be installed in the hq environment and won't conflict with other toolboxes you might be using. +Then, we use pip to install histoquant. pip was installed with Python, and will scan the histoquant folder, specifically the "pyproject.toml" file that lists all the required dependencies. To do so, you can either :
      +
    • pip install /path/to/histoquant
      +
    • +
    • Change directory from the terminal : +
      cd /path/to/histoquant
      +
      +Then install the package, "." denotes "here" : +
      pip install .
      +
    • +
    • Use the file explorer to get to the histoquant folder, use Shift+Right Button to "Open PowerShell window here" and run : +
      pip install .
      +
    • +
    +
  6. +
+
+

histoquant is now installed inside the hq environment and will be available in Python from that environment !

+
+

Tip

+

You will need to perform step 3. each time you want to update the package.

+
+

If you already have registered data and cells in QuPath, you can export Annotations and Detections as TSV files and head to the Example section.

+ + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/main-using-notebooks.html b/main-using-notebooks.html new file mode 100644 index 0000000..e6fc191 --- /dev/null +++ b/main-using-notebooks.html @@ -0,0 +1,1322 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + Using notebooks - histoquant + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + + + + +

Using notebooks#

+

A Jupyter notebook is a way to use Python in an interactive manner. It uses cells that contain Python code, and that are to be executed to immediately see the output, including figures.

+

You can see some rendered notebooks in the examples here, but you can also download them (downward arrow button on the top right corner of each notebook) and run them locally with your own data.

+

To do so, you can either use an integrated development environment (basically a supercharged text editor) that supports Jupyter notebooks, or directly the Jupyter web interface.

+
+
+
+

You can use for instance Visual Studio Code, also known as vscode.

+
    +
  1. Download it and install it.
  2. +
  3. Launch vscode.
  4. +
  5. Follow or skip tutorials.
  6. +
  7. In the left panel, open Extension (squared pieces).
  8. +
  9. Install the "Python" and "Jupyter" extensions (by Microsoft).
  10. +
  11. You now should be able to open .ipynb (notebooks) files with vscode. On the top right, you should be able to Select kernel : choose "hq".
  12. +
+
+
+
    +
  1. Create a folder dedicated to working with notebooks, for example "Documents\notebooks".
  2. +
  3. Copy the notebooks you're interested in in this folder.
  4. +
  5. Open a terminal inside this folder (by either using cd Documents\notebooks or, in the file explorer in your "notebooks" folder, Shift+Right Button to "Open PowerShell window here")
  6. +
  7. Activate the conda environment : +
    conda activate hq
    +
  8. +
  9. Launch the Jupyter Lab web interface : +
    jupyter lab
    +
    +This should open a web page where you can open the ipynb files.
  10. +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/overrides/main.html b/overrides/main.html new file mode 100644 index 0000000..f223d92 --- /dev/null +++ b/overrides/main.html @@ -0,0 +1,11 @@ +{% extends "base.html" %} + +{% block content %} +{% if page.nb_url %} + + {% include ".icons/material/download.svg" %} + +{% endif %} + +{{ super() }} +{% endblock content %} \ No newline at end of file diff --git a/search/search_index.js b/search/search_index.js new file mode 100644 index 0000000..a8db8b2 --- /dev/null +++ b/search/search_index.js @@ -0,0 +1 @@ +var __index = {"config":{"lang":["en"],"separator":"[\\s\\-]+","pipeline":["stopWordFilter"]},"docs":[{"location":"index.html","title":"Introduction","text":"

Info

The documentation is under construction.

histoquant is a Python package aiming at quantifying histological data.

After ABBA registration of 2D histological slices and QuPath objects' detection, histoquant is used to :

  • compute metrics, such as objects density in each brain regions,
  • compute objects distributions in three three axes (rostro-caudal, dorso-ventral and medio-lateral),
  • compute averages and sem across animals,
  • displaying all the above.

This documentation contains histoquant installation instructions, ABBA installation instructions, guides to prepare images for the pipeline, detect objects with QuPath, register 2D slices on a 3D atlas with ABBA, along with examples.

In theory, histoquant should work with any measurements table with the required columns, but has been designed with ABBA and QuPath in mind.

Due to the IT environment of the laboratory, this documentation is very Windows-oriented but most of it should be applicable to Linux and MacOS as well by slightly adapting terminal commands.

"},{"location":"index.html#documentation-navigation","title":"Documentation navigation","text":"

The documentation outline is on the left panel, you can click on items to browse it. In each page, you'll get the table of contents on the right panel.

"},{"location":"index.html#useful-external-resources","title":"Useful external resources","text":"
  • Project repository : https://github.com/TeamNCMC/histoquant
  • QuPath documentation : https://qupath.readthedocs.io/en/stable/
  • Aligning Big Brain and Atlases (ABBA) documentation : https://abba-documentation.readthedocs.io/en/latest/
  • Brainglobe : https://brainglobe.info/
  • BraiAn, a similar but published and way more feature-packed project : https://silvalab.codeberg.page/BraiAn/
  • Image.sc community forum : https://forum.image.sc/
  • Introduction to Bioimage Analysis, an interactive book written by QuPath's creator : https://bioimagebook.github.io/index.html
"},{"location":"index.html#credits","title":"Credits","text":"

histoquant has been primarly developed by Guillaume Le Goc in Julien Bouvier's lab at NeuroPSI.

The documentation itself is built with MkDocs using the Material theme.

"},{"location":"api-compute.html","title":"histoquant.compute","text":"

compute module, part of histoquant.

Contains actual computation functions.

"},{"location":"api-compute.html#histoquant.compute.get_distribution","title":"get_distribution(df, col, hue, hue_filter, per_commonnorm, binlim, nbins=100)","text":"

Computes distribution of objects.

A global distribution using only col is computed, then it computes a distribution distinguishing values in the hue column. For the latter, it is possible to use a subset of the data ony, based on another column using hue_filter. This another column is determined with hue, if the latter is \"hemisphere\", then hue_filter is used in the \"channel\" color and vice-versa. per_commonnorm controls how they are normalized, either as a whole (True) or independantly (False).

Use cases : (1) single-channel, two hemispheres : col=x, hue=hemisphere, hue_filter=\"\", per_commonorm=True. Computes a distribution for each hemisphere, the sum of the area of both is equal to 1. (2) three-channels, one hemisphere : col=x, hue=channel, hue_filter=\"Ipsi.\", per_commonnorm=False. Computes a distribution for each channel only for points in the ipsilateral hemisphere. Each curve will have an area of 1.

Parameters:

Name Type Description Default df DataFrame required col str

Key in df, used to compute the distributions.

required hue str

Key in df. Criterion for additional distributions.

required hue_filter str

Further filtering for \"per\" distribution. - hue = channel : value is the name of one of the hemisphere - hue = hemisphere : value can be the name of a channel, a list of such or \"all\"

required per_commonnorm bool

Use common normalization for all hues (per argument).

required binlim list or tuple

First bin left edge and last bin right edge.

required nbins int

Number of bins. Default is 100.

100

Returns:

Name Type Description df_distribution DataFrame

DataFrame with bins, distribution, count and their per-hemisphere or per-channel variants.

Source code in histoquant/compute.py
def get_distribution(\n    df: pd.DataFrame,\n    col: str,\n    hue: str,\n    hue_filter: dict,\n    per_commonnorm: bool,\n    binlim: tuple | list,\n    nbins=100,\n) -> pd.DataFrame:\n    \"\"\"\n    Computes distribution of objects.\n\n    A global distribution using only `col` is computed, then it computes a distribution\n    distinguishing values in the `hue` column. For the latter, it is possible to use a\n    subset of the data ony, based on another column using `hue_filter`. This another\n    column is determined with `hue`, if the latter is \"hemisphere\", then `hue_filter` is\n    used in the \"channel\" color and vice-versa.\n    `per_commonnorm` controls how they are normalized, either as a whole (True) or\n    independantly (False).\n\n    Use cases :\n    (1) single-channel, two hemispheres : `col=x`, `hue=hemisphere`, `hue_filter=\"\"`,\n    `per_commonorm=True`. Computes a distribution for each hemisphere, the sum of the\n    area of both is equal to 1.\n    (2) three-channels, one hemisphere : `col=x`, hue=`channel`,\n    `hue_filter=\"Ipsi.\", per_commonnorm=False`. Computes a distribution for each channel\n    only for points in the ipsilateral hemisphere. Each curve will have an area of 1.\n\n    Parameters\n    ----------\n    df : pandas.DataFrame\n    col : str\n        Key in `df`, used to compute the distributions.\n    hue : str\n        Key in `df`. Criterion for additional distributions.\n    hue_filter : str\n        Further filtering for \"per\" distribution.\n        - hue = channel : value is the name of one of the hemisphere\n        - hue = hemisphere : value can be the name of a channel, a list of such or \"all\"\n    per_commonnorm : bool\n        Use common normalization for all hues (per argument).\n    binlim : list or tuple\n        First bin left edge and last bin right edge.\n    nbins : int, optional\n        Number of bins. Default is 100.\n\n    Returns\n    -------\n    df_distribution : pandas.DataFrame\n        DataFrame with `bins`, `distribution`, `count` and their per-hemisphere or\n        per-channel variants.\n\n    \"\"\"\n\n    # - Preparation\n    bin_edges = np.linspace(*binlim, nbins + 1)  # create bins\n    df_distribution = []  # prepare list of distributions\n\n    # - Both hemispheres, all channels\n    # get raw count per bins (histogram)\n    count, bin_edges = np.histogram(df[col], bin_edges)\n    # get normalized count (pdf)\n    distribution, _ = np.histogram(df[col], bin_edges, density=True)\n    # get bin centers rather than edges to plot them\n    bin_centers = bin_edges[:-1] + np.diff(bin_edges) / 2\n\n    # make a DataFrame out of that\n    df_distribution.append(\n        pd.DataFrame(\n            {\n                \"bins\": bin_centers,\n                \"distribution\": distribution,\n                \"count\": count,\n                \"hemisphere\": \"both\",\n                \"channel\": \"all\",\n                \"axis\": col,  # keep track of what col. was used\n            }\n        )\n    )\n\n    # - Per additional criterion\n    # select data\n    df_sub = select_hemisphere_channel(df, hue, hue_filter, False)\n    hue_values = df[hue].unique()  # get grouping values\n    # total number of datapoints in the subset used for additional distribution\n    length_total = len(df_sub)\n\n    for value in hue_values:\n        # select part and coordinates\n        df_part = df_sub.loc[df_sub[hue] == value, col]\n\n        # get raw count per bins (histogram)\n        count, bin_edges = np.histogram(df_part, bin_edges)\n        # get normalized count (pdf)\n        distribution, _ = np.histogram(df_part, bin_edges, density=True)\n\n        if per_commonnorm:\n            # re-normalize so that the sum of areas of all sub-parts is 1\n            length_part = len(df_part)  # number of datapoints in that hemisphere\n            distribution *= length_part / length_total\n\n        # get bin centers rather than edges to plot them\n        bin_centers = bin_edges[:-1] + np.diff(bin_edges) / 2\n\n        # make a DataFrame out of that\n        df_distribution.append(\n            pd.DataFrame(\n                {\n                    \"bins\": bin_centers,\n                    \"distribution\": distribution,\n                    \"count\": count,\n                    hue: value,\n                    \"channel\" if hue == \"hemisphere\" else \"hemisphere\": hue_filter,\n                    \"axis\": col,  # keep track of what col. was used\n                }\n            )\n        )\n\n    return pd.concat(df_distribution)\n
"},{"location":"api-compute.html#histoquant.compute.get_regions_metrics","title":"get_regions_metrics(df_annotations, object_type, channel_names, meas_base_name, metrics_names)","text":"

Get a new DataFrame with cumulated axons segments length in each brain regions.

This is the quantification per brain regions for fibers-like objects, eg. axons. The returned DataFrame has columns \"cum. length \u00b5m\", \"cum. length mm\", \"density \u00b5m^-1\", \"density mm^-1\", \"coverage index\".

Parameters:

Name Type Description Default df_annotations DataFrame

DataFrame with an entry for each brain regions, with columns \"Area \u00b5m^2\", \"Name\", \"hemisphere\", and \"{object_type: channel} Length \u00b5m\".

required object_type str

Object type (primary classification).

required channel_names dict

Map between original channel names to something else.

required meas_base_name str required metrics_names dict required

Returns:

Name Type Description df_regions DataFrame

DataFrame with brain regions name, area and metrics.

Source code in histoquant/compute.py
def get_regions_metrics(\n    df_annotations: pd.DataFrame,\n    object_type: str,\n    channel_names: dict,\n    meas_base_name: str,\n    metrics_names: dict,\n) -> pd.DataFrame:\n    \"\"\"\n    Get a new DataFrame with cumulated axons segments length in each brain regions.\n\n    This is the quantification per brain regions for fibers-like objects, eg. axons. The\n    returned DataFrame has columns \"cum. length \u00b5m\", \"cum. length mm\", \"density \u00b5m^-1\",\n    \"density mm^-1\", \"coverage index\".\n\n    Parameters\n    ----------\n    df_annotations : pandas.DataFrame\n        DataFrame with an entry for each brain regions, with columns \"Area \u00b5m^2\",\n        \"Name\", \"hemisphere\", and \"{object_type: channel} Length \u00b5m\".\n    object_type : str\n        Object type (primary classification).\n    channel_names : dict\n        Map between original channel names to something else.\n    meas_base_name : str\n    metrics_names : dict\n\n    Returns\n    -------\n    df_regions : pandas.DataFrame\n        DataFrame with brain regions name, area and metrics.\n\n    \"\"\"\n    # get columns names\n    cols = df_annotations.columns\n    # get columns with fibers lengths\n    cols_colors = cols[\n        cols.str.startswith(object_type) & cols.str.endswith(meas_base_name)\n    ]\n    # select relevant data\n    cols_to_select = pd.Index([\"Name\", \"hemisphere\", \"Area \u00b5m^2\"]).append(cols_colors)\n    # sum lengths and areas of each brain regions\n    df_regions = (\n        df_annotations[cols_to_select]\n        .groupby([\"Name\", \"hemisphere\"])\n        .sum()\n        .reset_index()\n    )\n\n    # get measurement for both hemispheres (sum)\n    df_both = df_annotations[cols_to_select].groupby([\"Name\"]).sum().reset_index()\n    df_both[\"hemisphere\"] = \"both\"\n    df_regions = (\n        pd.concat([df_regions, df_both], ignore_index=True)\n        .sort_values(by=\"Name\")\n        .reset_index()\n        .drop(columns=\"index\")\n    )\n\n    # rename measurement columns to lower case\n    df_regions = df_regions.rename(\n        columns={\n            k: k.replace(meas_base_name, meas_base_name.lower()) for k in cols_colors\n        }\n    )\n\n    # update names\n    meas_base_name = meas_base_name.lower()\n    cols = df_regions.columns\n    cols_colors = cols[\n        cols.str.startswith(object_type) & cols.str.endswith(meas_base_name)\n    ]\n\n    # convert area in mm^2\n    df_regions[\"Area mm^2\"] = df_regions[\"Area \u00b5m^2\"] / 1e6\n\n    # prepare metrics\n    if \"\u00b5m\" in meas_base_name:\n        # fibers : convert to mm\n        cols_to_convert = pd.Index([col for col in cols_colors if \"\u00b5m\" in col])\n        df_regions[cols_to_convert.str.replace(\"\u00b5m\", \"mm\")] = (\n            df_regions[cols_to_convert] / 1000\n        )\n        metrics = [meas_base_name, meas_base_name.replace(\"\u00b5m\", \"mm\")]\n    else:\n        # objects : count\n        metrics = [meas_base_name]\n\n    # density = measurement / area\n    metric = metrics_names[\"density \u00b5m^-2\"]\n    df_regions[cols_colors.str.replace(meas_base_name, metric)] = df_regions[\n        cols_colors\n    ].divide(df_regions[\"Area \u00b5m^2\"], axis=0)\n    metrics.append(metric)\n    metric = metrics_names[\"density mm^-2\"]\n    df_regions[cols_colors.str.replace(meas_base_name, metric)] = df_regions[\n        cols_colors\n    ].divide(df_regions[\"Area mm^2\"], axis=0)\n    metrics.append(metric)\n\n    # coverage index = measurement\u00b2 / area\n    metric = metrics_names[\"coverage index\"]\n    df_regions[cols_colors.str.replace(meas_base_name, metric)] = (\n        df_regions[cols_colors].pow(2).divide(df_regions[\"Area \u00b5m^2\"], axis=0)\n    )\n    metrics.append(metric)\n\n    # prepare relative metrics columns\n    metric = metrics_names[\"relative measurement\"]\n    cols_rel_meas = cols_colors.str.replace(meas_base_name, metric)\n    df_regions[cols_rel_meas] = np.nan\n    metrics.append(metric)\n    metric = metrics_names[\"relative density\"]\n    cols_dens = cols_colors.str.replace(meas_base_name, metrics_names[\"density mm^-2\"])\n    cols_rel_dens = cols_colors.str.replace(meas_base_name, metric)\n    df_regions[cols_rel_dens] = np.nan\n    metrics.append(metric)\n    # relative metrics should be defined within each hemispheres (left, right, both)\n    for hemisphere in df_regions[\"hemisphere\"].unique():\n        row_indexer = df_regions[\"hemisphere\"] == hemisphere\n\n        # relative measurement = measurement / total measurement\n        df_regions.loc[row_indexer, cols_rel_meas] = (\n            df_regions.loc[row_indexer, cols_colors]\n            .divide(df_regions.loc[row_indexer, cols_colors].sum())\n            .to_numpy()\n        )\n\n        # relative density = density / total density\n        df_regions.loc[row_indexer, cols_rel_dens] = (\n            df_regions.loc[\n                row_indexer,\n                cols_dens,\n            ]\n            .divide(df_regions.loc[row_indexer, cols_dens].sum())\n            .to_numpy()\n        )\n\n    # collect channel names\n    channels = (\n        cols_colors.str.replace(object_type + \": \", \"\")\n        .str.replace(\" \" + meas_base_name, \"\")\n        .values.tolist()\n    )\n    # collect measurements columns names\n    cols_metrics = df_regions.columns.difference(\n        pd.Index([\"Name\", \"hemisphere\", \"Area \u00b5m^2\", \"Area mm^2\"])\n    )\n    for metric in metrics:\n        cols_to_cat = [f\"{object_type}: {cn} {metric}\" for cn in channels]\n        # make sure it's part of available metrics\n        if not set(cols_to_cat) <= set(cols_metrics):\n            raise ValueError(f\"{cols_to_cat} not in DataFrame.\")\n        # group all colors in the same colors\n        df_regions[metric] = df_regions[cols_to_cat].values.tolist()\n        # remove original data\n        df_regions = df_regions.drop(columns=cols_to_cat)\n\n    # add a color tag, given their names in the configuration file\n    df_regions[\"channel\"] = len(df_regions) * [[channel_names[k] for k in channels]]\n    metrics.append(\"channel\")\n\n    # explode the dataframe so that each color has an entry\n    df_regions = df_regions.explode(metrics)\n\n    return df_regions\n
"},{"location":"api-compute.html#histoquant.compute.normalize_starter_cells","title":"normalize_starter_cells(df, cols, animal, info_file, channel_names)","text":"

Normalize data by the number of starter cells.

Parameters:

Name Type Description Default df DataFrame

Contains the data to be normalized.

required cols list - like

Columns to divide by the number of starter cells.

required animal str

Animal ID to parse the number of starter cells.

required info_file str

Full path to the TOML file with informations.

required channel_names dict

Map between original channel names to something else.

required

Returns:

Type Description DataFrame

Same df with normalized count.

Source code in histoquant/compute.py
def normalize_starter_cells(\n    df: pd.DataFrame, cols: list[str], animal: str, info_file: str, channel_names: dict\n) -> pd.DataFrame:\n    \"\"\"\n    Normalize data by the number of starter cells.\n\n    Parameters\n    ----------\n    df : pd.DataFrame\n        Contains the data to be normalized.\n    cols : list-like\n        Columns to divide by the number of starter cells.\n    animal : str\n        Animal ID to parse the number of starter cells.\n    info_file : str\n        Full path to the TOML file with informations.\n    channel_names : dict\n        Map between original channel names to something else.\n\n    Returns\n    -------\n    pd.DataFrame\n        Same `df` with normalized count.\n\n    \"\"\"\n    for channel in df[\"channel\"].unique():\n        # inverse mapping channel colors : names\n        reverse_channels = {v: k for k, v in channel_names.items()}\n        nstarters = get_starter_cells(animal, reverse_channels[channel], info_file)\n\n        for col in cols:\n            df.loc[df[\"channel\"] == channel, col] = (\n                df.loc[df[\"channel\"] == channel, col] / nstarters\n            )\n\n    return df\n
"},{"location":"api-config-config.html","title":"Api config config","text":"

object_type : name of QuPath base classification (eg. without the \": subclass\" part) segmentation_tag : type of segmentation, matches directory name, used only in the full pipeline

atlas

Information related to the atlas used

name : brainglobe-atlasapi atlas name type : \"brain\" or \"cord\" (eg. registration done in ABBA or abba_python). This will determine whether to flip Left/Right when determining detections hemisphere based on their coordinates. Also adapts the axes in the 2D heatmaps. midline : midline Z coordinates (left/right limit) in microns to determine detections hemisphere based on their coordinates. outline_structures : structures to show an outline of in heatmaps

channels

Information related to imaging channels

names

Must contain all classifications derived from \"object_type\" you want to process. In the form subclassification name = name to display on the plots

\"marker+\" : classification name = name to display \"marker-\" : add any number of sub-classification

colors

Must have same keys as \"names\" keys, in the form subclassification name = color, with color specified as a matplotlib named color, an RGB list or an hex code.

\"marker+\" : classification name = matplotlib color \"marker-\" : must have the same entries as \"names\".

hemispheres

Information related to hemispheres, same structure as channels

names

Left : Left = name to display Right : Right = name to display

colors

Must have same keys as names' keys

Left : ff516e\" # Left = matplotlib color (either #hex, color name or RGB list) Right : 960010\" # Right = matplotlib color

distributions

Spatial distributions parameters

stereo : use stereotaxic coordinates (as in Paxinos, only for mouse brain CCFv3) ap_lim : bins limits for anterio-posterior in mm ap_nbins : number of bins for anterio-posterior dv_lim : bins limits for dorso-ventral in mm dv_nbins : number of bins for dorso-ventral ml_lim : bins limits for medio-lateral in mm ml_nbins : number of bins for medio-lateral hue : color curves with this parameter, must be \"hemisphere\" or \"channel\" hue_filter : use only a subset of data

  • If hue=hemisphere : it should be a channel name, a list of such or \"all\"
  • If hue=channel : it should be a hemisphere name or \"both\"

common_norm : use a global normalization (eg. the sum of areas under all curves is 1). Otherwise, normalize each hue individually

display

Display parameters

show_injection : add a patch showing the extent of injection sites. Uses corresponding channel colors. Requires the information TOML configuration file set up cmap : matplotlib color map for 2D heatmaps cmap_nbins : number of bins for 2D heatmaps cmap_lim : color limits for 2D heatmaps

regions

Distributions per regions parameters

base_measurement : the name of the measurement in QuPath to derive others from. Usually \"Count\" or \"Length \u00b5m\" hue : color bars with this parameter, must be \"hemisphere\" or \"channel\" hue_filter : use only a subset of data

  • If hue=hemisphere : it should be a channel name, a list of such or \"all\"
  • If hue=channel : it should be a hemisphere name or \"both\"

hue_mirror : plot two hue_filter in mirror instead of discarding the others. For example, if hue=channel and hue_filter=\"both\", plots the two hemisphere in mirror. normalize_starter_cells : normalize non-relative metrics by the number of starter cells

metrics

Names of metrics. The keys are used internally in histoquant as is so should NOT be modified. The values will only chang etheir names in the ouput file

\"density \u00b5m^-2\" : relevant name \"density mm^-2\" : relevant name \"coverage index\" : relevant name \"relative measurement\" : relevant name \"relative density\" : relevant name

display

nregions : number of regions to display (sorted by max.) orientation : orientation of the bars (\"h\" or \"v\") order : order the regions by \"ontology\" or by \"max\". Set to \"max\" to provide a custom order dodge : enforce the bar not being stacked log_scale : use log. scale for metrics

metrics

name of metrics to display

\"count\" : real_name = display_name, with real_name the \"values\" in [regions.metrics] \"density mm^-2\"

files

Full path to information TOML files and atlas outlines for 2D heatmaps.

blacklist fusion outlines infos

"},{"location":"api-config.html","title":"histoquant.config","text":"

config module, part of histoquant.

Contains the Config class.

"},{"location":"api-config.html#histoquant.config.Config","title":"Config(config_file)","text":"

The configuration class.

Reads input configuration file and provides its constant.

Parameters:

Name Type Description Default config_file str

Full path to the configuration file to load.

required

Returns:

Name Type Description cfg Config object.

Constructor.

Source code in histoquant/config.py
def __init__(self, config_file):\n    \"\"\"Constructor.\"\"\"\n    with open(config_file, \"rb\") as fid:\n        cfg = tomllib.load(fid)\n\n        for key in cfg:\n            setattr(self, key, cfg[key])\n\n    self.config_file = config_file\n    self.bg_atlas = BrainGlobeAtlas(self.atlas[\"name\"], check_latest=False)\n    self.get_blacklist()\n    self.get_leaves_list()\n
"},{"location":"api-config.html#histoquant.config.Config.get_blacklist","title":"get_blacklist()","text":"

Wraps histoquant.utils.get_blacklist.

Source code in histoquant/config.py
def get_blacklist(self):\n    \"\"\"Wraps histoquant.utils.get_blacklist.\"\"\"\n\n    self.atlas[\"blacklist\"] = utils.get_blacklist(\n        self.files[\"blacklist\"], self.bg_atlas\n    )\n
"},{"location":"api-config.html#histoquant.config.Config.get_hue_palette","title":"get_hue_palette(mode)","text":"

Get color palette given hue.

Maps hue to colors in channels or hemispheres.

Parameters:

Name Type Description Default mode (hemisphere, channel) \"hemisphere\"

Returns:

Name Type Description palette dict

Maps a hue level to a color, usable in seaborn.

Source code in histoquant/config.py
def get_hue_palette(self, mode: str) -> dict:\n    \"\"\"\n    Get color palette given hue.\n\n    Maps hue to colors in channels or hemispheres.\n\n    Parameters\n    ----------\n    mode : {\"hemisphere\", \"channel\"}\n\n    Returns\n    -------\n    palette : dict\n        Maps a hue level to a color, usable in seaborn.\n\n    \"\"\"\n    params = getattr(self, mode)\n\n    if params[\"hue\"] == \"channel\":\n        # replace channels by their new names\n        palette = {\n            self.channels[\"names\"][k]: v for k, v in self.channels[\"colors\"].items()\n        }\n    elif params[\"hue\"] == \"hemisphere\":\n        # replace hemispheres by their new names\n        palette = {\n            self.hemispheres[\"names\"][k]: v\n            for k, v in self.hemispheres[\"colors\"].items()\n        }\n    else:\n        palette = None\n        warnings.warn(f\"hue={self.regions[\"display\"][\"hue\"]} not supported.\")\n\n    return palette\n
"},{"location":"api-config.html#histoquant.config.Config.get_injection_sites","title":"get_injection_sites(animals)","text":"

Get list of injection sites coordinates for each animals, for each channels.

Parameters:

Name Type Description Default animals list of str

List of animals.

required

Returns:

Name Type Description injection_sites dict

{\"x\": {channel0: [x]}, \"y\": {channel1: [y]}}

Source code in histoquant/config.py
def get_injection_sites(self, animals: list[str]) -> dict:\n    \"\"\"\n    Get list of injection sites coordinates for each animals, for each channels.\n\n    Parameters\n    ----------\n    animals : list of str\n        List of animals.\n\n    Returns\n    -------\n    injection_sites : dict\n        {\"x\": {channel0: [x]}, \"y\": {channel1: [y]}}\n\n    \"\"\"\n    injection_sites = {\n        axis: {channel: [] for channel in self.channels[\"names\"].keys()}\n        for axis in [\"x\", \"y\", \"z\"]\n    }\n\n    for animal in animals:\n        for channel in self.channels[\"names\"].keys():\n            injx, injy, injz = utils.get_injection_site(\n                animal,\n                self.files[\"infos\"],\n                channel,\n                stereo=self.distributions[\"stereo\"],\n            )\n            if injx is not None:\n                injection_sites[\"x\"][channel].append(injx)\n            if injy is not None:\n                injection_sites[\"y\"][channel].append(injy)\n            if injz is not None:\n                injection_sites[\"z\"][channel].append(injz)\n\n    return injection_sites\n
"},{"location":"api-config.html#histoquant.config.Config.get_leaves_list","title":"get_leaves_list()","text":"

Wraps utils.get_leaves_list.

Source code in histoquant/config.py
def get_leaves_list(self):\n    \"\"\"Wraps utils.get_leaves_list.\"\"\"\n\n    self.atlas[\"leaveslist\"] = utils.get_leaves_list(self.bg_atlas)\n
"},{"location":"api-display.html","title":"histoquant.display","text":"

display module, part of histoquant.

Contains display functions, essentially wrapping matplotlib and seaborn functions.

"},{"location":"api-display.html#histoquant.display.add_data_coverage","title":"add_data_coverage(df, ax, colors=None, **kwargs)","text":"

Add lines below the plot to represent data coverage.

Parameters:

Name Type Description Default df DataFrame

DataFrame with X_min and X_max on rows for each animals (on columns).

required ax Axes

Handle to axes where to add the patch.

required colors list or str or None

Colors for the patches, as a RGB list or hex list. Should be the same size as the number of patches to plot, eg. the number of columns in df. If None, default seaborn colors are used. If only one element, used for each animal.

None **kwargs passed to patches.Rectangle() {}

Returns:

Name Type Description ax Axes

Handle to updated axes.

Source code in histoquant/display.py
def add_data_coverage(\n    df: pd.DataFrame, ax: plt.Axes, colors: list | str | None = None, **kwargs\n) -> plt.Axes:\n    \"\"\"\n    Add lines below the plot to represent data coverage.\n\n    Parameters\n    ----------\n    df : pandas.DataFrame\n        DataFrame with `X_min` and `X_max` on rows for each animals (on columns).\n    ax : Axes\n        Handle to axes where to add the patch.\n    colors : list or str or None, optional\n        Colors for the patches, as a RGB list or hex list. Should be the same size as\n        the number of patches to plot, eg. the number of columns in `df`. If None,\n        default seaborn colors are used. If only one element, used for each animal.\n    **kwargs : passed to patches.Rectangle()\n\n    Returns\n    -------\n    ax : Axes\n        Handle to updated axes.\n\n    \"\"\"\n    # get colors\n    ncolumns = len(df.columns)\n    if not colors:\n        colors = sns.color_palette(n_colors=ncolumns)\n    elif isinstance(colors, str) or (isinstance(colors, list) & (len(colors) == 3)):\n        colors = [colors] * ncolumns\n    elif len(colors) != ncolumns:\n        warnings.warn(f\"Wrong number of colors ({len(colors)}), using default colors.\")\n        colors = sns.color_palette(n_colors=ncolumns)\n\n    # get patch height depending on current axis limits\n    ymin, ymax = ax.get_ylim()\n    height = (ymax - ymin) * 0.02\n\n    for animal, color in zip(df.columns, colors):\n        # get patch coordinates\n        ymin, ymax = ax.get_ylim()\n        ylength = ymax - ymin\n        ybottom = ymin - 0.02 * ylength\n        xleft = df.loc[\"X_min\", animal]\n        xright = df.loc[\"X_max\", animal]\n\n        # plot patch\n        ax.add_patch(\n            patches.Rectangle(\n                (xleft, ybottom),\n                xright - xleft,\n                height,\n                label=animal,\n                color=color,\n                **kwargs,\n            )\n        )\n\n        ax.autoscale(tight=True)  # set new axes limits\n\n    ax.autoscale()  # reset scale\n\n    return ax\n
"},{"location":"api-display.html#histoquant.display.add_injection_patch","title":"add_injection_patch(X, ax, **kwargs)","text":"

Add a patch representing the injection sites.

The patch will span from the minimal coordinate to the maximal. If plotted in stereotaxic coordinates, coordinates should be converted beforehand.

Parameters:

Name Type Description Default X list

Coordinates in mm for each animals. Can be empty to not plot anything.

required ax Axes

Handle to axes where to add the patch.

required **kwargs passed to Axes.axvspan {}

Returns:

Name Type Description ax Axes

Handle to updated Axes.

Source code in histoquant/display.py
def add_injection_patch(X: list, ax: plt.Axes, **kwargs) -> plt.Axes:\n    \"\"\"\n    Add a patch representing the injection sites.\n\n    The patch will span from the minimal coordinate to the maximal.\n    If plotted in stereotaxic coordinates, coordinates should be converted beforehand.\n\n    Parameters\n    ----------\n    X : list\n        Coordinates in mm for each animals. Can be empty to not plot anything.\n    ax : Axes\n        Handle to axes where to add the patch.\n    **kwargs : passed to Axes.axvspan\n\n    Returns\n    -------\n    ax : Axes\n        Handle to updated Axes.\n\n    \"\"\"\n    # plot patch\n    if len(X) > 0:\n        ax.axvspan(min(X), max(X), **kwargs)\n\n    return ax\n
"},{"location":"api-display.html#histoquant.display.draw_structure_outline","title":"draw_structure_outline(view='sagittal', structures=['root'], outline_file='', ax=None, microns=False, **kwargs)","text":"

Plot brain regions outlines in given projection.

This requires a file containing the structures outlines.

Parameters:

Name Type Description Default view str

Projection, \"sagittal\", \"coronal\" or \"top\". Default is \"sagittal\".

'sagittal' structures list[str]

List of structures acronyms whose outlines will be drawn. Default is [\"root\"].

['root'] outline_file str

Full path the outlines HDF5 file.

'' ax Axes or None

Axes where to plot the outlines. If None, get current axes (the default).

None microns bool

If False (default), converts the coordinates in mm.

False **kwargs passed to pyplot.plot() {}

Returns:

Name Type Description ax Axes Source code in histoquant/display.py
def draw_structure_outline(\n    view: str = \"sagittal\",\n    structures: list[str] = [\"root\"],\n    outline_file: str = \"\",\n    ax: plt.Axes | None = None,\n    microns: bool = False,\n    **kwargs,\n) -> plt.Axes:\n    \"\"\"\n    Plot brain regions outlines in given projection.\n\n    This requires a file containing the structures outlines.\n\n    Parameters\n    ----------\n    view : str\n        Projection, \"sagittal\", \"coronal\" or \"top\". Default is \"sagittal\".\n    structures : list[str]\n        List of structures acronyms whose outlines will be drawn. Default is [\"root\"].\n    outline_file : str\n        Full path the outlines HDF5 file.\n    ax : plt.Axes or None, optional\n        Axes where to plot the outlines. If None, get current axes (the default).\n    microns : bool, optional\n        If False (default), converts the coordinates in mm.\n    **kwargs : passed to pyplot.plot()\n\n    Returns\n    -------\n    ax : plt.Axes\n\n    \"\"\"\n    # get axes\n    if not ax:\n        ax = plt.gca()\n\n    # get units\n    if microns:\n        conv = 1\n    else:\n        conv = 1 / 1000\n\n    with h5py.File(outline_file) as f:\n        if view == \"sagittal\":\n            for structure in structures:\n                dsets = f[\"sagittal\"][structure]\n\n                for dset in dsets.values():\n                    ax.plot(dset[:, 0] * conv, dset[:, 1] * conv, **kwargs)\n\n        if view == \"coronal\":\n            for structure in structures:\n                dsets = f[\"coronal\"][structure]\n\n                for dset in dsets.values():\n                    ax.plot(dset[:, 0] * conv, dset[:, 1] * conv, **kwargs)\n\n        if view == \"top\":\n            for structure in structures:\n                dsets = f[\"top\"][structure]\n\n                for dset in dsets.values():\n                    ax.plot(dset[:, 0] * conv, dset[:, 1] * conv, **kwargs)\n\n    return ax\n
"},{"location":"api-display.html#histoquant.display.nice_bar_plot","title":"nice_bar_plot(df, x='', y=[''], hue='', ylabel=[''], orient='h', nx=None, ordering=None, names_list=None, hue_mirror=False, log_scale=False, bar_kws={}, pts_kws={})","text":"

Nice bar plot of per-region objects distribution.

This is used for objects distribution across brain regions. Shows the y metric (count, aeral density, cumulated length...) in each x categories (brain regions). orient controls wether the bars are shown horizontally (default) or vertically. Input df must have an additional \"hemisphere\" column. All y are plotted in the same figure as different subplots. nx controls the number of displayed regions.

Parameters:

Name Type Description Default df DataFrame required x str

Key in df.

'' y str

Key in df.

'' hue str

Key in df.

'' ylabel list of str

Y axis labels.

[''] orient h or v

\"h\" for horizontal bars (default) or \"v\" for vertical bars.

'h' nx None or int

Number of x to show in the plot. Default is None (no limit).

None ordering None or list[str] or max

Sorted list of acronyms. Data will be sorted follwowing this order, if \"max\", sorted by descending values, if None, not sorted (default).

None names_list list or None

List of names to display. If None (default), takes the most prominent overall ones.

None hue_mirror bool

If there are 2 groups, plot in mirror. Default is False.

False log_scale bool

Set the metrics in log scale. Default is False.

False bar_kws dict

Passed to seaborn.barplot().

{} pts_kws dict

Passed to seaborn.stripplot().

{}

Returns:

Name Type Description figs list

List of figures.

Source code in histoquant/display.py
def nice_bar_plot(\n    df: pd.DataFrame,\n    x: str = \"\",\n    y: list[str] = [\"\"],\n    hue: str = \"\",\n    ylabel: list[str] = [\"\"],\n    orient=\"h\",\n    nx: None | int = None,\n    ordering: None | list[str] | str = None,\n    names_list: None | list = None,\n    hue_mirror: bool = False,\n    log_scale: bool = False,\n    bar_kws: dict = {},\n    pts_kws: dict = {},\n) -> list[plt.Axes]:\n    \"\"\"\n    Nice bar plot of per-region objects distribution.\n\n    This is used for objects distribution across brain regions. Shows the `y` metric\n    (count, aeral density, cumulated length...) in each `x` categories (brain regions).\n    `orient` controls wether the bars are shown horizontally (default) or vertically.\n    Input `df` must have an additional \"hemisphere\" column. All `y` are plotted in the\n    same figure as different subplots. `nx` controls the number of displayed regions.\n\n    Parameters\n    ----------\n    df : pandas.DataFrame\n    x, y, hue : str\n        Key in `df`.\n    ylabel : list of str\n        Y axis labels.\n    orient : \"h\" or \"v\", optional\n        \"h\" for horizontal bars (default) or \"v\" for vertical bars.\n    nx : None or int, optional\n        Number of `x` to show in the plot. Default is None (no limit).\n    ordering : None or list[str] or \"max\", optional\n        Sorted list of acronyms. Data will be sorted follwowing this order, if \"max\",\n        sorted by descending values, if None, not sorted (default).\n    names_list : list or None, optional\n        List of names to display. If None (default), takes the most prominent overall\n        ones.\n    hue_mirror : bool, optional\n        If there are 2 groups, plot in mirror. Default is False.\n    log_scale : bool, optional\n        Set the metrics in log scale. Default is False.\n    bar_kws : dict\n        Passed to seaborn.barplot().\n    pts_kws : dict\n        Passed to seaborn.stripplot().\n\n    Returns\n    -------\n    figs : list\n        List of figures.\n\n    \"\"\"\n    figs = []\n    # loop for each features\n    for yi, ylabeli in zip(y, ylabel):\n        # prepare data\n        # get nx first most prominent regions\n        if not names_list:\n            names_list_plt = (\n                df.groupby([\"Name\"])[yi].mean().sort_values(ascending=False).index[0:nx]\n            )\n        else:\n            names_list_plt = names_list\n        dfplt = df[df[\"Name\"].isin(names_list_plt)]  # limit to those regions\n        # limit hierarchy list if provided\n        if isinstance(ordering, list):\n            order = [el for el in ordering if el in names_list_plt]\n        elif ordering == \"max\":\n            order = names_list_plt\n        else:\n            order = None\n\n        # reorder keys depending on orientation and create axes\n        if orient == \"h\":\n            xp = yi\n            yp = x\n            if hue_mirror:\n                nrows = 1\n                ncols = 2\n                sharex = None\n                sharey = \"all\"\n            else:\n                nrows = 1\n                ncols = 1\n                sharex = None\n                sharey = None\n        elif orient == \"v\":\n            xp = x\n            yp = yi\n            if hue_mirror:\n                nrows = 2\n                ncols = 1\n                sharex = \"all\"\n                sharey = None\n            else:\n                nrows = 1\n                ncols = 1\n                sharex = None\n                sharey = None\n        fig, axs = plt.subplots(nrows=nrows, ncols=ncols, sharex=sharex, sharey=sharey)\n\n        if hue_mirror:\n            # two graphs\n            ax1, ax2 = axs\n            # determine what will be mirrored\n            if hue == \"channel\":\n                hue_filter = \"hemisphere\"\n            elif hue == \"hemisphere\":\n                hue_filter = \"channel\"\n            # select the two types (should be left/right or two channels)\n            hue_filters = dfplt[hue_filter].unique()[0:2]\n            hue_filters.sort()  # make sure it will be always in the same order\n\n            # plot\n            for filt, ax in zip(hue_filters, [ax1, ax2]):\n                dfplt2 = dfplt[dfplt[hue_filter] == filt]\n                ax = sns.barplot(\n                    dfplt2,\n                    x=xp,\n                    y=yp,\n                    hue=hue,\n                    estimator=\"mean\",\n                    errorbar=\"se\",\n                    orient=orient,\n                    order=order,\n                    ax=ax,\n                    **bar_kws,\n                )\n                # add points\n                ax = sns.stripplot(\n                    dfplt2, x=xp, y=yp, hue=hue, legend=False, ax=ax, **pts_kws\n                )\n\n                # cosmetics\n                if orient == \"h\":\n                    ax.set_title(f\"{hue_filter}: {filt}\")\n                    ax.set_ylabel(None)\n                    ax.set_ylim((nx + 0.5, -0.5))\n                    if log_scale:\n                        ax.set_xscale(\"log\")\n\n                elif orient == \"v\":\n                    if ax == ax1:\n                        # top title\n                        ax1.set_title(f\"{hue_filter}: {filt}\")\n                        ax.set_xlabel(None)\n                    elif ax == ax2:\n                        # use xlabel as bottom title\n                        ax2.set_xlabel(\n                            f\"{hue_filter}: {filt}\", fontsize=ax1.title.get_fontsize()\n                        )\n                    ax.set_xlim((-0.5, nx + 0.5))\n                    if log_scale:\n                        ax.set_yscale(\"log\")\n\n                    for label in ax.get_xticklabels():\n                        label.set_verticalalignment(\"center\")\n                        label.set_horizontalalignment(\"center\")\n\n            # tune axes cosmetics\n            if orient == \"h\":\n                ax1.set_xlabel(ylabeli)\n                ax2.set_xlabel(ylabeli)\n                ax1.set_xlim(\n                    ax1.get_xlim()[0], max((ax1.get_xlim()[1], ax2.get_xlim()[1]))\n                )\n                ax2.set_xlim(\n                    ax2.get_xlim()[0], max((ax1.get_xlim()[1], ax2.get_xlim()[1]))\n                )\n                ax1.invert_xaxis()\n                sns.despine(ax=ax1, left=True, top=True, right=False, bottom=False)\n                sns.despine(ax=ax2, left=False, top=True, right=True, bottom=False)\n                ax1.yaxis.tick_right()\n                ax1.tick_params(axis=\"y\", pad=20)\n                for label in ax1.get_yticklabels():\n                    label.set_verticalalignment(\"center\")\n                    label.set_horizontalalignment(\"center\")\n            elif orient == \"v\":\n                ax2.set_ylabel(ylabeli)\n                ax1.set_ylim(\n                    ax1.get_ylim()[0], max((ax1.get_ylim()[1], ax2.get_ylim()[1]))\n                )\n                ax2.set_ylim(\n                    ax2.get_ylim()[0], max((ax1.get_ylim()[1], ax2.get_ylim()[1]))\n                )\n                ax2.invert_yaxis()\n                sns.despine(ax=ax1, left=False, top=True, right=True, bottom=False)\n                sns.despine(ax=ax2, left=False, top=False, right=True, bottom=True)\n                for label in ax2.get_xticklabels():\n                    label.set_verticalalignment(\"center\")\n                    label.set_horizontalalignment(\"center\")\n                ax2.tick_params(axis=\"x\", labelrotation=90, pad=20)\n\n        else:\n            # one graph\n            ax = axs\n            # plot\n            ax = sns.barplot(\n                dfplt,\n                x=xp,\n                y=yp,\n                hue=hue,\n                estimator=\"mean\",\n                errorbar=\"se\",\n                orient=orient,\n                order=order,\n                ax=ax,\n                **bar_kws,\n            )\n            # add points\n            ax = sns.stripplot(\n                dfplt, x=xp, y=yp, hue=hue, legend=False, ax=ax, **pts_kws\n            )\n\n            # cosmetics\n            if orient == \"h\":\n                ax.set_xlabel(ylabeli)\n                ax.set_ylabel(None)\n                ax.set_ylim((nx + 0.5, -0.5))\n                if log_scale:\n                    ax.set_xscale(\"log\")\n            elif orient == \"v\":\n                ax.set_xlabel(None)\n                ax.set_ylabel(ylabeli)\n                ax.set_xlim((-0.5, nx + 0.5))\n                if log_scale:\n                    ax.set_yscale(\"log\")\n\n        fig.tight_layout(pad=0)\n        figs.append(fig)\n\n    return figs\n
"},{"location":"api-display.html#histoquant.display.nice_distribution_plot","title":"nice_distribution_plot(df, x='', y='', hue=None, xlabel='', ylabel='', injections_sites={}, channel_colors={}, channel_names={}, ax=None, **kwargs)","text":"

Nice plot of 1D distribution of objects.

Parameters:

Name Type Description Default df DataFrame required x str

Keys in df.

'' y str

Keys in df.

'' hue str or None

Key in df. If None, no hue is used.

None xlabel str

X and Y axes labels.

'' ylabel str

X and Y axes labels.

'' injections_sites dict

List of injection sites 1D coordinates in a dict with the channel name as key. If empty, injection site is not plotted (default).

{} channel_colors dict

Required if injections_sites is not empty, dict mapping channel names to a color.

{} channel_names dict

Required if injections_sites is not empty, dict mapping channel names to a display name.

{} ax Axes or None

Axes in which to plot the figure, if None, a new figure is created (default).

None **kwargs passed to seaborn.lineplot() {}

Returns:

Name Type Description ax matplotlib axes

Handle to axes.

Source code in histoquant/display.py
def nice_distribution_plot(\n    df: pd.DataFrame,\n    x: str = \"\",\n    y: str = \"\",\n    hue: str | None = None,\n    xlabel: str = \"\",\n    ylabel: str = \"\",\n    injections_sites: dict = {},\n    channel_colors: dict = {},\n    channel_names: dict = {},\n    ax: plt.Axes | None = None,\n    **kwargs,\n) -> plt.Axes:\n    \"\"\"\n    Nice plot of 1D distribution of objects.\n\n    Parameters\n    ----------\n    df : pandas.DataFrame\n    x, y : str\n        Keys in `df`.\n    hue : str or None, optional\n        Key in `df`. If None, no hue is used.\n    xlabel, ylabel : str\n        X and Y axes labels.\n    injections_sites : dict, optional\n        List of injection sites 1D coordinates in a dict with the channel name as key.\n        If empty, injection site is not plotted (default).\n    channel_colors : dict, optional\n        Required if injections_sites is not empty, dict mapping channel names to a\n        color.\n    channel_names : dict, optional\n        Required if injections_sites is not empty, dict mapping channel names to a\n        display name.\n    ax : Axes or None, optional\n        Axes in which to plot the figure, if None, a new figure is created (default).\n    **kwargs : passed to seaborn.lineplot()\n\n    Returns\n    -------\n    ax : matplotlib axes\n        Handle to axes.\n\n    \"\"\"\n    if not ax:\n        # create figure\n        _, ax = plt.subplots(figsize=(10, 6))\n\n    ax = sns.lineplot(\n        df,\n        x=x,\n        y=y,\n        hue=hue,\n        estimator=\"mean\",\n        errorbar=\"se\",\n        ax=ax,\n        **kwargs,\n    )\n\n    for channel in injections_sites.keys():\n        ax = add_injection_patch(\n            injections_sites[channel],\n            ax,\n            color=channel_colors[channel],\n            edgecolor=None,\n            alpha=0.25,\n            label=channel_names[channel] + \": inj. site\",\n        )\n\n    ax.legend()\n    ax.set_xlabel(xlabel)\n    ax.set_ylabel(ylabel)\n\n    return ax\n
"},{"location":"api-display.html#histoquant.display.nice_heatmap","title":"nice_heatmap(df, animals, x='', y='', xlabel='', ylabel='', invertx=False, inverty=False, **kwargs)","text":"

Nice plots of 2D distribution of boutons as a heatmap per animal.

Parameters:

Name Type Description Default df DataFrame required animals list-like of str

List of animals.

required x str

Keys in df.

'' y str

Keys in df.

'' xlabel str

Labels of x and y axes.

'' ylabel str

Labels of x and y axes.

'' invertx bool

Wether to inverse the x or y axes. Default is False.

False inverty bool

Wether to inverse the x or y axes. Default is False.

False **kwargs passed to seaborn.histplot() {}

Returns:

Name Type Description ax Axes or list of Axes

Handle to axes.

Source code in histoquant/display.py
def nice_heatmap(\n    df: pd.DataFrame,\n    animals: tuple[str] | list[str],\n    x: str = \"\",\n    y: str = \"\",\n    xlabel: str = \"\",\n    ylabel: str = \"\",\n    invertx: bool = False,\n    inverty: bool = False,\n    **kwargs,\n) -> list[plt.Axes] | plt.Axes:\n    \"\"\"\n    Nice plots of 2D distribution of boutons as a heatmap per animal.\n\n    Parameters\n    ----------\n    df : pandas.DataFrame\n    animals : list-like of str\n        List of animals.\n    x, y : str\n        Keys in `df`.\n    xlabel, ylabel : str\n        Labels of x and y axes.\n    invertx, inverty : bool, optional\n        Wether to inverse the x or y axes. Default is False.\n    **kwargs : passed to seaborn.histplot()\n\n    Returns\n    -------\n    ax : Axes or list of Axes\n        Handle to axes.\n\n    \"\"\"\n\n    # 2D distribution, per animal\n    _, axs = plt.subplots(len(animals), 1, sharex=\"all\")\n\n    for animal, ax in zip(animals, axs):\n        ax = sns.histplot(\n            df[df[\"animal\"] == animal],\n            x=x,\n            y=y,\n            ax=ax,\n            **kwargs,\n        )\n        ax.set_xlabel(xlabel)\n        ax.set_ylabel(ylabel)\n        ax.set_title(animal)\n\n        if inverty:\n            ax.invert_yaxis()\n\n    if invertx:\n        axs[-1].invert_xaxis()  # only once since all x axes are shared\n\n    return axs\n
"},{"location":"api-display.html#histoquant.display.nice_joint_plot","title":"nice_joint_plot(df, x='', y='', xlabel='', ylabel='', invertx=False, inverty=False, outline_kws={}, ax=None, **kwargs)","text":"

Joint distribution.

Used to display a 2D heatmap of objects. This is more qualitative than quantitative, for display purposes.

Parameters:

Name Type Description Default df DataFrame required x str

Keys in df.

'' y str

Keys in df.

'' xlabel str

Label of x and y axes.

'' ylabel str

Label of x and y axes.

'' invertx bool

Whether to inverse the x or y axes. Default is False for both.

False inverty bool

Whether to inverse the x or y axes. Default is False for both.

False outline_kws dict

Passed to draw_structure_outline().

{} ax Axes or None

Axes to plot in. If None, draws in current axes (default).

None **kwargs

Passed to seaborn.histplot.

{}

Returns:

Name Type Description ax Axes Source code in histoquant/display.py
def nice_joint_plot(\n    df: pd.DataFrame,\n    x: str = \"\",\n    y: str = \"\",\n    xlabel: str = \"\",\n    ylabel: str = \"\",\n    invertx: bool = False,\n    inverty: bool = False,\n    outline_kws: dict = {},\n    ax: plt.Axes | None = None,\n    **kwargs,\n) -> plt.Figure:\n    \"\"\"\n    Joint distribution.\n\n    Used to display a 2D heatmap of objects. This is more qualitative than quantitative,\n    for display purposes.\n\n    Parameters\n    ----------\n    df : pandas.DataFrame\n    x, y : str\n        Keys in `df`.\n    xlabel, ylabel : str\n        Label of x and y axes.\n    invertx, inverty : bool, optional\n        Whether to inverse the x or y axes. Default is False for both.\n    outline_kws : dict\n        Passed to draw_structure_outline().\n    ax : plt.Axes or None, optional\n        Axes to plot in. If None, draws in current axes (default).\n    **kwargs\n        Passed to seaborn.histplot.\n\n    Returns\n    -------\n    ax : plt.Axes\n\n    \"\"\"\n    if not ax:\n        ax = plt.gca()\n\n    # plot outline\n    draw_structure_outline(ax=ax, **outline_kws)\n\n    # plot joint distribution\n    sns.histplot(\n        df,\n        x=x,\n        y=y,\n        ax=ax,\n        **kwargs,\n    )\n\n    # adjust axes\n    if invertx:\n        ax.invert_xaxis()\n    if inverty:\n        ax.invert_yaxis()\n\n    # labels\n    ax.set_xlabel(xlabel)\n    ax.set_ylabel(ylabel)\n\n    return ax\n
"},{"location":"api-display.html#histoquant.display.plot_1D_distributions","title":"plot_1D_distributions(dfs_distributions, cfg, df_coordinates=None)","text":"

Wraps nice_distribution_plot().

Source code in histoquant/display.py
def plot_1D_distributions(\n    dfs_distributions: list[pd.DataFrame],\n    cfg,\n    df_coordinates: pd.DataFrame = None,\n):\n    \"\"\"\n    Wraps nice_distribution_plot().\n    \"\"\"\n    # prepare figures\n    fig, axs_dist = plt.subplots(1, 3, sharey=True, figsize=(13, 6))\n    xlabels = [\n        \"Rostro-caudal position (mm)\",\n        \"Dorso-ventral position (mm)\",\n        \"Medio-lateral position (mm)\",\n    ]\n\n    # get animals\n    animals = []\n    for df in dfs_distributions:\n        animals.extend(df[\"animal\"].unique())\n    animals = set(animals)\n\n    # get injection sites\n    if cfg.distributions[\"display\"][\"show_injection\"]:\n        injection_sites = cfg.get_injection_sites(animals)\n    else:\n        injection_sites = {k: {} for k in range(3)}\n\n    # get color palette based on hue\n    hue = cfg.distributions[\"hue\"]\n    palette = cfg.get_hue_palette(\"distributions\")\n\n    # loop through each axis\n    for df_dist, ax_dist, xlabel, inj_sites in zip(\n        dfs_distributions, axs_dist, xlabels, injection_sites.values()\n    ):\n        # select data\n        if cfg.distributions[\"hue\"] == \"hemisphere\":\n            dfplt = df_dist[df_dist[\"hemisphere\"] != \"both\"]\n        elif cfg.distributions[\"hue\"] == \"channel\":\n            dfplt = df_dist[df_dist[\"channel\"] != \"all\"]\n\n        # plot\n        ax_dist = nice_distribution_plot(\n            dfplt,\n            x=\"bins\",\n            y=\"distribution\",\n            hue=hue,\n            xlabel=xlabel,\n            ylabel=\"normalized distribution\",\n            injections_sites=inj_sites,\n            channel_colors=cfg.channels[\"colors\"],\n            channel_names=cfg.channels[\"names\"],\n            linewidth=2,\n            palette=palette,\n            ax=ax_dist,\n        )\n\n        # add data coverage\n        if (\"Atlas_AP\" in df_dist[\"axis\"].unique()) & (df_coordinates is not None):\n            df_coverage = utils.get_data_coverage(df_coordinates)\n            ax_dist = add_data_coverage(df_coverage, ax_dist, edgecolor=None, alpha=0.5)\n            ax_dist.legend()\n        else:\n            ax_dist.legend().remove()\n\n    # - Distributions, per animal\n    if len(animals) > 1:\n        _, axs_dist = plt.subplots(1, 3, sharey=True)\n\n        # loop through each axis\n        for df_dist, ax_dist, xlabel, inj_sites in zip(\n            dfs_distributions, axs_dist, xlabels, injection_sites.values()\n        ):\n            # select data\n            df_dist_plot = df_dist[df_dist[\"hemisphere\"] == \"both\"]\n\n            # plot\n            ax_dist = nice_distribution_plot(\n                df_dist_plot,\n                x=\"bins\",\n                y=\"distribution\",\n                hue=\"animal\",\n                xlabel=xlabel,\n                ylabel=\"normalized distribution\",\n                injections_sites=inj_sites,\n                channel_colors=cfg.channels[\"colors\"],\n                channel_names=cfg.channels[\"names\"],\n                linewidth=2,\n                ax=ax_dist,\n            )\n\n    return fig\n
"},{"location":"api-display.html#histoquant.display.plot_2D_distributions","title":"plot_2D_distributions(df, cfg)","text":"

Wraps nice_joint_plot().

Source code in histoquant/display.py
def plot_2D_distributions(df: pd.DataFrame, cfg):\n    \"\"\"\n    Wraps nice_joint_plot().\n    \"\"\"\n    # -- 2D heatmap, all animals pooled\n    # prepare figure\n    fig_heatmap = plt.figure(figsize=(12, 9))\n\n    ax_sag = fig_heatmap.add_subplot(2, 2, 1)\n    ax_cor = fig_heatmap.add_subplot(2, 2, 2, sharey=ax_sag)\n    ax_top = fig_heatmap.add_subplot(2, 2, 3, sharex=ax_sag)\n    ax_cbar = fig_heatmap.add_subplot(2, 2, 4, box_aspect=15)\n\n    # prepare options\n    map_options = dict(\n        bins=cfg.distributions[\"display\"][\"cmap_nbins\"],\n        cmap=cfg.distributions[\"display\"][\"cmap\"],\n        rasterized=True,\n        thresh=10,\n        stat=\"count\",\n        vmin=cfg.distributions[\"display\"][\"cmap_lim\"][0],\n        vmax=cfg.distributions[\"display\"][\"cmap_lim\"][1],\n    )\n    outline_kws = dict(\n        structures=cfg.atlas[\"outline_structures\"],\n        outline_file=cfg.files[\"outlines\"],\n        linewidth=1.5,\n        color=\"k\",\n    )\n    cbar_kws = dict(label=\"count\")\n\n    # determine which axes are going to be inverted\n    if cfg.atlas[\"type\"] == \"brain\":\n        cor_invertx = True\n        cor_inverty = False\n        top_invertx = True\n        top_inverty = False\n    elif cfg.atlas[\"type\"] == \"cord\":\n        cor_invertx = False\n        cor_inverty = False\n        top_invertx = True\n        top_inverty = True\n\n    # - sagittal\n    # no need to invert axes because they are shared with the two other views\n    outline_kws[\"view\"] = \"sagittal\"\n    nice_joint_plot(\n        df,\n        x=\"Atlas_X\",\n        y=\"Atlas_Y\",\n        xlabel=\"Rostro-caudal (mm)\",\n        ylabel=\"Dorso-ventral (mm)\",\n        outline_kws=outline_kws,\n        ax=ax_sag,\n        **map_options,\n    )\n\n    # - coronal\n    outline_kws[\"view\"] = \"coronal\"\n    nice_joint_plot(\n        df,\n        x=\"Atlas_Z\",\n        y=\"Atlas_Y\",\n        xlabel=\"Medio-lateral (mm)\",\n        ylabel=\"Dorso-ventral (mm)\",\n        invertx=cor_invertx,\n        inverty=cor_inverty,\n        outline_kws=outline_kws,\n        ax=ax_cor,\n        **map_options,\n    )\n    ax_cor.invert_yaxis()\n\n    # - top\n    outline_kws[\"view\"] = \"top\"\n    nice_joint_plot(\n        df,\n        x=\"Atlas_X\",\n        y=\"Atlas_Z\",\n        xlabel=\"Rostro-caudal (mm)\",\n        ylabel=\"Medio-lateral (mm)\",\n        invertx=top_invertx,\n        inverty=top_inverty,\n        outline_kws=outline_kws,\n        ax=ax_top,\n        cbar=True,\n        cbar_ax=ax_cbar,\n        cbar_kws=cbar_kws,\n        **map_options,\n    )\n    fig_heatmap.suptitle(\"sagittal, coronal and top-view projections\")\n\n    # -- 2D heatmap per animals\n    # get animals\n    animals = df[\"animal\"].unique()\n    if len(animals) > 1:\n        # Rostro-caudal, dorso-ventral (sagittal)\n        _ = nice_heatmap(\n            df,\n            animals,\n            x=\"Atlas_X\",\n            y=\"Atlas_Y\",\n            xlabel=\"Rostro-caudal (mm)\",\n            ylabel=\"Dorso-ventral (mm)\",\n            invertx=True,\n            inverty=True,\n            cmap=\"OrRd\",\n            rasterized=True,\n            cbar=True,\n        )\n\n        # Medio-lateral, dorso-ventral (coronal)\n        _ = nice_heatmap(\n            df,\n            animals,\n            x=\"Atlas_Z\",\n            y=\"Atlas_Y\",\n            xlabel=\"Medio-lateral (mm)\",\n            ylabel=\"Dorso-ventral (mm)\",\n            inverty=True,\n            invertx=True,\n            cmap=\"OrRd\",\n            rasterized=True,\n        )\n\n    return fig_heatmap\n
"},{"location":"api-display.html#histoquant.display.plot_regions","title":"plot_regions(df, cfg, **kwargs)","text":"

Wraps nice_bar_plot().

Source code in histoquant/display.py
def plot_regions(df: pd.DataFrame, cfg, **kwargs):\n    \"\"\"\n    Wraps nice_bar_plot().\n    \"\"\"\n    # get regions order\n    if cfg.regions[\"display\"][\"order\"] == \"ontology\":\n        regions_order = [d[\"acronym\"] for d in cfg.bg_atlas.structures_list]\n    elif cfg.regions[\"display\"][\"order\"] == \"max\":\n        regions_order = \"max\"\n    else:\n        regions_order = None\n\n    # determine metrics to be plotted and color palette based on hue\n    metrics = [*cfg.regions[\"display\"][\"metrics\"].keys()]\n    hue = cfg.regions[\"hue\"]\n    palette = cfg.get_hue_palette(\"regions\")\n\n    # select data\n    dfplt = utils.select_hemisphere_channel(\n        df, hue, cfg.regions[\"hue_filter\"], cfg.regions[\"hue_mirror\"]\n    )\n\n    # prepare options\n    bar_kws = dict(\n        err_kws={\"linewidth\": 1.5},\n        dodge=cfg.regions[\"display\"][\"dodge\"],\n        palette=palette,\n    )\n    pts_kws = dict(\n        size=4,\n        edgecolor=\"auto\",\n        linewidth=0.75,\n        dodge=cfg.regions[\"display\"][\"dodge\"],\n        palette=palette,\n    )\n    # draw\n    figs = nice_bar_plot(\n        dfplt,\n        x=\"Name\",\n        y=metrics,\n        hue=hue,\n        ylabel=[*cfg.regions[\"display\"][\"metrics\"].values()],\n        orient=cfg.regions[\"display\"][\"orientation\"],\n        nx=cfg.regions[\"display\"][\"nregions\"],\n        ordering=regions_order,\n        hue_mirror=cfg.regions[\"hue_mirror\"],\n        log_scale=cfg.regions[\"display\"][\"log_scale\"],\n        bar_kws=bar_kws,\n        pts_kws=pts_kws,\n        **kwargs,\n    )\n\n    return figs\n
"},{"location":"api-io.html","title":"histoquant.io","text":"

io module, part of histoquant.

Contains loading and saving functions.

"},{"location":"api-io.html#histoquant.io.cat_csv_dir","title":"cat_csv_dir(directory, **kwargs)","text":"

Scans a directory for csv files and concatenate them into a single DataFrame.

Parameters:

Name Type Description Default directory str

Path to the directory to scan.

required **kwargs passed to pandas.read_csv() {}

Returns:

Name Type Description df DataFrame

All CSV files concatenated in a single DataFrame.

Source code in histoquant/io.py
def cat_csv_dir(directory, **kwargs) -> pd.DataFrame:\n    \"\"\"\n    Scans a directory for csv files and concatenate them into a single DataFrame.\n\n    Parameters\n    ----------\n    directory : str\n        Path to the directory to scan.\n    **kwargs : passed to pandas.read_csv()\n\n    Returns\n    -------\n    df : pandas.DataFrame\n        All CSV files concatenated in a single DataFrame.\n\n    \"\"\"\n    return pd.concat(\n        pd.read_csv(\n            os.path.join(directory, filename),\n            **kwargs,\n        )\n        for filename in os.listdir(directory)\n        if (filename.endswith(\".csv\"))\n        and not check_empty_file(os.path.join(directory, filename), threshold=1)\n    )\n
"},{"location":"api-io.html#histoquant.io.cat_data_dir","title":"cat_data_dir(directory, segtype, **kwargs)","text":"

Wraps either cat_csv_dir() or cat_json_dir() depending on segtype.

Parameters:

Name Type Description Default directory str

Path to the directory to scan.

required segtype str

\"synaptophysin\" or \"fibers\".

required **kwargs passed to cat_csv_dir() or cat_json_dir(). {}

Returns:

Name Type Description df DataFrame

All files concatenated in a single DataFrame.

Source code in histoquant/io.py
def cat_data_dir(directory: str, segtype: str, **kwargs) -> pd.DataFrame:\n    \"\"\"\n    Wraps either cat_csv_dir() or cat_json_dir() depending on `segtype`.\n\n    Parameters\n    ----------\n    directory : str\n        Path to the directory to scan.\n    segtype : str\n        \"synaptophysin\" or \"fibers\".\n    **kwargs : passed to cat_csv_dir() or cat_json_dir().\n\n    Returns\n    -------\n    df : pd.DataFrame\n        All files concatenated in a single DataFrame.\n\n    \"\"\"\n    if segtype in CSV_KW:\n        # remove kwargs for json\n        kwargs.pop(\"hemisphere_names\", None)\n        kwargs.pop(\"atlas\", None)\n        return cat_csv_dir(directory, **kwargs)\n    elif segtype in JSON_KW:\n        kwargs = {k: kwargs[k] for k in [\"hemisphere_names\", \"atlas\"] if k in kwargs}\n        return cat_json_dir(directory, **kwargs)\n    else:\n        raise ValueError(\n            f\"'{segtype}' not supported, unable to determine if CSV or JSON.\"\n        )\n
"},{"location":"api-io.html#histoquant.io.cat_json_dir","title":"cat_json_dir(directory, hemisphere_names, atlas)","text":"

Scans a directory for json files and concatenate them in a single DataFrame.

The json files must be generated with 'workflow_import_export.groovy\" from a QuPath project.

Parameters:

Name Type Description Default directory str

Path to the directory to scan.

required hemisphere_names dict

Maps between hemisphere names in the json files (\"Right\" and \"Left\") to something else (eg. \"Ipsi.\" and \"Contra.\").

required atlas BrainGlobeAtlas

Atlas to read regions from.

required

Returns:

Name Type Description df DataFrame

All JSON files concatenated in a single DataFrame.

Source code in histoquant/io.py
def cat_json_dir(\n    directory: str, hemisphere_names: dict, atlas: BrainGlobeAtlas\n) -> pd.DataFrame:\n    \"\"\"\n    Scans a directory for json files and concatenate them in a single DataFrame.\n\n    The json files must be generated with 'workflow_import_export.groovy\" from a QuPath\n    project.\n\n    Parameters\n    ----------\n    directory : str\n        Path to the directory to scan.\n    hemisphere_names : dict\n        Maps between hemisphere names in the json files (\"Right\" and \"Left\") to\n        something else (eg. \"Ipsi.\" and \"Contra.\").\n    atlas : BrainGlobeAtlas\n        Atlas to read regions from.\n\n    Returns\n    -------\n    df : pd.DataFrame\n        All JSON files concatenated in a single DataFrame.\n\n    \"\"\"\n    # list files\n    files_list = [\n        os.path.join(directory, filename)\n        for filename in os.listdir(directory)\n        if (filename.endswith(\".json\"))\n    ]\n\n    data = []  # prepare list of DataFrame\n    for filename in files_list:\n        with open(filename, \"rb\") as fid:\n            df = pd.DataFrame.from_dict(\n                orjson.loads(fid.read())[\"paths\"], orient=\"index\"\n            )\n            df[\"Image\"] = os.path.basename(filename).split(\"_detections\")[0]\n            data.append(df)\n\n    df = (\n        pd.concat(data)\n        .explode(\n            [\"x\", \"y\", \"z\", \"hemisphere\"]\n        )  # get an entry for each point of segments\n        .reset_index()\n        .rename(\n            columns=dict(\n                x=\"Atlas_X\",\n                y=\"Atlas_Y\",\n                z=\"Atlas_Z\",\n                index=\"Object ID\",\n                classification=\"Classification\",\n            )\n        )\n        .set_index(\"Object ID\")\n    )\n\n    # change hemisphere names\n    df[\"hemisphere\"] = df[\"hemisphere\"].map(hemisphere_names)\n\n    # add object type\n    df[\"Object type\"] = \"Detection\"\n\n    # add brain regions\n    df = utils.add_brain_region(df, atlas, col=\"Parent\")\n\n    return df\n
"},{"location":"api-io.html#histoquant.io.check_empty_file","title":"check_empty_file(filename, threshold=1)","text":"

Checks if a file is empty.

Empty is defined as a file whose number of lines is lower than or equal to threshold (to allow for headers).

Parameters:

Name Type Description Default filename str

Full path to the file to check.

required threshold int

If number of lines is lower than or equal to this value, it is considered as empty. Default is 1.

1

Returns:

Name Type Description empty bool

True if the file is empty as defined above.

Source code in histoquant/io.py
def check_empty_file(filename: str, threshold: int = 1) -> bool:\n    \"\"\"\n    Checks if a file is empty.\n\n    Empty is defined as a file whose number of lines is lower than or equal to\n    `threshold` (to allow for headers).\n\n    Parameters\n    ----------\n    filename : str\n        Full path to the file to check.\n    threshold : int, optional\n        If number of lines is lower than or equal to this value, it is considered as\n        empty. Default is 1.\n\n    Returns\n    -------\n    empty : bool\n        True if the file is empty as defined above.\n\n    \"\"\"\n    with open(filename, \"rb\") as fid:\n        nlines = sum(1 for _ in fid)\n\n    if nlines <= threshold:\n        return True\n    else:\n        return False\n
"},{"location":"api-io.html#histoquant.io.get_measurements_directory","title":"get_measurements_directory(wdir, animal, kind, segtype)","text":"

Get the directory with detections or annotations measurements for given animal ID.

Parameters:

Name Type Description Default wdir str

Base working directory.

required animal str

Animal ID.

required kind str

\"annotation\" or \"detection\".

required segtype str

Type of segmentation, eg. \"synaptophysin\".

required

Returns:

Name Type Description directory str

Path to detections or annotations directory.

Source code in histoquant/io.py
def get_measurements_directory(wdir, animal: str, kind: str, segtype: str) -> str:\n    \"\"\"\n    Get the directory with detections or annotations measurements for given animal ID.\n\n    Parameters\n    ----------\n    wdir : str\n        Base working directory.\n    animal : str\n        Animal ID.\n    kind : str\n        \"annotation\" or \"detection\".\n    segtype : str\n        Type of segmentation, eg. \"synaptophysin\".\n\n    Returns\n    -------\n    directory : str\n        Path to detections or annotations directory.\n\n    \"\"\"\n    bdir = os.path.join(wdir, animal, animal.lower() + \"_segmentation\", segtype)\n\n    if (kind == \"detection\") or (kind == \"detections\"):\n        return os.path.join(bdir, \"detections\")\n    elif (kind == \"annotation\") or (kind == \"annotations\"):\n        return os.path.join(bdir, \"annotations\")\n    else:\n        raise ValueError(\n            f\"kind = '{kind}' not supported. Choose 'detection' or 'annotation'.\"\n        )\n
"},{"location":"api-io.html#histoquant.io.load_dfs","title":"load_dfs(filepath, fmt, identifiers=['df_regions', 'df_coordinates', 'df_distribution_ap', 'df_distribution_dv', 'df_distribution_ml'])","text":"

Load DataFrames from file.

If fmt is \"h5\" (\"xslx\"), identifiers are interpreted as h5 group identifier (sheet name, respectively). If fmt is \"pickle\", \"csv\" or \"tsv\", identifiers are appended to filename. Path to the file can't have a dot (\".\") in it.

Parameters:

Name Type Description Default filepath str

Full path to the file(s), without extension.

required fmt (h5, csv, pickle, xlsx)

File(s) format.

\"h5\" identifiers list of str

List of identifiers to load from files. Defaults to the ones saved in histoquant.process.process_animals().

['df_regions', 'df_coordinates', 'df_distribution_ap', 'df_distribution_dv', 'df_distribution_ml']

Returns:

Type Description All requested DataFrames. Source code in histoquant/io.py
def load_dfs(\n    filepath: str,\n    fmt: str,\n    identifiers: list[str] = [\n        \"df_regions\",\n        \"df_coordinates\",\n        \"df_distribution_ap\",\n        \"df_distribution_dv\",\n        \"df_distribution_ml\",\n    ],\n):\n    \"\"\"\n    Load DataFrames from file.\n\n    If `fmt` is \"h5\" (\"xslx\"), identifiers are interpreted as h5 group identifier (sheet\n    name, respectively).\n    If `fmt` is \"pickle\", \"csv\" or \"tsv\", identifiers are appended to `filename`.\n    Path to the file can't have a dot (\".\") in it.\n\n    Parameters\n    ----------\n    filepath : str\n        Full path to the file(s), without extension.\n    fmt : {\"h5\", \"csv\", \"pickle\", \"xlsx\"}\n        File(s) format.\n    identifiers : list of str, optional\n        List of identifiers to load from files. Defaults to the ones saved in\n        histoquant.process.process_animals().\n\n    Returns\n    -------\n    All requested DataFrames.\n\n    \"\"\"\n    # ensure filename without extension\n    base_path = os.path.splitext(filepath)[0]\n    full_path = base_path + \".\" + fmt\n\n    res = []\n    if (fmt == \"h5\") or (fmt == \"hdf\") or (fmt == \"hdf5\"):\n        for identifier in identifiers:\n            res.append(pd.read_hdf(full_path, identifier))\n    elif fmt == \"xlsx\":\n        for identifier in identifiers:\n            res.append(pd.read_excel(full_path, sheet_name=identifier))\n    else:\n        for identifier in identifiers:\n            id_path = f\"{base_path}_{identifier}.{fmt}\"\n            if (fmt == \"pickle\") or (fmt == \"pkl\"):\n                res.append(pd.read_pickle(id_path))\n            elif fmt == \"csv\":\n                res.append(pd.read_csv(id_path))\n            elif fmt == \"tsv\":\n                res.append(pd.read_csv(id_path, sep=\"\\t\"))\n            else:\n                raise ValueError(f\"{fmt} is not supported.\")\n\n    return res\n
"},{"location":"api-io.html#histoquant.io.save_dfs","title":"save_dfs(out_dir, filename, dfs)","text":"

Save DataFrames to file.

File format is inferred from file name extension.

Parameters:

Name Type Description Default out_dir str

Output directory.

required filename _type_

File name.

required dfs dict

DataFrames to save, as {identifier: df}. If HDF5 or xlsx, all df are saved in the same file, otherwise identifier is appended to the file name.

required Source code in histoquant/io.py
def save_dfs(out_dir: str, filename, dfs: dict):\n    \"\"\"\n    Save DataFrames to file.\n\n    File format is inferred from file name extension.\n\n    Parameters\n    ----------\n    out_dir : str\n        Output directory.\n    filename : _type_\n        File name.\n    dfs : dict\n        DataFrames to save, as {identifier: df}. If HDF5 or xlsx, all df are saved in\n        the same file, otherwise identifier is appended to the file name.\n\n    \"\"\"\n    if not os.path.isdir(out_dir):\n        os.makedirs(out_dir)\n\n    basename, ext = os.path.splitext(filename)\n    if ext in [\".h5\", \".hdf\", \".hdf5\"]:\n        path = os.path.join(out_dir, filename)\n        for identifier, df in dfs.items():\n            df.to_hdf(path, key=identifier)\n    elif ext == \".xlsx\":\n        for identifier, df in dfs.items():\n            df.to_excel(path, sheet_name=identifier)\n    else:\n        for identifier, df in dfs.items():\n            path = os.path.join(out_dir, f\"{basename}_{identifier}{ext}\")\n            if ext in [\".pickle\", \".pkl\"]:\n                df.to_pickle(path)\n            elif ext == \".csv\":\n                df.to_csv(path)\n            elif ext == \".tsv\":\n                df.to_csv(path, sep=\"\\t\")\n            else:\n                raise ValueError(f\"{filename} has an unsupported extension.\")\n
"},{"location":"api-process.html","title":"histoquant.process","text":"

process module, part of histoquant.

Wraps other functions for a click&play behaviour. Relies on the configuration file.

"},{"location":"api-process.html#histoquant.process.process_animal","title":"process_animal(animal, df_annotations, df_detections, cfg, compute_distributions=True)","text":"

Quantify objects for one animal.

Fetch required files and compute objects' distributions in brain regions, spatial distributions and gather Atlas coordinates.

Parameters:

Name Type Description Default animal str

Animal ID.

required df_annotations DataFrame

DataFrames of QuPath Annotations and Detections.

required df_detections DataFrame

DataFrames of QuPath Annotations and Detections.

required cfg Config

The configuration loaded from TOML configuration file.

required compute_distributions bool

If False, do not compute the 1D distributions and return an empty list.Default is True.

True

Returns:

Name Type Description df_regions DataFrame

Metrics in brain regions. One entry for each hemisphere of each brain regions.

df_distribution list of pandas.DataFrame

Rostro-caudal distribution, as raw count and probability density function, in each axis.

df_coordinates DataFrame

Atlas coordinates of each points.

Source code in histoquant/process.py
def process_animal(\n    animal: str,\n    df_annotations: pd.DataFrame,\n    df_detections: pd.DataFrame,\n    cfg,\n    compute_distributions: bool = True,\n) -> tuple[pd.DataFrame, list[pd.DataFrame], pd.DataFrame]:\n    \"\"\"\n    Quantify objects for one animal.\n\n    Fetch required files and compute objects' distributions in brain regions, spatial\n    distributions and gather Atlas coordinates.\n\n    Parameters\n    ----------\n    animal : str\n        Animal ID.\n    df_annotations, df_detections : pd.DataFrame\n        DataFrames of QuPath Annotations and Detections.\n    cfg : histoquant.Config\n        The configuration loaded from TOML configuration file.\n    compute_distributions : bool, optional\n        If False, do not compute the 1D distributions and return an empty list.Default\n        is True.\n\n    Returns\n    -------\n    df_regions : pandas.DataFrame\n        Metrics in brain regions. One entry for each hemisphere of each brain regions.\n    df_distribution : list of pandas.DataFrame\n        Rostro-caudal distribution, as raw count and probability density function, in\n        each axis.\n    df_coordinates : pandas.DataFrame\n        Atlas coordinates of each points.\n\n    \"\"\"\n    # - Annotations data cleanup\n    # filter regions\n    df_annotations = utils.filter_df_regions(\n        df_annotations, [\"Root\", \"root\"], mode=\"remove\", col=\"Name\"\n    )\n    df_annotations = utils.filter_df_regions(\n        df_annotations, cfg.atlas[\"blacklist\"], mode=\"remove\", col=\"Name\"\n    )\n    # add hemisphere\n    df_annotations = utils.add_hemisphere(df_annotations, cfg.hemispheres[\"names\"])\n    # remove objects in non-leaf regions\n    df_annotations = utils.filter_df_regions(\n        df_annotations, cfg.atlas[\"leaveslist\"], mode=\"keep\", col=\"Name\"\n    )\n    # merge regions\n    df_annotations = utils.merge_regions(\n        df_annotations, col=\"Name\", fusion_file=cfg.files[\"fusion\"]\n    )\n    if compute_distributions:\n        # - Detections data cleanup\n        # remove objects not in selected classifications\n        df_detections = utils.filter_df_classifications(\n            df_detections, cfg.object_type, mode=\"keep\", col=\"Classification\"\n        )\n        # remove objects from blacklisted regions and \"Root\"\n        df_detections = utils.filter_df_regions(\n            df_detections, cfg.atlas[\"blacklist\"], mode=\"remove\", col=\"Parent\"\n        )\n        # add hemisphere\n        df_detections = utils.add_hemisphere(\n            df_detections,\n            cfg.hemispheres[\"names\"],\n            cfg.atlas[\"midline\"],\n            col=\"Atlas_Z\",\n            atlas_type=cfg.atlas[\"type\"],\n        )\n        # add detection channel\n        df_detections = utils.add_channel(\n            df_detections, cfg.object_type, cfg.channels[\"names\"]\n        )\n        # convert coordinates to mm\n        df_detections[[\"Atlas_X\", \"Atlas_Y\", \"Atlas_Z\"]] = df_detections[\n            [\"Atlas_X\", \"Atlas_Y\", \"Atlas_Z\"]\n        ].divide(1000)\n        # convert to sterotaxic coordinates\n        if cfg.distributions[\"stereo\"]:\n            (\n                df_detections[\"Atlas_AP\"],\n                df_detections[\"Atlas_DV\"],\n                df_detections[\"Atlas_ML\"],\n            ) = utils.ccf_to_stereo(\n                df_detections[\"Atlas_X\"],\n                df_detections[\"Atlas_Y\"],\n                df_detections[\"Atlas_Z\"],\n            )\n        else:\n            (\n                df_detections[\"Atlas_AP\"],\n                df_detections[\"Atlas_DV\"],\n                df_detections[\"Atlas_ML\"],\n            ) = (\n                df_detections[\"Atlas_X\"],\n                df_detections[\"Atlas_Y\"],\n                df_detections[\"Atlas_Z\"],\n            )\n\n    # - Computations\n    # get regions distributions\n    df_regions = compute.get_regions_metrics(\n        df_annotations,\n        cfg.object_type,\n        cfg.channels[\"names\"],\n        cfg.regions[\"base_measurement\"],\n        cfg.regions[\"metrics\"],\n    )\n    colstonorm = [v for v in cfg.regions[\"metrics\"].values() if \"relative\" not in v]\n\n    # normalize by starter cells\n    if cfg.regions[\"normalize_starter_cells\"]:\n        df_regions = compute.normalize_starter_cells(\n            df_regions, colstonorm, animal, cfg.files[\"infos\"], cfg.channels[\"names\"]\n        )\n\n    # get AP, DV, ML distributions in stereotaxic coordinates\n    if compute_distributions:\n        dfs_distributions = [\n            compute.get_distribution(\n                df_detections,\n                axis,\n                cfg.distributions[\"hue\"],\n                cfg.distributions[\"hue_filter\"],\n                cfg.distributions[\"common_norm\"],\n                stereo_lim,\n                nbins=nbins,\n            )\n            for axis, stereo_lim, nbins in zip(\n                [\"Atlas_AP\", \"Atlas_DV\", \"Atlas_ML\"],\n                [\n                    cfg.distributions[\"ap_lim\"],\n                    cfg.distributions[\"dv_lim\"],\n                    cfg.distributions[\"ml_lim\"],\n                ],\n                [\n                    cfg.distributions[\"ap_nbins\"],\n                    cfg.distributions[\"dv_nbins\"],\n                    cfg.distributions[\"dv_nbins\"],\n                ],\n            )\n        ]\n    else:\n        dfs_distributions = []\n\n    # add animal tag to each DataFrame\n    df_detections[\"animal\"] = animal\n    df_regions[\"animal\"] = animal\n    for df in dfs_distributions:\n        df[\"animal\"] = animal\n\n    return df_regions, dfs_distributions, df_detections\n
"},{"location":"api-process.html#histoquant.process.process_animals","title":"process_animals(wdir, animals, cfg, out_fmt=None, compute_distributions=True)","text":"

Get data from all animals and plot.

Parameters:

Name Type Description Default wdir str

Base working directory, containing animals folders.

required animals list-like of str

List of animals ID.

required cfg

Configuration object.

required out_fmt (None, h5, csv, tsv, xslx, pickle)

Output file(s) format, if None, nothing is saved (default).

None compute_distributions bool

If False, do not compute the 1D distributions and return an empty list.Default is True.

True

Returns:

Name Type Description df_regions DataFrame

Metrics in brain regions. One entry for each hemisphere of each brain regions.

df_distribution list of pandas.DataFrame

Rostro-caudal distribution, as raw count and probability density function, in each axis.

df_coordinates DataFrame

Atlas coordinates of each points.

Source code in histoquant/process.py
def process_animals(\n    wdir: str,\n    animals: list[str] | tuple[str],\n    cfg,\n    out_fmt: str | None = None,\n    compute_distributions: bool = True,\n) -> tuple[pd.DataFrame]:\n    \"\"\"\n    Get data from all animals and plot.\n\n    Parameters\n    ----------\n    wdir : str\n        Base working directory, containing `animals` folders.\n    animals : list-like of str\n        List of animals ID.\n    cfg: histoquant.Config\n        Configuration object.\n    out_fmt : {None, \"h5\", \"csv\", \"tsv\", \"xslx\", \"pickle\"}\n        Output file(s) format, if None, nothing is saved (default).\n    compute_distributions : bool, optional\n        If False, do not compute the 1D distributions and return an empty list.Default\n        is True.\n\n\n    Returns\n    -------\n    df_regions : pandas.DataFrame\n        Metrics in brain regions. One entry for each hemisphere of each brain regions.\n    df_distribution : list of pandas.DataFrame\n        Rostro-caudal distribution, as raw count and probability density function, in\n        each axis.\n    df_coordinates : pandas.DataFrame\n        Atlas coordinates of each points.\n\n    \"\"\"\n\n    # -- Preparation\n    df_regions = []\n    dfs_distributions = []\n    df_coordinates = []\n\n    # -- Processing\n    pbar = tqdm(animals)\n\n    for animal in pbar:\n        pbar.set_description(f\"Processing {animal}\")\n\n        # combine all detections and annotations from this animal\n        df_annotations = io.cat_csv_dir(\n            io.get_measurements_directory(\n                wdir, animal, \"annotation\", cfg.segmentation_tag\n            ),\n            index_col=\"Object ID\",\n            sep=\"\\t\",\n        )\n        if compute_distributions:\n            df_detections = io.cat_data_dir(\n                io.get_measurements_directory(\n                    wdir, animal, \"detection\", cfg.segmentation_tag\n                ),\n                cfg.segmentation_tag,\n                index_col=\"Object ID\",\n                sep=\"\\t\",\n                hemisphere_names=cfg.hemispheres[\"names\"],\n                atlas=cfg.bg_atlas,\n            )\n        else:\n            df_detections = pd.DataFrame()\n\n        # get results\n        df_reg, dfs_dis, df_coo = process_animal(\n            animal,\n            df_annotations,\n            df_detections,\n            cfg,\n            compute_distributions=compute_distributions,\n        )\n\n        # collect results\n        df_regions.append(df_reg)\n        dfs_distributions.append(dfs_dis)\n        df_coordinates.append(df_coo)\n\n    # concatenate all results\n    df_regions = pd.concat(df_regions, ignore_index=True)\n    dfs_distributions = [\n        pd.concat(dfs_list, ignore_index=True) for dfs_list in zip(*dfs_distributions)\n    ]\n    df_coordinates = pd.concat(df_coordinates, ignore_index=True)\n\n    # -- Saving\n    if out_fmt:\n        outdir = os.path.join(wdir, \"quantification\")\n        outfile = f\"{cfg.object_type.lower()}_{cfg.atlas[\"type\"]}_{'-'.join(animals)}.{out_fmt}\"\n        dfs = dict(\n            df_regions=df_regions,\n            df_coordinates=df_coordinates,\n            df_distribution_ap=dfs_distributions[0],\n            df_distribution_dv=dfs_distributions[1],\n            df_distribution_ml=dfs_distributions[2],\n        )\n        io.save_dfs(outdir, outfile, dfs)\n\n    return df_regions, dfs_distributions, df_coordinates\n
"},{"location":"api-script-pyramids.html","title":"create_pyramids","text":"

create_pyramids command line interface (CLI). You can set up your settings filling the variables at the top of the file and run the script :

python create_pyramids.py /path/to/your/images

Or alternatively, you can run the script as a CLI :

python create_pyramids.py [options] /path/to/your/images

Example :

python create_pyramids.py --tile-size 1024 --pyramid-factor 4 /path/to/your/images

To get help (eg. list all options), run :

python create_pyramids.py --help

To use the QuPath backend, you'll need the companion 'createPyramids.groovy' script.

author : Guillaume Le Goc (g.legoc@posteo.org) @ NeuroPSI version : 2024.11.19

"},{"location":"api-script-pyramids.html#scripts.pyramids.create_pyramids.COMPRESSION_PYTHON","title":"COMPRESSION_PYTHON: str = 'LZW' module-attribute","text":"

Compression method.

"},{"location":"api-script-pyramids.html#scripts.pyramids.create_pyramids.INEXT","title":"INEXT: str = 'ome.tiff' module-attribute","text":"

Input files extension.

"},{"location":"api-script-pyramids.html#scripts.pyramids.create_pyramids.NTHREADS","title":"NTHREADS: int = int(multiprocessing.cpu_count() / 2) module-attribute","text":"

Number of threads for parallelization.

"},{"location":"api-script-pyramids.html#scripts.pyramids.create_pyramids.PYRAMID_FACTOR","title":"PYRAMID_FACTOR: int = 2 module-attribute","text":"

Factor between two consecutive pyramid levels.

"},{"location":"api-script-pyramids.html#scripts.pyramids.create_pyramids.PYRAMID_MAX","title":"PYRAMID_MAX: int = 32 module-attribute","text":"

Maximum rescaling (smaller pyramid).

"},{"location":"api-script-pyramids.html#scripts.pyramids.create_pyramids.QUPATH_PATH","title":"QUPATH_PATH: str = 'C:/Users/glegoc/AppData/Local/QuPath-0.5.1/QuPath-0.5.1 (console).exe' module-attribute","text":"

Full path to the QuPath (console) executable.

"},{"location":"api-script-pyramids.html#scripts.pyramids.create_pyramids.SCRIPT_PATH","title":"SCRIPT_PATH: str = os.path.join(os.path.dirname(__file__), 'createPyramids.groovy') module-attribute","text":"

Full path to the groovy script that does the job.

"},{"location":"api-script-pyramids.html#scripts.pyramids.create_pyramids.TILE_SIZE","title":"TILE_SIZE: int = 512 module-attribute","text":"

Tile size (usually 512 or 1024).

"},{"location":"api-script-pyramids.html#scripts.pyramids.create_pyramids.USE_QUPATH","title":"USE_QUPATH: bool = True module-attribute","text":"

Use QuPath and the external groovy script instead of pure python (more reliable).

"},{"location":"api-script-pyramids.html#scripts.pyramids.create_pyramids.get_tiff_options","title":"get_tiff_options(compression, nthreads, tilesize)","text":"

Get the relevant tags and options to write a TIFF file.

The returned dict is meant to be used to write a new tiff page with those tags.

Parameters:

Name Type Description Default compression str

Tiff compression (None, LZW, ...).

required nthreads int

Number of threads to write tiles.

required tilesize int

Tile size in pixels. Should be a power of 2.

required

Returns:

Name Type Description options dict

Dictionary with Tiff tags.

Source code in scripts/pyramids/create_pyramids.py
def get_tiff_options(compression: str, nthreads: int, tilesize: int) -> dict:\n    \"\"\"\n    Get the relevant tags and options to write a TIFF file.\n\n    The returned dict is meant to be used to write a new tiff page with those tags.\n\n    Parameters\n    ----------\n    compression : str\n        Tiff compression (None, LZW, ...).\n    nthreads : int\n        Number of threads to write tiles.\n    tilesize : int\n        Tile size in pixels. Should be a power of 2.\n\n    Returns\n    -------\n    options : dict\n        Dictionary with Tiff tags.\n\n    \"\"\"\n    return {\n        \"compression\": compression,\n        \"photometric\": \"minisblack\",\n        \"resolutionunit\": \"CENTIMETER\",\n        \"maxworkers\": nthreads,\n        \"tile\": (tilesize, tilesize),\n    }\n
"},{"location":"api-script-pyramids.html#scripts.pyramids.create_pyramids.pyramidalize_directory","title":"pyramidalize_directory(inputdir, version=None, use_qupath=USE_QUPATH, tile_size=TILE_SIZE, pyramid_factor=PYRAMID_FACTOR, nthreads=NTHREADS, qupath_path=QUPATH_PATH, script_path=SCRIPT_PATH, pyramid_max=PYRAMID_MAX)","text":"

Create pyramidal versions of .ome.tiff images found in the input directory. You need to edit the script to set the \"QUPATH_PATH\" to your installation of QuPath. Usually on Windows it should be here : C:/Users/$USERNAME$/AppData/Local/QuPath-0.X.Y/QuPath-0.X.Y (console).exe Alternatively you can run the script with the --qupath-path option.

Source code in scripts/pyramids/create_pyramids.py
def pyramidalize_directory(\n    inputdir: Annotated[\n        str,\n        typer.Argument(help=\"Full path to the directory with images to pyramidalize.\"),\n    ],\n    version: Annotated[\n        Optional[bool],\n        typer.Option(\"--version\", callback=version_callback, is_eager=True),\n    ] = None,\n    use_qupath: Annotated[\n        Optional[bool],\n        typer.Option(help=\"Use QuPath backend instead of Python.\"),\n    ] = USE_QUPATH,\n    tile_size: Annotated[\n        Optional[int],\n        typer.Option(help=\"Image tile size, typically 512 or 1024.\"),\n    ] = TILE_SIZE,\n    pyramid_factor: Annotated[\n        Optional[int],\n        typer.Option(help=\"Factor between two consecutive pyramid levels.\"),\n    ] = PYRAMID_FACTOR,\n    nthreads: Annotated[\n        Optional[int],\n        typer.Option(help=\"Number of threads to parallelize image writing.\"),\n    ] = NTHREADS,\n    qupath_path: Annotated[\n        Optional[str],\n        typer.Option(\n            help=\"Full path to the QuPath (console) executable.\",\n            rich_help_panel=\"QuPath backend\",\n        ),\n    ] = QUPATH_PATH,\n    script_path: Annotated[\n        Optional[str],\n        typer.Option(\n            help=\"Full path to the groovy script that does the job.\",\n            rich_help_panel=\"QuPath backend\",\n        ),\n    ] = SCRIPT_PATH,\n    pyramid_max: Annotated[\n        Optional[int],\n        typer.Option(\n            help=\"Maximum rescaling (smaller pyramid, will be rounded to closer power of 2).\",\n            rich_help_panel=\"Python backend\",\n        ),\n    ] = PYRAMID_MAX,\n):\n    \"\"\"\n    Create pyramidal versions of .ome.tiff images found in the input directory.\n    You need to edit the script to set the \"QUPATH_PATH\" to your installation of QuPath.\n    Usually on Windows it should be here :\n    C:/Users/$USERNAME$/AppData/Local/QuPath-0.X.Y/QuPath-0.X.Y (console).exe\n    Alternatively you can run the script with the --qupath-path option.\n\n    \"\"\"\n    # check QuPath was correctly set\n    if not os.path.isfile(qupath_path):\n        raise FileNotFoundError(\n            \"\"\"QuPath executable was not found. Edit the script to set 'QUPATH_PATH',\n            or run the script with the --qupath-path  option. Usually it is installed\n            at C:/Users/$USERNAME$/AppData/Local/QuPath-0.X.Y/QuPath-0.X.Y (console).exe\"\"\"\n        )\n    # prepare output directory\n    outputdir = os.path.join(inputdir, \"pyramidal\")\n    if not os.path.isdir(outputdir):\n        os.mkdir(outputdir)\n\n    # get a list of images\n    files = [filename for filename in os.listdir(inputdir) if filename.endswith(INEXT)]\n\n    # check we have files to process\n    if len(files) == 0:\n        print(\"Specified input directory is empty.\")\n        sys.exit()\n\n    # loop over all files\n    print(f\"Found {len(files)} to pyramidalize...\")\n\n    pbar = tqdm(files)\n    for imagename in pbar:\n        # prepare image names\n        image_path = os.path.join(inputdir, imagename)\n        output_image = os.path.join(outputdir, imagename)\n\n        # check if output file already exists\n        if os.path.isfile(output_image):\n            continue\n\n        # verbose\n        pbar.set_description(f\"Pyramidalyzing {imagename}\")\n\n        if use_qupath:\n            pyramidalize_qupath(\n                image_path,\n                output_image,\n                qupath_path,\n                script_path,\n                tile_size,\n                pyramid_factor,\n                nthreads,\n            )\n        else:\n            # prepare tiffwriter options\n            tiffoptions = get_tiff_options(COMPRESSION_PYTHON, nthreads, tile_size)\n\n            # number of pyramid levels\n            levels = [\n                pyramid_factor**i\n                for i in range(1, int(math.log(pyramid_max, pyramid_factor)) + 1)\n            ]\n            pyramidalize_python(image_path, output_image, levels, tiffoptions)\n\n    print(\"All done!\")\n
"},{"location":"api-script-pyramids.html#scripts.pyramids.create_pyramids.pyramidalize_python","title":"pyramidalize_python(image_path, output_image, levels, tiffoptions)","text":"

Pyramidalization with tifffile and scikit-image.

Parameters:

Name Type Description Default image_path str

Full path to the image.

required output_image str

Full path to the pyramidalized image.

required levels list-like of int

Pyramids levels.

required tiffoptions dict

Options for TiffWriter.

required Source code in scripts/pyramids/create_pyramids.py
def pyramidalize_python(\n    image_path: str, output_image: str, levels: list | tuple, tiffoptions: dict\n):\n    \"\"\"\n    Pyramidalization with tifffile and scikit-image.\n\n    Parameters\n    ----------\n    image_path : str\n        Full path to the image.\n    output_image : str\n        Full path to the pyramidalized image.\n    levels : list-like of int\n        Pyramids levels.\n    tiffoptions : dict\n        Options for TiffWriter.\n    \"\"\"\n    # specific imports\n    import xml.etree.ElementTree as ET\n\n    import numpy as np\n    import tifffile\n    from skimage import transform\n\n    # Nested functions\n    def get_pixelsize_ome(\n        desc: str,\n        namespace: dict = {\"ome\": \"http://www.openmicroscopy.org/Schemas/OME/2016-06\"},\n    ) -> float:\n        \"\"\"\n        Extract physical pixel size from OME-XML description.\n\n        Raise a warning if pixels are anisotropic (eg. X and Y sizes are not the same).\n        Raise an error if size units are not microns (\"\u00b5m\").\n\n        Parameters\n        ----------\n        desc : str\n            OME-XML string from Tiff page.\n        namespace : dict, optional\n            XML namespace, defaults to latest OME-XML schema (2016-06).\n\n        Returns\n        -------\n        pixelsize : float\n            Physical pixel size.\n\n        \"\"\"\n        root = ET.fromstring(desc)\n\n        for pixels in root.findall(\".//ome:Pixels\", namespace):\n            pixelsize_x = float(pixels.get(\"PhysicalSizeX\"))\n            pixelsize_y = float(pixels.get(\"PhysicalSizeY\"))\n            break  # stop at first Pixels field in the XML\n\n        # sanity checks\n        if pixelsize_x != pixelsize_y:\n            warnings.warn(\n                f\"Anisotropic pixels size found, are you sure ? ({pixelsize_x}, {pixelsize_y})\"\n            )\n\n        return np.mean([pixelsize_x, pixelsize_y])\n\n    def im_downscale(img, downfactor, **kwargs):\n        \"\"\"\n        Downscale an image by the given factor.\n\n        Wrapper for `skimage.transform.rescale`.\n\n        Parameters\n        ----------\n        img : np.ndarray\n        downfactor : int or float\n            Downscaling factor.\n        **kwargs : passed to skimage.transform.rescale\n\n        Returns\n        -------\n        img_rs : np.ndarray\n            Rescaled image.\n\n        \"\"\"\n        return transform.rescale(\n            img, 1 / downfactor, anti_aliasing=False, preserve_range=True, **kwargs\n        )\n\n    # get metadata from original file (without loading the whole image)\n    with tifffile.TiffFile(image_path) as tifin:\n        metadata = tifin.ome_metadata\n        pixelsize = get_pixelsize_ome(metadata)\n\n    with tifffile.TiffWriter(output_image, ome=False) as tifout:\n        # read full image\n        img = tifffile.imread(image_path)\n\n        # write full resolution multichannel image\n        tifout.write(\n            img,\n            subifds=len(levels),\n            resolution=(1e4 / pixelsize, 1e4 / pixelsize),\n            description=metadata,\n            metadata=None,\n            **tiffoptions,\n        )\n\n        # write downsampled images (pyramidal levels)\n        for level in levels:\n            img_down = im_downscale(\n                img, level, order=0, channel_axis=0\n            )  # downsample image\n            tifout.write(\n                img_down,\n                subfiletype=1,\n                resolution=(1e4 / level / pixelsize, 1e4 / level / pixelsize),\n                **tiffoptions,\n            )\n
"},{"location":"api-script-pyramids.html#scripts.pyramids.create_pyramids.pyramidalize_qupath","title":"pyramidalize_qupath(image_path, output_image, qupath_path, script_path, tile_size, pyramid_factor, nthreads)","text":"

Pyramidalization with QuPath backend.

Source code in scripts/pyramids/create_pyramids.py
def pyramidalize_qupath(\n    image_path: str,\n    output_image: str,\n    qupath_path: str,\n    script_path: str,\n    tile_size: int,\n    pyramid_factor: int,\n    nthreads: int,\n):\n    \"\"\"\n    Pyramidalization with QuPath backend.\n\n    \"\"\"\n    # generate an uid to make sure to not overwrite original file\n    uid = uuid.uuid1().hex\n\n    # prepare image names\n    imagename = os.path.basename(image_path)\n    inputdir = os.path.dirname(image_path)\n    new_imagename = uid + \"_\" + imagename\n    new_imagepath = os.path.join(inputdir, new_imagename)\n\n    # prepare arguments\n    args = \"[\" f\"{uid},\" f\"{tile_size},\" f\"{pyramid_factor},\" f\"{nthreads}\" \"]\"\n\n    # call the qupath groovy script within a shell\n    subprocess.run(\n        [qupath_path, \"script\", script_path, \"-i\", image_path, \"--args\", args],\n        shell=True,\n        stdout=subprocess.DEVNULL,\n    )\n\n    if not os.path.isfile(new_imagepath):\n        raise FileNotFoundError(\n            \"QuPath did not manage to create the pyramidalized image.\"\n        )\n\n    # move the pyramidalized image in the output directory\n    os.rename(new_imagepath, output_image)\n
"},{"location":"api-script-qupath-script-runner.html","title":"qupath_script_runner","text":"

Template to show how to run groovy script with QuPath, multi-threaded.

"},{"location":"api-script-qupath-script-runner.html#scripts.qupath_script_template.EXCLUDE_LIST","title":"EXCLUDE_LIST = [] module-attribute","text":"

Images names to NOT run the script on.

"},{"location":"api-script-qupath-script-runner.html#scripts.qupath_script_template.NTHREADS","title":"NTHREADS = 5 module-attribute","text":"

Number of threads to use.

"},{"location":"api-script-qupath-script-runner.html#scripts.qupath_script_template.QPROJ_PATH","title":"QPROJ_PATH = '/path/to/qupath/project.qproj' module-attribute","text":"

Full path to the QuPath project.

"},{"location":"api-script-qupath-script-runner.html#scripts.qupath_script_template.QUIET","title":"QUIET = True module-attribute","text":"

Use QuPath in quiet mode, eg. with minimal verbosity.

"},{"location":"api-script-qupath-script-runner.html#scripts.qupath_script_template.QUPATH_EXE","title":"QUPATH_EXE = '/path/to/the/qupath/QuPath-0.5.1 (console).exe' module-attribute","text":"

Path to the QuPath executable (console mode).

"},{"location":"api-script-qupath-script-runner.html#scripts.qupath_script_template.SAVE","title":"SAVE = True module-attribute","text":"

Whether to save the project after the script ran on an image.

"},{"location":"api-script-qupath-script-runner.html#scripts.qupath_script_template.SCRIPT_PATH","title":"SCRIPT_PATH = '/path/to/the/script.groovy' module-attribute","text":"

Path to the groovy script.

"},{"location":"api-script-segment.html","title":"segment_images","text":"

Script to segment objects from images.

For fiber-like objects, binarize and skeletonize the image, then use skan to extract branches coordinates. For polygon-like objects, binarize the image and detect objects and extract contours coordinates. For points, treat that as polygons then extract the centroids instead of contours. Finally, export the coordinates as collections in geojson files, importable in QuPath. Supports any number of channel of interest within the same image. One file output file per channel will be created.

This script uses histoquant.seg. It is designed to work on probability maps generated from a pixel classifier in QuPath, but might work on raw images.

Usage : fill-in the Parameters section of the script and run it. A \"geojson\" folder will be created in the parent directory of IMAGES_DIR. To exclude objects near the edges of an ROI, specify the path to masks stored as images with the same names as probabilities images (without their suffix).

author : Guillaume Le Goc (g.legoc@posteo.org) @ NeuroPSI version : 2024.12.10

"},{"location":"api-script-segment.html#scripts.segmentation.segment_images.CHANNELS_PARAMS","title":"CHANNELS_PARAMS = [{'name': 'cy5', 'target_channel': 0, 'proba_threshold': 0.85, 'qp_class': 'Fibers: Cy5', 'qp_color': [164, 250, 120]}, {'name': 'dsred', 'target_channel': 1, 'proba_threshold': 0.65, 'qp_class': 'Fibers: DsRed', 'qp_color': [224, 153, 18]}, {'name': 'egfp', 'target_channel': 2, 'proba_threshold': 0.85, 'qp_class': 'Fibers: EGFP', 'qp_color': [135, 11, 191]}] module-attribute","text":"

This should be a list of dictionary (one per channel) with keys :

  • name: str, used as suffix for output geojson files, not used if only one channel
  • target_channel: int, index of the segmented channel of the image, 0-based
  • proba_threshold: float < 1, probability cut-off for that channel
  • qp_class: str, name of QuPath classification
  • qp_color: list of RGB values, associated color
"},{"location":"api-script-segment.html#scripts.segmentation.segment_images.EDGE_DIST","title":"EDGE_DIST = 0 module-attribute","text":"

Distance to brain edge to ignore, in \u00b5m. 0 to disable.

"},{"location":"api-script-segment.html#scripts.segmentation.segment_images.FILTERS","title":"FILTERS = {'length_low': 1.5, 'area_low': 10, 'area_high': 1000, 'ecc_low': 0.0, 'ecc_high': 0.9, 'dist_thresh': 30} module-attribute","text":"

Dictionary with keys :

  • length_low: minimal length in microns - for lines
  • area_low: minimal area in \u00b5m\u00b2 - for polygons and points
  • area_high: maximal area in \u00b5m\u00b2 - for polygons and points
  • ecc_low: minimal eccentricity - for polygons and points (0 = circle)
  • ecc_high: maximal eccentricity - for polygons and points (1 = line)
  • dist_thresh: maximal inter-point distance in \u00b5m - for points
"},{"location":"api-script-segment.html#scripts.segmentation.segment_images.IMAGES_DIR","title":"IMAGES_DIR = '/path/to/images' module-attribute","text":"

Full path to the images to segment.

"},{"location":"api-script-segment.html#scripts.segmentation.segment_images.IMG_SUFFIX","title":"IMG_SUFFIX = '_Probabilities.tiff' module-attribute","text":"

Images suffix, including extension. Masks must be the same name without the suffix.

"},{"location":"api-script-segment.html#scripts.segmentation.segment_images.MASKS_DIR","title":"MASKS_DIR = 'path/to/corresponding/masks' module-attribute","text":"

Full path to the masks, to exclude objects near the brain edges (set to None or empty string to disable this feature).

"},{"location":"api-script-segment.html#scripts.segmentation.segment_images.MASKS_EXT","title":"MASKS_EXT = 'tiff' module-attribute","text":"

Masks files extension.

"},{"location":"api-script-segment.html#scripts.segmentation.segment_images.MAX_PIX_VALUE","title":"MAX_PIX_VALUE = 255 module-attribute","text":"

Maximum pixel possible value to adjust proba_threshold.

"},{"location":"api-script-segment.html#scripts.segmentation.segment_images.ORIGINAL_PIXELSIZE","title":"ORIGINAL_PIXELSIZE = 0.45 module-attribute","text":"

Original images pixel size in microns. This is in case the pixel classifier uses a lower resolution, yielding smaller probability maps, so output objects coordinates need to be rescaled to the full size images. The pixel size is written in the \"Image\" tab in QuPath.

"},{"location":"api-script-segment.html#scripts.segmentation.segment_images.QUPATH_TYPE","title":"QUPATH_TYPE = 'detection' module-attribute","text":"

QuPath object type.

"},{"location":"api-script-segment.html#scripts.segmentation.segment_images.SEGTYPE","title":"SEGTYPE = 'boutons' module-attribute","text":"

Type of segmentation.

"},{"location":"api-script-segment.html#scripts.segmentation.segment_images.get_geojson_dir","title":"get_geojson_dir(images_dir)","text":"

Get the directory of geojson files, which will be in the parent directory of images_dir.

If the directory does not exist, create it.

Parameters:

Name Type Description Default images_dir str required

Returns:

Name Type Description geojson_dir str Source code in scripts/segmentation/segment_images.py
def get_geojson_dir(images_dir: str):\n    \"\"\"\n    Get the directory of geojson files, which will be in the parent directory\n    of `images_dir`.\n\n    If the directory does not exist, create it.\n\n    Parameters\n    ----------\n    images_dir : str\n\n    Returns\n    -------\n    geojson_dir : str\n\n    \"\"\"\n\n    geojson_dir = os.path.join(Path(images_dir).parent, \"geojson\")\n\n    if not os.path.isdir(geojson_dir):\n        os.mkdir(geojson_dir)\n\n    return geojson_dir\n
"},{"location":"api-script-segment.html#scripts.segmentation.segment_images.get_geojson_properties","title":"get_geojson_properties(name, color, objtype='detection')","text":"

Return geojson objects properties as a dictionnary, ready to be used in geojson.Feature.

Parameters:

Name Type Description Default name str

Classification name.

required color tuple or list

Classification color in RGB (3-elements vector).

required objtype str

Object type (\"detection\" or \"annotation\"). Default is \"detection\".

'detection'

Returns:

Name Type Description props dict Source code in scripts/segmentation/segment_images.py
def get_geojson_properties(name: str, color: tuple | list, objtype: str = \"detection\"):\n    \"\"\"\n    Return geojson objects properties as a dictionnary, ready to be used in geojson.Feature.\n\n    Parameters\n    ----------\n    name : str\n        Classification name.\n    color : tuple or list\n        Classification color in RGB (3-elements vector).\n    objtype : str, optional\n        Object type (\"detection\" or \"annotation\"). Default is \"detection\".\n\n    Returns\n    -------\n    props : dict\n\n    \"\"\"\n\n    return {\n        \"objectType\": objtype,\n        \"classification\": {\"name\": name, \"color\": color},\n        \"isLocked\": \"true\",\n    }\n
"},{"location":"api-script-segment.html#scripts.segmentation.segment_images.get_seg_method","title":"get_seg_method(segtype)","text":"

Determine what kind of segmentation is performed.

Segmentation kind are, for now, lines, polygons or points. We detect that based on hardcoded keywords.

Parameters:

Name Type Description Default segtype str required

Returns:

Name Type Description seg_method str Source code in scripts/segmentation/segment_images.py
def get_seg_method(segtype: str):\n    \"\"\"\n    Determine what kind of segmentation is performed.\n\n    Segmentation kind are, for now, lines, polygons or points. We detect that based on\n    hardcoded keywords.\n\n    Parameters\n    ----------\n    segtype : str\n\n    Returns\n    -------\n    seg_method : str\n\n    \"\"\"\n\n    line_list = [\"fibers\", \"axons\", \"fiber\", \"axon\"]\n    point_list = [\"synapto\", \"synaptophysin\", \"syngfp\", \"boutons\", \"points\"]\n    polygon_list = [\"cells\", \"polygon\", \"polygons\", \"polygon\", \"cell\"]\n\n    if segtype in line_list:\n        seg_method = \"lines\"\n    elif segtype in polygon_list:\n        seg_method = \"polygons\"\n    elif segtype in point_list:\n        seg_method = \"points\"\n    else:\n        raise ValueError(\n            f\"Could not determine method to use based on segtype : {segtype}.\"\n        )\n\n    return seg_method\n
"},{"location":"api-script-segment.html#scripts.segmentation.segment_images.parameters_as_dict","title":"parameters_as_dict(images_dir, masks_dir, segtype, name, proba_threshold, edge_dist)","text":"

Get information as a dictionnary.

Parameters:

Name Type Description Default images_dir str

Path to images to be segmented.

required masks_dir str

Path to images masks.

required segtype str

Segmentation type (eg. \"fibers\").

required name str

Name of the segmentation (eg. \"green\").

required proba_threshold float < 1

Probability threshold.

required edge_dist float

Distance in \u00b5m to the brain edge that is ignored.

required

Returns:

Name Type Description params dict Source code in scripts/segmentation/segment_images.py
def parameters_as_dict(\n    images_dir: str,\n    masks_dir: str,\n    segtype: str,\n    name: str,\n    proba_threshold: float,\n    edge_dist: float,\n):\n    \"\"\"\n    Get information as a dictionnary.\n\n    Parameters\n    ----------\n    images_dir : str\n        Path to images to be segmented.\n    masks_dir : str\n        Path to images masks.\n    segtype : str\n        Segmentation type (eg. \"fibers\").\n    name : str\n        Name of the segmentation (eg. \"green\").\n    proba_threshold : float < 1\n        Probability threshold.\n    edge_dist : float\n        Distance in \u00b5m to the brain edge that is ignored.\n\n    Returns\n    -------\n    params : dict\n\n    \"\"\"\n\n    return {\n        \"images_location\": images_dir,\n        \"masks_location\": masks_dir,\n        \"type\": segtype,\n        \"probability threshold\": proba_threshold,\n        \"name\": name,\n        \"edge distance\": edge_dist,\n    }\n
"},{"location":"api-script-segment.html#scripts.segmentation.segment_images.process_directory","title":"process_directory(images_dir, img_suffix='', segtype='', original_pixelsize=1.0, target_channel=0, proba_threshold=0.0, qupath_class='Object', qupath_color=[0, 0, 0], channel_suffix='', edge_dist=0.0, filters={}, masks_dir='', masks_ext='')","text":"

Main function, processes the .ome.tiff files in the input directory.

Parameters:

Name Type Description Default images_dir str

Animal ID to process.

required img_suffix str

Images suffix, including extension.

'' segtype str

Segmentation type.

'' original_pixelsize float

Original images pixel size in microns.

1.0 target_channel int

Index of the channel containning the objects of interest (eg. not the background), in the probability map (not the original images channels).

0 proba_threshold float < 1

Probability below this value will be discarded (multiplied by MAX_PIXEL_VALUE)

0.0 qupath_class str

Name of the QuPath classification.

'Object' qupath_color list of three elements

Color associated to that classification in RGB.

[0, 0, 0] channel_suffix str

Channel name, will be used as a suffix in output geojson files.

'' edge_dist float

Distance to the edge of the brain masks that will be ignored, in microns. Set to 0 to disable this feature.

0.0 filters dict

Filters values to include or excludes objects. See the top of the script.

{} masks_dir str

Path to images masks, to exclude objects found near the edges. The masks must be with the same name as the corresponding image to be segmented, without its suffix. Default is \"\", which disables this feature.

'' masks_ext str

Masks files extension, without leading \".\". Default is \"\"

'' Source code in scripts/segmentation/segment_images.py
def process_directory(\n    images_dir: str,\n    img_suffix: str = \"\",\n    segtype: str = \"\",\n    original_pixelsize: float = 1.0,\n    target_channel: int = 0,\n    proba_threshold: float = 0.0,\n    qupath_class: str = \"Object\",\n    qupath_color: list = [0, 0, 0],\n    channel_suffix: str = \"\",\n    edge_dist: float = 0.0,\n    filters: dict = {},\n    masks_dir: str = \"\",\n    masks_ext: str = \"\",\n):\n    \"\"\"\n    Main function, processes the .ome.tiff files in the input directory.\n\n    Parameters\n    ----------\n    images_dir : str\n        Animal ID to process.\n    img_suffix : str\n        Images suffix, including extension.\n    segtype : str\n        Segmentation type.\n    original_pixelsize : float\n        Original images pixel size in microns.\n    target_channel : int\n        Index of the channel containning the objects of interest (eg. not the\n        background), in the probability map (*not* the original images channels).\n    proba_threshold : float < 1\n        Probability below this value will be discarded (multiplied by `MAX_PIXEL_VALUE`)\n    qupath_class : str\n        Name of the QuPath classification.\n    qupath_color : list of three elements\n        Color associated to that classification in RGB.\n    channel_suffix : str\n        Channel name, will be used as a suffix in output geojson files.\n    edge_dist : float\n        Distance to the edge of the brain masks that will be ignored, in microns. Set to\n        0 to disable this feature.\n    filters : dict\n        Filters values to include or excludes objects. See the top of the script.\n    masks_dir : str, optional\n        Path to images masks, to exclude objects found near the edges. The masks must be\n        with the same name as the corresponding image to be segmented, without its\n        suffix. Default is \"\", which disables this feature.\n    masks_ext : str, optional\n        Masks files extension, without leading \".\". Default is \"\"\n\n    \"\"\"\n\n    # -- Preparation\n    # get segmentation type\n    seg_method = get_seg_method(segtype)\n\n    # get output directory path\n    geojson_dir = get_geojson_dir(images_dir)\n\n    # get images list\n    images_list = [\n        os.path.join(images_dir, filename)\n        for filename in os.listdir(images_dir)\n        if filename.endswith(img_suffix)\n    ]\n\n    # write parameters\n    parameters = parameters_as_dict(\n        images_dir, masks_dir, segtype, channel_suffix, proba_threshold, edge_dist\n    )\n    param_file = os.path.join(geojson_dir, \"parameters\" + channel_suffix + \".txt\")\n    if os.path.isfile(param_file):\n        raise FileExistsError(\"Parameters file already exists.\")\n    else:\n        write_parameters(param_file, parameters, filters, original_pixelsize)\n\n    # convert parameters to pixels in probability map\n    pixelsize = hq.seg.get_pixelsize(images_list[0])  # get pixel size\n    edge_dist = int(edge_dist / pixelsize)\n    filters = hq.seg.convert_to_pixels(filters, pixelsize)\n\n    # get rescaling factor\n    rescale_factor = pixelsize / original_pixelsize\n\n    # get GeoJSON properties\n    geojson_props = get_geojson_properties(\n        qupath_class, qupath_color, objtype=QUPATH_TYPE\n    )\n\n    # -- Processing\n    pbar = tqdm(images_list)\n    for imgpath in pbar:\n        # build file names\n        imgname = os.path.basename(imgpath)\n        geoname = imgname.replace(img_suffix, \"\")\n        geojson_file = os.path.join(\n            geojson_dir, geoname + \"_segmentation\" + channel_suffix + \".geojson\"\n        )\n\n        # checks if output file already exists\n        if os.path.isfile(geojson_file):\n            continue\n\n        # read images\n        pbar.set_description(f\"{geoname}: Loading...\")\n        img = tifffile.imread(imgpath, key=target_channel)\n        if (edge_dist > 0) & (len(masks_dir) != 0):\n            mask = tifffile.imread(os.path.join(masks_dir, geoname + \".\" + masks_ext))\n            mask = hq.seg.pad_image(mask, img.shape)  # resize mask\n            # apply mask, eroding from the edges\n            img = img * hq.seg.erode_mask(mask, edge_dist)\n\n        # image processing\n        pbar.set_description(f\"{geoname}: IP...\")\n\n        # threshold probability and binarization\n        img = img >= proba_threshold * MAX_PIX_VALUE\n\n        # segmentation\n        pbar.set_description(f\"{geoname}: Segmenting...\")\n\n        if seg_method == \"lines\":\n            collection = hq.seg.segment_lines(\n                img,\n                geojson_props,\n                minsize=filters[\"length_low\"],\n                rescale_factor=rescale_factor,\n            )\n\n        elif seg_method == \"polygons\":\n            collection = hq.seg.segment_polygons(\n                img,\n                geojson_props,\n                area_min=filters[\"area_low\"],\n                area_max=filters[\"area_high\"],\n                ecc_min=filters[\"ecc_low\"],\n                ecc_max=filters[\"ecc_high\"],\n                rescale_factor=rescale_factor,\n            )\n\n        elif seg_method == \"points\":\n            collection = hq.seg.segment_points(\n                img,\n                geojson_props,\n                area_min=filters[\"area_low\"],\n                area_max=filters[\"area_high\"],\n                ecc_min=filters[\"ecc_low\"],\n                ecc_max=filters[\"ecc_high\"],\n                dist_thresh=filters[\"dist_thresh\"],\n                rescale_factor=rescale_factor,\n            )\n        else:\n            # we already printed an error message\n            return\n\n        # save geojson\n        pbar.set_description(f\"{geoname}: Saving...\")\n        with open(geojson_file, \"w\") as fid:\n            fid.write(geojson.dumps(collection))\n
"},{"location":"api-script-segment.html#scripts.segmentation.segment_images.write_parameters","title":"write_parameters(outfile, parameters, filters, original_pixelsize)","text":"

Write parameters to outfile.

A timestamp will be added. Parameters are written as key = value, and a [filters] is added before filters parameters.

Parameters:

Name Type Description Default outfile str

Full path to the output file.

required parameters dict

General parameters.

required filters dict

Filters parameters.

required original_pixelsize float

Size of pixels in original image.

required Source code in scripts/segmentation/segment_images.py
def write_parameters(\n    outfile: str, parameters: dict, filters: dict, original_pixelsize: float\n):\n    \"\"\"\n    Write parameters to `outfile`.\n\n    A timestamp will be added. Parameters are written as key = value,\n    and a [filters] is added before filters parameters.\n\n    Parameters\n    ----------\n    outfile : str\n        Full path to the output file.\n    parameters : dict\n        General parameters.\n    filters : dict\n        Filters parameters.\n    original_pixelsize : float\n        Size of pixels in original image.\n\n    \"\"\"\n\n    with open(outfile, \"w\") as fid:\n        fid.writelines(f\"date = {datetime.now().strftime('%d-%B-%Y %H:%M:%S')}\\n\")\n\n        fid.writelines(f\"original_pixelsize = {original_pixelsize}\\n\")\n\n        for key, value in parameters.items():\n            fid.writelines(f\"{key} = {value}\\n\")\n\n        fid.writelines(\"[filters]\\n\")\n\n        for key, value in filters.items():\n            fid.writelines(f\"{key} = {value}\\n\")\n
"},{"location":"api-seg.html","title":"histoquant.seg","text":"

seg module, part of histoquant.

Functions for segmentating probability map stored as an image.

"},{"location":"api-seg.html#histoquant.seg.convert_to_pixels","title":"convert_to_pixels(filters, pixelsize)","text":"

Convert some values in filters in pixels.

Parameters:

Name Type Description Default filters dict

Must contain the keys used below.

required pixelsize float

Pixel size in microns.

required

Returns:

Name Type Description filters dict

Same as input, with values in pixels.

Source code in histoquant/seg.py
def convert_to_pixels(filters, pixelsize):\n    \"\"\"\n    Convert some values in `filters` in pixels.\n\n    Parameters\n    ----------\n    filters : dict\n        Must contain the keys used below.\n    pixelsize : float\n        Pixel size in microns.\n\n    Returns\n    -------\n    filters : dict\n        Same as input, with values in pixels.\n\n    \"\"\"\n\n    filters[\"area_low\"] = filters[\"area_low\"] / pixelsize**2\n    filters[\"area_high\"] = filters[\"area_high\"] / pixelsize**2\n    filters[\"length_low\"] = filters[\"length_low\"] / pixelsize\n    filters[\"dist_thresh\"] = int(filters[\"dist_thresh\"] / pixelsize)\n\n    return filters\n
"},{"location":"api-seg.html#histoquant.seg.erode_mask","title":"erode_mask(mask, edge_dist)","text":"

Erode the mask outline so that is is edge_dist smaller from the border.

This allows discarding the edges.

Parameters:

Name Type Description Default mask ndarray required edge_dist float

Distance to edges, in pixels.

required

Returns:

Name Type Description eroded_mask ndarray of bool Source code in histoquant/seg.py
def erode_mask(mask: np.ndarray, edge_dist: float) -> np.ndarray:\n    \"\"\"\n    Erode the mask outline so that is is `edge_dist` smaller from the border.\n\n    This allows discarding the edges.\n\n    Parameters\n    ----------\n    mask : ndarray\n    edge_dist : float\n        Distance to edges, in pixels.\n\n    Returns\n    -------\n    eroded_mask : ndarray of bool\n\n    \"\"\"\n\n    if edge_dist % 2 == 0:\n        edge_dist += 1  # decomposition requires even number\n\n    footprint = morphology.square(edge_dist, decomposition=\"sequence\")\n\n    return mask * morphology.binary_erosion(mask, footprint=footprint)\n
"},{"location":"api-seg.html#histoquant.seg.get_collection_from_points","title":"get_collection_from_points(coords, properties, rescale_factor=1.0, offset=0.5)","text":"

Gather coordinates from coords and put them in GeoJSON format.

An entry in coords are pairs of (x, y) coordinates defining the point. properties is a dictionnary with QuPath properties of each detections.

Parameters:

Name Type Description Default coords list required properties dict required rescale_factor float

Rescale output coordinates by this factor.

1.0

Returns:

Name Type Description collection FeatureCollection Source code in histoquant/seg.py
def get_collection_from_points(\n    coords: list, properties: dict, rescale_factor: float = 1.0, offset: float = 0.5\n) -> geojson.FeatureCollection:\n    \"\"\"\n    Gather coordinates from `coords` and put them in GeoJSON format.\n\n    An entry in `coords` are pairs of (x, y) coordinates defining the point.\n    `properties` is a dictionnary with QuPath properties of each detections.\n\n    Parameters\n    ----------\n    coords : list\n    properties : dict\n    rescale_factor : float\n        Rescale output coordinates by this factor.\n\n    Returns\n    -------\n    collection : geojson.FeatureCollection\n\n    \"\"\"\n\n    collection = [\n        geojson.Feature(\n            geometry=shapely.Point(\n                np.flip((coord + offset) * rescale_factor)\n            ),  # shape object\n            properties=properties,  # object properties\n            id=str(uuid.uuid4()),  # object uuid\n        )\n        for coord in coords\n    ]\n\n    return geojson.FeatureCollection(collection)\n
"},{"location":"api-seg.html#histoquant.seg.get_collection_from_poly","title":"get_collection_from_poly(contours, properties, rescale_factor=1.0, offset=0.5)","text":"

Gather coordinates in the list and put them in GeoJSON format as Polygons.

An entry in contours must define a closed polygon. properties is a dictionnary with QuPath properties of each detections.

Parameters:

Name Type Description Default contours list required properties dict

QuPatj objects' properties.

required rescale_factor float

Rescale output coordinates by this factor.

1.0 offset float

Shift coordinates by this amount, typically to get pixel centers or edges. Default is 0.5.

0.5

Returns:

Name Type Description collection FeatureCollection

A FeatureCollection ready to be written as geojson.

Source code in histoquant/seg.py
def get_collection_from_poly(\n    contours: list, properties: dict, rescale_factor: float = 1.0, offset: float = 0.5\n) -> geojson.FeatureCollection:\n    \"\"\"\n    Gather coordinates in the list and put them in GeoJSON format as Polygons.\n\n    An entry in `contours` must define a closed polygon. `properties` is a dictionnary\n    with QuPath properties of each detections.\n\n    Parameters\n    ----------\n    contours : list\n    properties : dict\n        QuPatj objects' properties.\n    rescale_factor : float\n        Rescale output coordinates by this factor.\n    offset : float\n        Shift coordinates by this amount, typically to get pixel centers or edges.\n        Default is 0.5.\n\n    Returns\n    -------\n    collection : geojson.FeatureCollection\n        A FeatureCollection ready to be written as geojson.\n\n    \"\"\"\n    collection = [\n        geojson.Feature(\n            geometry=shapely.Polygon(\n                np.fliplr((contour + offset) * rescale_factor)\n            ),  # shape object\n            properties=properties,  # object properties\n            id=str(uuid.uuid4()),  # object uuid\n        )\n        for contour in contours\n    ]\n\n    return geojson.FeatureCollection(collection)\n
"},{"location":"api-seg.html#histoquant.seg.get_collection_from_skel","title":"get_collection_from_skel(skeleton, properties, rescale_factor=1.0, offset=0.5)","text":"

Get the coordinates of each skeleton path as a GeoJSON Features in a FeatureCollection. properties is a dictionnary with QuPath properties of each detections.

Parameters:

Name Type Description Default skeleton Skeleton required properties dict

QuPatj objects' properties.

required rescale_factor float

Rescale output coordinates by this factor.

1.0 offset float

Shift coordinates by this amount, typically to get pixel centers or edges. Default is 0.5.

0.5

Returns:

Name Type Description collection FeatureCollection

A FeatureCollection ready to be written as geojson.

Source code in histoquant/seg.py
def get_collection_from_skel(\n    skeleton: Skeleton, properties: dict, rescale_factor: float = 1.0, offset=0.5\n) -> geojson.FeatureCollection:\n    \"\"\"\n    Get the coordinates of each skeleton path as a GeoJSON Features in a\n    FeatureCollection.\n    `properties` is a dictionnary with QuPath properties of each detections.\n\n    Parameters\n    ----------\n    skeleton : skan.Skeleton\n    properties : dict\n        QuPatj objects' properties.\n    rescale_factor : float\n        Rescale output coordinates by this factor.\n    offset : float\n        Shift coordinates by this amount, typically to get pixel centers or edges.\n        Default is 0.5.\n\n    Returns\n    -------\n    collection : geojson.FeatureCollection\n        A FeatureCollection ready to be written as geojson.\n\n    \"\"\"\n\n    branch_data = summarize(skeleton, separator=\"_\")\n\n    collection = []\n    for ind in range(skeleton.n_paths):\n        prop = properties.copy()\n        prop[\"measurements\"] = {\"skeleton_id\": int(branch_data.loc[ind, \"skeleton_id\"])}\n        collection.append(\n            geojson.Feature(\n                geometry=shapely.LineString(\n                    (skeleton.path_coordinates(ind)[:, ::-1] + offset) * rescale_factor\n                ),  # shape object\n                properties=prop,  # object properties\n                id=str(uuid.uuid4()),  # object uuid\n            )\n        )\n\n    return geojson.FeatureCollection(collection)\n
"},{"location":"api-seg.html#histoquant.seg.get_image_skeleton","title":"get_image_skeleton(img, minsize=0)","text":"

Get the image skeleton.

Computes the image skeleton and removes objects smaller than minsize.

Parameters:

Name Type Description Default img ndarray of bool required minsize number

Min. size the object can have, as a number of pixels. Default is 0.

0

Returns:

Name Type Description skel ndarray of bool

Binary image with 1-pixel wide skeleton.

Source code in histoquant/seg.py
def get_image_skeleton(img: np.ndarray, minsize=0) -> np.ndarray:\n    \"\"\"\n    Get the image skeleton.\n\n    Computes the image skeleton and removes objects smaller than `minsize`.\n\n    Parameters\n    ----------\n    img : ndarray of bool\n    minsize : number, optional\n        Min. size the object can have, as a number of pixels. Default is 0.\n\n    Returns\n    -------\n    skel : ndarray of bool\n        Binary image with 1-pixel wide skeleton.\n\n    \"\"\"\n\n    skel = morphology.skeletonize(img)\n\n    return morphology.remove_small_objects(skel, min_size=minsize, connectivity=2)\n
"},{"location":"api-seg.html#histoquant.seg.get_pixelsize","title":"get_pixelsize(image_name)","text":"

Get pixel size recorded in image_name TIFF metadata.

Parameters:

Name Type Description Default image_name str

Full path to image.

required

Returns:

Name Type Description pixelsize float

Pixel size in microns.

Source code in histoquant/seg.py
def get_pixelsize(image_name: str) -> float:\n    \"\"\"\n    Get pixel size recorded in `image_name` TIFF metadata.\n\n    Parameters\n    ----------\n    image_name : str\n        Full path to image.\n\n    Returns\n    -------\n    pixelsize : float\n        Pixel size in microns.\n\n    \"\"\"\n\n    with tifffile.TiffFile(image_name) as tif:\n        # XResolution is a tuple, numerator, denomitor. The inverse is the pixel size\n        return (\n            tif.pages[0].tags[\"XResolution\"].value[1]\n            / tif.pages[0].tags[\"XResolution\"].value[0]\n        )\n
"},{"location":"api-seg.html#histoquant.seg.pad_image","title":"pad_image(img, finalsize)","text":"

Pad image with zeroes to match expected final size.

Parameters:

Name Type Description Default img ndarray required finalsize tuple or list

nrows, ncolumns

required

Returns:

Name Type Description imgpad ndarray

img with black borders.

Source code in histoquant/seg.py
def pad_image(img: np.ndarray, finalsize: tuple | list) -> np.ndarray:\n    \"\"\"\n    Pad image with zeroes to match expected final size.\n\n    Parameters\n    ----------\n    img : ndarray\n    finalsize : tuple or list\n        nrows, ncolumns\n\n    Returns\n    -------\n    imgpad : ndarray\n        img with black borders.\n\n    \"\"\"\n\n    final_h = finalsize[0]  # requested number of rows (height)\n    final_w = finalsize[1]  # requested number of columns (width)\n    original_h = img.shape[0]  # input number of rows\n    original_w = img.shape[1]  # input number of columns\n\n    a = (final_h - original_h) // 2  # vertical padding before\n    aa = final_h - a - original_h  # vertical padding after\n    b = (final_w - original_w) // 2  # horizontal padding before\n    bb = final_w - b - original_w  # horizontal padding after\n\n    return np.pad(img, pad_width=((a, aa), (b, bb)), mode=\"constant\")\n
"},{"location":"api-seg.html#histoquant.seg.segment_lines","title":"segment_lines(img, geojson_props, minsize=0.0, rescale_factor=1.0)","text":"

Wraps skeleton analysis to get paths coordinates.

Parameters:

Name Type Description Default img ndarray of bool

Binary image to segment as lines.

required geojson_props dict

GeoJSON properties of objects.

required minsize float

Minimum size in pixels for an object.

0.0 rescale_factor float

Rescale output coordinates by this factor.

1.0

Returns:

Name Type Description collection FeatureCollection

A FeatureCollection ready to be written as geojson.

Source code in histoquant/seg.py
def segment_lines(\n    img: np.ndarray, geojson_props: dict, minsize=0.0, rescale_factor=1.0\n) -> geojson.FeatureCollection:\n    \"\"\"\n    Wraps skeleton analysis to get paths coordinates.\n\n    Parameters\n    ----------\n    img : ndarray of bool\n        Binary image to segment as lines.\n    geojson_props : dict\n        GeoJSON properties of objects.\n    minsize : float\n        Minimum size in pixels for an object.\n    rescale_factor : float\n        Rescale output coordinates by this factor.\n\n    Returns\n    -------\n    collection : geojson.FeatureCollection\n        A FeatureCollection ready to be written as geojson.\n\n    \"\"\"\n\n    skel = get_image_skeleton(img, minsize=minsize)\n\n    # get paths coordinates as FeatureCollection\n    skeleton = Skeleton(skel, keep_images=False)\n    return get_collection_from_skel(\n        skeleton, geojson_props, rescale_factor=rescale_factor\n    )\n
"},{"location":"api-seg.html#histoquant.seg.segment_points","title":"segment_points(img, geojson_props, area_min=0.0, area_max=np.inf, ecc_min=0, ecc_max=1, dist_thresh=0, rescale_factor=1)","text":"

Point segmentation.

First, segment polygons to apply shape filters, then extract their centroids, and remove isolated points as defined by dist_thresh.

Parameters:

Name Type Description Default img ndarray of bool

Binary image to segment as points.

required geojson_props dict

GeoJSON properties of objects.

required area_min float

Minimum and maximum area in pixels for an object.

0.0 area_max float

Minimum and maximum area in pixels for an object.

0.0 ecc_min float

Minimum and maximum eccentricity for an object.

0 ecc_max float

Minimum and maximum eccentricity for an object.

0 dist_thresh float

Maximal distance in pixels between objects before considering them as isolated and remove them. 0 disables it.

0 rescale_factor float

Rescale output coordinates by this factor.

1

Returns:

Name Type Description collection FeatureCollection

A FeatureCollection ready to be written as geojson.

Source code in histoquant/seg.py
def segment_points(\n    img: np.ndarray,\n    geojson_props: dict,\n    area_min: float = 0.0,\n    area_max: float = np.inf,\n    ecc_min: float = 0,\n    ecc_max: float = 1,\n    dist_thresh: float = 0,\n    rescale_factor: float = 1,\n) -> geojson.FeatureCollection:\n    \"\"\"\n    Point segmentation.\n\n    First, segment polygons to apply shape filters, then extract their centroids,\n    and remove isolated points as defined by `dist_thresh`.\n\n    Parameters\n    ----------\n    img : ndarray of bool\n        Binary image to segment as points.\n    geojson_props : dict\n        GeoJSON properties of objects.\n    area_min, area_max : float\n        Minimum and maximum area in pixels for an object.\n    ecc_min, ecc_max : float\n        Minimum and maximum eccentricity for an object.\n    dist_thresh : float\n        Maximal distance in pixels between objects before considering them as isolated and remove them.\n        0 disables it.\n    rescale_factor : float\n        Rescale output coordinates by this factor.\n\n    Returns\n    -------\n    collection : geojson.FeatureCollection\n        A FeatureCollection ready to be written as geojson.\n\n    \"\"\"\n\n    # get objects properties\n    stats = pd.DataFrame(\n        measure.regionprops_table(\n            measure.label(img), properties=(\"label\", \"area\", \"eccentricity\", \"centroid\")\n        )\n    )\n\n    # keep objects matching filters\n    stats = stats[\n        (stats[\"area\"] >= area_min)\n        & (stats[\"area\"] <= area_max)\n        & (stats[\"eccentricity\"] >= ecc_min)\n        & (stats[\"eccentricity\"] <= ecc_max)\n    ]\n\n    # create an image from centroids only\n    stats[\"centroid-0\"] = stats[\"centroid-0\"].astype(int)\n    stats[\"centroid-1\"] = stats[\"centroid-1\"].astype(int)\n    bw = np.zeros(img.shape, dtype=bool)\n    bw[stats[\"centroid-0\"], stats[\"centroid-1\"]] = True\n\n    # filter isolated objects\n    if dist_thresh:\n        # dilation of points\n        if dist_thresh % 2 == 0:\n            dist_thresh += 1  # decomposition requires even number\n\n        footprint = morphology.square(int(dist_thresh), decomposition=\"sequence\")\n        dilated = measure.label(morphology.binary_dilation(bw, footprint=footprint))\n        stats = pd.DataFrame(\n            measure.regionprops_table(dilated, properties=(\"label\", \"area\"))\n        )\n\n        # objects that did not merge are alone\n        toremove = stats[(stats[\"area\"] <= dist_thresh**2)]\n        dilated[np.isin(dilated, toremove[\"label\"])] = 0  # remove them\n\n        # apply mask\n        bw = bw * dilated\n\n    # get points coordinates\n    coords = np.argwhere(bw)\n\n    return get_collection_from_points(\n        coords, geojson_props, rescale_factor=rescale_factor\n    )\n
"},{"location":"api-seg.html#histoquant.seg.segment_polygons","title":"segment_polygons(img, geojson_props, area_min=0.0, area_max=np.inf, ecc_min=0.0, ecc_max=1.0, rescale_factor=1.0)","text":"

Polygon segmentation.

Parameters:

Name Type Description Default img ndarray of bool

Binary image to segment as polygons.

required geojson_props dict

GeoJSON properties of objects.

required area_min float

Minimum and maximum area in pixels for an object.

0.0 area_max float

Minimum and maximum area in pixels for an object.

0.0 ecc_min float

Minimum and maximum eccentricity for an object.

0.0 ecc_max float

Minimum and maximum eccentricity for an object.

0.0 rescale_factor float

Rescale output coordinates by this factor.

1.0

Returns:

Name Type Description collection FeatureCollection

A FeatureCollection ready to be written as geojson.

Source code in histoquant/seg.py
def segment_polygons(\n    img: np.ndarray,\n    geojson_props: dict,\n    area_min: float = 0.0,\n    area_max: float = np.inf,\n    ecc_min: float = 0.0,\n    ecc_max: float = 1.0,\n    rescale_factor: float = 1.0,\n) -> geojson.FeatureCollection:\n    \"\"\"\n    Polygon segmentation.\n\n    Parameters\n    ----------\n    img : ndarray of bool\n        Binary image to segment as polygons.\n    geojson_props : dict\n        GeoJSON properties of objects.\n    area_min, area_max : float\n        Minimum and maximum area in pixels for an object.\n    ecc_min, ecc_max : float\n        Minimum and maximum eccentricity for an object.\n    rescale_factor: float\n        Rescale output coordinates by this factor.\n\n    Returns\n    -------\n    collection : geojson.FeatureCollection\n        A FeatureCollection ready to be written as geojson.\n\n    \"\"\"\n\n    label_image = measure.label(img)\n\n    # get objects properties\n    stats = pd.DataFrame(\n        measure.regionprops_table(\n            label_image, properties=(\"label\", \"area\", \"eccentricity\")\n        )\n    )\n\n    # remove objects not matching filters\n    toremove = stats[\n        (stats[\"area\"] < area_min)\n        | (stats[\"area\"] > area_max)\n        | (stats[\"eccentricity\"] < ecc_min)\n        | (stats[\"eccentricity\"] > ecc_max)\n    ]\n\n    label_image[np.isin(label_image, toremove[\"label\"])] = 0\n\n    # find objects countours\n    label_image = label_image > 0\n    contours = measure.find_contours(label_image)\n\n    return get_collection_from_poly(\n        contours, geojson_props, rescale_factor=rescale_factor\n    )\n
"},{"location":"api-utils.html","title":"histoquant.utils","text":"

utils module, part of histoquant.

Contains utilities functions.

"},{"location":"api-utils.html#histoquant.utils.add_brain_region","title":"add_brain_region(df, atlas, col='Parent')","text":"

Add brain region to a DataFrame with Atlas_X, Atlas_Y and Atlas_Z columns.

This uses Brainglobe Atlas API to query the atlas. It does not use the structure_from_coords() method, instead it manually converts the coordinates in stack indices, then get the corresponding annotation id and query the corresponding acronym -- because brainglobe-atlasapi is not vectorized at all.

Parameters:

Name Type Description Default df DataFrame

DataFrame with atlas coordinates in microns.

required atlas BrainGlobeAtlas required col str

Column in which to put the regions acronyms. Default is \"Parent\".

'Parent'

Returns:

Name Type Description df DataFrame

Same DataFrame with a new \"Parent\" column.

Source code in histoquant/utils.py
def add_brain_region(\n    df: pd.DataFrame, atlas: BrainGlobeAtlas, col=\"Parent\"\n) -> pd.DataFrame:\n    \"\"\"\n    Add brain region to a DataFrame with `Atlas_X`, `Atlas_Y` and `Atlas_Z` columns.\n\n    This uses Brainglobe Atlas API to query the atlas. It does not use the\n    structure_from_coords() method, instead it manually converts the coordinates in\n    stack indices, then get the corresponding annotation id and query the corresponding\n    acronym -- because brainglobe-atlasapi is not vectorized at all.\n\n    Parameters\n    ----------\n    df : pd.DataFrame\n        DataFrame with atlas coordinates in microns.\n    atlas : BrainGlobeAtlas\n    col : str, optional\n        Column in which to put the regions acronyms. Default is \"Parent\".\n\n    Returns\n    -------\n    df : pd.DataFrame\n        Same DataFrame with a new \"Parent\" column.\n\n    \"\"\"\n    df_in = df.copy()\n\n    res = atlas.resolution  # microns <-> pixels conversion\n    lims = atlas.shape_um  # out of brain\n\n    # set out-of-brain objects at 0 so we get \"root\" as their parent\n    df_in.loc[(df_in[\"Atlas_X\"] >= lims[0]) | (df_in[\"Atlas_X\"] < 0), \"Atlas_X\"] = 0\n    df_in.loc[(df_in[\"Atlas_Y\"] >= lims[1]) | (df_in[\"Atlas_Y\"] < 0), \"Atlas_Y\"] = 0\n    df_in.loc[(df_in[\"Atlas_Z\"] >= lims[2]) | (df_in[\"Atlas_Z\"] < 0), \"Atlas_Z\"] = 0\n\n    # build the multi index, in pixels and integers\n    ixyz = (\n        df_in[\"Atlas_X\"].divide(res[0]).astype(int),\n        df_in[\"Atlas_Y\"].divide(res[1]).astype(int),\n        df_in[\"Atlas_Z\"].divide(res[2]).astype(int),\n    )\n    # convert i, j, k indices in raveled indices\n    linear_indices = np.ravel_multi_index(ixyz, dims=atlas.annotation.shape)\n    # get the structure id from the annotation stack\n    idlist = atlas.annotation.ravel()[linear_indices]\n    # replace 0 which does not exist to 997 (root)\n    idlist[idlist == 0] = 997\n\n    # query the corresponding acronyms\n    lookup = atlas.lookup_df.set_index(\"id\")\n    df.loc[:, col] = lookup.loc[idlist, \"acronym\"].values\n\n    return df\n
"},{"location":"api-utils.html#histoquant.utils.add_channel","title":"add_channel(df, object_type, channel_names)","text":"

Add channel as a measurement for detections DataFrame.

The channel is read from the Classification column, the latter having to be formatted as \"object_type: channel\".

Parameters:

Name Type Description Default df DataFrame

DataFrame with detections measurements.

required object_type str

Object type (primary classification).

required channel_names dict

Map between original channel names to something else.

required

Returns:

Type Description DataFrame

Same DataFrame with a \"channel\" column.

Source code in histoquant/utils.py
def add_channel(\n    df: pd.DataFrame, object_type: str, channel_names: dict\n) -> pd.DataFrame:\n    \"\"\"\n    Add channel as a measurement for detections DataFrame.\n\n    The channel is read from the Classification column, the latter having to be\n    formatted as \"object_type: channel\".\n\n    Parameters\n    ----------\n    df : pd.DataFrame\n        DataFrame with detections measurements.\n    object_type : str\n        Object type (primary classification).\n    channel_names : dict\n        Map between original channel names to something else.\n\n    Returns\n    -------\n    pd.DataFrame\n        Same DataFrame with a \"channel\" column.\n\n    \"\"\"\n    # check if there is something to do\n    if \"channel\" in df.columns:\n        return df\n\n    kind = get_df_kind(df)\n    if kind == \"annotation\":\n        warnings.warn(\"Annotation DataFrame not supported.\")\n        return df\n\n    # add channel, from {class_name: channel} classification\n    df[\"channel\"] = (\n        df[\"Classification\"].str.replace(object_type + \": \", \"\").map(channel_names)\n    )\n\n    return df\n
"},{"location":"api-utils.html#histoquant.utils.add_hemisphere","title":"add_hemisphere(df, hemisphere_names, midline=5700, col='Atlas_Z', atlas_type='brain')","text":"

Add hemisphere (left/right) as a measurement for detections or annotations.

The hemisphere is read in the \"Classification\" column for annotations. The latter needs to be in the form \"Right: Name\" or \"Left: Name\". For detections, the input col of df is compared to midline to assess if the object belong to the left or right hemispheres.

Parameters:

Name Type Description Default df DataFrame

DataFrame with detections or annotations measurements.

required hemisphere_names dict

Map between \"Left\" and \"Right\" to something else.

required midline float

Used only for \"detections\" df. Corresponds to the brain midline in microns, should be 5700 for CCFv3 and 1610 for spinal cord.

5700 col str

Name of the column containing the Z coordinate (medio-lateral) in microns. Default is \"Atlas_Z\".

'Atlas_Z' atlas_type (brain, cord)

Type of atlas used for registration. Required because the brain atlas is swapped between left and right while the spinal cord atlas is not. Default is \"brain\".

\"brain\"

Returns:

Name Type Description df DataFrame

The same DataFrame with a new \"hemisphere\" column

Source code in histoquant/utils.py
def add_hemisphere(\n    df: pd.DataFrame,\n    hemisphere_names: dict,\n    midline: float = 5700,\n    col: str = \"Atlas_Z\",\n    atlas_type: str = \"brain\",\n) -> pd.DataFrame:\n    \"\"\"\n    Add hemisphere (left/right) as a measurement for detections or annotations.\n\n    The hemisphere is read in the \"Classification\" column for annotations. The latter\n    needs to be in the form \"Right: Name\" or \"Left: Name\". For detections, the input\n    `col` of `df` is compared to `midline` to assess if the object belong to the left or\n    right hemispheres.\n\n    Parameters\n    ----------\n    df : pandas.DataFrame\n        DataFrame with detections or annotations measurements.\n    hemisphere_names : dict\n        Map between \"Left\" and \"Right\" to something else.\n    midline : float\n        Used only for \"detections\" `df`. Corresponds to the brain midline in microns,\n        should be 5700 for CCFv3 and 1610 for spinal cord.\n    col : str, optional\n        Name of the column containing the Z coordinate (medio-lateral) in microns.\n        Default is \"Atlas_Z\".\n    atlas_type : {\"brain\", \"cord\"}, optional\n        Type of atlas used for registration. Required because the brain atlas is swapped\n        between left and right while the spinal cord atlas is not. Default is \"brain\".\n\n    Returns\n    -------\n    df : pandas.DataFrame\n        The same DataFrame with a new \"hemisphere\" column\n\n    \"\"\"\n    # check if there is something to do\n    if \"hemisphere\" in df.columns:\n        return df\n\n    # get kind of DataFrame\n    kind = get_df_kind(df)\n\n    if kind == \"detection\":\n        # use midline\n        if atlas_type == \"brain\":\n            # brain atlas : beyond midline, it's left\n            df.loc[df[col] >= midline, \"hemisphere\"] = hemisphere_names[\"Left\"]\n            df.loc[df[col] < midline, \"hemisphere\"] = hemisphere_names[\"Right\"]\n        elif atlas_type == \"cord\":\n            # cord atlas : below midline, it's left\n            df.loc[df[col] <= midline, \"hemisphere\"] = hemisphere_names[\"Left\"]\n            df.loc[df[col] > midline, \"hemisphere\"] = hemisphere_names[\"Right\"]\n\n    elif kind == \"annotation\":\n        # use Classification name -- this does not depend on atlas type\n        df[\"hemisphere\"] = [name.split(\":\")[0] for name in df[\"Classification\"]]\n        df[\"hemisphere\"] = df[\"hemisphere\"].map(hemisphere_names)\n\n    return df\n
"},{"location":"api-utils.html#histoquant.utils.ccf_to_stereo","title":"ccf_to_stereo(x_ccf, y_ccf, z_ccf=0)","text":"

Convert X, Y, Z coordinates in CCFv3 to stereotaxis coordinates (as in Paxinos-Franklin atlas).

Coordinates are shifted, rotated and squeezed, see (1) for more info. Input must be in mm. x_ccf corresponds to the anterio-posterior (rostro-caudal) axis. y_ccf corresponds to the dorso-ventral axis. z_ccf corresponds to the medio-lateral axis (left-right) axis.

Warning : it is a rough estimation.

(1) https://community.brain-map.org/t/how-to-transform-ccf-x-y-z-coordinates-into-stereotactic-coordinates/1858

Parameters:

Name Type Description Default x_ccf floats or ndarray

Coordinates in CCFv3 space in mm.

required y_ccf floats or ndarray

Coordinates in CCFv3 space in mm.

required z_ccf float or ndarray

Coordinate in CCFv3 space in mm. Default is 0.

0

Returns:

Type Description ap, dv, ml : floats or np.ndarray

Stereotaxic coordinates in mm.

Source code in histoquant/utils.py
def ccf_to_stereo(\n    x_ccf: float | np.ndarray, y_ccf: float | np.ndarray, z_ccf: float | np.ndarray = 0\n) -> tuple:\n    \"\"\"\n    Convert X, Y, Z coordinates in CCFv3 to stereotaxis coordinates (as in\n    Paxinos-Franklin atlas).\n\n    Coordinates are shifted, rotated and squeezed, see (1) for more info. Input must be\n    in mm.\n    `x_ccf` corresponds to the anterio-posterior (rostro-caudal) axis.\n    `y_ccf` corresponds to the dorso-ventral axis.\n    `z_ccf` corresponds to the medio-lateral axis (left-right) axis.\n\n    Warning : it is a rough estimation.\n\n    (1) https://community.brain-map.org/t/how-to-transform-ccf-x-y-z-coordinates-into-stereotactic-coordinates/1858\n\n    Parameters\n    ----------\n    x_ccf, y_ccf : floats or np.ndarray\n        Coordinates in CCFv3 space in mm.\n    z_ccf : float or np.ndarray, optional\n        Coordinate in CCFv3 space in mm. Default is 0.\n\n    Returns\n    -------\n    ap, dv, ml : floats or np.ndarray\n        Stereotaxic coordinates in mm.\n\n    \"\"\"\n    # Center CCF on Bregma\n    xstereo = -(x_ccf - 5.40)  # anterio-posterior coordinate (rostro-caudal)\n    ystereo = y_ccf - 0.44  # dorso-ventral coordinate\n    ml = z_ccf - 5.70  # medio-lateral coordinate (left-right)\n\n    # Rotate CCF of 5\u00b0\n    angle = np.deg2rad(5)\n    ap = xstereo * np.cos(angle) - ystereo * np.sin(angle)\n    dv = xstereo * np.sin(angle) + ystereo * np.cos(angle)\n\n    # Squeeze the dorso-ventral axis by 94.34%\n    dv *= 0.9434\n\n    return ap, dv, ml\n
"},{"location":"api-utils.html#histoquant.utils.filter_df_classifications","title":"filter_df_classifications(df, filter_list, mode='keep', col='Classification')","text":"

Filter a DataFrame whether specified col column entries contain elements in filter_list. Case insensitive.

If mode is \"keep\", keep entries only if their col in is in the list (default). If mode is \"remove\", remove entries if their col is in the list.

Parameters:

Name Type Description Default df DataFrame required filter_list list | tuple | str

List of words that should be present to trigger the filter.

required mode keep or remove

Keep or remove entries from the list. Default is \"keep\".

'keep' col str

Key in df. Default is \"Classification\".

'Classification'

Returns:

Type Description DataFrame

Filtered DataFrame.

Source code in histoquant/utils.py
def filter_df_classifications(\n    df: pd.DataFrame, filter_list: list | tuple | str, mode=\"keep\", col=\"Classification\"\n) -> pd.DataFrame:\n    \"\"\"\n    Filter a DataFrame whether specified `col` column entries contain elements in\n    `filter_list`. Case insensitive.\n\n    If `mode` is \"keep\", keep entries only if their `col` in is in the list (default).\n    If `mode` is \"remove\", remove entries if their `col` is in the list.\n\n    Parameters\n    ----------\n    df : pd.DataFrame\n    filter_list : list | tuple | str\n        List of words that should be present to trigger the filter.\n    mode : \"keep\" or \"remove\", optional\n        Keep or remove entries from the list. Default is \"keep\".\n    col : str, optional\n        Key in `df`. Default is \"Classification\".\n\n    Returns\n    -------\n    pd.DataFrame\n        Filtered DataFrame.\n\n    \"\"\"\n    # check input\n    if isinstance(filter_list, str):\n        filter_list = [filter_list]  # make sure it is a list\n\n    if col not in df.columns:\n        # might be because of 'Classification' instead of 'classification'\n        col = col.capitalize()\n        if col not in df.columns:\n            raise KeyError(f\"{col} not in DataFrame.\")\n\n    pattern = \"|\".join(f\".*{s}.*\" for s in filter_list)\n\n    if mode == \"keep\":\n        df_return = df[df[col].str.contains(pattern, case=False, regex=True)]\n    elif mode == \"remove\":\n        df_return = df[~df[col].str.contains(pattern, case=False, regex=True)]\n\n    # check\n    if len(df_return) == 0:\n        raise ValueError(\n            (\n                f\"Filtering '{col}' with {filter_list} resulted in an\"\n                + \" empty DataFrame, check your config file.\"\n            )\n        )\n    return df_return\n
"},{"location":"api-utils.html#histoquant.utils.filter_df_regions","title":"filter_df_regions(df, filter_list, mode='keep', col='Parent')","text":"

Filters entries in df based on wether their col is in filter_list or not.

If mode is \"keep\", keep entries only if their col in is in the list (default). If mode is \"remove\", remove entries if their col is in the list.

Parameters:

Name Type Description Default df DataFrame required filter_list list - like

List of regions to keep or remove from the DataFrame.

required mode keep or remove

Keep or remove entries from the list. Default is \"keep\".

'keep' col str

Key in df. Default is \"Parent\".

'Parent'

Returns:

Name Type Description df DataFrame

Filtered DataFrame.

Source code in histoquant/utils.py
def filter_df_regions(\n    df: pd.DataFrame, filter_list: list | tuple, mode=\"keep\", col=\"Parent\"\n) -> pd.DataFrame:\n    \"\"\"\n    Filters entries in `df` based on wether their `col` is in `filter_list` or not.\n\n    If `mode` is \"keep\", keep entries only if their `col` in is in the list (default).\n    If `mode` is \"remove\", remove entries if their `col` is in the list.\n\n    Parameters\n    ----------\n    df : pandas.DataFrame\n    filter_list : list-like\n        List of regions to keep or remove from the DataFrame.\n    mode : \"keep\" or \"remove\", optional\n        Keep or remove entries from the list. Default is \"keep\".\n    col : str, optional\n        Key in `df`. Default is \"Parent\".\n\n    Returns\n    -------\n    df : pandas.DataFrame\n        Filtered DataFrame.\n\n    \"\"\"\n\n    if mode == \"keep\":\n        return df[df[col].isin(filter_list)]\n    if mode == \"remove\":\n        return df[~df[col].isin(filter_list)]\n
"},{"location":"api-utils.html#histoquant.utils.get_blacklist","title":"get_blacklist(file, atlas)","text":"

Build a list of regions to exclude from file.

File must be a TOML with [WITH_CHILDS] and [EXACT] sections.

Parameters:

Name Type Description Default file str

Full path the atlas_blacklist.toml file.

required atlas BrainGlobeAtlas

Atlas to extract regions from.

required

Returns:

Name Type Description black_list list

Full list of acronyms to discard.

Source code in histoquant/utils.py
def get_blacklist(file: str, atlas: BrainGlobeAtlas) -> list:\n    \"\"\"\n    Build a list of regions to exclude from file.\n\n    File must be a TOML with [WITH_CHILDS] and [EXACT] sections.\n\n    Parameters\n    ----------\n    file : str\n        Full path the atlas_blacklist.toml file.\n    atlas : BrainGlobeAtlas\n        Atlas to extract regions from.\n\n    Returns\n    -------\n    black_list : list\n        Full list of acronyms to discard.\n\n    \"\"\"\n    with open(file, \"rb\") as fid:\n        content = tomllib.load(fid)\n\n    blacklist = []  # init. the list\n\n    # add regions and their descendants\n    for region in content[\"WITH_CHILDS\"][\"members\"]:\n        blacklist.extend(\n            [\n                atlas.structures[id][\"acronym\"]\n                for id in atlas.structures.tree.expand_tree(\n                    atlas.structures[region][\"id\"]\n                )\n            ]\n        )\n\n    # add regions specified exactly (no descendants)\n    blacklist.extend(content[\"EXACT\"][\"members\"])\n\n    return blacklist\n
"},{"location":"api-utils.html#histoquant.utils.get_data_coverage","title":"get_data_coverage(df, col='Atlas_AP', by='animal')","text":"

Get min and max in col for each by.

Used to get data coverage for each animal to plot in distributions.

Parameters:

Name Type Description Default df DataFrame

description

required col str

Key in df, default is \"Atlas_X\".

'Atlas_AP' by str

Key in df , default is \"animal\".

'animal'

Returns:

Type Description DataFrame

min and max of col for each by, named \"X_min\", and \"X_max\".

Source code in histoquant/utils.py
def get_data_coverage(df: pd.DataFrame, col=\"Atlas_AP\", by=\"animal\") -> pd.DataFrame:\n    \"\"\"\n    Get min and max in `col` for each `by`.\n\n    Used to get data coverage for each animal to plot in distributions.\n\n    Parameters\n    ----------\n    df : pd.DataFrame\n        _description_\n    col : str, optional\n        Key in `df`, default is \"Atlas_X\".\n    by : str, optional\n        Key in `df` , default is \"animal\".\n\n    Returns\n    -------\n    pd.DataFrame\n        min and max of `col` for each `by`, named \"X_min\", and \"X_max\".\n\n    \"\"\"\n    df_group = df.groupby([by])\n    return pd.DataFrame(\n        [\n            df_group[col].min(),\n            df_group[col].max(),\n        ],\n        index=[\"X_min\", \"X_max\"],\n    )\n
"},{"location":"api-utils.html#histoquant.utils.get_df_kind","title":"get_df_kind(df)","text":"

Get DataFrame kind, eg. Annotations or Detections.

It is based on reading the Object Type of the first entry, so the DataFrame must have only one kind of object.

Parameters:

Name Type Description Default df DataFrame required

Returns:

Name Type Description kind str

\"detection\" or \"annotation\".

Source code in histoquant/utils.py
def get_df_kind(df: pd.DataFrame) -> str:\n    \"\"\"\n    Get DataFrame kind, eg. Annotations or Detections.\n\n    It is based on reading the Object Type of the first entry, so the DataFrame must\n    have only one kind of object.\n\n    Parameters\n    ----------\n    df : pandas.DataFrame\n\n    Returns\n    -------\n    kind : str\n        \"detection\" or \"annotation\".\n\n    \"\"\"\n    return df[\"Object type\"].iloc[0].lower()\n
"},{"location":"api-utils.html#histoquant.utils.get_injection_site","title":"get_injection_site(animal, info_file, channel, stereo=False)","text":"

Get the injection site coordinates associated with animal.

Parameters:

Name Type Description Default animal str

Animal ID.

required info_file str

Path to TOML info file.

required channel str

Channel ID as in the TOML file.

required stereo bool

Wether to convert coordinates in stereotaxis coordinates. Default is False.

False

Returns:

Type Description x, y, z : floats

Injection site coordinates.

Source code in histoquant/utils.py
def get_injection_site(\n    animal: str, info_file: str, channel: str, stereo: bool = False\n) -> tuple:\n    \"\"\"\n    Get the injection site coordinates associated with animal.\n\n    Parameters\n    ----------\n    animal : str\n        Animal ID.\n    info_file : str\n        Path to TOML info file.\n    channel : str\n        Channel ID as in the TOML file.\n    stereo : bool, optional\n        Wether to convert coordinates in stereotaxis coordinates. Default is False.\n\n    Returns\n    -------\n    x, y, z : floats\n        Injection site coordinates.\n\n    \"\"\"\n    with open(info_file, \"rb\") as fid:\n        info = tomllib.load(fid)\n\n    if channel in info[animal]:\n        x, y, z = info[animal][channel][\"injection_site\"]\n        if stereo:\n            x, y, z = ccf_to_stereo(x, y, z)\n    else:\n        x, y, z = None, None, None\n\n    return x, y, z\n
"},{"location":"api-utils.html#histoquant.utils.get_leaves_list","title":"get_leaves_list(atlas)","text":"

Get the list of leaf brain regions.

Leaf brain regions are defined as regions without childs, eg. regions that are at the bottom of the hiearchy.

Parameters:

Name Type Description Default atlas BrainGlobeAtlas

Atlas to extract regions from.

required

Returns:

Name Type Description leaves_list list

Acronyms of leaf brain regions.

Source code in histoquant/utils.py
def get_leaves_list(atlas: BrainGlobeAtlas) -> list:\n    \"\"\"\n    Get the list of leaf brain regions.\n\n    Leaf brain regions are defined as regions without childs, eg. regions that are at\n    the bottom of the hiearchy.\n\n    Parameters\n    ----------\n    atlas : BrainGlobeAtlas\n        Atlas to extract regions from.\n\n    Returns\n    -------\n    leaves_list : list\n        Acronyms of leaf brain regions.\n\n    \"\"\"\n    leaves_list = []\n    for region in atlas.structures_list:\n        if atlas.structures.tree[region[\"id\"]].is_leaf():\n            leaves_list.append(region[\"acronym\"])\n\n    return leaves_list\n
"},{"location":"api-utils.html#histoquant.utils.get_mapping_fusion","title":"get_mapping_fusion(fusion_file)","text":"

Get mapping dictionnary between input brain regions and new regions defined in atlas_fusion.toml file.

The returned dictionnary can be used in DataFrame.replace().

Parameters:

Name Type Description Default fusion_file str

Path to the TOML file with the merging rules.

required

Returns:

Name Type Description m dict

Mapping as {old: new}.

Source code in histoquant/utils.py
def get_mapping_fusion(fusion_file: str) -> dict:\n    \"\"\"\n    Get mapping dictionnary between input brain regions and new regions defined in\n    `atlas_fusion.toml` file.\n\n    The returned dictionnary can be used in DataFrame.replace().\n\n    Parameters\n    ----------\n    fusion_file : str\n        Path to the TOML file with the merging rules.\n\n    Returns\n    -------\n    m : dict\n        Mapping as {old: new}.\n\n    \"\"\"\n    with open(fusion_file, \"rb\") as fid:\n        df = pd.DataFrame.from_dict(tomllib.load(fid), orient=\"index\").set_index(\n            \"acronym\"\n        )\n\n    return (\n        df.drop(columns=\"name\")[\"members\"]\n        .explode()\n        .reset_index()\n        .set_index(\"members\")\n        .to_dict()[\"acronym\"]\n    )\n
"},{"location":"api-utils.html#histoquant.utils.get_starter_cells","title":"get_starter_cells(animal, channel, info_file)","text":"

Get the number of starter cells associated with animal.

Parameters:

Name Type Description Default animal str

Animal ID.

required channel str

Channel ID.

required info_file str

Path to TOML info file.

required

Returns:

Name Type Description n_starters int

Number of starter cells.

Source code in histoquant/utils.py
def get_starter_cells(animal: str, channel: str, info_file: str) -> int:\n    \"\"\"\n    Get the number of starter cells associated with animal.\n\n    Parameters\n    ----------\n    animal : str\n        Animal ID.\n    channel : str\n        Channel ID.\n    info_file : str\n        Path to TOML info file.\n\n    Returns\n    -------\n    n_starters : int\n        Number of starter cells.\n\n    \"\"\"\n    with open(info_file, \"rb\") as fid:\n        info = tomllib.load(fid)\n\n    return info[animal][channel][\"starter_cells\"]\n
"},{"location":"api-utils.html#histoquant.utils.merge_regions","title":"merge_regions(df, col, fusion_file)","text":"

Merge brain regions following rules in the fusion_file.toml file.

Apply this merging on col of the input DataFrame. col whose value is found in the members sections in the file will be changed to the new acronym.

Parameters:

Name Type Description Default df DataFrame required col str

Column of df on which to apply the mapping.

required fusion_file str

Path to the toml file with the merging rules.

required

Returns:

Name Type Description df DataFrame

Same DataFrame with regions renamed.

Source code in histoquant/utils.py
def merge_regions(df: pd.DataFrame, col: str, fusion_file: str) -> pd.DataFrame:\n    \"\"\"\n    Merge brain regions following rules in the `fusion_file.toml` file.\n\n    Apply this merging on `col` of the input DataFrame. `col` whose value is found in\n    the `members` sections in the file will be changed to the new acronym.\n\n    Parameters\n    ----------\n    df : pandas.DataFrame\n    col : str\n        Column of `df` on which to apply the mapping.\n    fusion_file : str\n        Path to the toml file with the merging rules.\n\n    Returns\n    -------\n    df : pandas.DataFrame\n        Same DataFrame with regions renamed.\n\n    \"\"\"\n    df[col] = df[col].replace(get_mapping_fusion(fusion_file))\n\n    return df\n
"},{"location":"api-utils.html#histoquant.utils.renormalize_per_key","title":"renormalize_per_key(df, by, on)","text":"

Renormalize on column by its sum for each by.

Use case : relative density is computed for both hemispheres, so if one wants to plot only one hemisphere, the sum of the bars corresponding to one channel (by) should be 1. So :

df = df[df[\"hemisphere\"] == \"Ipsi.\"] df = renormalize_per_key(df, \"channel\", \"relative density\") Then, the sum of \"relative density\" for each \"channel\" equals 1.

Parameters:

Name Type Description Default df DataFrame required by str

Key in df. df is normalized for each by.

required on str

Key in df. Measurement to be normalized.

required

Returns:

Name Type Description df DataFrame

Same DataFrame with normalized on column.

Source code in histoquant/utils.py
def renormalize_per_key(df: pd.DataFrame, by: str, on: str):\n    \"\"\"\n    Renormalize `on` column by its sum for each `by`.\n\n    Use case : relative density is computed for both hemispheres, so if one wants to\n    plot only one hemisphere, the sum of the bars corresponding to one channel (`by`)\n    should be 1. So :\n    >>> df = df[df[\"hemisphere\"] == \"Ipsi.\"]\n    >>> df = renormalize_per_key(df, \"channel\", \"relative density\")\n    Then, the sum of \"relative density\" for each \"channel\" equals 1.\n\n    Parameters\n    ----------\n    df : pd.DataFrame\n    by : str\n        Key in `df`. `df` is normalized for each `by`.\n    on : str\n        Key in `df`. Measurement to be normalized.\n\n    Returns\n    -------\n    df : pd.DataFrame\n        Same DataFrame with normalized `on` column.\n\n    \"\"\"\n    norm = df.groupby(by)[on].sum()\n    bys = df[by].unique()\n    for key in bys:\n        df.loc[df[by] == key, on] = df.loc[df[by] == key, on].divide(norm[key])\n\n    return df\n
"},{"location":"api-utils.html#histoquant.utils.select_hemisphere_channel","title":"select_hemisphere_channel(df, hue, hue_filter, hue_mirror)","text":"

Select relevant data given hue and filters.

Returns the DataFrame with only things to be used.

Parameters:

Name Type Description Default df DataFrame

DataFrame to filter.

required hue (hemisphere, channel)

hue that will be used in seaborn plots.

\"hemisphere\" hue_filter str

Selected data.

required hue_mirror bool

Instead of keeping only hue_filter values, they will be plotted in mirror.

required

Returns:

Name Type Description dfplt DataFrame

DataFrame to be used in plots.

Source code in histoquant/utils.py
def select_hemisphere_channel(\n    df: pd.DataFrame, hue: str, hue_filter: str, hue_mirror: bool\n) -> pd.DataFrame:\n    \"\"\"\n    Select relevant data given hue and filters.\n\n    Returns the DataFrame with only things to be used.\n\n    Parameters\n    ----------\n    df : pd.DataFrame\n        DataFrame to filter.\n    hue : {\"hemisphere\", \"channel\"}\n        hue that will be used in seaborn plots.\n    hue_filter : str\n        Selected data.\n    hue_mirror : bool\n        Instead of keeping only hue_filter values, they will be plotted in mirror.\n\n    Returns\n    -------\n    dfplt : pd.DataFrame\n        DataFrame to be used in plots.\n\n    \"\"\"\n    dfplt = df.copy()\n\n    if hue == \"hemisphere\":\n        # hue_filter is used to select channels\n        # keep only left and right hemispheres, not \"both\"\n        dfplt = dfplt[dfplt[\"hemisphere\"] != \"both\"]\n        if hue_filter == \"all\":\n            hue_filter = dfplt[\"channel\"].unique()\n        elif not isinstance(hue_filter, (list, tuple)):\n            # it is allowed to select several channels so handle lists\n            hue_filter = [hue_filter]\n        dfplt = dfplt[dfplt[\"channel\"].isin(hue_filter)]\n    elif hue == \"channel\":\n        # hue_filter is used to select hemispheres\n        # it can only be left, right, both or empty\n        if hue_filter == \"both\":\n            # handle if it's a coordinates DataFrame which doesn't have \"both\"\n            if \"both\" not in dfplt[\"hemisphere\"].unique():\n                # keep both hemispheres, don't do anything\n                pass\n            else:\n                if hue_mirror:\n                    # we need to keep both hemispheres to plot them in mirror\n                    dfplt = dfplt[dfplt[\"hemisphere\"] != \"both\"]\n                else:\n                    # we keep the metrics computed in both hemispheres\n                    dfplt = dfplt[dfplt[\"hemisphere\"] == \"both\"]\n        else:\n            # hue_filter should correspond to an hemisphere name\n            dfplt = dfplt[dfplt[\"hemisphere\"] == hue_filter]\n    else:\n        # not handled. Just return the DataFrame without filtering, maybe it'll make\n        # sense.\n        warnings.warn(f\"{hue} should be 'channel' or 'hemisphere'.\")\n\n    # check result\n    if len(dfplt) == 0:\n        warnings.warn(\n            f\"hue={hue} and hue_filter={hue_filter} resulted in an empty subset.\"\n        )\n\n    return dfplt\n
"},{"location":"guide-create-pyramids.html","title":"Create pyramidal OME-TIFF","text":"

This page will guide you to use the create_pyramids script, in the event the CZI file does not work directly in QuPath. The script will generate pyramids from OME-TIFF files exported from ZEN.

Tip

The create_pyramids.py script can also pyramidalize images using Python only with the --no-use-qupath option, but I find it slower and less reliable.

This Python script uses QuPath under the hood, via a companion script called createPyramids.groovy. It will find the OME-TIFF files and make QuPath run the groovy script on it, in console mode (without graphical user interface).

This script is standalone, eg. it does not rely on the histoquant package. But installing the later makes sure all dependencies are installed (namely typer and tqdm with the QuPath backend and quite a few more for the Python backend).

"},{"location":"guide-create-pyramids.html#installation","title":"Installation","text":"

You will need a virtual environment with the required dependencies.

Follow those instructions to install miniconda3 if you didn't already.

Then, install the required dependencies.

RecommendedMinimal

Install the histoquant package by following those instructions.

Alternatively, if you don't plan to use the histoquant package, you can create a minimal conda environment with only the libraries required for create_pyramids.py. With QuPath backend

conda create -n hq python=3.12\nconda activate hq\npip install typer tqdm\n
With Python backend
conda create -n hq python=3.12\nconda activate hq\npip install typer tqdm numpy tifffile scikit-image\n

"},{"location":"guide-create-pyramids.html#export-czi-to-ome-tiff","title":"Export CZI to OME-TIFF","text":"

OME-TIFF is a specification of the TIFF image format. It specifies how the metadata should be written to the file to be interoperable between softwares. ZEN can export to OME-TIFF so you don't need to pay attention to metadata. Therefore, you won't need to specify pixel size and channels names and colors as it will be read directly from the OME-TIFF files.

  1. Open your CZI file in ZEN.
  2. Open the \"Processing tab\" on the left panel.
  3. Under method, choose Export/Import > OME TIFF-Export.
  4. In Parameters, make sure to tick the \"Show all\" tiny box on the right.
  5. The following parameters should be used (checked), the other should be unchecked :
    • Use Tiles
    • Original data \"Convert to 8 Bit\" should be UNCHECKED
    • OME-XML Scheme : 2016-06
    • Use full set of dimensions (unless you want to select slices and/or channels)
  6. In Input, choose your file
  7. Go back to Parameters to choose the output directory and file prefix. \"_s1\", \"_s2\"... will be appended to the prefix.
  8. Back on the top, click the \"Apply\" button.

The OME-TIFF files should be ready to be pyramidalized with the create_pyramids.py script.

"},{"location":"guide-create-pyramids.html#usage","title":"Usage","text":"

The script is located under scripts/pyramids. Copy the two files (.py and .groovy) elsewhere on your computer.

To use the QuPath backend (recommended), you need to set its path in the script. To do so, open the create_pyramids.py file with a text editor (Notepad or vscode to get nice syntax coloring). Locate the QUPATH_PATH line :

QUPATH_PATH: str = (\n    \"C:/Users/glegoc/AppData/Local/QuPath-0.5.1/QuPath-0.5.1 (console).exe\"\n)\n\"\"\"Full path to the QuPath (console) executable.\"\"\"\n

Info

The AppData directory is hidden by default. In the file explorer, you can go to the \"View\" tab and check \"Hidden items\" under \"Show/hide\".

And replace the path to the \"QuPath-0.X.Y (console).exe\" executable. QuPath should be installed in C:\\Users\\USERNAME\\AppData\\Local\\QuPath-0.X.Y\\ by default. Save the file. Then run the script on your images :

  1. Open a terminal (PowerShell) so that it can find the create_pyramids.py script, by either :
    • open PowerShell from the start menu, then browse to the location of your script:
      cd /path/to/your/scripts\n
    • From the file explorer, browse to where the script is and in an empty space, Shift+Right Button to \"Open PowerShell window here\"
  2. Activate the virtual environment :
    conda activate hq\n
  3. Copy the path to your OME-TIFF images (for example \"D:\\Data\\Histo\\NiceMouseName\\NiceMouseName-tiff\\\")
  4. In the terminal, run the script on your images :
    python create_pyramids.py \"D:\\Data\\Histo\\NiceMouseName\\NiceMouseName-tiff\\\"\n

Warning

Make sure to use double quotes when specifying the path (\"D:\\some\\path\"), because if there are whitespaces in it, each whitespace-separated bits will be parsed as several arguments for the script.

Tip

create_pyramids.py can behave like a command line interface. In the event you would need to modify the default values used in the script (tile size and the like), you can either edit the script or, preferably, use options when calling the script like so :

python create_pyramids.py --OPTION VALUE /path/to/images\n
Learn more by asking for help :
python create_pyramids.py --help\n

Upon completion, this will create a subdirectory \"pyramidal\" next to your OME-TIFF files where you will find the pyramidal images ready to be used in QuPath and ABBA. You can safely delete the original OME-TIFF exported from ZEN.

You can check the API documentation for this script here.

"},{"location":"guide-install-abba.html","title":"Install ABBA","text":"

You can head to the ABBA documentation for installation instructions. You'll see that a Windows installer is available. While it might be working great, I prefer to do it manually step-by-step to make sure everything is going well.

You will find below installation instructions for the regular ABBA Fiji plugin, which proposes only the mouse and rat brain atlases. To be able to use the Brainglobe atlases, you will need the Python version. The two can be installed alongside each other.

"},{"location":"guide-install-abba.html#abba-fiji","title":"ABBA Fiji","text":""},{"location":"guide-install-abba.html#install-fiji","title":"Install Fiji","text":"

Install the \"batteries-included\" distribution of ImageJ, Fiji, from the official website.

Warning

Extract Fiji somewhere you have write access, otherwise Fiji will not be able to download and install plugins. In other words, put the folder in your User directory and not in C:\\, C:\\Program Files and the like.

  1. Download the zip archive and extract it somewhere relevant.
  2. Launch ImageJ.exe.
"},{"location":"guide-install-abba.html#install-the-abba-plugin","title":"Install the ABBA plugin","text":"

We need to add the PTBIOP update site, managed by the bio-imaging and optics facility at EPFL, that contains the ABBA plugin.

  1. In Fiji, head to Help > Update...
  2. In the ImageJ updater window, click on Manage Update Sites. Look up PTBIOP, and click on the check box. Apply and Close, and Apply Changes. This will download and install the required plugins. Restart ImageJ as suggested.
  3. In Fiji, head to Plugins > BIOP > Atlas > ABBA - ABBA start, or simply type abba start in the search box. Choose the \"Adult Mouse Brain - Allen Brain Atlas V3p1\". It will download this atlas and might take a while, depending on your Internet connection.
"},{"location":"guide-install-abba.html#install-the-automatic-registration-tools","title":"Install the automatic registration tools","text":"

ABBA can leverage the elastix toolbox for automatic 2D in-plane registration.

  1. You need to download it here, which will redirect you to the Github releases page (5.2.0 should work).
  2. Download the zip archive and extract it somewhere relevant.
  3. In Fiji, in the search box, type \"set and check\" and launch the \"Set and Check Wrappers\" command. Set the paths to \"elastix.exe\" and \"transformix.exe\" you just downloaded.

ABBA should be installed and functional ! You can check the official documentation for usage instructions and some tips here.

"},{"location":"guide-install-abba.html#abba-python","title":"ABBA Python","text":"

Brainglobe is an initiative aiming at providing interoperable, model-agnostic Python-based tools for neuroanatomy. They package various published volumetric anatomical atlases of different species (check the list), including the Allen Mouse brain atlas (CCFv3, ref.) and a 3D version of the Allen mouse spinal cord atlas (ref).

To be able to leverage those atlases, we need to make ImageJ and Python be able to talk to each other. This is the purpose of abba_python, that will install ImageJ and its ABBA plugins inside a python environment, with bindings between the two worlds.

"},{"location":"guide-install-abba.html#install-conda","title":"Install conda","text":"

If not done already, follow those instructions to install miniconda3.

"},{"location":"guide-install-abba.html#install-abba_python-in-a-virtual-environment","title":"Install abba_python in a virtual environment","text":"
  1. Open a terminal (PowerShell).
  2. Create a virtual environment with Python 3.10, OpenJDK and PyImageJ :
    conda create -c conda-forge -n abba_python python=3.10 openjdk=11 maven pyimagej notebook\n
  3. Install the latest functional version of abba_python with pip :
    pip install abba-python==0.9.6.dev0\n
  4. Restart the terminal and activate the new environment :
    conda activate abba_python\n
  5. Download the Brainglobe atlas you want (eg. Allen mouse spinal cord) :
    brainglobe install -a allen_cord_20um\n
  6. Launch an interactive Python shell :
    ipython\n
    You should see the IPython prompt, that looks like this :
    In [1]:\n
  7. Import abba_python and launch ImageJ from Python :
    from abba_python import abba\nabba.start_imagej()\n
    The first launch needs to initialize ImageJ and install all required plugins, which takes a while (>5min).
  8. Use ABBA as the regular Fiji version ! The main difference is that the dropdown menu to select which atlas to use is populated with the Brainglobe atlases.

Tip

Afterwards, to launch ImageJ from Python and do some registration work, you just need to launch a terminal (PowerShell), and do steps 4., 6., and 7.

"},{"location":"guide-install-abba.html#install-the-automatic-registration-tools_1","title":"Install the automatic registration tools","text":"

You can follow the same instructions as the regular Fiji version. You can do it from either the \"normal\" Fiji or the ImageJ instance launched from Python, they share the same configuration files. Therefore, if you already did it in regular Fiji, elastix should already be set up and ready to use in ImageJ from Python.

"},{"location":"guide-install-abba.html#troubleshooting","title":"Troubleshooting","text":""},{"location":"guide-install-abba.html#java_home-errors","title":"JAVA_HOME errors","text":"

Unfortunately on some computers, Python does not find the Java virtual machine even though it should have been installed when installing OpenJDK with conda. This will result in an error mentionning \"java.dll\" and suggesting to check the JAVA_HOME environment variable.

The only fix I could find is to install Java system-wide. You can grab a (free) installer on Adoptium, choosing JRE 17.X for your platform. During the installation :

  • choose to install \"just for you\",
  • enable \"Modify PATH variable\" as well as \"Set or override JAVA_HOME\" variable.

Restart the terminal and try again. Now, ImageJ should use the system-wide Java and it should work.

"},{"location":"guide-install-abba.html#abba-qupath-extension","title":"ABBA QuPath extension","text":"

To import registered regions in your QuPath project and be able to convert objects' coordinates in atlas space, the ABBA QuPath extension is required.

  1. In QuPath, head to Edit > Preferences. In the Extension tab, set your QuPath user directory to a local directory (usually C:\\Users\\USERNAME\\QuPath\\v0.X.Y).
  2. Create a folder named extensions in your QuPath user directory.
  3. Download the latest ABBA extension for QuPath from GitHub (choose the file qupath-extension-abba-x.y.z.zip).
  4. Uncompress the archive and copy all .jar files into the extensions folder in your QuPath user directory.
  5. Restart QuPath. Now, in Extensions, you should have an ABBA entry.
"},{"location":"guide-pipeline.html","title":"Pipeline","text":"

While you can use QuPath and histoquant functionalities as you see fit, there exists a pipeline version of those. It requires a specific structure to store files (so that the different scripts know where to look for data). It also requires that you have detections stored as geojson files, which can be achieved using a pixel classifier and further segmentation (see here) for example.

"},{"location":"guide-pipeline.html#purpose","title":"Purpose","text":"

This is especially useful to perform quantification for several animals at once, where you'll only need to specify the root directory and the animals identifiers that should be pooled together, instead of having to manually specify each detections and annotations files.

Three main scripts and function are used within the pipeline :

  • exportPixelClassifierProbabilities.groovy to create prediction maps of objects of interest
  • segment_image.py to segment those maps and create geojson files to be imported back to QuPath as detections
  • pipelineImportExport.groovy to :
    • clear all objects
    • import ABBA regions
    • mirror regions names
    • import geojson detections (from $folderPrefix$segmentation/$segTag$/geojson)
    • add measurements to detections
    • add atlas coordinates to detections
    • add hemisphere to detections' parents
    • add regions measurements
      • count for punctal objects
      • cumulated length for lines objects
    • export detections measurements
      • as CSV for punctual objects
      • as JSON for lines
    • export annotations as CSV
"},{"location":"guide-pipeline.html#directory-structure","title":"Directory structure","text":"

Following a specific directory structure ensures subsequent scripts and functions can find required files. The good news is that this structure will mostly be created automatically using the segmentation scripts (from QuPath and Python), as long as you stay consistent filling the parameters of each script. The structure expected by the groovy all-in-one script and histoquant batch-process function is the following :

some_directory/\n    \u251c\u2500\u2500AnimalID0/  \n    \u2502   \u251c\u2500\u2500 animalid0_qupath/\n    \u2502   \u2514\u2500\u2500 animalid0_segmentation/  \n    \u2502       \u2514\u2500\u2500 segtag/  \n    \u2502           \u251c\u2500\u2500 annotations/  \n    \u2502           \u251c\u2500\u2500 detections/  \n    \u2502           \u251c\u2500\u2500 geojson/  \n    \u2502           \u2514\u2500\u2500 probabilities/  \n    \u251c\u2500\u2500AnimalID1/  \n    \u2502   \u251c\u2500\u2500 animalid1_qupath/\n    \u2502   \u2514\u2500\u2500 animalid1_segmentation/  \n    \u2502       \u2514\u2500\u2500 segtag/  \n    \u2502           \u251c\u2500\u2500 annotations/  \n    \u2502           \u251c\u2500\u2500 detections/  \n    \u2502           \u251c\u2500\u2500 geojson/  \n    \u2502           \u2514\u2500\u2500 probabilities/  \n

Info

Except the root directory and the QuPath project, the rest is automatically created based on the parameters provided in the different scripts. Here's the description of the structure and the requirements :

  • animalid0 should be a convenient animal identifier.
  • The hierarchy must be followed.
  • The experiment root directory, AnimalID0, can be anything but should correspond to one and only one animal.
  • Subsequent animalid0 should be lower case.
  • animalid0_qupath can be named as you wish in practice, but should be the QuPath project.
  • animalid0_segmentation should be called exactly like this -- replacing animalid0 with the actual animal ID. It will be created automatically with the exportPixelClassifierProbabilities.groovy script.
  • segtag corresponds to the type of segmentation (cells, fibers...). It is specified in the exportPixelClassifierProbabilities script. It could be anything, but to recognize if the objects are polygons (and should be counted per regions) or polylines (and the cumulated length should be measured), there are some hardcoded keywords in the segment_images.py and pipelineImportExport.groovy scripts :
    • Cells-like when you need measurements related to its shape (area, circularity...) : cells, cell, polygons, polygon
    • Cells-like when you consider them as punctual : synapto, synaptophysin, syngfp, boutons, points
    • Fibers-like (polylines) : fibers, fiber, axons, axon
  • annotations contains the atlas regions measurements as TSV files.
  • detections contains the objects atlas coordinates and measurements as CSV files (for punctal objects) or JSON (for polylines objects).
  • geojson contains objects stored as geojson files. They could be generated with the pixel classifier prediction map segmentation.
  • probabilities contains the prediction maps to be segmented by the segment_images.py script.

Tip

You can see an example minimal directory structure with only annotations stored in resources/multi.

"},{"location":"guide-pipeline.html#usage","title":"Usage","text":"

Tip

Remember that this is merely an example pipeline, you can shortcut it at any points, as long as you end up with TSV files following the requirements for histoquant.

  1. Create a QuPath project.
  2. Register your images on an atlas with ABBA and export the registration back to QuPath.
  3. Use a pixel classifier and export the prediction maps with the exportPixelClassifierProbabilities.groovy script. You need to get a pixel classifier or create one.
  4. Segment those maps with the segment_images.py script to generate the geojson files containing the objects of interest.
  5. Run the pipelineImportExport.groovy script on your QuPath project.
  6. Set up your configuration files.
  7. Then, analysing your data with any number of animals should be as easy as executing those lines in Python (either from IPython directly or in a script to easily run it later) :
import histoquant as hq\n\n# Parameters\nwdir = \"/path/to/some_directory\"\nanimals = [\"AnimalID0\", \"AnimalID1\"]\nconfig_file = \"/path/to/your/config.toml\"\noutput_format = \"h5\"  # to save the quantification values as hdf5 file\n\n# Processing\ncfg = hq.Config(config_file)\ndf_regions, dfs_distributions, df_coordinates = hq.process.process_animals(\n    wdir, animals, cfg, out_fmt=output_format\n)\n\n# Display\nhq.display.plot_regions(df_regions, cfg)\nhq.display.plot_1D_distributions(dfs_distributions, cfg, df_coordinates=df_coordinates)\nhq.display.plot_2D_distributions(df_coordinates, cfg)\n

Tip

You can see a live example in this demo notebook.

"},{"location":"guide-prepare-qupath.html","title":"Prepare QuPath data","text":"

histoquant uses some QuPath classifications concepts, make sure to be familiar with them with the official documentation. Notably, we use the concept of primary classification and derived classification : an object classfied as First: second is of classification First and of derived classification second.

"},{"location":"guide-prepare-qupath.html#qupath-requirements","title":"QuPath requirements","text":"

histoquant assumes a specific way of storing regions and objects information in the TSV files exported from QuPath. Note that only one primary classification is supported, but you can have any number of derived classifications.

"},{"location":"guide-prepare-qupath.html#detections","title":"Detections","text":"

Detections are the objects of interest. Their information must respect the following :

  • Atlas coordinates should be in millimetres (mm) and stored as Atlas_X, Atlas_Y, Atlas_Z. They correspond, respectively, to the anterio-posterior (rostro-caudal) axis, the inferio-superior (dorso-ventral) axis and the left-right (medio-lateral) axis.
  • They must have a derived classification, in the form Primary: second. Primary would be an object type (cells, fibers, ...), the second one would be a biological marker or a detection channel (fluorescence channel name), for instance : Cells: some marker, or Fibers: EGFP.
  • The classification must match exactly the corresponding measurement in the annotations (see below).
"},{"location":"guide-prepare-qupath.html#annotations","title":"Annotations","text":"

Annotations correspond to the atlas regions. Their information must respect the following :

  • They should be imported with the ABBA extension as acronyms and splitting left/right. Therefore, the annotation name should be the region acronym and its classification should be formatted as Hemisphere: acronym (for ex. Left: PAG).
  • Measurements names should be formatted as : Primary classification: derived classification measurement name. For instance :
    • if one has cells with some marker and count them in each atlas regions, the measurement name would be : Cells: some marker Count.
    • if one segments fibers revealed in the EGFP channel and measures the cumulated length in \u00b5m in each atlas regions, the measurement name would be : Fibers: EGFP Length \u00b5m.
  • Any number of markers or channels are supported.
"},{"location":"guide-prepare-qupath.html#measurements","title":"Measurements","text":""},{"location":"guide-prepare-qupath.html#metrics-supported-by-histoquant","title":"Metrics supported by histoquant","text":"

While you're free to add any measurements as long as they follow the requirements, keep in mind that for atlas regions quantification, histoquant will only compute, pool and average the following metrics :

  • the base measurement itself
    • if \"\u00b5m\" is contained in the measurement name, it will also be converted to mm (\\(\\div\\)1000)
  • the base measurement divided by the region area in \u00b5m\u00b2 (density in something/\u00b5m\u00b2)
  • the base measurement divided by the region area in mm\u00b2 (density in something/mm\u00b2)
  • the squared base measurement divided by the region area in \u00b5m\u00b2 (could be an index, in weird units...)
  • the relative base measurement : the base measurement divided by the total base measurement across all regions in each hemisphere
  • the relative density : density divided by total density across all regions in each hemisphere

It is then up to you to select which metrics among those to compute and display and name them, via the configuration file.

For punctal detections (eg. objects whose only the centroid is considered), only the atlas coordinates are used, to compute and display spatial distributions of objects across the brain (using their classifications to give each distributions different hues). For fibers-like objects, it requires to export the lines detections atlas coordinates as JSON files, with the exportFibersAtlasCoordinates.groovy script (this is done automatically when using the pipeline).

"},{"location":"guide-prepare-qupath.html#adding-measurements","title":"Adding measurements","text":""},{"location":"guide-prepare-qupath.html#count-for-cell-like-objects","title":"Count for cell-like objects","text":"

The groovy script under scripts/qupath-utils/measurements/addRegionsCount.groovy will add a properly formatted count of objects of selected classifications in all atlas regions. This is used for punctual objects (polygons or points), for example objects created in QuPath or with the segmentation script.

"},{"location":"guide-prepare-qupath.html#cumulated-length-for-fibers-like-objects","title":"Cumulated length for fibers-like objects","text":"

The groovy script under scripts/qupath-utils/measurements/addRegionsLength.groovy will add the properly formatted cumulated lenghth in microns of fibers-like objects in all atlas regions. This is used for polylines objects, for example generated with the segmentation script.

"},{"location":"guide-prepare-qupath.html#custom-measurements","title":"Custom measurements","text":"

Keeping in mind histoquant limitations, you can add any measurements you'd like.

For example, you can run a pixel classifier in all annotations (eg. atlas regions). Using the Measure button, it will add a measurement of the area covered by classified pixels. Then, you can use the script located under scripts/qupath-utils/measurements/renameMeasurements.groovy to rename the generated measurements with a properly-formatted name. Finally, you can export regions measurements.

Since histoquant will compute a \"density\", eg. the measurement divided by the region area, in this case, it will correspond to the fraction of surface occupied by classified pixels. This is showcased in the Examples.

"},{"location":"guide-prepare-qupath.html#qupath-export","title":"QuPath export","text":"

Once you imported atlas regions registered with ABBA, detected objects in your images and added properly formatted measurements to detections and annotations, you can :

  • Head to Measure > Export measurements
  • Select relevant images
  • Choose the Output file (specify in the file name if it is a detections or annotations file)
  • Chose either Detections or Annoations in Export type
  • Click Export

Do this for both Detections and Annotations, you can then use those files with histoquant (see the Examples).

"},{"location":"guide-qupath-objects.html","title":"Detect objects with QuPath","text":"

The QuPath documentation is quite extensive, detailed, very well explained and contains full guides on how to create a QuPath project and how to find objects of interests. It is therefore a highly recommended read, nevertheless, you will find below some quick reminders.

"},{"location":"guide-qupath-objects.html#qupath-project","title":"QuPath project","text":"

QuPath works with projects. It is basically a folder with a main project.qproj file, which is a JSON file that contains all the data about your images except the images themselves. Algonside, there is a data folder with an entry for each image, that stores the thumbnails, metadata about the image and detections and annotations but, again, not the image itself. The actual images can be stored anywhere (including a remote server), the QuPath project merely contains the information needed to fetch them and display them. QuPath will never modify your image data.

This design makes the QuPath project itself lightweight (should never exceed 500MB even with millions of detections), and portable : upon opening, if QuPath is not able to find the images where they should be, it will ask for their new locations.

Tip

It is recommended to create the QuPath project locally on your computer, to avoid any risk of conflicts if two people open it at the same time. Nevertheless, you should backup the project regularly on a remote server.

To create a new project, simply drag & drop an empty folder into QuPath window and accept to create a new empty project. Then, add images :

  • If you have a single file, just drag & drop it in the main window.
  • If you have several images, in the left panel, click Add images, then Choose files on the bottom. Drag & drop does not really work as the images will not be sorted properly.

Then, choose the following options :

Image server

Default (let QuPath decide)

Set image type

Most likely, fluorescence

Rotate image

No rotation (unless all your images should be rotated)

Optional args

Leave empty

Auto-generate pyramids

Uncheck

Import objects

Uncheck

Show image selector

Might be useful to check if the images are read correctly (mostly for CZI files).

"},{"location":"guide-qupath-objects.html#detect-objects","title":"Detect objects","text":""},{"location":"guide-qupath-objects.html#built-in-cell-detection","title":"Built-in cell detection","text":"

QuPath has a built-in cell detection feature, available in Analyze > Cell detection. You hava a full tutorial in the official documentation.

Briefly, this uses a watershed algorithm to find bright spots and can perform a cell expansion to estimate the full cell shape based on the detected nuclei. Therefore, this works best to segment nuclei but one can expect good performance for cells as well, depending on the imaging and staining conditions.

Tip

In scripts/qupath-utils/segmentation, there is watershedDetectionFilters.groovy which uses this feature from a script. It further allows you to filter out detected cells based on shape measurements as well as fluorescence itensity in several channels and cell compartments.

"},{"location":"guide-qupath-objects.html#pixel-classifier","title":"Pixel classifier","text":"

Another very powerful and versatile way to segment cells if through machine learning. Note the term \"machine\" and not \"deep\" as it relies on statistics theory from the 1980s. QuPath provides an user-friendly interface to that, similar to what ilastik provides.

The general idea is to train a model to classify every pixel as a signal or as background. You can find good resources on how to procede in the official documentation and some additionnal tips and tutorials on Michael Neslon's blog (here and here).

Specifically, you will manually annotate some pixels of objects of interest and background. Then, you will apply some image processing filters (gaussian blur, laplacian...) to reveal specific features in your images (shapes, textures...). Finally, the pixel classifier will fit a model on those pixel values, so that it will be able to predict if a pixel, given the values with the different filters you applied, belongs to an object of interest or to the background.

This is done in an intuitive GUI with live predictions to get an instant feedback on the effects of the filters and manual annotations.

"},{"location":"guide-qupath-objects.html#train-a-model","title":"Train a model","text":"

First and foremost, you should use a QuPath project dedicated to the training of a pixel classifier, as it is the only way to be able to edit it later on.

  1. You should choose some images from different animals, with different imaging conditions (staining efficiency and LED intensity) in different regions (eg. with different objects' shape, size, sparsity...). The goal is to get the most diversity of objects you could encounter in your experiments. 10 images is more than enough !
  2. Import those images to the new, dedicated QuPath project.
  3. Create the classifications you'll need, \"Cells: marker+\" for example. The \"Ignore*\" classification is used for the background.
  4. Head to Classify > Pixel classification > Train pixel classifier, and turn on Live prediction.
  5. Load all your images in Load training.
  6. In Advanced settings, check Reweight samples to help make sure a classification is not over-represented.
  7. Modify the different parameters :
    • Classifier : typically, RTrees or ANN_MLP. This can be changed dynamically afterwards to see which works best for you.
    • Resolution : this is the pixel size used. This is a trade-off between accuracy and speed. If your objects are only composed of a few pixels, you'll the full resolution, for big objects reducing the resolution will be faster.
    • Features : this is the core of the process -- where you choose the filters. In Edit, you'll need to choose :
      • The fluorescence channels
      • The scales, eg. the size of the filters applied to the image. The bigger, the coarser the filter is. Again, this will depend on the size of the objects you want to segment.
      • The features themselves, eg. the filters applied to your images before feeding the pixel values to the model. For starters, you can select them all to see what they look like.
    • Output :
      • Classification : QuPath will directly classify the pixels. Use that to create objects directly from the pixel classifier within QuPath.
      • Probability : this will output an image where each pixel is its probability to belong to each of the classifications. This is useful to create objects externally.
  8. In the bottom-right corner of the pixel classifier window, you can select to display each filters individually. Then in the QuPath main window, hitting C will switch the view to appreciate what the filter looks like. Identify the ones that makes your objects the most distinct from the background as possible. Switch back to Show classification once you begin to make annotations.
  9. Begin to annotate ! Use the Polyline annotation tool (V) to classify some pixels belonging to an object and some pixels belonging to the background across your images.

    Tip

    You can select the RTrees Classifier, then Edit : check the Calculate variable importance checkbox. Then in the log (Ctrl+Shift+L), you can inspect the weight each features have. This can help discard some filters to keep only the ones most efficient to distinguish the objects of interest.

  10. See in live the effect of your annotations on the classification using C and continue until you're satisfied.

    Important

    This is machine learning. The lesser annotations, the better, as this will make your model more general and adapt to new images. The goal is to find the minimal number of annotations to make it work.

  11. Once you're done, give your classifier a name in the text box in the bottom and save it. It will be stored as a JSON file in the classifiers folder of the QuPath project. This file can be imported in your other QuPath projects.

"},{"location":"guide-qupath-objects.html#built-in-create-objects","title":"Built-in create objects","text":"

Once you imported your model JSON file (Classify > Pixel classification > Load pixel classifier, three-dotted menu and Import from file), you can create objects out of it, measure the surface occupied by classified pixels in each annotation or classify existing detections based on the prediction at their centroid.

In scripts/qupath-utils/segmentation, there is a createDetectionsFromPixelClassifier.groovy script to batch-process your project.

"},{"location":"guide-qupath-objects.html#probability-map-segmentation","title":"Probability map segmentation","text":"

Alternatively, a Python script provided with histoquant can be used to segment the probability map generated by the pixel classifier (the script is located in scripts/segmentation).

You will first need to export those with the exportPixelClassifierProbabilities.groovy script (located in scripts/qupath-utils).

Then the segmentation script can :

  • find punctal objects as polygons (with a shape) or points (punctal) than can be counted.
  • trace fibers with skeletonization to create lines whose lengths can be measured.

Several parameters have to be specified by the user, see the segmentation script API reference. This script will generate GeoJson files that can be imported back to QuPath with the importGeojsonFiles.groovy script.

"},{"location":"guide-qupath-objects.html#third-party-extensions","title":"Third-party extensions","text":"

QuPath being open-source and extensible, there are third-party extensions that implement popular deep learning segmentation algorithms directly in QuPath. They can be used to find objects of interest as detections in the QuPath project and thus integrate nicely with histoquant to quantify them afterwards.

"},{"location":"guide-qupath-objects.html#instanseg","title":"InstanSeg","text":"

QuPath extension : https://github.com/qupath/qupath-extension-instanseg Original repository : https://github.com/instanseg/instanseg Reference papers : doi:10.48550/arXiv.2408.15954, doi:10.1101/2024.09.04.611150

"},{"location":"guide-qupath-objects.html#stardist","title":"Stardist","text":"

QuPath extension : https://github.com/qupath/qupath-extension-stardist Original repository : https://github.com/stardist/stardist Reference paper : doi:10.48550/arXiv.1806.03535

There is a stardistDetectionFilter.groovy script in scripts/qupath-utils/segmentation to use it from a script which further allows you to filter out detected cells based on shape measurements as well as fluorescence itensity in several channels and cell compartments.

"},{"location":"guide-qupath-objects.html#cellpose","title":"Cellpose","text":"

QuPath extension : https://github.com/BIOP/qupath-extension-cellpose Original repository : https://github.com/MouseLand/cellpose Reference papers : doi:10.1038/s41592-020-01018-x, doi:10.1038/s41592-022-01663-4, doi:10.1101/2024.02.10.579780

There is a cellposeDetectionFilter.groovy script in scripts/qupath-utils/segmentation to use it from a script which further allows you to filter out detected cells based on shape measurements as well as fluorescence itensity in several channels and cell compartments.

"},{"location":"guide-qupath-objects.html#sam","title":"SAM","text":"

QuPath extension : https://github.com/ksugar/qupath-extension-sam Original repositories : samapi, SAM Reference papers : doi:10.1101/2023.06.13.544786, doi:10.48550/arXiv.2304.02643

This is more an interactive annotation tool than a fully automatic segmentation algorithm.

"},{"location":"guide-register-abba.html","title":"Registration with ABBA","text":"

The ABBA documentation is quite extensive and contains guided tutorials and a video tutorial. You should therefore check it out ! Nevertheless, you will find below some quick reminders.

"},{"location":"guide-register-abba.html#import-a-qupath-project","title":"Import a QuPath project","text":"

Always use ABBA with a QuPath project, if you import the images directly it will not be possible to export the results back to QuPath. In the toolbar, head to Import > Import QuPath Project.

  • Select the .qproj file corresponding to the QuPath project to be aligned.
  • Initial axis position : this is the initial position where to put your stack. It will be modified afterwards.
  • Axis increment between slices : this is the spatial spacing, in mm, between two slices. This would correspond to the slice thickness multiplied by the number of set. If your images are ordered from rostral to caudal, set it negative.

Warning

ABBA is not the most stable software, it is highly recommended to save in a different file each time you do anything.

"},{"location":"guide-register-abba.html#navigation","title":"Navigation","text":""},{"location":"guide-register-abba.html#interface","title":"Interface","text":"
  • Left Button + drag to select slices
  • Right Button for display options
  • Right Button + drag to browse the view
  • Middle Button to zoom in and or out
"},{"location":"guide-register-abba.html#right-panel","title":"Right panel","text":"

In the right panel, there is everything related to the images, both yours and the atlas.

In the Atlas Display section, you can turn on and off different channels (the first is the reference image, the last is the regions outlines). The Displayed slicing [atlas steps] slider can increase or decrease the number of displayed 2D slices extracted from the 3D volume. It is comfortable to set to to the same spacing as your slices. Remember it is in \"altas steps\", so for an atlas imaged at 10\u00b5m, a 120\u00b5m spacing corresponds to 12 atlas steps.

The Slices Display section lists all your slices. Ctrl+A to select all, and click on the Vis. header to make them visible. Then, you can turn on and off each channels (generally the NISSL channel and the ChAT channel will be used) by clicking on the corresponding header. Finally, set the display limits clicking on the empty header containing the colors.

Right Button in the main view to Change overlap mode twice to get the slices right under the atlas slices.

Tip

Every action in ABBA are stored and are cancellable with Right Button+Z, except the Interactive transform.

"},{"location":"guide-register-abba.html#find-position-and-angle","title":"Find position and angle","text":"

This is the hardest task. You need to drag the slices along the rostro-caudal axis and modify the virtual slicing angle (X Rotation [deg] and Y Rotation [deg] sliders at the bottom of the right panel) until you match the brain structures observed in both your images and the atlas.

Tip

With a high number of slices, most likely, it will be impossible to find a position and slicing angle that works for all your slices. In that case, you should procede in batch, eg. sub-stack of images with a unique position and slicing angle that works for all images in the sub-stack. Then, remove the remaining slices (select them, Right Button > Remove Selected Slices), but do not remove them from the QuPath project.

Procede as usual, including saving (note the slices range it corresponds to) and exporting the registration back to QuPath. Then, reimport the project in a fresh ABBA instance, remove the slices that were already registered and redo the whole process with the next sub-stack and so on.

Once you found the correct position and slicing angle, it must not change anymore, otherwise the registration operations you perform will not make any sense anymore.

"},{"location":"guide-register-abba.html#in-plane-registration","title":"In-plane registration","text":"

The next step is to deform your slices to match the corresponding atlas image, extracted from the 3D volume given the position and virtual slicing angle defined at the previous step.

Info

ABBA makes the choice to deform your slices to the atlas, but the transformations are invertible. This means that you will still be able to work on your raw data and deform the altas onto it instead.

In image processing, there are two kinds of deformation one can apply on an image :

  • Affine (or linear) : simple, image-wide, linear operations - translation, rotation, scaling, shearing.
  • Spline (or non-linear) : complex non-linear operations that can allow for local deformation.

Both can be applied manually or automatically (if the imaging quality allows it). You have different tools to achieve this, all of which can be combined in any order, except the Interactive transform tool (coarse, linear manual deformation).

Change the overlap mode (Right Button) to overlay the slice onto the atlas regions borders. Select the slice you want to align.

"},{"location":"guide-register-abba.html#coarse-linear-manual-deformation","title":"Coarse, linear manual deformation","text":"

While not mandatory, if this tool shall be used, it must be before any operation as it is not cancellable. Head to Register > Affine > Interactive transform. This will open a box where you can rotate, translate and resize the image to make a first, coarse alignment.

Close the box. Again, this is not cancellable. Afterwards, you're free to apply any numbers of transformations in any order.

"},{"location":"guide-register-abba.html#automatic-registration","title":"Automatic registration","text":"

This uses the elastix toolbox to compute the transformations needed to best match two images. It is available in both affine and spline mode, in the Register > Affine and Register > Spline menus respectively.

In both cases, it will open a dialog where you need to choose :

  • Atlas channels : the reference image of the atlas, usually channel number 0
  • Slices channels : the fluorescence channel that looks like the most to the reference image, usually channel number 0
  • Registration re-sampling (micrometers) : the pixel size to resize the images before registration, as it is a computationally intensive task. Going below 20\u00b5m won't help much.

For the Spline mode, there an additional parameter :

  • Number of control points along X : the algorithm will set points as a grid in the image and perform the transformations from those. The higher number of points, the more local transformations will be.
"},{"location":"guide-register-abba.html#manual-registration","title":"Manual registration","text":"

This uses BigWarp to manually deform the images with the mouse. It can be done from scratch (eg. you place the points yourself) or from a previous registration (either a previous BigWarp session or elastix in Spline mode).

"},{"location":"guide-register-abba.html#from-scratch","title":"From scratch","text":"

Register > Spline > BigWarp registration to launch the tool. Choose the atlas that allows you to best see the brain structures (usually the regions outlines channels, the last one), and the reference fluorescence channel.

It will open two viewers, called \"BigWarp moving image\" and \"BigWarp fixed image\". Briefly, they correspond to the two spaces you're working in, the \"Atlas space\" and the \"Slice space\".

Tip

Do not panick yet, while the explanations might be confusing (at least they were to me), in practice, it is easy, intuitive and can even be fun (sometimes, at small dose).

To browse the viewer, use Right Button + drag (Left Button is used to rotate the viewer), Middle Button zooms in and out.

The idea is to place points, called landmarks, that always go in pairs : one in the moving image and one where it corresponds to in the fixed image (or vice-versa). In practice, we will only work in the BigWarp fixed image viewer to place landmarks in both space in one click, then drag it to the corresponding location, with a live feedback of the transformation needed to go from one to another.

To do so :

  1. Press Space to switch to the \"Landmark mode\".

    Warning

    In \"Landmark mode\", Right Button can't be used to browse the view anymore. To do so, turn off the \"Landmark mode\" hitting Space again.

  2. Use Ctrl+Left Button to place a landmark.

    Info

    At least 4 landmarks are needed before activating the live-transform view.

  3. When there are at least 4 landmarks, hit T to activate the \"Transformed\" view. Transformed will be written at the bottom.

  4. Hold Left Button on a landmark to drag it to deform the image onto the atlas.
  5. Add as many landmarks as needed, when you're done, find the Fiji window called \"Big Warp registration\" that opened at the beginning and click OK.

Important remarks and tips

  • A landmark is a location where you said \"this location correspond to this one\". Therefore, BigWarp is not allowed to move this particular location. Everywhere else, it is free to transform the image without any restrictions, including the borders. Thus, it is a good idea to delimit the coarse contour of the brain with landmarks to constrain the registration.
  • Left Button without holding Ctrl will place a landmark in the fixed image only, without pair, and BigWarp won't like it. To delete landmarks, head to the \"Landmarks\" window that lists all of them. They highlight in the viewer upon selection. Hit Del to delete one. Alternatively, click on it on the viewer and hit Del.
"},{"location":"guide-register-abba.html#from-a-previous-registration","title":"From a previous registration","text":"

Head to Register > Edit last Registration to work on a previous registration.

If the previous registration was done with elastix (Spline) or BigWarp, it will launch the BigWarp interface exactly like above, but with landmarks already placed, either on a grid (elastix) or the one you manually placed (BigWarp).

Tip

It will ask which channels to use, you can modify the channel for your slices to work on two channels successively. For instance, one could make a first registration using the NISSL staining, then refine the motoneurons with the ChAT staining, if available.

"},{"location":"guide-register-abba.html#abba-state-file","title":"ABBA state file","text":"

ABBA can save the state you're in, from the File > Save State menu. It will be saved as a .abba file, which is actually a zip archive containing a bunch of JSON, listing every actions you made and in which order, meaning you will stil be able to cancel actions after quitting ABBA.

To load a state, quit ABBA, launch it again, then choose File > Load State and select the .abba file to carry on with the registration.

Save, save, save !

Those state files are cheap, eg. they are lightweight (less than 200KB). You should save the state each time you finish a slice, and you can keep all your files, without overwritting the previous ones, appending a number to its file name. This will allow to roll back to the previous slice in the event of any problem you might face.

"},{"location":"guide-register-abba.html#export-registration-back-to-qupath","title":"Export registration back to QuPath","text":""},{"location":"guide-register-abba.html#export-the-registration-from-abba","title":"Export the registration from ABBA","text":"

Once you are satisfied with your registration, select the registered slices and head to Export > QuPath > Export Registrations To QuPath Project. Check the box to make sure to get the latest registered regions.

It will export several files in the QuPath projects, including the transformed atlas regions ready to be imported in QuPath and the transformations parameters to be able to convert coordinates from the extension.

"},{"location":"guide-register-abba.html#import-the-registration-in-qupath","title":"Import the registration in QuPath","text":"

Make sure you installed the ABBA extension in QuPath.

From your project with an image open, the basic usage is to head to Extensions > ABBA > Load Atlas Annotations into Open Image. Choose to Split Left and Right Regions to make the two hemispheres independent, and choose the \"acronym\" to name the regions. The registered regions should be imported as Annotations in the image.

Tip

With ABBA in regular Fiji using the CCFv3 Allen mouse brain atlas, the left and right regions are flipped, because ABBA considers the slices as backward facing. The importAbba.groovy script located in scripts/qupath-utils-atlas allows you to flip left/right regions names. This is OK because the Allen brain is symmetrical by construction.

For more complex use, check the Groovy scripts in scripts/qupath-utils/atlas. ABBA registration is used throughout the guides, to either work with brain regions (and count objects for instance) or to get the detections' coordinates in the atlas space.

"},{"location":"main-citing.html","title":"Citing","text":"

While histoquant does not have a reference paper as of now, you can reference the GitHub repository.

Please make sure to cite all the softwares used in your research. Citations are usually the only metric used by funding agencies, so citing properly the tools used in your research ensures the continuation of those projects.

  • Fiji : https://imagej.net/software/fiji/#publication
  • QuPath : https://qupath.readthedocs.io/en/stable/docs/intro/citing.html
  • ABBA : doi:10.1101/2024.09.06.611625
  • Brainglobe :
    • AtlasAPI : https://brainglobe.info/documentation/brainglobe-atlasapi/index.html#citation
    • Brainrender : https://brainglobe.info/documentation/brainrender/index.html#citation
  • Allen brain atlas (CCFv3) : doi:10.1016/j.cell.2020.04.007
  • 3D Allen spinal cord atlas : doi:10.1016/j.crmeth.2021.100074
  • Skeleton analysis (for fibers-like segmentation) : doi:10.7717/peerj.4312
"},{"location":"main-configuration-files.html","title":"The configuration files","text":"

There are three configuration files : altas_blacklist, atlas_fusion and a modality-specific file, that we'll call config in this document. The former two are related to the atlas you're using, the latter is what is used by histoquant to know what and how to compute and display things. There is a fourth, optional, file, used to provide some information on a specific experiment, info.

The configuration files are in the TOML file format, that are basically text files formatted in a way that is easy to parse in Python. See here for a basic explanation of the syntax.

Most lines of each template file are commented to explain what each parameter do.

"},{"location":"main-configuration-files.html#atlas_blacklisttoml","title":"atlas_blacklist.toml","text":"Click to see an example file atlas_blacklist.toml
# TOML file to list Allen brain regions to ignore during analysis.\n# \n# It is used to blacklist regions and all descendants regions (\"WITH_CHILD\").\n# Objects belonging to those regions and their descendants will be discarded.\n# And you can specify an exact region where to remove objects (\"EXACT\"),\n# descendants won't be affected.\n# Use it to remove noise in CBX, ventricual systems and fiber tracts.\n# Regions are referenced by their exact acronym.\n#\n# Syntax :\n#   [WITH_CHILDS]\n#   members = [\"CBX\", \"fiber tracts\", \"VS\"]\n#\n#   [EXACT]\n#   members = [\"CB\"]\n\n\n[WITH_CHILDS]\nmembers = [\"CBX\", \"fiber tracts\", \"VS\"]\n\n[EXACT]\nmembers = [\"CB\"]\n

This file is used to filter out specified regions and objects belonging to them.

  • The atlas regions present in the members keys will be ignored. Objects whose parents are in here will be ignored as well.
  • In the [WITH_CHILDS] section, regions and objects belonging to those regions and all descending regions (child regions, as per the altas hierarchy) will be removed.
  • In the [EXACT] section, only regions and objects belonging to those exact regions are removed. Descendants regions are not taken into account.
"},{"location":"main-configuration-files.html#atlas_fusiontoml","title":"atlas_fusion.toml","text":"Click to see an example file atlas_blacklist.toml
# TOML file to determine which brain regions should be merged together.\n# Regions are referenced by their exact acronym.\n# The syntax should be the following :\n# \n#   [MY]\n#   name = \"Medulla\"  # new or existing full name\n#   acronym = \"MY\"  # new or existing acronym\n#   members = [\"MY-mot\", \"MY-sat\"]  # existing Allen Brain acronyms that should belong to the new region\n#\n# Then, regions labelled \"MY-mot\" and \"MY-sat\" will be labelled \"MY\" and will join regions already labelled \"MY\".\n# What's in [] does not matter but must be unique and is used to group.\n# The new \"name\" and \"acronym\" can be existing Allen Brain regions or a new (meaningful) one.\n# Note that it is case sensitive.\n\n[PHY]\nname = \"Perihypoglossal nuclei\"\nacronym = \"PHY\"\nmembers = [\"NR\", \"PRP\"]\n\n[NTS]\nname = \"Nucleus of the solitary tract\"\nacronym = \"NTS\"\nmembers = [\"ts\", \"NTSce\", \"NTSco\", \"NTSge\", \"NTSl\", \"NTSm\"]\n\n[AMB]\nname = \"Nucleus ambiguus\"\nacronym = \"AMB\"\nmembers = [\"AMBd\", \"AMBv\"]\n\n[MY]\nname = \"Medulla undertermined\"\nacronym = \"MYu\"\nmembers = [\"MY-mot\", \"MY-sat\"]\n\n[IRN]\nname = \"Intermediate reticular nucleus\"\nacronym = \"IRN\"\nmembers = [\"IRN\", \"LIN\"]\n

This file is used to group regions together, to customize the atlas' hierarchy. It is particularly useful to group smalls brain regions that are impossible to register precisely. Keys name, acronym and members should belong to a [section].

  • [section] is just for organizing, the name does not matter but should be unique.
  • name should be a human-readable name for your new region.
  • acronym is how the region will be refered to. It can be a new acronym, or an existing one.
  • members is a list of acronyms of atlas regions that should be part of the new one.
"},{"location":"main-configuration-files.html#configtoml","title":"config.toml","text":"Click to see an example file config_template.toml
########################################################################################\n# Configuration file for histoquant package\n# -----------------------------------------\n# This is a TOML file. It maps a key to a value : `key = value`.\n# Each key must exist and be filled. The keys' names can't be modified, except:\n#   - entries in the [channels.names] section and its corresponding [channels.colors] section,\n#   - entries in the [regions.metrics] section.                                                                                   \n#\n# It is strongly advised to NOT modify this template but rather copy it and modify the copy.\n# Useful resources :\n#   - the TOML specification : https://toml.io/en/\n#   - matplotlib colors : https://matplotlib.org/stable/gallery/color/color_demo.html\n#\n# Configuration file part of the python histoquant package.\n# version : 2.1\n########################################################################################\n\nobject_type = \"Cells\"  # name of QuPath base classification (eg. without the \": subclass\" part)\nsegmentation_tag = \"cells\"  # type of segmentation, matches directory name, used only in the full pipeline\n\n[atlas]  # information related to the atlas used\nname = \"allen_mouse_10um\"  # brainglobe-atlasapi atlas name\ntype = \"brain\"  # brain or cord (eg. registration done in ABBA or abba_python)\nmidline = 5700  # midline Z coordinates (left/right limit) in microns\noutline_structures = [\"root\", \"CB\", \"MY\", \"P\"]  # structures to show an outline of in heatmaps\n\n[channels]  # information related to imaging channels\n[channels.names]  # must contain all classifications derived from \"object_type\"\n\"marker+\" = \"Positive\"  # classification name = name to display\n\"marker-\" = \"Negative\"\n[channels.colors]  # must have same keys as names' keys\n\"marker+\" = \"#96c896\"  # classification name = matplotlib color (either #hex, color name or RGB list)\n\"marker-\" = \"#688ba6\"\n\n[hemispheres]  # information related to hemispheres\n[hemispheres.names]\nLeft = \"Left\"  # Left = name to display\nRight = \"Right\"  # Right = name to display\n[hemispheres.colors]  # must have same keys as names' keys\nLeft = \"#ff516e\"  # Left = matplotlib color (either #hex, color name or RGB list)\nRight = \"#960010\"  # Right = matplotlib color\n\n[distributions]  # spatial distributions parameters\nstereo = true  # use stereotaxic coordinates (Paxinos, only for brain)\nap_lim = [-8.0, 0.0]  # bins limits for anterio-posterior\nap_nbins = 75  # number of bins for anterio-posterior\ndv_lim = [-1.0, 7.0]  # bins limits for dorso-ventral\ndv_nbins = 50  # number of bins for dorso-ventral\nml_lim = [-5.0, 5.0]  # bins limits for medio-lateral\nml_nbins = 50  # number of bins for medio-lateral\nhue = \"channel\"  # color curves with this parameter, must be \"hemisphere\" or \"channel\"\nhue_filter = \"Left\"  # use only a subset of data. If hue=hemisphere : channel name, list of such or \"all\". If hue=channel : hemisphere name or \"both\".\ncommon_norm = true  # use a global normalization for each hue (eg. the sum of areas under all curves is 1)\n[distributions.display]\nshow_injection = false  # add a patch showing the extent of injection sites. Uses corresponding channel colors\ncmap = \"OrRd\"  # matplotlib color map for heatmaps\ncmap_nbins = 50  # number of bins for heatmaps\ncmap_lim = [1, 50]  # color limits for heatmaps\n\n[regions]  # distributions per regions parameters\nbase_measurement = \"Count\"  # the name of the measurement in QuPath to derive others from\nhue = \"channel\"  # color bars with this parameter, must be \"hemisphere\" or \"channel\"\nhue_filter = \"Left\"  # use only a subset of data. If hue=hemisphere : channel name, list of such or \"all\". If hue=channel : hemisphere name or \"both\".\nhue_mirror = false  # plot two hue_filter in mirror instead of discarding the other\nnormalize_starter_cells = false  # normalize non-relative metrics by the number of starter cells\n[regions.metrics]  # names of metrics. Do not change the keys !\n\"density \u00b5m^-2\" = \"density \u00b5m^-2\"\n\"density mm^-2\" = \"density mm^-2\"\n\"coverage index\" = \"coverage index\"\n\"relative measurement\" = \"relative count\"\n\"relative density\" = \"relative density\"\n[regions.display]\nnregions = 18  # number of regions to display (sorted by max.)\norientation = \"h\"  # orientation of the bars (\"h\" or \"v\")\norder = \"max\"  # order the regions by \"ontology\" or by \"max\". Set to \"max\" to provide a custom order\ndodge = true  # enforce the bar not being stacked\nlog_scale = false  # use log. scale for metrics\n[regions.display.metrics]  # name of metrics to display\n\"count\" = \"count\"  # real_name = display_name, with real_name the \"values\" in [regions.metrics]\n\"density mm^-2\" = \"density (mm^-2)\"\n\n[files]  # full path to information TOML files\nblacklist = \"../../atlas/atlas_blacklist.toml\"\nfusion = \"../../atlas/atlas_fusion.toml\"\noutlines = \"/data/atlases/allen_mouse_10um_outlines.h5\"\ninfos = \"../../configs/infos_template.toml\"\n

This file is used to configure histoquant behavior. It specifies what to compute, how, and display parameters such as colors associated to each classifications, hemisphere names, distributions bins limits...

Warning

When editing your config.toml file, you're allowed to modify the keys only in the [channels] section.

Click for a more readable parameters explanation

object_type : name of QuPath base classification (eg. without the \": subclass\" part) segmentation_tag : type of segmentation, matches directory name, used only in the full pipeline

atlas Information related to the atlas used

name : brainglobe-atlasapi atlas name type : \"brain\" or \"cord\" (eg. registration done in ABBA or abba_python). This will determine whether to flip Left/Right when determining detections hemisphere based on their coordinates. Also adapts the axes in the 2D heatmaps. midline : midline Z coordinates (left/right limit) in microns to determine detections hemisphere based on their coordinates. outline_structures : structures to show an outline of in heatmaps

channels Information related to imaging channels

names Must contain all classifications derived from \"object_type\" you want to process. In the form subclassification name = name to display on the plots

\"marker+\" : classification name = name to display \"marker-\" : add any number of sub-classification

colors Must have same keys as \"names\" keys, in the form subclassification name = color, with color specified as a matplotlib named color, an RGB list or an hex code.

\"marker+\" : classification name = matplotlib color \"marker-\" : must have the same entries as \"names\".

hemispheres Information related to hemispheres, same structure as channels

names

Left : Left = name to display Right : Right = name to display

colors Must have same keys as names' keys

Left : ff516e\" # Left = matplotlib color (either #hex, color name or RGB list) Right : 960010\" # Right = matplotlib color

distributions Spatial distributions parameters

stereo : use stereotaxic coordinates (as in Paxinos, only for mouse brain CCFv3) ap_lim : bins limits for anterio-posterior in mm ap_nbins : number of bins for anterio-posterior dv_lim : bins limits for dorso-ventral in mm dv_nbins : number of bins for dorso-ventral ml_lim : bins limits for medio-lateral in mm ml_nbins : number of bins for medio-lateral hue : color curves with this parameter, must be \"hemisphere\" or \"channel\" hue_filter : use only a subset of data

  • If hue=hemisphere : it should be a channel name, a list of such or \"all\"
  • If hue=channel : it should be a hemisphere name or \"both\"

common_norm : use a global normalization (eg. the sum of areas under all curves is 1). Otherwise, normalize each hue individually

display Display parameters

show_injection : add a patch showing the extent of injection sites. Uses corresponding channel colors. Requires the information TOML configuration file set up cmap : matplotlib color map for 2D heatmaps cmap_nbins : number of bins for 2D heatmaps cmap_lim : color limits for 2D heatmaps

regions Distributions per regions parameters

base_measurement : the name of the measurement in QuPath to derive others from. Usually \"Count\" or \"Length \u00b5m\" hue : color bars with this parameter, must be \"hemisphere\" or \"channel\" hue_filter : use only a subset of data

  • If hue=hemisphere : it should be a channel name, a list of such or \"all\"
  • If hue=channel : it should be a hemisphere name or \"both\"

hue_mirror : plot two hue_filter in mirror instead of discarding the others. For example, if hue=channel and hue_filter=\"both\", plots the two hemisphere in mirror. normalize_starter_cells : normalize non-relative metrics by the number of starter cells

metrics Names of metrics. The keys are used internally in histoquant as is so should NOT be modified. The values will only chang etheir names in the ouput file

\"density \u00b5m^-2\" : relevant name \"density mm^-2\" : relevant name \"coverage index\" : relevant name \"relative measurement\" : relevant name \"relative density\" : relevant name

display

nregions : number of regions to display (sorted by max.) orientation : orientation of the bars (\"h\" or \"v\") order : order the regions by \"ontology\" or by \"max\". Set to \"max\" to provide a custom order dodge : enforce the bar not being stacked log_scale : use log. scale for metrics

metrics name of metrics to display

\"count\" : real_name = display_name, with real_name the \"values\" in [regions.metrics] \"density mm^-2\"

files Full path to information TOML files and atlas outlines for 2D heatmaps.

blacklist fusion outlines infos

"},{"location":"main-configuration-files.html#infotoml","title":"info.toml","text":"Click to see an example file info_template.toml
# TOML file to specify experimental settings of each animals.\n# Syntax should be :\n#   [animalid0]  # animal ID\n#   slice_thickness = 30  # slice thickness in microns\n#   slice_spacing = 60  # spacing between two slices in microns\n#   [animalid0.marker-name]  # [{Animal id}.{segmented channel name}]\n#   starter_cells = 190  # number of starter cells\n#   injection_site = [x, y, z]  # approx. injection site in CCFv3 coordinates\n#\n# --------------------------------------------------------------------------\n[animalid0]\nslice_thickness = 30\nslice_spacing = 60\n[animalid0.\"marker+\"]\nstarter_cells = 150\ninjection_site = [ 10.8937328, 6.18522070, 6.841855301 ]\n[animalid0.\"marker-\"]\nstarter_cells = 175\ninjection_site = [ 10.7498512, 6.21545461, 6.815487203 ]\n# --------------------------------------------------------------------------\n[animalid1-SC]\nslice_thickness = 30\nslice_spacing = 120\n[animalid1-SC.EGFP]\nstarter_cells = 250\ninjection_site = [ 10.9468211, 6.3479642, 6.0061113 ]\n[animalid1-SC.DsRed]\nstarter_cells = 275\ninjection_site = [ 10.9154874, 6.2954872, 8.1587125 ]\n# --------------------------------------------------------------------------\n

This file is used to specify injection sites for each animal and each channel, to display it in distributions.

"},{"location":"main-getting-help.html","title":"Getting help","text":"

For help in QuPath, ABBA, Fiji or any image processing-related questions, your one stop is the image.sc forum. There, you can search with specific tags (#qupath, #abba, ...). You can also ask questions or even answer to some by creating an account !

For help with histoquant in particular, you can open an issue in Github (which requires an account as well), or send an email to me or Antoine Lesage.

"},{"location":"main-getting-started.html","title":"Getting started","text":""},{"location":"main-getting-started.html#quick-start","title":"Quick start","text":"
  1. Install QuPath, ABBA and miniconda3.
  2. Create an environment :
    conda create -c conda-forge -n hq python=3.12 pytables\n
  3. Activate it :
    conda activate hq\n
  4. Download the latest release .zip, unzip it and install it with pip, from inside the histoquant-xxx folder :
    pip install .\n
    If you want to build the doc :
    pip install .[doc]\n
"},{"location":"main-getting-started.html#slow-start","title":"Slow start","text":"

Tip

If all goes well, you shouldn't need any admin rights to install the various pieces of software used before histoquant.

Important

Remember to cite all softwares you use ! See Citing.

"},{"location":"main-getting-started.html#qupath","title":"QuPath","text":"

QuPath is an \"open source software for bioimage analysis\". You can install it from the official website : https://qupath.github.io/. The documentation is quite clear and comprehensive : https://qupath.readthedocs.io/en/stable/index.html.

This is where you'll create QuPath projects, in which you'll be able to browse your images, annotate them, import registered brain regions and find objects of interests (via automatic segmentation, thresholding, pixel classification, ...). Then, those annotations and detections can be exported to be processed by histoquant.

"},{"location":"main-getting-started.html#aligning-big-brain-and-atlases-abba","title":"Aligning Big Brain and Atlases (ABBA)","text":"

This is the tool you'll use to register 2D histological sections to 3D atlases. See the dedicated page.

"},{"location":"main-getting-started.html#python-virtual-environment-manager-conda","title":"Python virtual environment manager (conda)","text":"

The histoquant package is written in Python. It depends on scientific libraries (such as NumPy, pandas and many more). Those libraries need to be installed in versions that are compatible with each other and with histoquant. To make sure those versions do not conflict with other Python tools you might be using (deeplabcut, abba_python, ...), we will install histoquant and its dependencies in a dedicated virtual environment.

conda is a software that takes care of this. It comes with a \"base\" environment, from which we will create and manage other environments. It is included with the Anaconda distribution, but the latter is bloated : its \"base\" environment already contains tons of libraries, and tends to self-destruct at some point (eg. becomes unable to resolve the inter-dependencies), which makes you unable to install new libraries nor create new environments.

This is why it is highly recommended to install miniconda3 instead, a minimal installer for conda :

  1. Download and install miniconda3 (choose the \"latest\" version for your system). During the installation, choose to install for the current user, add conda to PATH and make python the default interpreter.
  2. Open a terminal (PowerShell in Windows). Run :
    conda init\n
    This will activate conda and its base environment whenever you open a new PowerShell window. Now, when opening a new PowerShell (or terminal), you should see a prompt like this :
    (base) PS C:\\Users\\myname>\n
  3. Run :
    conda config --add channels conda-forge\n
    Then :
    conda config --set channel_priority flexible\n
    This will make conda download the packages from the \"conda-forge\" online repository, which is more complete and up-to-date. The flag -c conda-forge in the subsequent instructions won't be necessary anymore.

Tip

If Anaconda is already installed and you don't have the rights to uninstall it, you'll have to use it instead. You can launch the \"Anaconda Prompt (PowerShell)\", run conda init and follow the same instructions below (and hope it won't break in the foreseeable future).

"},{"location":"main-getting-started.html#installation","title":"Installation","text":"

This section explains how to actually install the histoquant package. The following commands should be run from a terminal (PowerShell). Remember that the -c conda-forge bits are not necessary if you did the step 3. above.

  1. Create a virtual environment with python 3.12 and some libraries:
    conda create -c conda-forge -n hq python=3.12 pytables\n
  2. Get a copy of the histoquant Source code .zip package, from the Releases page.
  3. We need to install it inside the hq environment we just created. First, you need to activate the hq environment :
    conda activate hq\n
    Now, the prompt should look like this :
    (hq) PS C:\\Users\\myname>\n
    This means that Python packages will now be installed in the hq environment and won't conflict with other toolboxes you might be using. Then, we use pip to install histoquant. pip was installed with Python, and will scan the histoquant folder, specifically the \"pyproject.toml\" file that lists all the required dependencies. To do so, you can either :
    • pip install /path/to/histoquant\n
    • Change directory from the terminal :
      cd /path/to/histoquant\n
      Then install the package, \".\" denotes \"here\" :
      pip install .\n
    • Use the file explorer to get to the histoquant folder, use Shift+Right Button to \"Open PowerShell window here\" and run :
      pip install .\n

histoquant is now installed inside the hq environment and will be available in Python from that environment !

Tip

You will need to perform step 3. each time you want to update the package.

If you already have registered data and cells in QuPath, you can export Annotations and Detections as TSV files and head to the Example section.

"},{"location":"main-using-notebooks.html","title":"Using notebooks","text":"

A Jupyter notebook is a way to use Python in an interactive manner. It uses cells that contain Python code, and that are to be executed to immediately see the output, including figures.

You can see some rendered notebooks in the examples here, but you can also download them (downward arrow button on the top right corner of each notebook) and run them locally with your own data.

To do so, you can either use an integrated development environment (basically a supercharged text editor) that supports Jupyter notebooks, or directly the Jupyter web interface.

IDEJupyter web interface

You can use for instance Visual Studio Code, also known as vscode.

  1. Download it and install it.
  2. Launch vscode.
  3. Follow or skip tutorials.
  4. In the left panel, open Extension (squared pieces).
  5. Install the \"Python\" and \"Jupyter\" extensions (by Microsoft).
  6. You now should be able to open .ipynb (notebooks) files with vscode. On the top right, you should be able to Select kernel : choose \"hq\".
  1. Create a folder dedicated to working with notebooks, for example \"Documents\\notebooks\".
  2. Copy the notebooks you're interested in in this folder.
  3. Open a terminal inside this folder (by either using cd Documents\\notebooks or, in the file explorer in your \"notebooks\" folder, Shift+Right Button to \"Open PowerShell window here\")
  4. Activate the conda environment :
    conda activate hq\n
  5. Launch the Jupyter Lab web interface :
    jupyter lab\n
    This should open a web page where you can open the ipynb files.
"},{"location":"tips-abba.html","title":"ABBA","text":""},{"location":"tips-brain-contours.html","title":"Brain contours","text":"

With histoquant, it is possible to plot 2D heatmaps on brain contours.

All the detections are projected in a single plane, thus it is up to you to select a relevant data range. It is primarily intended to give a quick, qualitative overview of the spreading of your data.

To do so, it requires the brain regions outlines, stored in a hdf5 file. This can be generated with brainglobe-atlasapi. The generate_atlas_outlines.py located in scripts/atlas will show you how to make such a file, that the histoquant.display module can use.

Alternatively it is possible to directly plot density maps without histoquant, using brainglobe-heatmap. An example is shown here.

"},{"location":"tips-formats.html","title":"Data format","text":""},{"location":"tips-formats.html#some-concepts","title":"Some concepts","text":""},{"location":"tips-formats.html#tiles","title":"Tiles","text":"

The representation of an image in a computer is basically a table where each element represents the pixel value (see more here). It can be n-dimensional, where the typical dimensions would be \\((x, y, z)\\), time and the fluorescence channels.

In large images, such as histological slices that are more than 10000\\(\\times\\)10000 pixels, a strategy called tiling is used to optimize access to specific regions in the image. Storing the whole image at once in a file would imply to load the whole thing at once in the memory (RAM), even though one would only need to access a given rectangular region with a given zoom. Instead, the image is stored as tiles, small squares (512--2048 pixels) that pave the whole image and are used to reconstruct the original image. Therefore, when zooming-in, only the relevant tiles are loaded and displayed, allowing for smooth large image navigation. This process is done seamlessly by software like QuPath and BigDataViewer (the Fiji plugin ABBA is based on) when loading tiled images. This is also leveraged for image processing in QuPath, which will work on tiles instead of the whole image to not saturate your computer RAM.

Most images are already tiled, including Zeiss CZI images. Note that those tiles do not necessarily correspond to the actual, real-world, tiles the microscope did to image the whole slide.

"},{"location":"tips-formats.html#pyramids","title":"Pyramids","text":"

In the same spirit as tiles, it would be a waste to have to load the entire image (and all the tiles) at once when viewing the image at max zoom-out, as your monitor nor your eyes would handle it. Instead, smaller, rescaled versions of the original image are stored alongside it, and depending on the zoom you are using, the sub-resolution version is displayed. Again, this is done seamlessly by QuPath and ABBA, allowing you to quickly switch from an image to another, without having to load the GB-sized image. Also, for image processing that does not require the original pixel size, QuPath can also leverage pyramids to go faster.

Usually, upon openning a CZI file in ZEN, there is a pop-up suggesting you to generate pyramids. It is a very good idea to say yes, wait a bit and save the file so that the pyramidal levels are saved within the file.

"},{"location":"tips-formats.html#metadata","title":"Metadata","text":"

Metadata, while often overlooked, are of paramount importance in microscopy data. It allows both softwares and users to interpret the raw data of images, eg. the values of each pixels. Most image file formats support this, including the microcope manufacturer file formats. Metadata may include :

  • Pixel size. Usually expressed in \u00b5m for microscopy, this maps computer pixel units into real world distance. QuPath and ABBA uses that calibration to scale your image properly, so that it match the atlas you'll register your slices on,
  • Channels colors and names,
  • Image type (fluorescence, brightfield, ...),
  • Dimensions,
  • Magnification...

Pixel size is the parameter that is absolutely necessary. Channel names and colors are more a quality of life feature, to make sure not to mix your difference fluorescence channels. CZI files or exported OME-TIFF files include this out of the box so you don't really need to pay attention.

"},{"location":"tips-formats.html#bio-formats","title":"Bio-formats","text":"

Bio-formats is an initiative of the Open Microscopy Environment (OME) consortium, aiming at being able to read proprietary microscopy image data and metadata. It is used in QuPath, Fiji and ABBA.

This page summarizes the level of support of numerous file formats. You can see that Zeiss CZI files and Leica LIF are quite well supported, and should therefore work out of the box in QuPath.

"},{"location":"tips-formats.html#zeiss-czi-files","title":"Zeiss CZI files","text":"

QuPath and ABBA supports any Bio-formats supported, tiled, pyramidal images.

If you're in luck, adding the pyramidal CZI file to your QuPath project will just work. If it doesn't, you'll notice immediately : the tiles will be shuffled and you'll see only a part of the image instead of the whole one. Unfortunately I was not able to determine why this happens and did not find a way to even predict if a file will or will not work.

In the event you experience this bug, you'll need to export the CZI files to OME-TIFF files from ZEN, then generate tiled pyramidal images with the create_pyramids.py script included in histoquant. See the instructions.

"},{"location":"tips-formats.html#markdown-md-files","title":"Markdown (.md) files","text":"

Markdown is a markup language to create formatted text. It is basically a simple text file that could be opened with any text editor software (notepad and the like), but features specific tags to format the text with heading levels, typesetting (bold, itallic), links, lists... This very page is actually written in markdown, and the engine that builds it renders the text in a nicely formatted manner.

If you open a .md file with vscode for example, you'll get a magnigying glass on the top right corner to switch to the rendered version of the file.

"},{"location":"tips-formats.html#toml-toml-files","title":"TOML (.toml) files","text":"

TOML, or Tom's Obvious Minimal Language, is a configuration file format (similar to YAML). Again, it is basically a simple text file that can be opened with any text editor and is human-readable, but also computer-readable. This means that it is easy for most software and programming language to parse the file to associate a variable (or \"key\") to a value, thus making it a good file format for configuration. It is used in histoquant (see The configuration files page).

The syntax looks like this :

# a comment, ignored by the computer\nkey1 = 10  # the key \"key1\" is mapped to the number 10\nkey2 = \"something\"  # \"key2\" is mapped to the string \"something\"\nkey3 = [\"something else\", 1.10, -25]  # \"key3\" is mapped to a list with 3 elements\n[section]  # we can declare sections\nkey1 = 5  # this is not \"key1\", it actually is section.key1\n[section.example]  # we can have nested sections\nkey1 = true  # this is section.example.key1, mapped to the boolean True\n

You can check the full specification of this language here.

"},{"location":"tips-formats.html#csv-csv-tsv-files","title":"CSV (.csv, .tsv) files","text":"

CSV (or TSV) stands for Comma-Separated Values (or Tab-Separated Values) and is, once again, a simple text file formatted in a way that allows LibreOffice Calc (or Excel) to open them as a table. Lines of the table are delimited with new lines, and columns are separated with commas (,) or tabulations. Those files are easily parsed by programming languages (including Python). QuPath can export annotations and detections measurements in TSV format.

"},{"location":"tips-formats.html#json-and-geojson-files","title":"JSON and GeoJSON files","text":"

JSON is a \"data-interchange format\". It is used to store data, very much like toml, but supports more complex data and is more efficient to read and write, but is less human-readable. It is used in histoquant to store fibers-like objects coordinates, as they can contain several millions of points (making CSV not usable).

GeoJson is a file format used to store geographic data structures, basically objects coordinates with various shapes. It is based on and compatible with JSON, which makes it easy to parse in numerous programming language. It used in QuPath to import and export objects, that can be point, line, polygons...

"},{"location":"tips-qupath.html","title":"QuPath","text":""},{"location":"tips-qupath.html#custom-scripts","title":"Custom scripts","text":"

While QuPath graphical user interface (GUI) should meet a lot of your needs, it is very convenient to use scripting to automate certain tasks, execute them in batch (on all your images) and do things you couldn't do otherwise. QuPath uses the Groovy programming language, which is mostly Java.

Warning

Not all commands will appear in the history.

In QuPath, in the left panel in the \"Workflow\" tab, there is an history of most of the commands you used during the session. On the bottom, you can click on Create workflow to select the relevant commands and create a script. This will open the built-in script editor that will contain the groovy version of what you did graphically.

Tip

The scripts/qupath-utils folder contains a bunch of utility scripts.

They can be run in batch with the three-dotted menu on the bottom right corner of the script editor : Run for project, then choose the images you want the script to run on.

"},{"location":"demo_notebooks/cells_distributions.html","title":"Cells distributions","text":"

This notebook shows how to load data exported from QuPath, compute metrics and display them, according to the configuration file. This is meant for a single-animal.

There are some conventions that need to be met in the QuPath project so that the measurements are usable with histoquant:

  • Objects' classifications must be derived, eg. be in the form \"something: else\". The primary classification (\"something\") will be refered to \"object_type\" and the secondary classification (\"else\") to \"channel\" in the configuration file.
  • Only one \"object_type\" can be processed at once, but supports any numbers of channels.
  • Annotations (brain regions) must have properly formatted measurements. For punctual objects, it would be the count. Run the \"add_regions_count.groovy\" script to add them. The measurements names must be in the form \"something: else name\", for instance, \"something: else Count\". \"name\" is refered to \"base_measurement\" in the configuration file.

You should copy this notebook, the configuration file and the atlas-related configuration files (blacklist and fusion) elsewhere and edit them according to your need.

The data was generated from QuPath with stardist cell detection on toy data.

In\u00a0[1]: Copied!
import pandas as pd\n\nimport histoquant as hq\n
import pandas as pd import histoquant as hq In\u00a0[2]: Copied!
# Full path to your configuration file, edited according to your need beforehand\nconfig_file = \"../../resources/demo_config_cells.toml\"\n
# Full path to your configuration file, edited according to your need beforehand config_file = \"../../resources/demo_config_cells.toml\" In\u00a0[3]: Copied!
# - Files\n# animal identifier\nanimal = \"animalid0\"\n# set the full path to the annotations tsv file from QuPath\nannotations_file = \"../../resources/cells_measurements_annotations.tsv\"\n# set the full path to the detections tsv file from QuPath\ndetections_file = \"../../resources/cells_measurements_detections.tsv\"\n
# - Files # animal identifier animal = \"animalid0\" # set the full path to the annotations tsv file from QuPath annotations_file = \"../../resources/cells_measurements_annotations.tsv\" # set the full path to the detections tsv file from QuPath detections_file = \"../../resources/cells_measurements_detections.tsv\" In\u00a0[4]: Copied!
# get configuration\ncfg = hq.config.Config(config_file)\n
# get configuration cfg = hq.config.Config(config_file) In\u00a0[5]: Copied!
# read data\ndf_annotations = pd.read_csv(annotations_file, index_col=\"Object ID\", sep=\"\\t\")\ndf_detections = pd.read_csv(detections_file, index_col=\"Object ID\", sep=\"\\t\")\n\n# remove annotations that are not brain regions\ndf_annotations = df_annotations[df_annotations[\"Classification\"] != \"Region*\"]\ndf_annotations = df_annotations[df_annotations[\"ROI\"] != \"Rectangle\"]\n\n# convert atlas coordinates from mm to microns\ndf_detections[[\"Atlas_X\", \"Atlas_Y\", \"Atlas_Z\"]] = df_detections[\n    [\"Atlas_X\", \"Atlas_Y\", \"Atlas_Z\"]\n].multiply(1000)\n\n# have a look\ndisplay(df_annotations.head())\ndisplay(df_detections.head())\n
# read data df_annotations = pd.read_csv(annotations_file, index_col=\"Object ID\", sep=\"\\t\") df_detections = pd.read_csv(detections_file, index_col=\"Object ID\", sep=\"\\t\") # remove annotations that are not brain regions df_annotations = df_annotations[df_annotations[\"Classification\"] != \"Region*\"] df_annotations = df_annotations[df_annotations[\"ROI\"] != \"Rectangle\"] # convert atlas coordinates from mm to microns df_detections[[\"Atlas_X\", \"Atlas_Y\", \"Atlas_Z\"]] = df_detections[ [\"Atlas_X\", \"Atlas_Y\", \"Atlas_Z\"] ].multiply(1000) # have a look display(df_annotations.head()) display(df_detections.head()) Image Object type Name Classification Parent ROI Centroid X \u00b5m Centroid Y \u00b5m Cells: marker+ Count Cells: marker- Count ID Side Parent ID Num Detections Num Cells: marker+ Num Cells: marker- Area \u00b5m^2 Perimeter \u00b5m Object ID 4781ed63-0d8e-422e-aead-b685fbe20eb5 animalid0_030.ome.tiff Annotation Root NaN Root object (Image) Geometry 5372.5 3922.1 0 0 NaN NaN NaN 2441 136 2305 31666431.6 37111.9 aa4b133d-13f9-42d9-8c21-45f143b41a85 animalid0_030.ome.tiff Annotation root Right: root Root Polygon 7094.9 4085.7 0 0 997 0.0 NaN 1284 41 1243 15882755.9 18819.5 42c3b914-91c5-4b65-a603-3f9431717d48 animalid0_030.ome.tiff Annotation grey Right: grey root Geometry 7256.8 4290.6 0 0 8 0.0 997.0 1009 24 985 12026268.7 49600.3 887af3eb-4061-4f8a-aa4c-fe9b81184061 animalid0_030.ome.tiff Annotation CB Right: CB grey Geometry 7778.7 3679.2 0 16 512 0.0 8.0 542 5 537 6943579.0 30600.2 adaabc05-36d1-4aad-91fe-2e904adc574f animalid0_030.ome.tiff Annotation CBN Right: CBN CB Geometry 6790.5 3567.9 0 0 519 0.0 512.0 55 1 54 864212.3 7147.4 Image Object type Name Classification Parent ROI Atlas_X Atlas_Y Atlas_Z Object ID 5ff386a8-5abd-46d1-8e0d-f5c5365457c1 animalid0_030.ome.tiff Detection NaN Cells: marker- VeCB Polygon 11523.0 4272.4 4276.7 9a2a9a8c-acbe-4308-bc5e-f3c9fd1754c0 animalid0_030.ome.tiff Detection NaN Cells: marker- VeCB Polygon 11520.2 4278.4 4418.6 481a519b-8b40-4450-9ec6-725181807d72 animalid0_030.ome.tiff Detection NaN Cells: marker- VeCB Polygon 11506.0 4317.2 4356.3 fd28e09c-2c64-4750-b026-cd99e3526a57 animalid0_030.ome.tiff Detection NaN Cells: marker- VeCB Polygon 11528.4 4257.4 4336.4 3d9ce034-f2ed-4c73-99be-f782363cf323 animalid0_030.ome.tiff Detection NaN Cells: marker- VeCB Polygon 11548.7 4203.3 4294.3 In\u00a0[6]: Copied!
# get distributions per regions, spatial distributions and coordinates\ndf_regions, dfs_distributions, df_coordinates = hq.process.process_animal(\n    animal, df_annotations, df_detections, cfg, compute_distributions=True\n)\n\n# have a look\ndisplay(df_regions.head())\ndisplay(df_coordinates.head())\n
# get distributions per regions, spatial distributions and coordinates df_regions, dfs_distributions, df_coordinates = hq.process.process_animal( animal, df_annotations, df_detections, cfg, compute_distributions=True ) # have a look display(df_regions.head()) display(df_coordinates.head()) Name hemisphere Area \u00b5m^2 Area mm^2 count density \u00b5m^-2 density mm^-2 coverage index relative count relative density channel animal 0 ACVII Left 8307.1 0.008307 1 0.00012 120.378953 0.00012 0.002132 0.205275 Positive animalid0 0 ACVII Left 8307.1 0.008307 1 0.00012 120.378953 0.00012 0.000189 0.020671 Negative animalid0 1 ACVII Right 7061.4 0.007061 0 0.0 0.0 0.0 0.0 0.0 Positive animalid0 1 ACVII Right 7061.4 0.007061 1 0.000142 141.614977 0.000142 0.000144 0.021646 Negative animalid0 2 ACVII both 15368.5 0.015369 1 0.000065 65.068159 0.000065 0.001362 0.153797 Positive animalid0 Image Object type Name Classification Parent ROI Atlas_X Atlas_Y Atlas_Z hemisphere channel Atlas_AP Atlas_DV Atlas_ML animal Object ID 5ff386a8-5abd-46d1-8e0d-f5c5365457c1 animalid0_030.ome.tiff Detection NaN Cells: marker- VeCB Polygon 11.5230 4.2724 4.2767 Right Negative -6.433716 3.098278 -1.4233 animalid0 9a2a9a8c-acbe-4308-bc5e-f3c9fd1754c0 animalid0_030.ome.tiff Detection NaN Cells: marker- VeCB Polygon 11.5202 4.2784 4.4186 Right Negative -6.431449 3.104147 -1.2814 animalid0 481a519b-8b40-4450-9ec6-725181807d72 animalid0_030.ome.tiff Detection NaN Cells: marker- VeCB Polygon 11.5060 4.3172 4.3563 Right Negative -6.420685 3.141780 -1.3437 animalid0 fd28e09c-2c64-4750-b026-cd99e3526a57 animalid0_030.ome.tiff Detection NaN Cells: marker- VeCB Polygon 11.5284 4.2574 4.3364 Right Negative -6.437788 3.083737 -1.3636 animalid0 3d9ce034-f2ed-4c73-99be-f782363cf323 animalid0_030.ome.tiff Detection NaN Cells: marker- VeCB Polygon 11.5487 4.2033 4.2943 Right Negative -6.453296 3.031224 -1.4057 animalid0 In\u00a0[7]: Copied!
# plot distributions per regions\nfigs_regions = hq.display.plot_regions(df_regions, cfg)\n# specify which regions to plot\n# figs_regions = hq.display.plot_regions(df_regions, cfg, names_list=[\"GRN\", \"IRN\", \"MDRNv\"])\n\n# save as svg\n# figs_regions[0].savefig(r\"C:\\Users\\glegoc\\Downloads\\regions_count.svg\")\n# figs_regions[1].savefig(r\"C:\\Users\\glegoc\\Downloads\\regions_density.svg\")\n
# plot distributions per regions figs_regions = hq.display.plot_regions(df_regions, cfg) # specify which regions to plot # figs_regions = hq.display.plot_regions(df_regions, cfg, names_list=[\"GRN\", \"IRN\", \"MDRNv\"]) # save as svg # figs_regions[0].savefig(r\"C:\\Users\\glegoc\\Downloads\\regions_count.svg\") # figs_regions[1].savefig(r\"C:\\Users\\glegoc\\Downloads\\regions_density.svg\") In\u00a0[8]: Copied!
# plot 1D distributions\nfig_distrib = hq.display.plot_1D_distributions(\n    dfs_distributions, cfg, df_coordinates=df_coordinates\n)\n
# plot 1D distributions fig_distrib = hq.display.plot_1D_distributions( dfs_distributions, cfg, df_coordinates=df_coordinates )

If there were several animal in the measurement file, it would be displayed as mean +/- sem instead.

In\u00a0[9]: Copied!
# plot heatmap (all types of cells pooled)\nfig_heatmap = hq.display.plot_2D_distributions(df_coordinates, cfg)\n
# plot heatmap (all types of cells pooled) fig_heatmap = hq.display.plot_2D_distributions(df_coordinates, cfg)"},{"location":"demo_notebooks/density_map.html","title":"Density map","text":"

Draw 2D heatmaps as density isolines.

This notebook does not actually use histoquant and relies only on brainglobe-heatmap to extract brain structures outlines.

Only the detections measurements with atlas coordinates exported from QuPath are used.

You need to select the range of data to be used, the regions outlines will be extracted at the centroid of that range. Therefore, a range that is too large will be misleading and irrelevant.

In\u00a0[10]: Copied!
import brainglobe_heatmap as bgh\nimport matplotlib.pyplot as plt\nimport numpy as np\nimport pandas as pd\nimport seaborn as sns\n
import brainglobe_heatmap as bgh import matplotlib.pyplot as plt import numpy as np import pandas as pd import seaborn as sns In\u00a0[11]: Copied!
# path to the exported measurements from QuPath\nfilename = \"../../resources/cells_measurements_detections.tsv\"\n
# path to the exported measurements from QuPath filename = \"../../resources/cells_measurements_detections.tsv\"

Settings

In\u00a0[12]: Copied!
# atlas to use\natlas_name = \"allen_mouse_10um\"\n# brain regions whose outlines will be plotted\nregions = [\"root\", \"CB\", \"MY\", \"GRN\", \"IRN\"]\n# range to include, in Allen coordinates, in microns\nap_lims = [9800, 10000]  # lims : [0, 13200] for coronal\nml_lims = [5600, 5800]  # lims : [0, 11400] for sagittal\ndv_lims = [3900, 4100]  # lims : [0, 8000] for top\n# number of isolines\nnlevels = 5\n# color mapping between classification and matplotlib color\npalette = {\"Cells: marker-\": \"#d8782f\", \"Cells: marker+\": \"#8ccb73\"}\n
# atlas to use atlas_name = \"allen_mouse_10um\" # brain regions whose outlines will be plotted regions = [\"root\", \"CB\", \"MY\", \"GRN\", \"IRN\"] # range to include, in Allen coordinates, in microns ap_lims = [9800, 10000] # lims : [0, 13200] for coronal ml_lims = [5600, 5800] # lims : [0, 11400] for sagittal dv_lims = [3900, 4100] # lims : [0, 8000] for top # number of isolines nlevels = 5 # color mapping between classification and matplotlib color palette = {\"Cells: marker-\": \"#d8782f\", \"Cells: marker+\": \"#8ccb73\"} In\u00a0[13]: Copied!
df = pd.read_csv(filename, sep=\"\\t\")\ndisplay(df.head())\n
df = pd.read_csv(filename, sep=\"\\t\") display(df.head())
 Image Object ID Object type Name Classification Parent ROI Atlas_X Atlas_Y Atlas_Z 0 animalid0_030.ome.tiff 5ff386a8-5abd-46d1-8e0d-f5c5365457c1 Detection NaN Cells: marker- VeCB Polygon 11.5230 4.2724 4.2767 1 animalid0_030.ome.tiff 9a2a9a8c-acbe-4308-bc5e-f3c9fd1754c0 Detection NaN Cells: marker- VeCB Polygon 11.5202 4.2784 4.4186 2 animalid0_030.ome.tiff 481a519b-8b40-4450-9ec6-725181807d72 Detection NaN Cells: marker- VeCB Polygon 11.5060 4.3172 4.3563 3 animalid0_030.ome.tiff fd28e09c-2c64-4750-b026-cd99e3526a57 Detection NaN Cells: marker- VeCB Polygon 11.5284 4.2574 4.3364 4 animalid0_030.ome.tiff 3d9ce034-f2ed-4c73-99be-f782363cf323 Detection NaN Cells: marker- VeCB Polygon 11.5487 4.2033 4.2943 

Here we can filter out classifications we don't wan't to display.

In\u00a0[14]: Copied!
# select objects\n# df = df[df[\"Classification\"] == \"example: classification\"]\n
# select objects # df = df[df[\"Classification\"] == \"example: classification\"] In\u00a0[15]: Copied!
# get outline coordinates in coronal (=frontal) orientation\ncoords_coronal = bgh.get_structures_slice_coords(\n    regions,\n    orientation=\"frontal\",\n    atlas_name=atlas_name,\n    position=(np.mean(ap_lims), 0, 0),\n)\n# get outline coordinates in sagittal orientation\ncoords_sagittal = bgh.get_structures_slice_coords(\n    regions,\n    orientation=\"sagittal\",\n    atlas_name=atlas_name,\n    position=(0, 0, np.mean(ml_lims)),\n)\n# get outline coordinates in top (=horizontal) orientation\ncoords_top = bgh.get_structures_slice_coords(\n    regions,\n    orientation=\"horizontal\",\n    atlas_name=atlas_name,\n    position=(0, np.mean(dv_lims), 0),\n)\n
# get outline coordinates in coronal (=frontal) orientation coords_coronal = bgh.get_structures_slice_coords( regions, orientation=\"frontal\", atlas_name=atlas_name, position=(np.mean(ap_lims), 0, 0), ) # get outline coordinates in sagittal orientation coords_sagittal = bgh.get_structures_slice_coords( regions, orientation=\"sagittal\", atlas_name=atlas_name, position=(0, 0, np.mean(ml_lims)), ) # get outline coordinates in top (=horizontal) orientation coords_top = bgh.get_structures_slice_coords( regions, orientation=\"horizontal\", atlas_name=atlas_name, position=(0, np.mean(dv_lims), 0), ) In\u00a0[16]: Copied!
# Coronal projection\n# select objects within the rostro-caudal range\ndf_coronal = df[\n    (df[\"Atlas_X\"] >= ap_lims[0] / 1000) & (df[\"Atlas_X\"] <= ap_lims[1] / 1000)\n]\n\nplt.figure()\n\nfor struct_name, contours in coords_coronal.items():\n    for cont in contours:\n        plt.fill(cont[:, 0] / 1000, cont[:, 1] / 1000, lw=1, fc=\"none\", ec=\"k\")\n\n# see https://seaborn.pydata.org/generated/seaborn.kdeplot.html to customize\nax = sns.kdeplot(\n    df_coronal,\n    x=\"Atlas_Z\",\n    y=\"Atlas_Y\",\n    hue=\"Classification\",\n    levels=nlevels,\n    common_norm=False,\n    palette=palette,\n)\nax.invert_yaxis()\nsns.despine(left=True, bottom=True)\nplt.axis(\"equal\")\nplt.xlabel(None)\nplt.ylabel(None)\nplt.xticks([])\nplt.yticks([])\nplt.plot([2, 3], [8, 8], \"k\", linewidth=3)\nplt.text(2, 7.9, \"1 mm\")\n
# Coronal projection # select objects within the rostro-caudal range df_coronal = df[ (df[\"Atlas_X\"] >= ap_lims[0] / 1000) & (df[\"Atlas_X\"] <= ap_lims[1] / 1000) ] plt.figure() for struct_name, contours in coords_coronal.items(): for cont in contours: plt.fill(cont[:, 0] / 1000, cont[:, 1] / 1000, lw=1, fc=\"none\", ec=\"k\") # see https://seaborn.pydata.org/generated/seaborn.kdeplot.html to customize ax = sns.kdeplot( df_coronal, x=\"Atlas_Z\", y=\"Atlas_Y\", hue=\"Classification\", levels=nlevels, common_norm=False, palette=palette, ) ax.invert_yaxis() sns.despine(left=True, bottom=True) plt.axis(\"equal\") plt.xlabel(None) plt.ylabel(None) plt.xticks([]) plt.yticks([]) plt.plot([2, 3], [8, 8], \"k\", linewidth=3) plt.text(2, 7.9, \"1 mm\")
 Out[16]: 
Text(2, 7.9, '1 mm')
 In\u00a0[17]: Copied! 
# Sagittal projection\n# select objects within the medio-lateral range\ndf_sagittal = df[\n    (df[\"Atlas_Z\"] >= ml_lims[0] / 1000) & (df[\"Atlas_Z\"] <= ml_lims[1] / 1000)\n]\n\nplt.figure()\n\nfor struct_name, contours in coords_sagittal.items():\n    for cont in contours:\n        plt.fill(cont[:, 0] / 1000, cont[:, 1] / 1000, lw=1, fc=\"none\", ec=\"k\")\n\n# see https://seaborn.pydata.org/generated/seaborn.kdeplot.html to customize\nax = sns.kdeplot(\n    df_sagittal,\n    x=\"Atlas_X\",\n    y=\"Atlas_Y\",\n    hue=\"Classification\",\n    levels=nlevels,\n    common_norm=False,\n    palette=palette,\n)\nax.invert_yaxis()\nsns.despine(left=True, bottom=True)\nplt.axis(\"equal\")\nplt.xlabel(None)\nplt.ylabel(None)\nplt.xticks([])\nplt.yticks([])\nplt.plot([2, 3], [7.1, 7.1], \"k\", linewidth=3)\nplt.text(2, 7, \"1 mm\")\n
# Sagittal projection # select objects within the medio-lateral range df_sagittal = df[ (df[\"Atlas_Z\"] >= ml_lims[0] / 1000) & (df[\"Atlas_Z\"] <= ml_lims[1] / 1000) ] plt.figure() for struct_name, contours in coords_sagittal.items(): for cont in contours: plt.fill(cont[:, 0] / 1000, cont[:, 1] / 1000, lw=1, fc=\"none\", ec=\"k\") # see https://seaborn.pydata.org/generated/seaborn.kdeplot.html to customize ax = sns.kdeplot( df_sagittal, x=\"Atlas_X\", y=\"Atlas_Y\", hue=\"Classification\", levels=nlevels, common_norm=False, palette=palette, ) ax.invert_yaxis() sns.despine(left=True, bottom=True) plt.axis(\"equal\") plt.xlabel(None) plt.ylabel(None) plt.xticks([]) plt.yticks([]) plt.plot([2, 3], [7.1, 7.1], \"k\", linewidth=3) plt.text(2, 7, \"1 mm\")
 Out[17]: 
Text(2, 7, '1 mm')
 In\u00a0[18]: Copied! 
# Top projection\n# select objects within the dorso-ventral range\ndf_top = df[(df[\"Atlas_Y\"] >= dv_lims[0] / 1000) & (df[\"Atlas_Y\"] <= dv_lims[1] / 1000)]\n\nplt.figure()\n\nfor struct_name, contours in coords_top.items():\n    for cont in contours:\n        plt.fill(-cont[:, 0] / 1000, cont[:, 1] / 1000, lw=1, fc=\"none\", ec=\"k\")\n\n# see https://seaborn.pydata.org/generated/seaborn.kdeplot.html to customize\nax = sns.kdeplot(\n    df_top,\n    x=\"Atlas_Z\",\n    y=\"Atlas_X\",\n    hue=\"Classification\",\n    levels=nlevels,\n    common_norm=False,\n    palette=palette,\n)\nax.invert_yaxis()\nsns.despine(left=True, bottom=True)\nplt.axis(\"equal\")\nplt.xlabel(None)\nplt.ylabel(None)\nplt.xticks([])\nplt.yticks([])\nplt.plot([0.5, 1.5], [0.5, 0.5], \"k\", linewidth=3)\nplt.text(0.5, 0.4, \"1 mm\")\n
# Top projection # select objects within the dorso-ventral range df_top = df[(df[\"Atlas_Y\"] >= dv_lims[0] / 1000) & (df[\"Atlas_Y\"] <= dv_lims[1] / 1000)] plt.figure() for struct_name, contours in coords_top.items(): for cont in contours: plt.fill(-cont[:, 0] / 1000, cont[:, 1] / 1000, lw=1, fc=\"none\", ec=\"k\") # see https://seaborn.pydata.org/generated/seaborn.kdeplot.html to customize ax = sns.kdeplot( df_top, x=\"Atlas_Z\", y=\"Atlas_X\", hue=\"Classification\", levels=nlevels, common_norm=False, palette=palette, ) ax.invert_yaxis() sns.despine(left=True, bottom=True) plt.axis(\"equal\") plt.xlabel(None) plt.ylabel(None) plt.xticks([]) plt.yticks([]) plt.plot([0.5, 1.5], [0.5, 0.5], \"k\", linewidth=3) plt.text(0.5, 0.4, \"1 mm\")
 Out[18]: 
Text(0.5, 0.4, '1 mm')
 In\u00a0[\u00a0]: Copied! 
\n
"},{"location":"demo_notebooks/fibers_coverage.html","title":"Fibers coverage","text":"

Plot regions coverage percentage in the spinal cord.

This showcases that any brainglobe atlases should be supported.

Here we're going to quantify the percentage of area of each spinal cord regions innervated by axons.

The \"area \u00b5m^2\" measurement for each annotations can be created in QuPath with a pixel classifier, using the Measure button.

We're going to consider that the \"area \u00b5m^2\" measurement generated by the pixel classifier is an object count. histoquant computes a density, which is the count in each region divided by its aera. Therefore, in this case, it will be actually the fraction of area covered by fibers in a given color.

The data was generated using QuPath with a pixel classifier on toy data.

In\u00a0[1]: Copied!
import pandas as pd\n\nimport histoquant as hq\n
import pandas as pd import histoquant as hq In\u00a0[2]: Copied!
# Full path to your configuration file, edited according to your need beforehand\nconfig_file = \"../../resources/demo_config_fibers.toml\"\n
# Full path to your configuration file, edited according to your need beforehand config_file = \"../../resources/demo_config_fibers.toml\" In\u00a0[3]: Copied!
# - Files\n# not important if only one animal\nanimal = \"animalid1-SC\"\n# set the full path to the annotations tsv file from QuPath\nannotations_file = \"../../resources/fibers_measurements_annotations.tsv\"\n
# - Files # not important if only one animal animal = \"animalid1-SC\" # set the full path to the annotations tsv file from QuPath annotations_file = \"../../resources/fibers_measurements_annotations.tsv\" In\u00a0[4]: Copied!
# get configuration\ncfg = hq.config.Config(config_file)\n
# get configuration cfg = hq.config.Config(config_file) In\u00a0[5]: Copied!
# read data\ndf_annotations = pd.read_csv(annotations_file, index_col=\"Object ID\", sep=\"\\t\")\ndf_detections = pd.DataFrame()  # empty DataFrame\n\n# remove annotations that are not brain regions\ndf_annotations = df_annotations[df_annotations[\"Classification\"] != \"Region*\"]\ndf_annotations = df_annotations[df_annotations[\"ROI\"] != \"Rectangle\"]\n\n# have a look\ndisplay(df_annotations.head())\n
# read data df_annotations = pd.read_csv(annotations_file, index_col=\"Object ID\", sep=\"\\t\") df_detections = pd.DataFrame() # empty DataFrame # remove annotations that are not brain regions df_annotations = df_annotations[df_annotations[\"Classification\"] != \"Region*\"] df_annotations = df_annotations[df_annotations[\"ROI\"] != \"Rectangle\"] # have a look display(df_annotations.head()) Image Object type Name Classification Parent ROI Centroid X \u00b5m Centroid Y \u00b5m Fibers: EGFP area \u00b5m^2 Fibers: DsRed area \u00b5m^2 ID Side Parent ID Area \u00b5m^2 Perimeter \u00b5m Object ID dcfe5196-4e8d-4126-b255-a9ea393c383a animalid1-SC_s1.ome.tiff Annotation Root NaN Root object (Image) Geometry 1353.70 1060.00 108993.1953 15533.3701 NaN NaN NaN 3172474.0 9853.3 acc74bc0-3dd0-4b3e-86e3-e6c7b681d544 animalid1-SC_s1.ome.tiff Annotation root Right: root Root Polygon 864.44 989.95 39162.8906 5093.2798 250.0 0.0 NaN 1603335.7 4844.2 94571cf9-f22b-453f-860c-eb13d0e72440 animalid1-SC_s1.ome.tiff Annotation WM Right: WM root Geometry 791.00 1094.60 20189.0469 2582.4824 130.0 0.0 250.0 884002.0 7927.8 473d65fb-fda4-4721-ba6f-cc659efc1d5a animalid1-SC_s1.ome.tiff Annotation vf Right: vf WM Polygon 984.31 1599.00 6298.3574 940.4100 70.0 0.0 130.0 281816.9 2719.5 449e2cd1-eca2-4708-83fe-651f378c3a14 animalid1-SC_s1.ome.tiff Annotation df Right: df WM Polygon 1242.90 401.26 1545.0750 241.3800 74.0 0.0 130.0 152952.8 1694.4 In\u00a0[6]: Copied!
# get distributions per regions, spatial distributions and coordinates\ndf_regions, dfs_distributions, df_coordinates = hq.process.process_animal(\n    animal, df_annotations, df_detections, cfg, compute_distributions=False\n)\n\n# convert the \"density \u00b5m^-2\" column, which is actually the coverage fraction, to a percentage\ndf_regions[\"density \u00b5m^-2\"] = df_regions[\"density \u00b5m^-2\"] * 100\n\n# have a look\ndisplay(df_regions.head())\n
# get distributions per regions, spatial distributions and coordinates df_regions, dfs_distributions, df_coordinates = hq.process.process_animal( animal, df_annotations, df_detections, cfg, compute_distributions=False ) # convert the \"density \u00b5m^-2\" column, which is actually the coverage fraction, to a percentage df_regions[\"density \u00b5m^-2\"] = df_regions[\"density \u00b5m^-2\"] * 100 # have a look display(df_regions.head()) Name hemisphere Area \u00b5m^2 Area mm^2 area \u00b5m^2 area mm^2 density \u00b5m^-2 density mm^-2 coverage index relative count relative density channel animal 0 10Sp Contra. 1749462.18 1.749462 53117.3701 53.11737 3.036211 30362.113973 1612.755645 0.036535 0.033062 Negative animalid1-SC 0 10Sp Contra. 1749462.18 1.749462 5257.1025 5.257103 0.300498 3004.98208 15.797499 0.030766 0.02085 Positive animalid1-SC 1 10Sp Ipsi. 1439105.93 1.439106 64182.9823 64.182982 4.459921 44599.206328 2862.51007 0.023524 0.023265 Negative animalid1-SC 1 10Sp Ipsi. 1439105.93 1.439106 8046.3375 8.046337 0.559121 5591.205854 44.988729 0.028911 0.022984 Positive animalid1-SC 2 10Sp both 3188568.11 3.188568 117300.3524 117.300352 3.678778 36787.783216 4315.219935 0.028047 0.025734 Negative animalid1-SC In\u00a0[7]: Copied!
# plot distributions per regions\nfig_regions = hq.display.plot_regions(df_regions, cfg)\n# specify which regions to plot\n# fig_regions = hq.display.plot_regions(df_regions, cfg, names_list=[\"Rh9\", \"Sr9\", \"8Sp\"])\n\n# save as svg\n# fig_regions[0].savefig(r\"C:\\Users\\glegoc\\Downloads\\nice_figure.svg\")\n
# plot distributions per regions fig_regions = hq.display.plot_regions(df_regions, cfg) # specify which regions to plot # fig_regions = hq.display.plot_regions(df_regions, cfg, names_list=[\"Rh9\", \"Sr9\", \"8Sp\"]) # save as svg # fig_regions[0].savefig(r\"C:\\Users\\glegoc\\Downloads\\nice_figure.svg\")"},{"location":"demo_notebooks/fibers_length_multi.html","title":"Fibers length in multi animals","text":"In\u00a0[1]: Copied!
import histoquant as hq\n
import histoquant as hq In\u00a0[2]: Copied!
# Full path to your configuration file, edited according to your need beforehand\nconfig_file = \"../../resources/demo_config_multi.toml\"\n
# Full path to your configuration file, edited according to your need beforehand config_file = \"../../resources/demo_config_multi.toml\" In\u00a0[3]: Copied!
# Files\nwdir = \"../../resources/multi\"\nanimals = [\"mouse0\", \"mouse1\"]\n
# Files wdir = \"../../resources/multi\" animals = [\"mouse0\", \"mouse1\"] In\u00a0[4]: Copied!
# get configuration\ncfg = hq.Config(config_file)\n
# get configuration cfg = hq.Config(config_file) In\u00a0[5]: Copied!
# get distributions per regions\ndf_regions, _, _ = hq.process.process_animals(\n    wdir, animals, cfg, compute_distributions=False\n)\n\n# have a look\ndisplay(df_regions.head(10))\n
# get distributions per regions df_regions, _, _ = hq.process.process_animals( wdir, animals, cfg, compute_distributions=False ) # have a look display(df_regions.head(10))
Processing mouse1: 100%|\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588| 2/2 [00:00<00:00, 15.24it/s]\n
Name hemisphere Area \u00b5m^2 Area mm^2 length \u00b5m length mm density \u00b5m^-1 density mm^-1 coverage index relative count relative density channel animal 0 ACVII Contra. 9099.04 0.009099 468.0381 0.468038 0.051438 51438.184688 24.07503 0.00064 0.022168 marker3 mouse0 1 ACVII Contra. 9099.04 0.009099 4260.4844 4.260484 0.468234 468234.495068 1994.905762 0.0019 0.056502 marker2 mouse0 2 ACVII Contra. 9099.04 0.009099 5337.7103 5.33771 0.586623 586623.45698 3131.226069 0.010104 0.242734 marker1 mouse0 3 ACVII Ipsi. 4609.90 0.004610 0.0 0.0 0.0 0.0 0.0 0.0 0.0 marker3 mouse0 4 ACVII Ipsi. 4609.90 0.004610 0.0 0.0 0.0 0.0 0.0 0.0 0.0 marker2 mouse0 5 ACVII Ipsi. 4609.90 0.004610 0.0 0.0 0.0 0.0 0.0 0.0 0.0 marker1 mouse0 6 ACVII both 13708.94 0.013709 468.0381 0.468038 0.034141 34141.086036 15.979329 0.000284 0.011001 marker3 mouse0 7 ACVII both 13708.94 0.013709 4260.4844 4.260484 0.310781 310781.460857 1324.079566 0.000934 0.030688 marker2 mouse0 8 ACVII both 13708.94 0.013709 5337.7103 5.33771 0.38936 389359.811918 2078.289878 0.00534 0.142623 marker1 mouse0 9 AMB Contra. 122463.80 0.122464 30482.7815 30.482782 0.248913 248912.588863 7587.548059 0.041712 0.107271 marker3 mouse0 In\u00a0[6]: Copied!
figs_regions = hq.display.plot_regions(df_regions, cfg)\n
figs_regions = hq.display.plot_regions(df_regions, cfg)"},{"location":"demo_notebooks/fibers_length_multi.html#fibers-length-in-multi-animals","title":"Fibers length in multi animals\u00b6","text":"

This example uses synthetic data to showcase how histoquant can be used in a pipeline.

Annotations measurements should be exported from QuPath, following the required directory structure.

Alternatively, you can merge all your CSV files yourself, one per animal, adding an animal ID to each table. Those can be processed with the histoquant.process.process_animal() function, in a loop, collecting the results at each iteration and finally concatenating the results. Finally, those can be used with display module. See the API reference for the process module.

"}]} \ No newline at end of file diff --git a/search/search_index.json b/search/search_index.json new file mode 100644 index 0000000..24cb6de --- /dev/null +++ b/search/search_index.json @@ -0,0 +1 @@ +{"config":{"lang":["en"],"separator":"[\\s\\-]+","pipeline":["stopWordFilter"]},"docs":[{"location":"index.html","title":"Introduction","text":"

Info

The documentation is under construction.

histoquant is a Python package aiming at quantifying histological data.

After ABBA registration of 2D histological slices and QuPath objects' detection, histoquant is used to :

  • compute metrics, such as objects density in each brain regions,
  • compute objects distributions in three three axes (rostro-caudal, dorso-ventral and medio-lateral),
  • compute averages and sem across animals,
  • displaying all the above.

This documentation contains histoquant installation instructions, ABBA installation instructions, guides to prepare images for the pipeline, detect objects with QuPath, register 2D slices on a 3D atlas with ABBA, along with examples.

In theory, histoquant should work with any measurements table with the required columns, but has been designed with ABBA and QuPath in mind.

Due to the IT environment of the laboratory, this documentation is very Windows-oriented but most of it should be applicable to Linux and MacOS as well by slightly adapting terminal commands.

"},{"location":"index.html#documentation-navigation","title":"Documentation navigation","text":"

The documentation outline is on the left panel, you can click on items to browse it. In each page, you'll get the table of contents on the right panel.

"},{"location":"index.html#useful-external-resources","title":"Useful external resources","text":"
  • Project repository : https://github.com/TeamNCMC/histoquant
  • QuPath documentation : https://qupath.readthedocs.io/en/stable/
  • Aligning Big Brain and Atlases (ABBA) documentation : https://abba-documentation.readthedocs.io/en/latest/
  • Brainglobe : https://brainglobe.info/
  • BraiAn, a similar but published and way more feature-packed project : https://silvalab.codeberg.page/BraiAn/
  • Image.sc community forum : https://forum.image.sc/
  • Introduction to Bioimage Analysis, an interactive book written by QuPath's creator : https://bioimagebook.github.io/index.html
"},{"location":"index.html#credits","title":"Credits","text":"

histoquant has been primarly developed by Guillaume Le Goc in Julien Bouvier's lab at NeuroPSI.

The documentation itself is built with MkDocs using the Material theme.

"},{"location":"api-compute.html","title":"histoquant.compute","text":"

compute module, part of histoquant.

Contains actual computation functions.

"},{"location":"api-compute.html#histoquant.compute.get_distribution","title":"get_distribution(df, col, hue, hue_filter, per_commonnorm, binlim, nbins=100)","text":"

Computes distribution of objects.

A global distribution using only col is computed, then it computes a distribution distinguishing values in the hue column. For the latter, it is possible to use a subset of the data ony, based on another column using hue_filter. This another column is determined with hue, if the latter is \"hemisphere\", then hue_filter is used in the \"channel\" color and vice-versa. per_commonnorm controls how they are normalized, either as a whole (True) or independantly (False).

Use cases : (1) single-channel, two hemispheres : col=x, hue=hemisphere, hue_filter=\"\", per_commonorm=True. Computes a distribution for each hemisphere, the sum of the area of both is equal to 1. (2) three-channels, one hemisphere : col=x, hue=channel, hue_filter=\"Ipsi.\", per_commonnorm=False. Computes a distribution for each channel only for points in the ipsilateral hemisphere. Each curve will have an area of 1.

Parameters:

Name Type Description Default df DataFrame required col str

Key in df, used to compute the distributions.

required hue str

Key in df. Criterion for additional distributions.

required hue_filter str

Further filtering for \"per\" distribution. - hue = channel : value is the name of one of the hemisphere - hue = hemisphere : value can be the name of a channel, a list of such or \"all\"

required per_commonnorm bool

Use common normalization for all hues (per argument).

required binlim list or tuple

First bin left edge and last bin right edge.

required nbins int

Number of bins. Default is 100.

100

Returns:

Name Type Description df_distribution DataFrame

DataFrame with bins, distribution, count and their per-hemisphere or per-channel variants.

Source code in histoquant/compute.py
def get_distribution(\n    df: pd.DataFrame,\n    col: str,\n    hue: str,\n    hue_filter: dict,\n    per_commonnorm: bool,\n    binlim: tuple | list,\n    nbins=100,\n) -> pd.DataFrame:\n    \"\"\"\n    Computes distribution of objects.\n\n    A global distribution using only `col` is computed, then it computes a distribution\n    distinguishing values in the `hue` column. For the latter, it is possible to use a\n    subset of the data ony, based on another column using `hue_filter`. This another\n    column is determined with `hue`, if the latter is \"hemisphere\", then `hue_filter` is\n    used in the \"channel\" color and vice-versa.\n    `per_commonnorm` controls how they are normalized, either as a whole (True) or\n    independantly (False).\n\n    Use cases :\n    (1) single-channel, two hemispheres : `col=x`, `hue=hemisphere`, `hue_filter=\"\"`,\n    `per_commonorm=True`. Computes a distribution for each hemisphere, the sum of the\n    area of both is equal to 1.\n    (2) three-channels, one hemisphere : `col=x`, hue=`channel`,\n    `hue_filter=\"Ipsi.\", per_commonnorm=False`. Computes a distribution for each channel\n    only for points in the ipsilateral hemisphere. Each curve will have an area of 1.\n\n    Parameters\n    ----------\n    df : pandas.DataFrame\n    col : str\n        Key in `df`, used to compute the distributions.\n    hue : str\n        Key in `df`. Criterion for additional distributions.\n    hue_filter : str\n        Further filtering for \"per\" distribution.\n        - hue = channel : value is the name of one of the hemisphere\n        - hue = hemisphere : value can be the name of a channel, a list of such or \"all\"\n    per_commonnorm : bool\n        Use common normalization for all hues (per argument).\n    binlim : list or tuple\n        First bin left edge and last bin right edge.\n    nbins : int, optional\n        Number of bins. Default is 100.\n\n    Returns\n    -------\n    df_distribution : pandas.DataFrame\n        DataFrame with `bins`, `distribution`, `count` and their per-hemisphere or\n        per-channel variants.\n\n    \"\"\"\n\n    # - Preparation\n    bin_edges = np.linspace(*binlim, nbins + 1)  # create bins\n    df_distribution = []  # prepare list of distributions\n\n    # - Both hemispheres, all channels\n    # get raw count per bins (histogram)\n    count, bin_edges = np.histogram(df[col], bin_edges)\n    # get normalized count (pdf)\n    distribution, _ = np.histogram(df[col], bin_edges, density=True)\n    # get bin centers rather than edges to plot them\n    bin_centers = bin_edges[:-1] + np.diff(bin_edges) / 2\n\n    # make a DataFrame out of that\n    df_distribution.append(\n        pd.DataFrame(\n            {\n                \"bins\": bin_centers,\n                \"distribution\": distribution,\n                \"count\": count,\n                \"hemisphere\": \"both\",\n                \"channel\": \"all\",\n                \"axis\": col,  # keep track of what col. was used\n            }\n        )\n    )\n\n    # - Per additional criterion\n    # select data\n    df_sub = select_hemisphere_channel(df, hue, hue_filter, False)\n    hue_values = df[hue].unique()  # get grouping values\n    # total number of datapoints in the subset used for additional distribution\n    length_total = len(df_sub)\n\n    for value in hue_values:\n        # select part and coordinates\n        df_part = df_sub.loc[df_sub[hue] == value, col]\n\n        # get raw count per bins (histogram)\n        count, bin_edges = np.histogram(df_part, bin_edges)\n        # get normalized count (pdf)\n        distribution, _ = np.histogram(df_part, bin_edges, density=True)\n\n        if per_commonnorm:\n            # re-normalize so that the sum of areas of all sub-parts is 1\n            length_part = len(df_part)  # number of datapoints in that hemisphere\n            distribution *= length_part / length_total\n\n        # get bin centers rather than edges to plot them\n        bin_centers = bin_edges[:-1] + np.diff(bin_edges) / 2\n\n        # make a DataFrame out of that\n        df_distribution.append(\n            pd.DataFrame(\n                {\n                    \"bins\": bin_centers,\n                    \"distribution\": distribution,\n                    \"count\": count,\n                    hue: value,\n                    \"channel\" if hue == \"hemisphere\" else \"hemisphere\": hue_filter,\n                    \"axis\": col,  # keep track of what col. was used\n                }\n            )\n        )\n\n    return pd.concat(df_distribution)\n
"},{"location":"api-compute.html#histoquant.compute.get_regions_metrics","title":"get_regions_metrics(df_annotations, object_type, channel_names, meas_base_name, metrics_names)","text":"

Get a new DataFrame with cumulated axons segments length in each brain regions.

This is the quantification per brain regions for fibers-like objects, eg. axons. The returned DataFrame has columns \"cum. length \u00b5m\", \"cum. length mm\", \"density \u00b5m^-1\", \"density mm^-1\", \"coverage index\".

Parameters:

Name Type Description Default df_annotations DataFrame

DataFrame with an entry for each brain regions, with columns \"Area \u00b5m^2\", \"Name\", \"hemisphere\", and \"{object_type: channel} Length \u00b5m\".

required object_type str

Object type (primary classification).

required channel_names dict

Map between original channel names to something else.

required meas_base_name str required metrics_names dict required

Returns:

Name Type Description df_regions DataFrame

DataFrame with brain regions name, area and metrics.

Source code in histoquant/compute.py
def get_regions_metrics(\n    df_annotations: pd.DataFrame,\n    object_type: str,\n    channel_names: dict,\n    meas_base_name: str,\n    metrics_names: dict,\n) -> pd.DataFrame:\n    \"\"\"\n    Get a new DataFrame with cumulated axons segments length in each brain regions.\n\n    This is the quantification per brain regions for fibers-like objects, eg. axons. The\n    returned DataFrame has columns \"cum. length \u00b5m\", \"cum. length mm\", \"density \u00b5m^-1\",\n    \"density mm^-1\", \"coverage index\".\n\n    Parameters\n    ----------\n    df_annotations : pandas.DataFrame\n        DataFrame with an entry for each brain regions, with columns \"Area \u00b5m^2\",\n        \"Name\", \"hemisphere\", and \"{object_type: channel} Length \u00b5m\".\n    object_type : str\n        Object type (primary classification).\n    channel_names : dict\n        Map between original channel names to something else.\n    meas_base_name : str\n    metrics_names : dict\n\n    Returns\n    -------\n    df_regions : pandas.DataFrame\n        DataFrame with brain regions name, area and metrics.\n\n    \"\"\"\n    # get columns names\n    cols = df_annotations.columns\n    # get columns with fibers lengths\n    cols_colors = cols[\n        cols.str.startswith(object_type) & cols.str.endswith(meas_base_name)\n    ]\n    # select relevant data\n    cols_to_select = pd.Index([\"Name\", \"hemisphere\", \"Area \u00b5m^2\"]).append(cols_colors)\n    # sum lengths and areas of each brain regions\n    df_regions = (\n        df_annotations[cols_to_select]\n        .groupby([\"Name\", \"hemisphere\"])\n        .sum()\n        .reset_index()\n    )\n\n    # get measurement for both hemispheres (sum)\n    df_both = df_annotations[cols_to_select].groupby([\"Name\"]).sum().reset_index()\n    df_both[\"hemisphere\"] = \"both\"\n    df_regions = (\n        pd.concat([df_regions, df_both], ignore_index=True)\n        .sort_values(by=\"Name\")\n        .reset_index()\n        .drop(columns=\"index\")\n    )\n\n    # rename measurement columns to lower case\n    df_regions = df_regions.rename(\n        columns={\n            k: k.replace(meas_base_name, meas_base_name.lower()) for k in cols_colors\n        }\n    )\n\n    # update names\n    meas_base_name = meas_base_name.lower()\n    cols = df_regions.columns\n    cols_colors = cols[\n        cols.str.startswith(object_type) & cols.str.endswith(meas_base_name)\n    ]\n\n    # convert area in mm^2\n    df_regions[\"Area mm^2\"] = df_regions[\"Area \u00b5m^2\"] / 1e6\n\n    # prepare metrics\n    if \"\u00b5m\" in meas_base_name:\n        # fibers : convert to mm\n        cols_to_convert = pd.Index([col for col in cols_colors if \"\u00b5m\" in col])\n        df_regions[cols_to_convert.str.replace(\"\u00b5m\", \"mm\")] = (\n            df_regions[cols_to_convert] / 1000\n        )\n        metrics = [meas_base_name, meas_base_name.replace(\"\u00b5m\", \"mm\")]\n    else:\n        # objects : count\n        metrics = [meas_base_name]\n\n    # density = measurement / area\n    metric = metrics_names[\"density \u00b5m^-2\"]\n    df_regions[cols_colors.str.replace(meas_base_name, metric)] = df_regions[\n        cols_colors\n    ].divide(df_regions[\"Area \u00b5m^2\"], axis=0)\n    metrics.append(metric)\n    metric = metrics_names[\"density mm^-2\"]\n    df_regions[cols_colors.str.replace(meas_base_name, metric)] = df_regions[\n        cols_colors\n    ].divide(df_regions[\"Area mm^2\"], axis=0)\n    metrics.append(metric)\n\n    # coverage index = measurement\u00b2 / area\n    metric = metrics_names[\"coverage index\"]\n    df_regions[cols_colors.str.replace(meas_base_name, metric)] = (\n        df_regions[cols_colors].pow(2).divide(df_regions[\"Area \u00b5m^2\"], axis=0)\n    )\n    metrics.append(metric)\n\n    # prepare relative metrics columns\n    metric = metrics_names[\"relative measurement\"]\n    cols_rel_meas = cols_colors.str.replace(meas_base_name, metric)\n    df_regions[cols_rel_meas] = np.nan\n    metrics.append(metric)\n    metric = metrics_names[\"relative density\"]\n    cols_dens = cols_colors.str.replace(meas_base_name, metrics_names[\"density mm^-2\"])\n    cols_rel_dens = cols_colors.str.replace(meas_base_name, metric)\n    df_regions[cols_rel_dens] = np.nan\n    metrics.append(metric)\n    # relative metrics should be defined within each hemispheres (left, right, both)\n    for hemisphere in df_regions[\"hemisphere\"].unique():\n        row_indexer = df_regions[\"hemisphere\"] == hemisphere\n\n        # relative measurement = measurement / total measurement\n        df_regions.loc[row_indexer, cols_rel_meas] = (\n            df_regions.loc[row_indexer, cols_colors]\n            .divide(df_regions.loc[row_indexer, cols_colors].sum())\n            .to_numpy()\n        )\n\n        # relative density = density / total density\n        df_regions.loc[row_indexer, cols_rel_dens] = (\n            df_regions.loc[\n                row_indexer,\n                cols_dens,\n            ]\n            .divide(df_regions.loc[row_indexer, cols_dens].sum())\n            .to_numpy()\n        )\n\n    # collect channel names\n    channels = (\n        cols_colors.str.replace(object_type + \": \", \"\")\n        .str.replace(\" \" + meas_base_name, \"\")\n        .values.tolist()\n    )\n    # collect measurements columns names\n    cols_metrics = df_regions.columns.difference(\n        pd.Index([\"Name\", \"hemisphere\", \"Area \u00b5m^2\", \"Area mm^2\"])\n    )\n    for metric in metrics:\n        cols_to_cat = [f\"{object_type}: {cn} {metric}\" for cn in channels]\n        # make sure it's part of available metrics\n        if not set(cols_to_cat) <= set(cols_metrics):\n            raise ValueError(f\"{cols_to_cat} not in DataFrame.\")\n        # group all colors in the same colors\n        df_regions[metric] = df_regions[cols_to_cat].values.tolist()\n        # remove original data\n        df_regions = df_regions.drop(columns=cols_to_cat)\n\n    # add a color tag, given their names in the configuration file\n    df_regions[\"channel\"] = len(df_regions) * [[channel_names[k] for k in channels]]\n    metrics.append(\"channel\")\n\n    # explode the dataframe so that each color has an entry\n    df_regions = df_regions.explode(metrics)\n\n    return df_regions\n
"},{"location":"api-compute.html#histoquant.compute.normalize_starter_cells","title":"normalize_starter_cells(df, cols, animal, info_file, channel_names)","text":"

Normalize data by the number of starter cells.

Parameters:

Name Type Description Default df DataFrame

Contains the data to be normalized.

required cols list - like

Columns to divide by the number of starter cells.

required animal str

Animal ID to parse the number of starter cells.

required info_file str

Full path to the TOML file with informations.

required channel_names dict

Map between original channel names to something else.

required

Returns:

Type Description DataFrame

Same df with normalized count.

Source code in histoquant/compute.py
def normalize_starter_cells(\n    df: pd.DataFrame, cols: list[str], animal: str, info_file: str, channel_names: dict\n) -> pd.DataFrame:\n    \"\"\"\n    Normalize data by the number of starter cells.\n\n    Parameters\n    ----------\n    df : pd.DataFrame\n        Contains the data to be normalized.\n    cols : list-like\n        Columns to divide by the number of starter cells.\n    animal : str\n        Animal ID to parse the number of starter cells.\n    info_file : str\n        Full path to the TOML file with informations.\n    channel_names : dict\n        Map between original channel names to something else.\n\n    Returns\n    -------\n    pd.DataFrame\n        Same `df` with normalized count.\n\n    \"\"\"\n    for channel in df[\"channel\"].unique():\n        # inverse mapping channel colors : names\n        reverse_channels = {v: k for k, v in channel_names.items()}\n        nstarters = get_starter_cells(animal, reverse_channels[channel], info_file)\n\n        for col in cols:\n            df.loc[df[\"channel\"] == channel, col] = (\n                df.loc[df[\"channel\"] == channel, col] / nstarters\n            )\n\n    return df\n
"},{"location":"api-config-config.html","title":"Api config config","text":"

object_type : name of QuPath base classification (eg. without the \": subclass\" part) segmentation_tag : type of segmentation, matches directory name, used only in the full pipeline

atlas

Information related to the atlas used

name : brainglobe-atlasapi atlas name type : \"brain\" or \"cord\" (eg. registration done in ABBA or abba_python). This will determine whether to flip Left/Right when determining detections hemisphere based on their coordinates. Also adapts the axes in the 2D heatmaps. midline : midline Z coordinates (left/right limit) in microns to determine detections hemisphere based on their coordinates. outline_structures : structures to show an outline of in heatmaps

channels

Information related to imaging channels

names

Must contain all classifications derived from \"object_type\" you want to process. In the form subclassification name = name to display on the plots

\"marker+\" : classification name = name to display \"marker-\" : add any number of sub-classification

colors

Must have same keys as \"names\" keys, in the form subclassification name = color, with color specified as a matplotlib named color, an RGB list or an hex code.

\"marker+\" : classification name = matplotlib color \"marker-\" : must have the same entries as \"names\".

hemispheres

Information related to hemispheres, same structure as channels

names

Left : Left = name to display Right : Right = name to display

colors

Must have same keys as names' keys

Left : ff516e\" # Left = matplotlib color (either #hex, color name or RGB list) Right : 960010\" # Right = matplotlib color

distributions

Spatial distributions parameters

stereo : use stereotaxic coordinates (as in Paxinos, only for mouse brain CCFv3) ap_lim : bins limits for anterio-posterior in mm ap_nbins : number of bins for anterio-posterior dv_lim : bins limits for dorso-ventral in mm dv_nbins : number of bins for dorso-ventral ml_lim : bins limits for medio-lateral in mm ml_nbins : number of bins for medio-lateral hue : color curves with this parameter, must be \"hemisphere\" or \"channel\" hue_filter : use only a subset of data

  • If hue=hemisphere : it should be a channel name, a list of such or \"all\"
  • If hue=channel : it should be a hemisphere name or \"both\"

common_norm : use a global normalization (eg. the sum of areas under all curves is 1). Otherwise, normalize each hue individually

display

Display parameters

show_injection : add a patch showing the extent of injection sites. Uses corresponding channel colors. Requires the information TOML configuration file set up cmap : matplotlib color map for 2D heatmaps cmap_nbins : number of bins for 2D heatmaps cmap_lim : color limits for 2D heatmaps

regions

Distributions per regions parameters

base_measurement : the name of the measurement in QuPath to derive others from. Usually \"Count\" or \"Length \u00b5m\" hue : color bars with this parameter, must be \"hemisphere\" or \"channel\" hue_filter : use only a subset of data

  • If hue=hemisphere : it should be a channel name, a list of such or \"all\"
  • If hue=channel : it should be a hemisphere name or \"both\"

hue_mirror : plot two hue_filter in mirror instead of discarding the others. For example, if hue=channel and hue_filter=\"both\", plots the two hemisphere in mirror. normalize_starter_cells : normalize non-relative metrics by the number of starter cells

metrics

Names of metrics. The keys are used internally in histoquant as is so should NOT be modified. The values will only chang etheir names in the ouput file

\"density \u00b5m^-2\" : relevant name \"density mm^-2\" : relevant name \"coverage index\" : relevant name \"relative measurement\" : relevant name \"relative density\" : relevant name

display

nregions : number of regions to display (sorted by max.) orientation : orientation of the bars (\"h\" or \"v\") order : order the regions by \"ontology\" or by \"max\". Set to \"max\" to provide a custom order dodge : enforce the bar not being stacked log_scale : use log. scale for metrics

metrics

name of metrics to display

\"count\" : real_name = display_name, with real_name the \"values\" in [regions.metrics] \"density mm^-2\"

files

Full path to information TOML files and atlas outlines for 2D heatmaps.

blacklist fusion outlines infos

"},{"location":"api-config.html","title":"histoquant.config","text":"

config module, part of histoquant.

Contains the Config class.

"},{"location":"api-config.html#histoquant.config.Config","title":"Config(config_file)","text":"

The configuration class.

Reads input configuration file and provides its constant.

Parameters:

Name Type Description Default config_file str

Full path to the configuration file to load.

required

Returns:

Name Type Description cfg Config object.

Constructor.

Source code in histoquant/config.py
def __init__(self, config_file):\n    \"\"\"Constructor.\"\"\"\n    with open(config_file, \"rb\") as fid:\n        cfg = tomllib.load(fid)\n\n        for key in cfg:\n            setattr(self, key, cfg[key])\n\n    self.config_file = config_file\n    self.bg_atlas = BrainGlobeAtlas(self.atlas[\"name\"], check_latest=False)\n    self.get_blacklist()\n    self.get_leaves_list()\n
"},{"location":"api-config.html#histoquant.config.Config.get_blacklist","title":"get_blacklist()","text":"

Wraps histoquant.utils.get_blacklist.

Source code in histoquant/config.py
def get_blacklist(self):\n    \"\"\"Wraps histoquant.utils.get_blacklist.\"\"\"\n\n    self.atlas[\"blacklist\"] = utils.get_blacklist(\n        self.files[\"blacklist\"], self.bg_atlas\n    )\n
"},{"location":"api-config.html#histoquant.config.Config.get_hue_palette","title":"get_hue_palette(mode)","text":"

Get color palette given hue.

Maps hue to colors in channels or hemispheres.

Parameters:

Name Type Description Default mode (hemisphere, channel) \"hemisphere\"

Returns:

Name Type Description palette dict

Maps a hue level to a color, usable in seaborn.

Source code in histoquant/config.py
def get_hue_palette(self, mode: str) -> dict:\n    \"\"\"\n    Get color palette given hue.\n\n    Maps hue to colors in channels or hemispheres.\n\n    Parameters\n    ----------\n    mode : {\"hemisphere\", \"channel\"}\n\n    Returns\n    -------\n    palette : dict\n        Maps a hue level to a color, usable in seaborn.\n\n    \"\"\"\n    params = getattr(self, mode)\n\n    if params[\"hue\"] == \"channel\":\n        # replace channels by their new names\n        palette = {\n            self.channels[\"names\"][k]: v for k, v in self.channels[\"colors\"].items()\n        }\n    elif params[\"hue\"] == \"hemisphere\":\n        # replace hemispheres by their new names\n        palette = {\n            self.hemispheres[\"names\"][k]: v\n            for k, v in self.hemispheres[\"colors\"].items()\n        }\n    else:\n        palette = None\n        warnings.warn(f\"hue={self.regions[\"display\"][\"hue\"]} not supported.\")\n\n    return palette\n
"},{"location":"api-config.html#histoquant.config.Config.get_injection_sites","title":"get_injection_sites(animals)","text":"

Get list of injection sites coordinates for each animals, for each channels.

Parameters:

Name Type Description Default animals list of str

List of animals.

required

Returns:

Name Type Description injection_sites dict

{\"x\": {channel0: [x]}, \"y\": {channel1: [y]}}

Source code in histoquant/config.py
def get_injection_sites(self, animals: list[str]) -> dict:\n    \"\"\"\n    Get list of injection sites coordinates for each animals, for each channels.\n\n    Parameters\n    ----------\n    animals : list of str\n        List of animals.\n\n    Returns\n    -------\n    injection_sites : dict\n        {\"x\": {channel0: [x]}, \"y\": {channel1: [y]}}\n\n    \"\"\"\n    injection_sites = {\n        axis: {channel: [] for channel in self.channels[\"names\"].keys()}\n        for axis in [\"x\", \"y\", \"z\"]\n    }\n\n    for animal in animals:\n        for channel in self.channels[\"names\"].keys():\n            injx, injy, injz = utils.get_injection_site(\n                animal,\n                self.files[\"infos\"],\n                channel,\n                stereo=self.distributions[\"stereo\"],\n            )\n            if injx is not None:\n                injection_sites[\"x\"][channel].append(injx)\n            if injy is not None:\n                injection_sites[\"y\"][channel].append(injy)\n            if injz is not None:\n                injection_sites[\"z\"][channel].append(injz)\n\n    return injection_sites\n
"},{"location":"api-config.html#histoquant.config.Config.get_leaves_list","title":"get_leaves_list()","text":"

Wraps utils.get_leaves_list.

Source code in histoquant/config.py
def get_leaves_list(self):\n    \"\"\"Wraps utils.get_leaves_list.\"\"\"\n\n    self.atlas[\"leaveslist\"] = utils.get_leaves_list(self.bg_atlas)\n
"},{"location":"api-display.html","title":"histoquant.display","text":"

display module, part of histoquant.

Contains display functions, essentially wrapping matplotlib and seaborn functions.

"},{"location":"api-display.html#histoquant.display.add_data_coverage","title":"add_data_coverage(df, ax, colors=None, **kwargs)","text":"

Add lines below the plot to represent data coverage.

Parameters:

Name Type Description Default df DataFrame

DataFrame with X_min and X_max on rows for each animals (on columns).

required ax Axes

Handle to axes where to add the patch.

required colors list or str or None

Colors for the patches, as a RGB list or hex list. Should be the same size as the number of patches to plot, eg. the number of columns in df. If None, default seaborn colors are used. If only one element, used for each animal.

None **kwargs passed to patches.Rectangle() {}

Returns:

Name Type Description ax Axes

Handle to updated axes.

Source code in histoquant/display.py
def add_data_coverage(\n    df: pd.DataFrame, ax: plt.Axes, colors: list | str | None = None, **kwargs\n) -> plt.Axes:\n    \"\"\"\n    Add lines below the plot to represent data coverage.\n\n    Parameters\n    ----------\n    df : pandas.DataFrame\n        DataFrame with `X_min` and `X_max` on rows for each animals (on columns).\n    ax : Axes\n        Handle to axes where to add the patch.\n    colors : list or str or None, optional\n        Colors for the patches, as a RGB list or hex list. Should be the same size as\n        the number of patches to plot, eg. the number of columns in `df`. If None,\n        default seaborn colors are used. If only one element, used for each animal.\n    **kwargs : passed to patches.Rectangle()\n\n    Returns\n    -------\n    ax : Axes\n        Handle to updated axes.\n\n    \"\"\"\n    # get colors\n    ncolumns = len(df.columns)\n    if not colors:\n        colors = sns.color_palette(n_colors=ncolumns)\n    elif isinstance(colors, str) or (isinstance(colors, list) & (len(colors) == 3)):\n        colors = [colors] * ncolumns\n    elif len(colors) != ncolumns:\n        warnings.warn(f\"Wrong number of colors ({len(colors)}), using default colors.\")\n        colors = sns.color_palette(n_colors=ncolumns)\n\n    # get patch height depending on current axis limits\n    ymin, ymax = ax.get_ylim()\n    height = (ymax - ymin) * 0.02\n\n    for animal, color in zip(df.columns, colors):\n        # get patch coordinates\n        ymin, ymax = ax.get_ylim()\n        ylength = ymax - ymin\n        ybottom = ymin - 0.02 * ylength\n        xleft = df.loc[\"X_min\", animal]\n        xright = df.loc[\"X_max\", animal]\n\n        # plot patch\n        ax.add_patch(\n            patches.Rectangle(\n                (xleft, ybottom),\n                xright - xleft,\n                height,\n                label=animal,\n                color=color,\n                **kwargs,\n            )\n        )\n\n        ax.autoscale(tight=True)  # set new axes limits\n\n    ax.autoscale()  # reset scale\n\n    return ax\n
"},{"location":"api-display.html#histoquant.display.add_injection_patch","title":"add_injection_patch(X, ax, **kwargs)","text":"

Add a patch representing the injection sites.

The patch will span from the minimal coordinate to the maximal. If plotted in stereotaxic coordinates, coordinates should be converted beforehand.

Parameters:

Name Type Description Default X list

Coordinates in mm for each animals. Can be empty to not plot anything.

required ax Axes

Handle to axes where to add the patch.

required **kwargs passed to Axes.axvspan {}

Returns:

Name Type Description ax Axes

Handle to updated Axes.

Source code in histoquant/display.py
def add_injection_patch(X: list, ax: plt.Axes, **kwargs) -> plt.Axes:\n    \"\"\"\n    Add a patch representing the injection sites.\n\n    The patch will span from the minimal coordinate to the maximal.\n    If plotted in stereotaxic coordinates, coordinates should be converted beforehand.\n\n    Parameters\n    ----------\n    X : list\n        Coordinates in mm for each animals. Can be empty to not plot anything.\n    ax : Axes\n        Handle to axes where to add the patch.\n    **kwargs : passed to Axes.axvspan\n\n    Returns\n    -------\n    ax : Axes\n        Handle to updated Axes.\n\n    \"\"\"\n    # plot patch\n    if len(X) > 0:\n        ax.axvspan(min(X), max(X), **kwargs)\n\n    return ax\n
"},{"location":"api-display.html#histoquant.display.draw_structure_outline","title":"draw_structure_outline(view='sagittal', structures=['root'], outline_file='', ax=None, microns=False, **kwargs)","text":"

Plot brain regions outlines in given projection.

This requires a file containing the structures outlines.

Parameters:

Name Type Description Default view str

Projection, \"sagittal\", \"coronal\" or \"top\". Default is \"sagittal\".

'sagittal' structures list[str]

List of structures acronyms whose outlines will be drawn. Default is [\"root\"].

['root'] outline_file str

Full path the outlines HDF5 file.

'' ax Axes or None

Axes where to plot the outlines. If None, get current axes (the default).

None microns bool

If False (default), converts the coordinates in mm.

False **kwargs passed to pyplot.plot() {}

Returns:

Name Type Description ax Axes Source code in histoquant/display.py
def draw_structure_outline(\n    view: str = \"sagittal\",\n    structures: list[str] = [\"root\"],\n    outline_file: str = \"\",\n    ax: plt.Axes | None = None,\n    microns: bool = False,\n    **kwargs,\n) -> plt.Axes:\n    \"\"\"\n    Plot brain regions outlines in given projection.\n\n    This requires a file containing the structures outlines.\n\n    Parameters\n    ----------\n    view : str\n        Projection, \"sagittal\", \"coronal\" or \"top\". Default is \"sagittal\".\n    structures : list[str]\n        List of structures acronyms whose outlines will be drawn. Default is [\"root\"].\n    outline_file : str\n        Full path the outlines HDF5 file.\n    ax : plt.Axes or None, optional\n        Axes where to plot the outlines. If None, get current axes (the default).\n    microns : bool, optional\n        If False (default), converts the coordinates in mm.\n    **kwargs : passed to pyplot.plot()\n\n    Returns\n    -------\n    ax : plt.Axes\n\n    \"\"\"\n    # get axes\n    if not ax:\n        ax = plt.gca()\n\n    # get units\n    if microns:\n        conv = 1\n    else:\n        conv = 1 / 1000\n\n    with h5py.File(outline_file) as f:\n        if view == \"sagittal\":\n            for structure in structures:\n                dsets = f[\"sagittal\"][structure]\n\n                for dset in dsets.values():\n                    ax.plot(dset[:, 0] * conv, dset[:, 1] * conv, **kwargs)\n\n        if view == \"coronal\":\n            for structure in structures:\n                dsets = f[\"coronal\"][structure]\n\n                for dset in dsets.values():\n                    ax.plot(dset[:, 0] * conv, dset[:, 1] * conv, **kwargs)\n\n        if view == \"top\":\n            for structure in structures:\n                dsets = f[\"top\"][structure]\n\n                for dset in dsets.values():\n                    ax.plot(dset[:, 0] * conv, dset[:, 1] * conv, **kwargs)\n\n    return ax\n
"},{"location":"api-display.html#histoquant.display.nice_bar_plot","title":"nice_bar_plot(df, x='', y=[''], hue='', ylabel=[''], orient='h', nx=None, ordering=None, names_list=None, hue_mirror=False, log_scale=False, bar_kws={}, pts_kws={})","text":"

Nice bar plot of per-region objects distribution.

This is used for objects distribution across brain regions. Shows the y metric (count, aeral density, cumulated length...) in each x categories (brain regions). orient controls wether the bars are shown horizontally (default) or vertically. Input df must have an additional \"hemisphere\" column. All y are plotted in the same figure as different subplots. nx controls the number of displayed regions.

Parameters:

Name Type Description Default df DataFrame required x str

Key in df.

'' y str

Key in df.

'' hue str

Key in df.

'' ylabel list of str

Y axis labels.

[''] orient h or v

\"h\" for horizontal bars (default) or \"v\" for vertical bars.

'h' nx None or int

Number of x to show in the plot. Default is None (no limit).

None ordering None or list[str] or max

Sorted list of acronyms. Data will be sorted follwowing this order, if \"max\", sorted by descending values, if None, not sorted (default).

None names_list list or None

List of names to display. If None (default), takes the most prominent overall ones.

None hue_mirror bool

If there are 2 groups, plot in mirror. Default is False.

False log_scale bool

Set the metrics in log scale. Default is False.

False bar_kws dict

Passed to seaborn.barplot().

{} pts_kws dict

Passed to seaborn.stripplot().

{}

Returns:

Name Type Description figs list

List of figures.

Source code in histoquant/display.py
def nice_bar_plot(\n    df: pd.DataFrame,\n    x: str = \"\",\n    y: list[str] = [\"\"],\n    hue: str = \"\",\n    ylabel: list[str] = [\"\"],\n    orient=\"h\",\n    nx: None | int = None,\n    ordering: None | list[str] | str = None,\n    names_list: None | list = None,\n    hue_mirror: bool = False,\n    log_scale: bool = False,\n    bar_kws: dict = {},\n    pts_kws: dict = {},\n) -> list[plt.Axes]:\n    \"\"\"\n    Nice bar plot of per-region objects distribution.\n\n    This is used for objects distribution across brain regions. Shows the `y` metric\n    (count, aeral density, cumulated length...) in each `x` categories (brain regions).\n    `orient` controls wether the bars are shown horizontally (default) or vertically.\n    Input `df` must have an additional \"hemisphere\" column. All `y` are plotted in the\n    same figure as different subplots. `nx` controls the number of displayed regions.\n\n    Parameters\n    ----------\n    df : pandas.DataFrame\n    x, y, hue : str\n        Key in `df`.\n    ylabel : list of str\n        Y axis labels.\n    orient : \"h\" or \"v\", optional\n        \"h\" for horizontal bars (default) or \"v\" for vertical bars.\n    nx : None or int, optional\n        Number of `x` to show in the plot. Default is None (no limit).\n    ordering : None or list[str] or \"max\", optional\n        Sorted list of acronyms. Data will be sorted follwowing this order, if \"max\",\n        sorted by descending values, if None, not sorted (default).\n    names_list : list or None, optional\n        List of names to display. If None (default), takes the most prominent overall\n        ones.\n    hue_mirror : bool, optional\n        If there are 2 groups, plot in mirror. Default is False.\n    log_scale : bool, optional\n        Set the metrics in log scale. Default is False.\n    bar_kws : dict\n        Passed to seaborn.barplot().\n    pts_kws : dict\n        Passed to seaborn.stripplot().\n\n    Returns\n    -------\n    figs : list\n        List of figures.\n\n    \"\"\"\n    figs = []\n    # loop for each features\n    for yi, ylabeli in zip(y, ylabel):\n        # prepare data\n        # get nx first most prominent regions\n        if not names_list:\n            names_list_plt = (\n                df.groupby([\"Name\"])[yi].mean().sort_values(ascending=False).index[0:nx]\n            )\n        else:\n            names_list_plt = names_list\n        dfplt = df[df[\"Name\"].isin(names_list_plt)]  # limit to those regions\n        # limit hierarchy list if provided\n        if isinstance(ordering, list):\n            order = [el for el in ordering if el in names_list_plt]\n        elif ordering == \"max\":\n            order = names_list_plt\n        else:\n            order = None\n\n        # reorder keys depending on orientation and create axes\n        if orient == \"h\":\n            xp = yi\n            yp = x\n            if hue_mirror:\n                nrows = 1\n                ncols = 2\n                sharex = None\n                sharey = \"all\"\n            else:\n                nrows = 1\n                ncols = 1\n                sharex = None\n                sharey = None\n        elif orient == \"v\":\n            xp = x\n            yp = yi\n            if hue_mirror:\n                nrows = 2\n                ncols = 1\n                sharex = \"all\"\n                sharey = None\n            else:\n                nrows = 1\n                ncols = 1\n                sharex = None\n                sharey = None\n        fig, axs = plt.subplots(nrows=nrows, ncols=ncols, sharex=sharex, sharey=sharey)\n\n        if hue_mirror:\n            # two graphs\n            ax1, ax2 = axs\n            # determine what will be mirrored\n            if hue == \"channel\":\n                hue_filter = \"hemisphere\"\n            elif hue == \"hemisphere\":\n                hue_filter = \"channel\"\n            # select the two types (should be left/right or two channels)\n            hue_filters = dfplt[hue_filter].unique()[0:2]\n            hue_filters.sort()  # make sure it will be always in the same order\n\n            # plot\n            for filt, ax in zip(hue_filters, [ax1, ax2]):\n                dfplt2 = dfplt[dfplt[hue_filter] == filt]\n                ax = sns.barplot(\n                    dfplt2,\n                    x=xp,\n                    y=yp,\n                    hue=hue,\n                    estimator=\"mean\",\n                    errorbar=\"se\",\n                    orient=orient,\n                    order=order,\n                    ax=ax,\n                    **bar_kws,\n                )\n                # add points\n                ax = sns.stripplot(\n                    dfplt2, x=xp, y=yp, hue=hue, legend=False, ax=ax, **pts_kws\n                )\n\n                # cosmetics\n                if orient == \"h\":\n                    ax.set_title(f\"{hue_filter}: {filt}\")\n                    ax.set_ylabel(None)\n                    ax.set_ylim((nx + 0.5, -0.5))\n                    if log_scale:\n                        ax.set_xscale(\"log\")\n\n                elif orient == \"v\":\n                    if ax == ax1:\n                        # top title\n                        ax1.set_title(f\"{hue_filter}: {filt}\")\n                        ax.set_xlabel(None)\n                    elif ax == ax2:\n                        # use xlabel as bottom title\n                        ax2.set_xlabel(\n                            f\"{hue_filter}: {filt}\", fontsize=ax1.title.get_fontsize()\n                        )\n                    ax.set_xlim((-0.5, nx + 0.5))\n                    if log_scale:\n                        ax.set_yscale(\"log\")\n\n                    for label in ax.get_xticklabels():\n                        label.set_verticalalignment(\"center\")\n                        label.set_horizontalalignment(\"center\")\n\n            # tune axes cosmetics\n            if orient == \"h\":\n                ax1.set_xlabel(ylabeli)\n                ax2.set_xlabel(ylabeli)\n                ax1.set_xlim(\n                    ax1.get_xlim()[0], max((ax1.get_xlim()[1], ax2.get_xlim()[1]))\n                )\n                ax2.set_xlim(\n                    ax2.get_xlim()[0], max((ax1.get_xlim()[1], ax2.get_xlim()[1]))\n                )\n                ax1.invert_xaxis()\n                sns.despine(ax=ax1, left=True, top=True, right=False, bottom=False)\n                sns.despine(ax=ax2, left=False, top=True, right=True, bottom=False)\n                ax1.yaxis.tick_right()\n                ax1.tick_params(axis=\"y\", pad=20)\n                for label in ax1.get_yticklabels():\n                    label.set_verticalalignment(\"center\")\n                    label.set_horizontalalignment(\"center\")\n            elif orient == \"v\":\n                ax2.set_ylabel(ylabeli)\n                ax1.set_ylim(\n                    ax1.get_ylim()[0], max((ax1.get_ylim()[1], ax2.get_ylim()[1]))\n                )\n                ax2.set_ylim(\n                    ax2.get_ylim()[0], max((ax1.get_ylim()[1], ax2.get_ylim()[1]))\n                )\n                ax2.invert_yaxis()\n                sns.despine(ax=ax1, left=False, top=True, right=True, bottom=False)\n                sns.despine(ax=ax2, left=False, top=False, right=True, bottom=True)\n                for label in ax2.get_xticklabels():\n                    label.set_verticalalignment(\"center\")\n                    label.set_horizontalalignment(\"center\")\n                ax2.tick_params(axis=\"x\", labelrotation=90, pad=20)\n\n        else:\n            # one graph\n            ax = axs\n            # plot\n            ax = sns.barplot(\n                dfplt,\n                x=xp,\n                y=yp,\n                hue=hue,\n                estimator=\"mean\",\n                errorbar=\"se\",\n                orient=orient,\n                order=order,\n                ax=ax,\n                **bar_kws,\n            )\n            # add points\n            ax = sns.stripplot(\n                dfplt, x=xp, y=yp, hue=hue, legend=False, ax=ax, **pts_kws\n            )\n\n            # cosmetics\n            if orient == \"h\":\n                ax.set_xlabel(ylabeli)\n                ax.set_ylabel(None)\n                ax.set_ylim((nx + 0.5, -0.5))\n                if log_scale:\n                    ax.set_xscale(\"log\")\n            elif orient == \"v\":\n                ax.set_xlabel(None)\n                ax.set_ylabel(ylabeli)\n                ax.set_xlim((-0.5, nx + 0.5))\n                if log_scale:\n                    ax.set_yscale(\"log\")\n\n        fig.tight_layout(pad=0)\n        figs.append(fig)\n\n    return figs\n
"},{"location":"api-display.html#histoquant.display.nice_distribution_plot","title":"nice_distribution_plot(df, x='', y='', hue=None, xlabel='', ylabel='', injections_sites={}, channel_colors={}, channel_names={}, ax=None, **kwargs)","text":"

Nice plot of 1D distribution of objects.

Parameters:

Name Type Description Default df DataFrame required x str

Keys in df.

'' y str

Keys in df.

'' hue str or None

Key in df. If None, no hue is used.

None xlabel str

X and Y axes labels.

'' ylabel str

X and Y axes labels.

'' injections_sites dict

List of injection sites 1D coordinates in a dict with the channel name as key. If empty, injection site is not plotted (default).

{} channel_colors dict

Required if injections_sites is not empty, dict mapping channel names to a color.

{} channel_names dict

Required if injections_sites is not empty, dict mapping channel names to a display name.

{} ax Axes or None

Axes in which to plot the figure, if None, a new figure is created (default).

None **kwargs passed to seaborn.lineplot() {}

Returns:

Name Type Description ax matplotlib axes

Handle to axes.

Source code in histoquant/display.py
def nice_distribution_plot(\n    df: pd.DataFrame,\n    x: str = \"\",\n    y: str = \"\",\n    hue: str | None = None,\n    xlabel: str = \"\",\n    ylabel: str = \"\",\n    injections_sites: dict = {},\n    channel_colors: dict = {},\n    channel_names: dict = {},\n    ax: plt.Axes | None = None,\n    **kwargs,\n) -> plt.Axes:\n    \"\"\"\n    Nice plot of 1D distribution of objects.\n\n    Parameters\n    ----------\n    df : pandas.DataFrame\n    x, y : str\n        Keys in `df`.\n    hue : str or None, optional\n        Key in `df`. If None, no hue is used.\n    xlabel, ylabel : str\n        X and Y axes labels.\n    injections_sites : dict, optional\n        List of injection sites 1D coordinates in a dict with the channel name as key.\n        If empty, injection site is not plotted (default).\n    channel_colors : dict, optional\n        Required if injections_sites is not empty, dict mapping channel names to a\n        color.\n    channel_names : dict, optional\n        Required if injections_sites is not empty, dict mapping channel names to a\n        display name.\n    ax : Axes or None, optional\n        Axes in which to plot the figure, if None, a new figure is created (default).\n    **kwargs : passed to seaborn.lineplot()\n\n    Returns\n    -------\n    ax : matplotlib axes\n        Handle to axes.\n\n    \"\"\"\n    if not ax:\n        # create figure\n        _, ax = plt.subplots(figsize=(10, 6))\n\n    ax = sns.lineplot(\n        df,\n        x=x,\n        y=y,\n        hue=hue,\n        estimator=\"mean\",\n        errorbar=\"se\",\n        ax=ax,\n        **kwargs,\n    )\n\n    for channel in injections_sites.keys():\n        ax = add_injection_patch(\n            injections_sites[channel],\n            ax,\n            color=channel_colors[channel],\n            edgecolor=None,\n            alpha=0.25,\n            label=channel_names[channel] + \": inj. site\",\n        )\n\n    ax.legend()\n    ax.set_xlabel(xlabel)\n    ax.set_ylabel(ylabel)\n\n    return ax\n
"},{"location":"api-display.html#histoquant.display.nice_heatmap","title":"nice_heatmap(df, animals, x='', y='', xlabel='', ylabel='', invertx=False, inverty=False, **kwargs)","text":"

Nice plots of 2D distribution of boutons as a heatmap per animal.

Parameters:

Name Type Description Default df DataFrame required animals list-like of str

List of animals.

required x str

Keys in df.

'' y str

Keys in df.

'' xlabel str

Labels of x and y axes.

'' ylabel str

Labels of x and y axes.

'' invertx bool

Wether to inverse the x or y axes. Default is False.

False inverty bool

Wether to inverse the x or y axes. Default is False.

False **kwargs passed to seaborn.histplot() {}

Returns:

Name Type Description ax Axes or list of Axes

Handle to axes.

Source code in histoquant/display.py
def nice_heatmap(\n    df: pd.DataFrame,\n    animals: tuple[str] | list[str],\n    x: str = \"\",\n    y: str = \"\",\n    xlabel: str = \"\",\n    ylabel: str = \"\",\n    invertx: bool = False,\n    inverty: bool = False,\n    **kwargs,\n) -> list[plt.Axes] | plt.Axes:\n    \"\"\"\n    Nice plots of 2D distribution of boutons as a heatmap per animal.\n\n    Parameters\n    ----------\n    df : pandas.DataFrame\n    animals : list-like of str\n        List of animals.\n    x, y : str\n        Keys in `df`.\n    xlabel, ylabel : str\n        Labels of x and y axes.\n    invertx, inverty : bool, optional\n        Wether to inverse the x or y axes. Default is False.\n    **kwargs : passed to seaborn.histplot()\n\n    Returns\n    -------\n    ax : Axes or list of Axes\n        Handle to axes.\n\n    \"\"\"\n\n    # 2D distribution, per animal\n    _, axs = plt.subplots(len(animals), 1, sharex=\"all\")\n\n    for animal, ax in zip(animals, axs):\n        ax = sns.histplot(\n            df[df[\"animal\"] == animal],\n            x=x,\n            y=y,\n            ax=ax,\n            **kwargs,\n        )\n        ax.set_xlabel(xlabel)\n        ax.set_ylabel(ylabel)\n        ax.set_title(animal)\n\n        if inverty:\n            ax.invert_yaxis()\n\n    if invertx:\n        axs[-1].invert_xaxis()  # only once since all x axes are shared\n\n    return axs\n
"},{"location":"api-display.html#histoquant.display.nice_joint_plot","title":"nice_joint_plot(df, x='', y='', xlabel='', ylabel='', invertx=False, inverty=False, outline_kws={}, ax=None, **kwargs)","text":"

Joint distribution.

Used to display a 2D heatmap of objects. This is more qualitative than quantitative, for display purposes.

Parameters:

Name Type Description Default df DataFrame required x str

Keys in df.

'' y str

Keys in df.

'' xlabel str

Label of x and y axes.

'' ylabel str

Label of x and y axes.

'' invertx bool

Whether to inverse the x or y axes. Default is False for both.

False inverty bool

Whether to inverse the x or y axes. Default is False for both.

False outline_kws dict

Passed to draw_structure_outline().

{} ax Axes or None

Axes to plot in. If None, draws in current axes (default).

None **kwargs

Passed to seaborn.histplot.

{}

Returns:

Name Type Description ax Axes Source code in histoquant/display.py
def nice_joint_plot(\n    df: pd.DataFrame,\n    x: str = \"\",\n    y: str = \"\",\n    xlabel: str = \"\",\n    ylabel: str = \"\",\n    invertx: bool = False,\n    inverty: bool = False,\n    outline_kws: dict = {},\n    ax: plt.Axes | None = None,\n    **kwargs,\n) -> plt.Figure:\n    \"\"\"\n    Joint distribution.\n\n    Used to display a 2D heatmap of objects. This is more qualitative than quantitative,\n    for display purposes.\n\n    Parameters\n    ----------\n    df : pandas.DataFrame\n    x, y : str\n        Keys in `df`.\n    xlabel, ylabel : str\n        Label of x and y axes.\n    invertx, inverty : bool, optional\n        Whether to inverse the x or y axes. Default is False for both.\n    outline_kws : dict\n        Passed to draw_structure_outline().\n    ax : plt.Axes or None, optional\n        Axes to plot in. If None, draws in current axes (default).\n    **kwargs\n        Passed to seaborn.histplot.\n\n    Returns\n    -------\n    ax : plt.Axes\n\n    \"\"\"\n    if not ax:\n        ax = plt.gca()\n\n    # plot outline\n    draw_structure_outline(ax=ax, **outline_kws)\n\n    # plot joint distribution\n    sns.histplot(\n        df,\n        x=x,\n        y=y,\n        ax=ax,\n        **kwargs,\n    )\n\n    # adjust axes\n    if invertx:\n        ax.invert_xaxis()\n    if inverty:\n        ax.invert_yaxis()\n\n    # labels\n    ax.set_xlabel(xlabel)\n    ax.set_ylabel(ylabel)\n\n    return ax\n
"},{"location":"api-display.html#histoquant.display.plot_1D_distributions","title":"plot_1D_distributions(dfs_distributions, cfg, df_coordinates=None)","text":"

Wraps nice_distribution_plot().

Source code in histoquant/display.py
def plot_1D_distributions(\n    dfs_distributions: list[pd.DataFrame],\n    cfg,\n    df_coordinates: pd.DataFrame = None,\n):\n    \"\"\"\n    Wraps nice_distribution_plot().\n    \"\"\"\n    # prepare figures\n    fig, axs_dist = plt.subplots(1, 3, sharey=True, figsize=(13, 6))\n    xlabels = [\n        \"Rostro-caudal position (mm)\",\n        \"Dorso-ventral position (mm)\",\n        \"Medio-lateral position (mm)\",\n    ]\n\n    # get animals\n    animals = []\n    for df in dfs_distributions:\n        animals.extend(df[\"animal\"].unique())\n    animals = set(animals)\n\n    # get injection sites\n    if cfg.distributions[\"display\"][\"show_injection\"]:\n        injection_sites = cfg.get_injection_sites(animals)\n    else:\n        injection_sites = {k: {} for k in range(3)}\n\n    # get color palette based on hue\n    hue = cfg.distributions[\"hue\"]\n    palette = cfg.get_hue_palette(\"distributions\")\n\n    # loop through each axis\n    for df_dist, ax_dist, xlabel, inj_sites in zip(\n        dfs_distributions, axs_dist, xlabels, injection_sites.values()\n    ):\n        # select data\n        if cfg.distributions[\"hue\"] == \"hemisphere\":\n            dfplt = df_dist[df_dist[\"hemisphere\"] != \"both\"]\n        elif cfg.distributions[\"hue\"] == \"channel\":\n            dfplt = df_dist[df_dist[\"channel\"] != \"all\"]\n\n        # plot\n        ax_dist = nice_distribution_plot(\n            dfplt,\n            x=\"bins\",\n            y=\"distribution\",\n            hue=hue,\n            xlabel=xlabel,\n            ylabel=\"normalized distribution\",\n            injections_sites=inj_sites,\n            channel_colors=cfg.channels[\"colors\"],\n            channel_names=cfg.channels[\"names\"],\n            linewidth=2,\n            palette=palette,\n            ax=ax_dist,\n        )\n\n        # add data coverage\n        if (\"Atlas_AP\" in df_dist[\"axis\"].unique()) & (df_coordinates is not None):\n            df_coverage = utils.get_data_coverage(df_coordinates)\n            ax_dist = add_data_coverage(df_coverage, ax_dist, edgecolor=None, alpha=0.5)\n            ax_dist.legend()\n        else:\n            ax_dist.legend().remove()\n\n    # - Distributions, per animal\n    if len(animals) > 1:\n        _, axs_dist = plt.subplots(1, 3, sharey=True)\n\n        # loop through each axis\n        for df_dist, ax_dist, xlabel, inj_sites in zip(\n            dfs_distributions, axs_dist, xlabels, injection_sites.values()\n        ):\n            # select data\n            df_dist_plot = df_dist[df_dist[\"hemisphere\"] == \"both\"]\n\n            # plot\n            ax_dist = nice_distribution_plot(\n                df_dist_plot,\n                x=\"bins\",\n                y=\"distribution\",\n                hue=\"animal\",\n                xlabel=xlabel,\n                ylabel=\"normalized distribution\",\n                injections_sites=inj_sites,\n                channel_colors=cfg.channels[\"colors\"],\n                channel_names=cfg.channels[\"names\"],\n                linewidth=2,\n                ax=ax_dist,\n            )\n\n    return fig\n
"},{"location":"api-display.html#histoquant.display.plot_2D_distributions","title":"plot_2D_distributions(df, cfg)","text":"

Wraps nice_joint_plot().

Source code in histoquant/display.py
def plot_2D_distributions(df: pd.DataFrame, cfg):\n    \"\"\"\n    Wraps nice_joint_plot().\n    \"\"\"\n    # -- 2D heatmap, all animals pooled\n    # prepare figure\n    fig_heatmap = plt.figure(figsize=(12, 9))\n\n    ax_sag = fig_heatmap.add_subplot(2, 2, 1)\n    ax_cor = fig_heatmap.add_subplot(2, 2, 2, sharey=ax_sag)\n    ax_top = fig_heatmap.add_subplot(2, 2, 3, sharex=ax_sag)\n    ax_cbar = fig_heatmap.add_subplot(2, 2, 4, box_aspect=15)\n\n    # prepare options\n    map_options = dict(\n        bins=cfg.distributions[\"display\"][\"cmap_nbins\"],\n        cmap=cfg.distributions[\"display\"][\"cmap\"],\n        rasterized=True,\n        thresh=10,\n        stat=\"count\",\n        vmin=cfg.distributions[\"display\"][\"cmap_lim\"][0],\n        vmax=cfg.distributions[\"display\"][\"cmap_lim\"][1],\n    )\n    outline_kws = dict(\n        structures=cfg.atlas[\"outline_structures\"],\n        outline_file=cfg.files[\"outlines\"],\n        linewidth=1.5,\n        color=\"k\",\n    )\n    cbar_kws = dict(label=\"count\")\n\n    # determine which axes are going to be inverted\n    if cfg.atlas[\"type\"] == \"brain\":\n        cor_invertx = True\n        cor_inverty = False\n        top_invertx = True\n        top_inverty = False\n    elif cfg.atlas[\"type\"] == \"cord\":\n        cor_invertx = False\n        cor_inverty = False\n        top_invertx = True\n        top_inverty = True\n\n    # - sagittal\n    # no need to invert axes because they are shared with the two other views\n    outline_kws[\"view\"] = \"sagittal\"\n    nice_joint_plot(\n        df,\n        x=\"Atlas_X\",\n        y=\"Atlas_Y\",\n        xlabel=\"Rostro-caudal (mm)\",\n        ylabel=\"Dorso-ventral (mm)\",\n        outline_kws=outline_kws,\n        ax=ax_sag,\n        **map_options,\n    )\n\n    # - coronal\n    outline_kws[\"view\"] = \"coronal\"\n    nice_joint_plot(\n        df,\n        x=\"Atlas_Z\",\n        y=\"Atlas_Y\",\n        xlabel=\"Medio-lateral (mm)\",\n        ylabel=\"Dorso-ventral (mm)\",\n        invertx=cor_invertx,\n        inverty=cor_inverty,\n        outline_kws=outline_kws,\n        ax=ax_cor,\n        **map_options,\n    )\n    ax_cor.invert_yaxis()\n\n    # - top\n    outline_kws[\"view\"] = \"top\"\n    nice_joint_plot(\n        df,\n        x=\"Atlas_X\",\n        y=\"Atlas_Z\",\n        xlabel=\"Rostro-caudal (mm)\",\n        ylabel=\"Medio-lateral (mm)\",\n        invertx=top_invertx,\n        inverty=top_inverty,\n        outline_kws=outline_kws,\n        ax=ax_top,\n        cbar=True,\n        cbar_ax=ax_cbar,\n        cbar_kws=cbar_kws,\n        **map_options,\n    )\n    fig_heatmap.suptitle(\"sagittal, coronal and top-view projections\")\n\n    # -- 2D heatmap per animals\n    # get animals\n    animals = df[\"animal\"].unique()\n    if len(animals) > 1:\n        # Rostro-caudal, dorso-ventral (sagittal)\n        _ = nice_heatmap(\n            df,\n            animals,\n            x=\"Atlas_X\",\n            y=\"Atlas_Y\",\n            xlabel=\"Rostro-caudal (mm)\",\n            ylabel=\"Dorso-ventral (mm)\",\n            invertx=True,\n            inverty=True,\n            cmap=\"OrRd\",\n            rasterized=True,\n            cbar=True,\n        )\n\n        # Medio-lateral, dorso-ventral (coronal)\n        _ = nice_heatmap(\n            df,\n            animals,\n            x=\"Atlas_Z\",\n            y=\"Atlas_Y\",\n            xlabel=\"Medio-lateral (mm)\",\n            ylabel=\"Dorso-ventral (mm)\",\n            inverty=True,\n            invertx=True,\n            cmap=\"OrRd\",\n            rasterized=True,\n        )\n\n    return fig_heatmap\n
"},{"location":"api-display.html#histoquant.display.plot_regions","title":"plot_regions(df, cfg, **kwargs)","text":"

Wraps nice_bar_plot().

Source code in histoquant/display.py
def plot_regions(df: pd.DataFrame, cfg, **kwargs):\n    \"\"\"\n    Wraps nice_bar_plot().\n    \"\"\"\n    # get regions order\n    if cfg.regions[\"display\"][\"order\"] == \"ontology\":\n        regions_order = [d[\"acronym\"] for d in cfg.bg_atlas.structures_list]\n    elif cfg.regions[\"display\"][\"order\"] == \"max\":\n        regions_order = \"max\"\n    else:\n        regions_order = None\n\n    # determine metrics to be plotted and color palette based on hue\n    metrics = [*cfg.regions[\"display\"][\"metrics\"].keys()]\n    hue = cfg.regions[\"hue\"]\n    palette = cfg.get_hue_palette(\"regions\")\n\n    # select data\n    dfplt = utils.select_hemisphere_channel(\n        df, hue, cfg.regions[\"hue_filter\"], cfg.regions[\"hue_mirror\"]\n    )\n\n    # prepare options\n    bar_kws = dict(\n        err_kws={\"linewidth\": 1.5},\n        dodge=cfg.regions[\"display\"][\"dodge\"],\n        palette=palette,\n    )\n    pts_kws = dict(\n        size=4,\n        edgecolor=\"auto\",\n        linewidth=0.75,\n        dodge=cfg.regions[\"display\"][\"dodge\"],\n        palette=palette,\n    )\n    # draw\n    figs = nice_bar_plot(\n        dfplt,\n        x=\"Name\",\n        y=metrics,\n        hue=hue,\n        ylabel=[*cfg.regions[\"display\"][\"metrics\"].values()],\n        orient=cfg.regions[\"display\"][\"orientation\"],\n        nx=cfg.regions[\"display\"][\"nregions\"],\n        ordering=regions_order,\n        hue_mirror=cfg.regions[\"hue_mirror\"],\n        log_scale=cfg.regions[\"display\"][\"log_scale\"],\n        bar_kws=bar_kws,\n        pts_kws=pts_kws,\n        **kwargs,\n    )\n\n    return figs\n
"},{"location":"api-io.html","title":"histoquant.io","text":"

io module, part of histoquant.

Contains loading and saving functions.

"},{"location":"api-io.html#histoquant.io.cat_csv_dir","title":"cat_csv_dir(directory, **kwargs)","text":"

Scans a directory for csv files and concatenate them into a single DataFrame.

Parameters:

Name Type Description Default directory str

Path to the directory to scan.

required **kwargs passed to pandas.read_csv() {}

Returns:

Name Type Description df DataFrame

All CSV files concatenated in a single DataFrame.

Source code in histoquant/io.py
def cat_csv_dir(directory, **kwargs) -> pd.DataFrame:\n    \"\"\"\n    Scans a directory for csv files and concatenate them into a single DataFrame.\n\n    Parameters\n    ----------\n    directory : str\n        Path to the directory to scan.\n    **kwargs : passed to pandas.read_csv()\n\n    Returns\n    -------\n    df : pandas.DataFrame\n        All CSV files concatenated in a single DataFrame.\n\n    \"\"\"\n    return pd.concat(\n        pd.read_csv(\n            os.path.join(directory, filename),\n            **kwargs,\n        )\n        for filename in os.listdir(directory)\n        if (filename.endswith(\".csv\"))\n        and not check_empty_file(os.path.join(directory, filename), threshold=1)\n    )\n
"},{"location":"api-io.html#histoquant.io.cat_data_dir","title":"cat_data_dir(directory, segtype, **kwargs)","text":"

Wraps either cat_csv_dir() or cat_json_dir() depending on segtype.

Parameters:

Name Type Description Default directory str

Path to the directory to scan.

required segtype str

\"synaptophysin\" or \"fibers\".

required **kwargs passed to cat_csv_dir() or cat_json_dir(). {}

Returns:

Name Type Description df DataFrame

All files concatenated in a single DataFrame.

Source code in histoquant/io.py
def cat_data_dir(directory: str, segtype: str, **kwargs) -> pd.DataFrame:\n    \"\"\"\n    Wraps either cat_csv_dir() or cat_json_dir() depending on `segtype`.\n\n    Parameters\n    ----------\n    directory : str\n        Path to the directory to scan.\n    segtype : str\n        \"synaptophysin\" or \"fibers\".\n    **kwargs : passed to cat_csv_dir() or cat_json_dir().\n\n    Returns\n    -------\n    df : pd.DataFrame\n        All files concatenated in a single DataFrame.\n\n    \"\"\"\n    if segtype in CSV_KW:\n        # remove kwargs for json\n        kwargs.pop(\"hemisphere_names\", None)\n        kwargs.pop(\"atlas\", None)\n        return cat_csv_dir(directory, **kwargs)\n    elif segtype in JSON_KW:\n        kwargs = {k: kwargs[k] for k in [\"hemisphere_names\", \"atlas\"] if k in kwargs}\n        return cat_json_dir(directory, **kwargs)\n    else:\n        raise ValueError(\n            f\"'{segtype}' not supported, unable to determine if CSV or JSON.\"\n        )\n
"},{"location":"api-io.html#histoquant.io.cat_json_dir","title":"cat_json_dir(directory, hemisphere_names, atlas)","text":"

Scans a directory for json files and concatenate them in a single DataFrame.

The json files must be generated with 'workflow_import_export.groovy\" from a QuPath project.

Parameters:

Name Type Description Default directory str

Path to the directory to scan.

required hemisphere_names dict

Maps between hemisphere names in the json files (\"Right\" and \"Left\") to something else (eg. \"Ipsi.\" and \"Contra.\").

required atlas BrainGlobeAtlas

Atlas to read regions from.

required

Returns:

Name Type Description df DataFrame

All JSON files concatenated in a single DataFrame.

Source code in histoquant/io.py
def cat_json_dir(\n    directory: str, hemisphere_names: dict, atlas: BrainGlobeAtlas\n) -> pd.DataFrame:\n    \"\"\"\n    Scans a directory for json files and concatenate them in a single DataFrame.\n\n    The json files must be generated with 'workflow_import_export.groovy\" from a QuPath\n    project.\n\n    Parameters\n    ----------\n    directory : str\n        Path to the directory to scan.\n    hemisphere_names : dict\n        Maps between hemisphere names in the json files (\"Right\" and \"Left\") to\n        something else (eg. \"Ipsi.\" and \"Contra.\").\n    atlas : BrainGlobeAtlas\n        Atlas to read regions from.\n\n    Returns\n    -------\n    df : pd.DataFrame\n        All JSON files concatenated in a single DataFrame.\n\n    \"\"\"\n    # list files\n    files_list = [\n        os.path.join(directory, filename)\n        for filename in os.listdir(directory)\n        if (filename.endswith(\".json\"))\n    ]\n\n    data = []  # prepare list of DataFrame\n    for filename in files_list:\n        with open(filename, \"rb\") as fid:\n            df = pd.DataFrame.from_dict(\n                orjson.loads(fid.read())[\"paths\"], orient=\"index\"\n            )\n            df[\"Image\"] = os.path.basename(filename).split(\"_detections\")[0]\n            data.append(df)\n\n    df = (\n        pd.concat(data)\n        .explode(\n            [\"x\", \"y\", \"z\", \"hemisphere\"]\n        )  # get an entry for each point of segments\n        .reset_index()\n        .rename(\n            columns=dict(\n                x=\"Atlas_X\",\n                y=\"Atlas_Y\",\n                z=\"Atlas_Z\",\n                index=\"Object ID\",\n                classification=\"Classification\",\n            )\n        )\n        .set_index(\"Object ID\")\n    )\n\n    # change hemisphere names\n    df[\"hemisphere\"] = df[\"hemisphere\"].map(hemisphere_names)\n\n    # add object type\n    df[\"Object type\"] = \"Detection\"\n\n    # add brain regions\n    df = utils.add_brain_region(df, atlas, col=\"Parent\")\n\n    return df\n
"},{"location":"api-io.html#histoquant.io.check_empty_file","title":"check_empty_file(filename, threshold=1)","text":"

Checks if a file is empty.

Empty is defined as a file whose number of lines is lower than or equal to threshold (to allow for headers).

Parameters:

Name Type Description Default filename str

Full path to the file to check.

required threshold int

If number of lines is lower than or equal to this value, it is considered as empty. Default is 1.

1

Returns:

Name Type Description empty bool

True if the file is empty as defined above.

Source code in histoquant/io.py
def check_empty_file(filename: str, threshold: int = 1) -> bool:\n    \"\"\"\n    Checks if a file is empty.\n\n    Empty is defined as a file whose number of lines is lower than or equal to\n    `threshold` (to allow for headers).\n\n    Parameters\n    ----------\n    filename : str\n        Full path to the file to check.\n    threshold : int, optional\n        If number of lines is lower than or equal to this value, it is considered as\n        empty. Default is 1.\n\n    Returns\n    -------\n    empty : bool\n        True if the file is empty as defined above.\n\n    \"\"\"\n    with open(filename, \"rb\") as fid:\n        nlines = sum(1 for _ in fid)\n\n    if nlines <= threshold:\n        return True\n    else:\n        return False\n
"},{"location":"api-io.html#histoquant.io.get_measurements_directory","title":"get_measurements_directory(wdir, animal, kind, segtype)","text":"

Get the directory with detections or annotations measurements for given animal ID.

Parameters:

Name Type Description Default wdir str

Base working directory.

required animal str

Animal ID.

required kind str

\"annotation\" or \"detection\".

required segtype str

Type of segmentation, eg. \"synaptophysin\".

required

Returns:

Name Type Description directory str

Path to detections or annotations directory.

Source code in histoquant/io.py
def get_measurements_directory(wdir, animal: str, kind: str, segtype: str) -> str:\n    \"\"\"\n    Get the directory with detections or annotations measurements for given animal ID.\n\n    Parameters\n    ----------\n    wdir : str\n        Base working directory.\n    animal : str\n        Animal ID.\n    kind : str\n        \"annotation\" or \"detection\".\n    segtype : str\n        Type of segmentation, eg. \"synaptophysin\".\n\n    Returns\n    -------\n    directory : str\n        Path to detections or annotations directory.\n\n    \"\"\"\n    bdir = os.path.join(wdir, animal, animal.lower() + \"_segmentation\", segtype)\n\n    if (kind == \"detection\") or (kind == \"detections\"):\n        return os.path.join(bdir, \"detections\")\n    elif (kind == \"annotation\") or (kind == \"annotations\"):\n        return os.path.join(bdir, \"annotations\")\n    else:\n        raise ValueError(\n            f\"kind = '{kind}' not supported. Choose 'detection' or 'annotation'.\"\n        )\n
"},{"location":"api-io.html#histoquant.io.load_dfs","title":"load_dfs(filepath, fmt, identifiers=['df_regions', 'df_coordinates', 'df_distribution_ap', 'df_distribution_dv', 'df_distribution_ml'])","text":"

Load DataFrames from file.

If fmt is \"h5\" (\"xslx\"), identifiers are interpreted as h5 group identifier (sheet name, respectively). If fmt is \"pickle\", \"csv\" or \"tsv\", identifiers are appended to filename. Path to the file can't have a dot (\".\") in it.

Parameters:

Name Type Description Default filepath str

Full path to the file(s), without extension.

required fmt (h5, csv, pickle, xlsx)

File(s) format.

\"h5\" identifiers list of str

List of identifiers to load from files. Defaults to the ones saved in histoquant.process.process_animals().

['df_regions', 'df_coordinates', 'df_distribution_ap', 'df_distribution_dv', 'df_distribution_ml']

Returns:

Type Description All requested DataFrames. Source code in histoquant/io.py
def load_dfs(\n    filepath: str,\n    fmt: str,\n    identifiers: list[str] = [\n        \"df_regions\",\n        \"df_coordinates\",\n        \"df_distribution_ap\",\n        \"df_distribution_dv\",\n        \"df_distribution_ml\",\n    ],\n):\n    \"\"\"\n    Load DataFrames from file.\n\n    If `fmt` is \"h5\" (\"xslx\"), identifiers are interpreted as h5 group identifier (sheet\n    name, respectively).\n    If `fmt` is \"pickle\", \"csv\" or \"tsv\", identifiers are appended to `filename`.\n    Path to the file can't have a dot (\".\") in it.\n\n    Parameters\n    ----------\n    filepath : str\n        Full path to the file(s), without extension.\n    fmt : {\"h5\", \"csv\", \"pickle\", \"xlsx\"}\n        File(s) format.\n    identifiers : list of str, optional\n        List of identifiers to load from files. Defaults to the ones saved in\n        histoquant.process.process_animals().\n\n    Returns\n    -------\n    All requested DataFrames.\n\n    \"\"\"\n    # ensure filename without extension\n    base_path = os.path.splitext(filepath)[0]\n    full_path = base_path + \".\" + fmt\n\n    res = []\n    if (fmt == \"h5\") or (fmt == \"hdf\") or (fmt == \"hdf5\"):\n        for identifier in identifiers:\n            res.append(pd.read_hdf(full_path, identifier))\n    elif fmt == \"xlsx\":\n        for identifier in identifiers:\n            res.append(pd.read_excel(full_path, sheet_name=identifier))\n    else:\n        for identifier in identifiers:\n            id_path = f\"{base_path}_{identifier}.{fmt}\"\n            if (fmt == \"pickle\") or (fmt == \"pkl\"):\n                res.append(pd.read_pickle(id_path))\n            elif fmt == \"csv\":\n                res.append(pd.read_csv(id_path))\n            elif fmt == \"tsv\":\n                res.append(pd.read_csv(id_path, sep=\"\\t\"))\n            else:\n                raise ValueError(f\"{fmt} is not supported.\")\n\n    return res\n
"},{"location":"api-io.html#histoquant.io.save_dfs","title":"save_dfs(out_dir, filename, dfs)","text":"

Save DataFrames to file.

File format is inferred from file name extension.

Parameters:

Name Type Description Default out_dir str

Output directory.

required filename _type_

File name.

required dfs dict

DataFrames to save, as {identifier: df}. If HDF5 or xlsx, all df are saved in the same file, otherwise identifier is appended to the file name.

required Source code in histoquant/io.py
def save_dfs(out_dir: str, filename, dfs: dict):\n    \"\"\"\n    Save DataFrames to file.\n\n    File format is inferred from file name extension.\n\n    Parameters\n    ----------\n    out_dir : str\n        Output directory.\n    filename : _type_\n        File name.\n    dfs : dict\n        DataFrames to save, as {identifier: df}. If HDF5 or xlsx, all df are saved in\n        the same file, otherwise identifier is appended to the file name.\n\n    \"\"\"\n    if not os.path.isdir(out_dir):\n        os.makedirs(out_dir)\n\n    basename, ext = os.path.splitext(filename)\n    if ext in [\".h5\", \".hdf\", \".hdf5\"]:\n        path = os.path.join(out_dir, filename)\n        for identifier, df in dfs.items():\n            df.to_hdf(path, key=identifier)\n    elif ext == \".xlsx\":\n        for identifier, df in dfs.items():\n            df.to_excel(path, sheet_name=identifier)\n    else:\n        for identifier, df in dfs.items():\n            path = os.path.join(out_dir, f\"{basename}_{identifier}{ext}\")\n            if ext in [\".pickle\", \".pkl\"]:\n                df.to_pickle(path)\n            elif ext == \".csv\":\n                df.to_csv(path)\n            elif ext == \".tsv\":\n                df.to_csv(path, sep=\"\\t\")\n            else:\n                raise ValueError(f\"{filename} has an unsupported extension.\")\n
"},{"location":"api-process.html","title":"histoquant.process","text":"

process module, part of histoquant.

Wraps other functions for a click&play behaviour. Relies on the configuration file.

"},{"location":"api-process.html#histoquant.process.process_animal","title":"process_animal(animal, df_annotations, df_detections, cfg, compute_distributions=True)","text":"

Quantify objects for one animal.

Fetch required files and compute objects' distributions in brain regions, spatial distributions and gather Atlas coordinates.

Parameters:

Name Type Description Default animal str

Animal ID.

required df_annotations DataFrame

DataFrames of QuPath Annotations and Detections.

required df_detections DataFrame

DataFrames of QuPath Annotations and Detections.

required cfg Config

The configuration loaded from TOML configuration file.

required compute_distributions bool

If False, do not compute the 1D distributions and return an empty list.Default is True.

True

Returns:

Name Type Description df_regions DataFrame

Metrics in brain regions. One entry for each hemisphere of each brain regions.

df_distribution list of pandas.DataFrame

Rostro-caudal distribution, as raw count and probability density function, in each axis.

df_coordinates DataFrame

Atlas coordinates of each points.

Source code in histoquant/process.py
def process_animal(\n    animal: str,\n    df_annotations: pd.DataFrame,\n    df_detections: pd.DataFrame,\n    cfg,\n    compute_distributions: bool = True,\n) -> tuple[pd.DataFrame, list[pd.DataFrame], pd.DataFrame]:\n    \"\"\"\n    Quantify objects for one animal.\n\n    Fetch required files and compute objects' distributions in brain regions, spatial\n    distributions and gather Atlas coordinates.\n\n    Parameters\n    ----------\n    animal : str\n        Animal ID.\n    df_annotations, df_detections : pd.DataFrame\n        DataFrames of QuPath Annotations and Detections.\n    cfg : histoquant.Config\n        The configuration loaded from TOML configuration file.\n    compute_distributions : bool, optional\n        If False, do not compute the 1D distributions and return an empty list.Default\n        is True.\n\n    Returns\n    -------\n    df_regions : pandas.DataFrame\n        Metrics in brain regions. One entry for each hemisphere of each brain regions.\n    df_distribution : list of pandas.DataFrame\n        Rostro-caudal distribution, as raw count and probability density function, in\n        each axis.\n    df_coordinates : pandas.DataFrame\n        Atlas coordinates of each points.\n\n    \"\"\"\n    # - Annotations data cleanup\n    # filter regions\n    df_annotations = utils.filter_df_regions(\n        df_annotations, [\"Root\", \"root\"], mode=\"remove\", col=\"Name\"\n    )\n    df_annotations = utils.filter_df_regions(\n        df_annotations, cfg.atlas[\"blacklist\"], mode=\"remove\", col=\"Name\"\n    )\n    # add hemisphere\n    df_annotations = utils.add_hemisphere(df_annotations, cfg.hemispheres[\"names\"])\n    # remove objects in non-leaf regions\n    df_annotations = utils.filter_df_regions(\n        df_annotations, cfg.atlas[\"leaveslist\"], mode=\"keep\", col=\"Name\"\n    )\n    # merge regions\n    df_annotations = utils.merge_regions(\n        df_annotations, col=\"Name\", fusion_file=cfg.files[\"fusion\"]\n    )\n    if compute_distributions:\n        # - Detections data cleanup\n        # remove objects not in selected classifications\n        df_detections = utils.filter_df_classifications(\n            df_detections, cfg.object_type, mode=\"keep\", col=\"Classification\"\n        )\n        # remove objects from blacklisted regions and \"Root\"\n        df_detections = utils.filter_df_regions(\n            df_detections, cfg.atlas[\"blacklist\"], mode=\"remove\", col=\"Parent\"\n        )\n        # add hemisphere\n        df_detections = utils.add_hemisphere(\n            df_detections,\n            cfg.hemispheres[\"names\"],\n            cfg.atlas[\"midline\"],\n            col=\"Atlas_Z\",\n            atlas_type=cfg.atlas[\"type\"],\n        )\n        # add detection channel\n        df_detections = utils.add_channel(\n            df_detections, cfg.object_type, cfg.channels[\"names\"]\n        )\n        # convert coordinates to mm\n        df_detections[[\"Atlas_X\", \"Atlas_Y\", \"Atlas_Z\"]] = df_detections[\n            [\"Atlas_X\", \"Atlas_Y\", \"Atlas_Z\"]\n        ].divide(1000)\n        # convert to sterotaxic coordinates\n        if cfg.distributions[\"stereo\"]:\n            (\n                df_detections[\"Atlas_AP\"],\n                df_detections[\"Atlas_DV\"],\n                df_detections[\"Atlas_ML\"],\n            ) = utils.ccf_to_stereo(\n                df_detections[\"Atlas_X\"],\n                df_detections[\"Atlas_Y\"],\n                df_detections[\"Atlas_Z\"],\n            )\n        else:\n            (\n                df_detections[\"Atlas_AP\"],\n                df_detections[\"Atlas_DV\"],\n                df_detections[\"Atlas_ML\"],\n            ) = (\n                df_detections[\"Atlas_X\"],\n                df_detections[\"Atlas_Y\"],\n                df_detections[\"Atlas_Z\"],\n            )\n\n    # - Computations\n    # get regions distributions\n    df_regions = compute.get_regions_metrics(\n        df_annotations,\n        cfg.object_type,\n        cfg.channels[\"names\"],\n        cfg.regions[\"base_measurement\"],\n        cfg.regions[\"metrics\"],\n    )\n    colstonorm = [v for v in cfg.regions[\"metrics\"].values() if \"relative\" not in v]\n\n    # normalize by starter cells\n    if cfg.regions[\"normalize_starter_cells\"]:\n        df_regions = compute.normalize_starter_cells(\n            df_regions, colstonorm, animal, cfg.files[\"infos\"], cfg.channels[\"names\"]\n        )\n\n    # get AP, DV, ML distributions in stereotaxic coordinates\n    if compute_distributions:\n        dfs_distributions = [\n            compute.get_distribution(\n                df_detections,\n                axis,\n                cfg.distributions[\"hue\"],\n                cfg.distributions[\"hue_filter\"],\n                cfg.distributions[\"common_norm\"],\n                stereo_lim,\n                nbins=nbins,\n            )\n            for axis, stereo_lim, nbins in zip(\n                [\"Atlas_AP\", \"Atlas_DV\", \"Atlas_ML\"],\n                [\n                    cfg.distributions[\"ap_lim\"],\n                    cfg.distributions[\"dv_lim\"],\n                    cfg.distributions[\"ml_lim\"],\n                ],\n                [\n                    cfg.distributions[\"ap_nbins\"],\n                    cfg.distributions[\"dv_nbins\"],\n                    cfg.distributions[\"dv_nbins\"],\n                ],\n            )\n        ]\n    else:\n        dfs_distributions = []\n\n    # add animal tag to each DataFrame\n    df_detections[\"animal\"] = animal\n    df_regions[\"animal\"] = animal\n    for df in dfs_distributions:\n        df[\"animal\"] = animal\n\n    return df_regions, dfs_distributions, df_detections\n
"},{"location":"api-process.html#histoquant.process.process_animals","title":"process_animals(wdir, animals, cfg, out_fmt=None, compute_distributions=True)","text":"

Get data from all animals and plot.

Parameters:

Name Type Description Default wdir str

Base working directory, containing animals folders.

required animals list-like of str

List of animals ID.

required cfg

Configuration object.

required out_fmt (None, h5, csv, tsv, xslx, pickle)

Output file(s) format, if None, nothing is saved (default).

None compute_distributions bool

If False, do not compute the 1D distributions and return an empty list.Default is True.

True

Returns:

Name Type Description df_regions DataFrame

Metrics in brain regions. One entry for each hemisphere of each brain regions.

df_distribution list of pandas.DataFrame

Rostro-caudal distribution, as raw count and probability density function, in each axis.

df_coordinates DataFrame

Atlas coordinates of each points.

Source code in histoquant/process.py
def process_animals(\n    wdir: str,\n    animals: list[str] | tuple[str],\n    cfg,\n    out_fmt: str | None = None,\n    compute_distributions: bool = True,\n) -> tuple[pd.DataFrame]:\n    \"\"\"\n    Get data from all animals and plot.\n\n    Parameters\n    ----------\n    wdir : str\n        Base working directory, containing `animals` folders.\n    animals : list-like of str\n        List of animals ID.\n    cfg: histoquant.Config\n        Configuration object.\n    out_fmt : {None, \"h5\", \"csv\", \"tsv\", \"xslx\", \"pickle\"}\n        Output file(s) format, if None, nothing is saved (default).\n    compute_distributions : bool, optional\n        If False, do not compute the 1D distributions and return an empty list.Default\n        is True.\n\n\n    Returns\n    -------\n    df_regions : pandas.DataFrame\n        Metrics in brain regions. One entry for each hemisphere of each brain regions.\n    df_distribution : list of pandas.DataFrame\n        Rostro-caudal distribution, as raw count and probability density function, in\n        each axis.\n    df_coordinates : pandas.DataFrame\n        Atlas coordinates of each points.\n\n    \"\"\"\n\n    # -- Preparation\n    df_regions = []\n    dfs_distributions = []\n    df_coordinates = []\n\n    # -- Processing\n    pbar = tqdm(animals)\n\n    for animal in pbar:\n        pbar.set_description(f\"Processing {animal}\")\n\n        # combine all detections and annotations from this animal\n        df_annotations = io.cat_csv_dir(\n            io.get_measurements_directory(\n                wdir, animal, \"annotation\", cfg.segmentation_tag\n            ),\n            index_col=\"Object ID\",\n            sep=\"\\t\",\n        )\n        if compute_distributions:\n            df_detections = io.cat_data_dir(\n                io.get_measurements_directory(\n                    wdir, animal, \"detection\", cfg.segmentation_tag\n                ),\n                cfg.segmentation_tag,\n                index_col=\"Object ID\",\n                sep=\"\\t\",\n                hemisphere_names=cfg.hemispheres[\"names\"],\n                atlas=cfg.bg_atlas,\n            )\n        else:\n            df_detections = pd.DataFrame()\n\n        # get results\n        df_reg, dfs_dis, df_coo = process_animal(\n            animal,\n            df_annotations,\n            df_detections,\n            cfg,\n            compute_distributions=compute_distributions,\n        )\n\n        # collect results\n        df_regions.append(df_reg)\n        dfs_distributions.append(dfs_dis)\n        df_coordinates.append(df_coo)\n\n    # concatenate all results\n    df_regions = pd.concat(df_regions, ignore_index=True)\n    dfs_distributions = [\n        pd.concat(dfs_list, ignore_index=True) for dfs_list in zip(*dfs_distributions)\n    ]\n    df_coordinates = pd.concat(df_coordinates, ignore_index=True)\n\n    # -- Saving\n    if out_fmt:\n        outdir = os.path.join(wdir, \"quantification\")\n        outfile = f\"{cfg.object_type.lower()}_{cfg.atlas[\"type\"]}_{'-'.join(animals)}.{out_fmt}\"\n        dfs = dict(\n            df_regions=df_regions,\n            df_coordinates=df_coordinates,\n            df_distribution_ap=dfs_distributions[0],\n            df_distribution_dv=dfs_distributions[1],\n            df_distribution_ml=dfs_distributions[2],\n        )\n        io.save_dfs(outdir, outfile, dfs)\n\n    return df_regions, dfs_distributions, df_coordinates\n
"},{"location":"api-script-pyramids.html","title":"create_pyramids","text":"

create_pyramids command line interface (CLI). You can set up your settings filling the variables at the top of the file and run the script :

python create_pyramids.py /path/to/your/images

Or alternatively, you can run the script as a CLI :

python create_pyramids.py [options] /path/to/your/images

Example :

python create_pyramids.py --tile-size 1024 --pyramid-factor 4 /path/to/your/images

To get help (eg. list all options), run :

python create_pyramids.py --help

To use the QuPath backend, you'll need the companion 'createPyramids.groovy' script.

author : Guillaume Le Goc (g.legoc@posteo.org) @ NeuroPSI version : 2024.11.19

"},{"location":"api-script-pyramids.html#scripts.pyramids.create_pyramids.COMPRESSION_PYTHON","title":"COMPRESSION_PYTHON: str = 'LZW' module-attribute","text":"

Compression method.

"},{"location":"api-script-pyramids.html#scripts.pyramids.create_pyramids.INEXT","title":"INEXT: str = 'ome.tiff' module-attribute","text":"

Input files extension.

"},{"location":"api-script-pyramids.html#scripts.pyramids.create_pyramids.NTHREADS","title":"NTHREADS: int = int(multiprocessing.cpu_count() / 2) module-attribute","text":"

Number of threads for parallelization.

"},{"location":"api-script-pyramids.html#scripts.pyramids.create_pyramids.PYRAMID_FACTOR","title":"PYRAMID_FACTOR: int = 2 module-attribute","text":"

Factor between two consecutive pyramid levels.

"},{"location":"api-script-pyramids.html#scripts.pyramids.create_pyramids.PYRAMID_MAX","title":"PYRAMID_MAX: int = 32 module-attribute","text":"

Maximum rescaling (smaller pyramid).

"},{"location":"api-script-pyramids.html#scripts.pyramids.create_pyramids.QUPATH_PATH","title":"QUPATH_PATH: str = 'C:/Users/glegoc/AppData/Local/QuPath-0.5.1/QuPath-0.5.1 (console).exe' module-attribute","text":"

Full path to the QuPath (console) executable.

"},{"location":"api-script-pyramids.html#scripts.pyramids.create_pyramids.SCRIPT_PATH","title":"SCRIPT_PATH: str = os.path.join(os.path.dirname(__file__), 'createPyramids.groovy') module-attribute","text":"

Full path to the groovy script that does the job.

"},{"location":"api-script-pyramids.html#scripts.pyramids.create_pyramids.TILE_SIZE","title":"TILE_SIZE: int = 512 module-attribute","text":"

Tile size (usually 512 or 1024).

"},{"location":"api-script-pyramids.html#scripts.pyramids.create_pyramids.USE_QUPATH","title":"USE_QUPATH: bool = True module-attribute","text":"

Use QuPath and the external groovy script instead of pure python (more reliable).

"},{"location":"api-script-pyramids.html#scripts.pyramids.create_pyramids.get_tiff_options","title":"get_tiff_options(compression, nthreads, tilesize)","text":"

Get the relevant tags and options to write a TIFF file.

The returned dict is meant to be used to write a new tiff page with those tags.

Parameters:

Name Type Description Default compression str

Tiff compression (None, LZW, ...).

required nthreads int

Number of threads to write tiles.

required tilesize int

Tile size in pixels. Should be a power of 2.

required

Returns:

Name Type Description options dict

Dictionary with Tiff tags.

Source code in scripts/pyramids/create_pyramids.py
def get_tiff_options(compression: str, nthreads: int, tilesize: int) -> dict:\n    \"\"\"\n    Get the relevant tags and options to write a TIFF file.\n\n    The returned dict is meant to be used to write a new tiff page with those tags.\n\n    Parameters\n    ----------\n    compression : str\n        Tiff compression (None, LZW, ...).\n    nthreads : int\n        Number of threads to write tiles.\n    tilesize : int\n        Tile size in pixels. Should be a power of 2.\n\n    Returns\n    -------\n    options : dict\n        Dictionary with Tiff tags.\n\n    \"\"\"\n    return {\n        \"compression\": compression,\n        \"photometric\": \"minisblack\",\n        \"resolutionunit\": \"CENTIMETER\",\n        \"maxworkers\": nthreads,\n        \"tile\": (tilesize, tilesize),\n    }\n
"},{"location":"api-script-pyramids.html#scripts.pyramids.create_pyramids.pyramidalize_directory","title":"pyramidalize_directory(inputdir, version=None, use_qupath=USE_QUPATH, tile_size=TILE_SIZE, pyramid_factor=PYRAMID_FACTOR, nthreads=NTHREADS, qupath_path=QUPATH_PATH, script_path=SCRIPT_PATH, pyramid_max=PYRAMID_MAX)","text":"

Create pyramidal versions of .ome.tiff images found in the input directory. You need to edit the script to set the \"QUPATH_PATH\" to your installation of QuPath. Usually on Windows it should be here : C:/Users/$USERNAME$/AppData/Local/QuPath-0.X.Y/QuPath-0.X.Y (console).exe Alternatively you can run the script with the --qupath-path option.

Source code in scripts/pyramids/create_pyramids.py
def pyramidalize_directory(\n    inputdir: Annotated[\n        str,\n        typer.Argument(help=\"Full path to the directory with images to pyramidalize.\"),\n    ],\n    version: Annotated[\n        Optional[bool],\n        typer.Option(\"--version\", callback=version_callback, is_eager=True),\n    ] = None,\n    use_qupath: Annotated[\n        Optional[bool],\n        typer.Option(help=\"Use QuPath backend instead of Python.\"),\n    ] = USE_QUPATH,\n    tile_size: Annotated[\n        Optional[int],\n        typer.Option(help=\"Image tile size, typically 512 or 1024.\"),\n    ] = TILE_SIZE,\n    pyramid_factor: Annotated[\n        Optional[int],\n        typer.Option(help=\"Factor between two consecutive pyramid levels.\"),\n    ] = PYRAMID_FACTOR,\n    nthreads: Annotated[\n        Optional[int],\n        typer.Option(help=\"Number of threads to parallelize image writing.\"),\n    ] = NTHREADS,\n    qupath_path: Annotated[\n        Optional[str],\n        typer.Option(\n            help=\"Full path to the QuPath (console) executable.\",\n            rich_help_panel=\"QuPath backend\",\n        ),\n    ] = QUPATH_PATH,\n    script_path: Annotated[\n        Optional[str],\n        typer.Option(\n            help=\"Full path to the groovy script that does the job.\",\n            rich_help_panel=\"QuPath backend\",\n        ),\n    ] = SCRIPT_PATH,\n    pyramid_max: Annotated[\n        Optional[int],\n        typer.Option(\n            help=\"Maximum rescaling (smaller pyramid, will be rounded to closer power of 2).\",\n            rich_help_panel=\"Python backend\",\n        ),\n    ] = PYRAMID_MAX,\n):\n    \"\"\"\n    Create pyramidal versions of .ome.tiff images found in the input directory.\n    You need to edit the script to set the \"QUPATH_PATH\" to your installation of QuPath.\n    Usually on Windows it should be here :\n    C:/Users/$USERNAME$/AppData/Local/QuPath-0.X.Y/QuPath-0.X.Y (console).exe\n    Alternatively you can run the script with the --qupath-path option.\n\n    \"\"\"\n    # check QuPath was correctly set\n    if not os.path.isfile(qupath_path):\n        raise FileNotFoundError(\n            \"\"\"QuPath executable was not found. Edit the script to set 'QUPATH_PATH',\n            or run the script with the --qupath-path  option. Usually it is installed\n            at C:/Users/$USERNAME$/AppData/Local/QuPath-0.X.Y/QuPath-0.X.Y (console).exe\"\"\"\n        )\n    # prepare output directory\n    outputdir = os.path.join(inputdir, \"pyramidal\")\n    if not os.path.isdir(outputdir):\n        os.mkdir(outputdir)\n\n    # get a list of images\n    files = [filename for filename in os.listdir(inputdir) if filename.endswith(INEXT)]\n\n    # check we have files to process\n    if len(files) == 0:\n        print(\"Specified input directory is empty.\")\n        sys.exit()\n\n    # loop over all files\n    print(f\"Found {len(files)} to pyramidalize...\")\n\n    pbar = tqdm(files)\n    for imagename in pbar:\n        # prepare image names\n        image_path = os.path.join(inputdir, imagename)\n        output_image = os.path.join(outputdir, imagename)\n\n        # check if output file already exists\n        if os.path.isfile(output_image):\n            continue\n\n        # verbose\n        pbar.set_description(f\"Pyramidalyzing {imagename}\")\n\n        if use_qupath:\n            pyramidalize_qupath(\n                image_path,\n                output_image,\n                qupath_path,\n                script_path,\n                tile_size,\n                pyramid_factor,\n                nthreads,\n            )\n        else:\n            # prepare tiffwriter options\n            tiffoptions = get_tiff_options(COMPRESSION_PYTHON, nthreads, tile_size)\n\n            # number of pyramid levels\n            levels = [\n                pyramid_factor**i\n                for i in range(1, int(math.log(pyramid_max, pyramid_factor)) + 1)\n            ]\n            pyramidalize_python(image_path, output_image, levels, tiffoptions)\n\n    print(\"All done!\")\n
"},{"location":"api-script-pyramids.html#scripts.pyramids.create_pyramids.pyramidalize_python","title":"pyramidalize_python(image_path, output_image, levels, tiffoptions)","text":"

Pyramidalization with tifffile and scikit-image.

Parameters:

Name Type Description Default image_path str

Full path to the image.

required output_image str

Full path to the pyramidalized image.

required levels list-like of int

Pyramids levels.

required tiffoptions dict

Options for TiffWriter.

required Source code in scripts/pyramids/create_pyramids.py
def pyramidalize_python(\n    image_path: str, output_image: str, levels: list | tuple, tiffoptions: dict\n):\n    \"\"\"\n    Pyramidalization with tifffile and scikit-image.\n\n    Parameters\n    ----------\n    image_path : str\n        Full path to the image.\n    output_image : str\n        Full path to the pyramidalized image.\n    levels : list-like of int\n        Pyramids levels.\n    tiffoptions : dict\n        Options for TiffWriter.\n    \"\"\"\n    # specific imports\n    import xml.etree.ElementTree as ET\n\n    import numpy as np\n    import tifffile\n    from skimage import transform\n\n    # Nested functions\n    def get_pixelsize_ome(\n        desc: str,\n        namespace: dict = {\"ome\": \"http://www.openmicroscopy.org/Schemas/OME/2016-06\"},\n    ) -> float:\n        \"\"\"\n        Extract physical pixel size from OME-XML description.\n\n        Raise a warning if pixels are anisotropic (eg. X and Y sizes are not the same).\n        Raise an error if size units are not microns (\"\u00b5m\").\n\n        Parameters\n        ----------\n        desc : str\n            OME-XML string from Tiff page.\n        namespace : dict, optional\n            XML namespace, defaults to latest OME-XML schema (2016-06).\n\n        Returns\n        -------\n        pixelsize : float\n            Physical pixel size.\n\n        \"\"\"\n        root = ET.fromstring(desc)\n\n        for pixels in root.findall(\".//ome:Pixels\", namespace):\n            pixelsize_x = float(pixels.get(\"PhysicalSizeX\"))\n            pixelsize_y = float(pixels.get(\"PhysicalSizeY\"))\n            break  # stop at first Pixels field in the XML\n\n        # sanity checks\n        if pixelsize_x != pixelsize_y:\n            warnings.warn(\n                f\"Anisotropic pixels size found, are you sure ? ({pixelsize_x}, {pixelsize_y})\"\n            )\n\n        return np.mean([pixelsize_x, pixelsize_y])\n\n    def im_downscale(img, downfactor, **kwargs):\n        \"\"\"\n        Downscale an image by the given factor.\n\n        Wrapper for `skimage.transform.rescale`.\n\n        Parameters\n        ----------\n        img : np.ndarray\n        downfactor : int or float\n            Downscaling factor.\n        **kwargs : passed to skimage.transform.rescale\n\n        Returns\n        -------\n        img_rs : np.ndarray\n            Rescaled image.\n\n        \"\"\"\n        return transform.rescale(\n            img, 1 / downfactor, anti_aliasing=False, preserve_range=True, **kwargs\n        )\n\n    # get metadata from original file (without loading the whole image)\n    with tifffile.TiffFile(image_path) as tifin:\n        metadata = tifin.ome_metadata\n        pixelsize = get_pixelsize_ome(metadata)\n\n    with tifffile.TiffWriter(output_image, ome=False) as tifout:\n        # read full image\n        img = tifffile.imread(image_path)\n\n        # write full resolution multichannel image\n        tifout.write(\n            img,\n            subifds=len(levels),\n            resolution=(1e4 / pixelsize, 1e4 / pixelsize),\n            description=metadata,\n            metadata=None,\n            **tiffoptions,\n        )\n\n        # write downsampled images (pyramidal levels)\n        for level in levels:\n            img_down = im_downscale(\n                img, level, order=0, channel_axis=0\n            )  # downsample image\n            tifout.write(\n                img_down,\n                subfiletype=1,\n                resolution=(1e4 / level / pixelsize, 1e4 / level / pixelsize),\n                **tiffoptions,\n            )\n
"},{"location":"api-script-pyramids.html#scripts.pyramids.create_pyramids.pyramidalize_qupath","title":"pyramidalize_qupath(image_path, output_image, qupath_path, script_path, tile_size, pyramid_factor, nthreads)","text":"

Pyramidalization with QuPath backend.

Source code in scripts/pyramids/create_pyramids.py
def pyramidalize_qupath(\n    image_path: str,\n    output_image: str,\n    qupath_path: str,\n    script_path: str,\n    tile_size: int,\n    pyramid_factor: int,\n    nthreads: int,\n):\n    \"\"\"\n    Pyramidalization with QuPath backend.\n\n    \"\"\"\n    # generate an uid to make sure to not overwrite original file\n    uid = uuid.uuid1().hex\n\n    # prepare image names\n    imagename = os.path.basename(image_path)\n    inputdir = os.path.dirname(image_path)\n    new_imagename = uid + \"_\" + imagename\n    new_imagepath = os.path.join(inputdir, new_imagename)\n\n    # prepare arguments\n    args = \"[\" f\"{uid},\" f\"{tile_size},\" f\"{pyramid_factor},\" f\"{nthreads}\" \"]\"\n\n    # call the qupath groovy script within a shell\n    subprocess.run(\n        [qupath_path, \"script\", script_path, \"-i\", image_path, \"--args\", args],\n        shell=True,\n        stdout=subprocess.DEVNULL,\n    )\n\n    if not os.path.isfile(new_imagepath):\n        raise FileNotFoundError(\n            \"QuPath did not manage to create the pyramidalized image.\"\n        )\n\n    # move the pyramidalized image in the output directory\n    os.rename(new_imagepath, output_image)\n
"},{"location":"api-script-qupath-script-runner.html","title":"qupath_script_runner","text":"

Template to show how to run groovy script with QuPath, multi-threaded.

"},{"location":"api-script-qupath-script-runner.html#scripts.qupath_script_template.EXCLUDE_LIST","title":"EXCLUDE_LIST = [] module-attribute","text":"

Images names to NOT run the script on.

"},{"location":"api-script-qupath-script-runner.html#scripts.qupath_script_template.NTHREADS","title":"NTHREADS = 5 module-attribute","text":"

Number of threads to use.

"},{"location":"api-script-qupath-script-runner.html#scripts.qupath_script_template.QPROJ_PATH","title":"QPROJ_PATH = '/path/to/qupath/project.qproj' module-attribute","text":"

Full path to the QuPath project.

"},{"location":"api-script-qupath-script-runner.html#scripts.qupath_script_template.QUIET","title":"QUIET = True module-attribute","text":"

Use QuPath in quiet mode, eg. with minimal verbosity.

"},{"location":"api-script-qupath-script-runner.html#scripts.qupath_script_template.QUPATH_EXE","title":"QUPATH_EXE = '/path/to/the/qupath/QuPath-0.5.1 (console).exe' module-attribute","text":"

Path to the QuPath executable (console mode).

"},{"location":"api-script-qupath-script-runner.html#scripts.qupath_script_template.SAVE","title":"SAVE = True module-attribute","text":"

Whether to save the project after the script ran on an image.

"},{"location":"api-script-qupath-script-runner.html#scripts.qupath_script_template.SCRIPT_PATH","title":"SCRIPT_PATH = '/path/to/the/script.groovy' module-attribute","text":"

Path to the groovy script.

"},{"location":"api-script-segment.html","title":"segment_images","text":"

Script to segment objects from images.

For fiber-like objects, binarize and skeletonize the image, then use skan to extract branches coordinates. For polygon-like objects, binarize the image and detect objects and extract contours coordinates. For points, treat that as polygons then extract the centroids instead of contours. Finally, export the coordinates as collections in geojson files, importable in QuPath. Supports any number of channel of interest within the same image. One file output file per channel will be created.

This script uses histoquant.seg. It is designed to work on probability maps generated from a pixel classifier in QuPath, but might work on raw images.

Usage : fill-in the Parameters section of the script and run it. A \"geojson\" folder will be created in the parent directory of IMAGES_DIR. To exclude objects near the edges of an ROI, specify the path to masks stored as images with the same names as probabilities images (without their suffix).

author : Guillaume Le Goc (g.legoc@posteo.org) @ NeuroPSI version : 2024.12.10

"},{"location":"api-script-segment.html#scripts.segmentation.segment_images.CHANNELS_PARAMS","title":"CHANNELS_PARAMS = [{'name': 'cy5', 'target_channel': 0, 'proba_threshold': 0.85, 'qp_class': 'Fibers: Cy5', 'qp_color': [164, 250, 120]}, {'name': 'dsred', 'target_channel': 1, 'proba_threshold': 0.65, 'qp_class': 'Fibers: DsRed', 'qp_color': [224, 153, 18]}, {'name': 'egfp', 'target_channel': 2, 'proba_threshold': 0.85, 'qp_class': 'Fibers: EGFP', 'qp_color': [135, 11, 191]}] module-attribute","text":"

This should be a list of dictionary (one per channel) with keys :

  • name: str, used as suffix for output geojson files, not used if only one channel
  • target_channel: int, index of the segmented channel of the image, 0-based
  • proba_threshold: float < 1, probability cut-off for that channel
  • qp_class: str, name of QuPath classification
  • qp_color: list of RGB values, associated color
"},{"location":"api-script-segment.html#scripts.segmentation.segment_images.EDGE_DIST","title":"EDGE_DIST = 0 module-attribute","text":"

Distance to brain edge to ignore, in \u00b5m. 0 to disable.

"},{"location":"api-script-segment.html#scripts.segmentation.segment_images.FILTERS","title":"FILTERS = {'length_low': 1.5, 'area_low': 10, 'area_high': 1000, 'ecc_low': 0.0, 'ecc_high': 0.9, 'dist_thresh': 30} module-attribute","text":"

Dictionary with keys :

  • length_low: minimal length in microns - for lines
  • area_low: minimal area in \u00b5m\u00b2 - for polygons and points
  • area_high: maximal area in \u00b5m\u00b2 - for polygons and points
  • ecc_low: minimal eccentricity - for polygons and points (0 = circle)
  • ecc_high: maximal eccentricity - for polygons and points (1 = line)
  • dist_thresh: maximal inter-point distance in \u00b5m - for points
"},{"location":"api-script-segment.html#scripts.segmentation.segment_images.IMAGES_DIR","title":"IMAGES_DIR = '/path/to/images' module-attribute","text":"

Full path to the images to segment.

"},{"location":"api-script-segment.html#scripts.segmentation.segment_images.IMG_SUFFIX","title":"IMG_SUFFIX = '_Probabilities.tiff' module-attribute","text":"

Images suffix, including extension. Masks must be the same name without the suffix.

"},{"location":"api-script-segment.html#scripts.segmentation.segment_images.MASKS_DIR","title":"MASKS_DIR = 'path/to/corresponding/masks' module-attribute","text":"

Full path to the masks, to exclude objects near the brain edges (set to None or empty string to disable this feature).

"},{"location":"api-script-segment.html#scripts.segmentation.segment_images.MASKS_EXT","title":"MASKS_EXT = 'tiff' module-attribute","text":"

Masks files extension.

"},{"location":"api-script-segment.html#scripts.segmentation.segment_images.MAX_PIX_VALUE","title":"MAX_PIX_VALUE = 255 module-attribute","text":"

Maximum pixel possible value to adjust proba_threshold.

"},{"location":"api-script-segment.html#scripts.segmentation.segment_images.ORIGINAL_PIXELSIZE","title":"ORIGINAL_PIXELSIZE = 0.45 module-attribute","text":"

Original images pixel size in microns. This is in case the pixel classifier uses a lower resolution, yielding smaller probability maps, so output objects coordinates need to be rescaled to the full size images. The pixel size is written in the \"Image\" tab in QuPath.

"},{"location":"api-script-segment.html#scripts.segmentation.segment_images.QUPATH_TYPE","title":"QUPATH_TYPE = 'detection' module-attribute","text":"

QuPath object type.

"},{"location":"api-script-segment.html#scripts.segmentation.segment_images.SEGTYPE","title":"SEGTYPE = 'boutons' module-attribute","text":"

Type of segmentation.

"},{"location":"api-script-segment.html#scripts.segmentation.segment_images.get_geojson_dir","title":"get_geojson_dir(images_dir)","text":"

Get the directory of geojson files, which will be in the parent directory of images_dir.

If the directory does not exist, create it.

Parameters:

Name Type Description Default images_dir str required

Returns:

Name Type Description geojson_dir str Source code in scripts/segmentation/segment_images.py
def get_geojson_dir(images_dir: str):\n    \"\"\"\n    Get the directory of geojson files, which will be in the parent directory\n    of `images_dir`.\n\n    If the directory does not exist, create it.\n\n    Parameters\n    ----------\n    images_dir : str\n\n    Returns\n    -------\n    geojson_dir : str\n\n    \"\"\"\n\n    geojson_dir = os.path.join(Path(images_dir).parent, \"geojson\")\n\n    if not os.path.isdir(geojson_dir):\n        os.mkdir(geojson_dir)\n\n    return geojson_dir\n
"},{"location":"api-script-segment.html#scripts.segmentation.segment_images.get_geojson_properties","title":"get_geojson_properties(name, color, objtype='detection')","text":"

Return geojson objects properties as a dictionnary, ready to be used in geojson.Feature.

Parameters:

Name Type Description Default name str

Classification name.

required color tuple or list

Classification color in RGB (3-elements vector).

required objtype str

Object type (\"detection\" or \"annotation\"). Default is \"detection\".

'detection'

Returns:

Name Type Description props dict Source code in scripts/segmentation/segment_images.py
def get_geojson_properties(name: str, color: tuple | list, objtype: str = \"detection\"):\n    \"\"\"\n    Return geojson objects properties as a dictionnary, ready to be used in geojson.Feature.\n\n    Parameters\n    ----------\n    name : str\n        Classification name.\n    color : tuple or list\n        Classification color in RGB (3-elements vector).\n    objtype : str, optional\n        Object type (\"detection\" or \"annotation\"). Default is \"detection\".\n\n    Returns\n    -------\n    props : dict\n\n    \"\"\"\n\n    return {\n        \"objectType\": objtype,\n        \"classification\": {\"name\": name, \"color\": color},\n        \"isLocked\": \"true\",\n    }\n
"},{"location":"api-script-segment.html#scripts.segmentation.segment_images.get_seg_method","title":"get_seg_method(segtype)","text":"

Determine what kind of segmentation is performed.

Segmentation kind are, for now, lines, polygons or points. We detect that based on hardcoded keywords.

Parameters:

Name Type Description Default segtype str required

Returns:

Name Type Description seg_method str Source code in scripts/segmentation/segment_images.py
def get_seg_method(segtype: str):\n    \"\"\"\n    Determine what kind of segmentation is performed.\n\n    Segmentation kind are, for now, lines, polygons or points. We detect that based on\n    hardcoded keywords.\n\n    Parameters\n    ----------\n    segtype : str\n\n    Returns\n    -------\n    seg_method : str\n\n    \"\"\"\n\n    line_list = [\"fibers\", \"axons\", \"fiber\", \"axon\"]\n    point_list = [\"synapto\", \"synaptophysin\", \"syngfp\", \"boutons\", \"points\"]\n    polygon_list = [\"cells\", \"polygon\", \"polygons\", \"polygon\", \"cell\"]\n\n    if segtype in line_list:\n        seg_method = \"lines\"\n    elif segtype in polygon_list:\n        seg_method = \"polygons\"\n    elif segtype in point_list:\n        seg_method = \"points\"\n    else:\n        raise ValueError(\n            f\"Could not determine method to use based on segtype : {segtype}.\"\n        )\n\n    return seg_method\n
"},{"location":"api-script-segment.html#scripts.segmentation.segment_images.parameters_as_dict","title":"parameters_as_dict(images_dir, masks_dir, segtype, name, proba_threshold, edge_dist)","text":"

Get information as a dictionnary.

Parameters:

Name Type Description Default images_dir str

Path to images to be segmented.

required masks_dir str

Path to images masks.

required segtype str

Segmentation type (eg. \"fibers\").

required name str

Name of the segmentation (eg. \"green\").

required proba_threshold float < 1

Probability threshold.

required edge_dist float

Distance in \u00b5m to the brain edge that is ignored.

required

Returns:

Name Type Description params dict Source code in scripts/segmentation/segment_images.py
def parameters_as_dict(\n    images_dir: str,\n    masks_dir: str,\n    segtype: str,\n    name: str,\n    proba_threshold: float,\n    edge_dist: float,\n):\n    \"\"\"\n    Get information as a dictionnary.\n\n    Parameters\n    ----------\n    images_dir : str\n        Path to images to be segmented.\n    masks_dir : str\n        Path to images masks.\n    segtype : str\n        Segmentation type (eg. \"fibers\").\n    name : str\n        Name of the segmentation (eg. \"green\").\n    proba_threshold : float < 1\n        Probability threshold.\n    edge_dist : float\n        Distance in \u00b5m to the brain edge that is ignored.\n\n    Returns\n    -------\n    params : dict\n\n    \"\"\"\n\n    return {\n        \"images_location\": images_dir,\n        \"masks_location\": masks_dir,\n        \"type\": segtype,\n        \"probability threshold\": proba_threshold,\n        \"name\": name,\n        \"edge distance\": edge_dist,\n    }\n
"},{"location":"api-script-segment.html#scripts.segmentation.segment_images.process_directory","title":"process_directory(images_dir, img_suffix='', segtype='', original_pixelsize=1.0, target_channel=0, proba_threshold=0.0, qupath_class='Object', qupath_color=[0, 0, 0], channel_suffix='', edge_dist=0.0, filters={}, masks_dir='', masks_ext='')","text":"

Main function, processes the .ome.tiff files in the input directory.

Parameters:

Name Type Description Default images_dir str

Animal ID to process.

required img_suffix str

Images suffix, including extension.

'' segtype str

Segmentation type.

'' original_pixelsize float

Original images pixel size in microns.

1.0 target_channel int

Index of the channel containning the objects of interest (eg. not the background), in the probability map (not the original images channels).

0 proba_threshold float < 1

Probability below this value will be discarded (multiplied by MAX_PIXEL_VALUE)

0.0 qupath_class str

Name of the QuPath classification.

'Object' qupath_color list of three elements

Color associated to that classification in RGB.

[0, 0, 0] channel_suffix str

Channel name, will be used as a suffix in output geojson files.

'' edge_dist float

Distance to the edge of the brain masks that will be ignored, in microns. Set to 0 to disable this feature.

0.0 filters dict

Filters values to include or excludes objects. See the top of the script.

{} masks_dir str

Path to images masks, to exclude objects found near the edges. The masks must be with the same name as the corresponding image to be segmented, without its suffix. Default is \"\", which disables this feature.

'' masks_ext str

Masks files extension, without leading \".\". Default is \"\"

'' Source code in scripts/segmentation/segment_images.py
def process_directory(\n    images_dir: str,\n    img_suffix: str = \"\",\n    segtype: str = \"\",\n    original_pixelsize: float = 1.0,\n    target_channel: int = 0,\n    proba_threshold: float = 0.0,\n    qupath_class: str = \"Object\",\n    qupath_color: list = [0, 0, 0],\n    channel_suffix: str = \"\",\n    edge_dist: float = 0.0,\n    filters: dict = {},\n    masks_dir: str = \"\",\n    masks_ext: str = \"\",\n):\n    \"\"\"\n    Main function, processes the .ome.tiff files in the input directory.\n\n    Parameters\n    ----------\n    images_dir : str\n        Animal ID to process.\n    img_suffix : str\n        Images suffix, including extension.\n    segtype : str\n        Segmentation type.\n    original_pixelsize : float\n        Original images pixel size in microns.\n    target_channel : int\n        Index of the channel containning the objects of interest (eg. not the\n        background), in the probability map (*not* the original images channels).\n    proba_threshold : float < 1\n        Probability below this value will be discarded (multiplied by `MAX_PIXEL_VALUE`)\n    qupath_class : str\n        Name of the QuPath classification.\n    qupath_color : list of three elements\n        Color associated to that classification in RGB.\n    channel_suffix : str\n        Channel name, will be used as a suffix in output geojson files.\n    edge_dist : float\n        Distance to the edge of the brain masks that will be ignored, in microns. Set to\n        0 to disable this feature.\n    filters : dict\n        Filters values to include or excludes objects. See the top of the script.\n    masks_dir : str, optional\n        Path to images masks, to exclude objects found near the edges. The masks must be\n        with the same name as the corresponding image to be segmented, without its\n        suffix. Default is \"\", which disables this feature.\n    masks_ext : str, optional\n        Masks files extension, without leading \".\". Default is \"\"\n\n    \"\"\"\n\n    # -- Preparation\n    # get segmentation type\n    seg_method = get_seg_method(segtype)\n\n    # get output directory path\n    geojson_dir = get_geojson_dir(images_dir)\n\n    # get images list\n    images_list = [\n        os.path.join(images_dir, filename)\n        for filename in os.listdir(images_dir)\n        if filename.endswith(img_suffix)\n    ]\n\n    # write parameters\n    parameters = parameters_as_dict(\n        images_dir, masks_dir, segtype, channel_suffix, proba_threshold, edge_dist\n    )\n    param_file = os.path.join(geojson_dir, \"parameters\" + channel_suffix + \".txt\")\n    if os.path.isfile(param_file):\n        raise FileExistsError(\"Parameters file already exists.\")\n    else:\n        write_parameters(param_file, parameters, filters, original_pixelsize)\n\n    # convert parameters to pixels in probability map\n    pixelsize = hq.seg.get_pixelsize(images_list[0])  # get pixel size\n    edge_dist = int(edge_dist / pixelsize)\n    filters = hq.seg.convert_to_pixels(filters, pixelsize)\n\n    # get rescaling factor\n    rescale_factor = pixelsize / original_pixelsize\n\n    # get GeoJSON properties\n    geojson_props = get_geojson_properties(\n        qupath_class, qupath_color, objtype=QUPATH_TYPE\n    )\n\n    # -- Processing\n    pbar = tqdm(images_list)\n    for imgpath in pbar:\n        # build file names\n        imgname = os.path.basename(imgpath)\n        geoname = imgname.replace(img_suffix, \"\")\n        geojson_file = os.path.join(\n            geojson_dir, geoname + \"_segmentation\" + channel_suffix + \".geojson\"\n        )\n\n        # checks if output file already exists\n        if os.path.isfile(geojson_file):\n            continue\n\n        # read images\n        pbar.set_description(f\"{geoname}: Loading...\")\n        img = tifffile.imread(imgpath, key=target_channel)\n        if (edge_dist > 0) & (len(masks_dir) != 0):\n            mask = tifffile.imread(os.path.join(masks_dir, geoname + \".\" + masks_ext))\n            mask = hq.seg.pad_image(mask, img.shape)  # resize mask\n            # apply mask, eroding from the edges\n            img = img * hq.seg.erode_mask(mask, edge_dist)\n\n        # image processing\n        pbar.set_description(f\"{geoname}: IP...\")\n\n        # threshold probability and binarization\n        img = img >= proba_threshold * MAX_PIX_VALUE\n\n        # segmentation\n        pbar.set_description(f\"{geoname}: Segmenting...\")\n\n        if seg_method == \"lines\":\n            collection = hq.seg.segment_lines(\n                img,\n                geojson_props,\n                minsize=filters[\"length_low\"],\n                rescale_factor=rescale_factor,\n            )\n\n        elif seg_method == \"polygons\":\n            collection = hq.seg.segment_polygons(\n                img,\n                geojson_props,\n                area_min=filters[\"area_low\"],\n                area_max=filters[\"area_high\"],\n                ecc_min=filters[\"ecc_low\"],\n                ecc_max=filters[\"ecc_high\"],\n                rescale_factor=rescale_factor,\n            )\n\n        elif seg_method == \"points\":\n            collection = hq.seg.segment_points(\n                img,\n                geojson_props,\n                area_min=filters[\"area_low\"],\n                area_max=filters[\"area_high\"],\n                ecc_min=filters[\"ecc_low\"],\n                ecc_max=filters[\"ecc_high\"],\n                dist_thresh=filters[\"dist_thresh\"],\n                rescale_factor=rescale_factor,\n            )\n        else:\n            # we already printed an error message\n            return\n\n        # save geojson\n        pbar.set_description(f\"{geoname}: Saving...\")\n        with open(geojson_file, \"w\") as fid:\n            fid.write(geojson.dumps(collection))\n
"},{"location":"api-script-segment.html#scripts.segmentation.segment_images.write_parameters","title":"write_parameters(outfile, parameters, filters, original_pixelsize)","text":"

Write parameters to outfile.

A timestamp will be added. Parameters are written as key = value, and a [filters] is added before filters parameters.

Parameters:

Name Type Description Default outfile str

Full path to the output file.

required parameters dict

General parameters.

required filters dict

Filters parameters.

required original_pixelsize float

Size of pixels in original image.

required Source code in scripts/segmentation/segment_images.py
def write_parameters(\n    outfile: str, parameters: dict, filters: dict, original_pixelsize: float\n):\n    \"\"\"\n    Write parameters to `outfile`.\n\n    A timestamp will be added. Parameters are written as key = value,\n    and a [filters] is added before filters parameters.\n\n    Parameters\n    ----------\n    outfile : str\n        Full path to the output file.\n    parameters : dict\n        General parameters.\n    filters : dict\n        Filters parameters.\n    original_pixelsize : float\n        Size of pixels in original image.\n\n    \"\"\"\n\n    with open(outfile, \"w\") as fid:\n        fid.writelines(f\"date = {datetime.now().strftime('%d-%B-%Y %H:%M:%S')}\\n\")\n\n        fid.writelines(f\"original_pixelsize = {original_pixelsize}\\n\")\n\n        for key, value in parameters.items():\n            fid.writelines(f\"{key} = {value}\\n\")\n\n        fid.writelines(\"[filters]\\n\")\n\n        for key, value in filters.items():\n            fid.writelines(f\"{key} = {value}\\n\")\n
"},{"location":"api-seg.html","title":"histoquant.seg","text":"

seg module, part of histoquant.

Functions for segmentating probability map stored as an image.

"},{"location":"api-seg.html#histoquant.seg.convert_to_pixels","title":"convert_to_pixels(filters, pixelsize)","text":"

Convert some values in filters in pixels.

Parameters:

Name Type Description Default filters dict

Must contain the keys used below.

required pixelsize float

Pixel size in microns.

required

Returns:

Name Type Description filters dict

Same as input, with values in pixels.

Source code in histoquant/seg.py
def convert_to_pixels(filters, pixelsize):\n    \"\"\"\n    Convert some values in `filters` in pixels.\n\n    Parameters\n    ----------\n    filters : dict\n        Must contain the keys used below.\n    pixelsize : float\n        Pixel size in microns.\n\n    Returns\n    -------\n    filters : dict\n        Same as input, with values in pixels.\n\n    \"\"\"\n\n    filters[\"area_low\"] = filters[\"area_low\"] / pixelsize**2\n    filters[\"area_high\"] = filters[\"area_high\"] / pixelsize**2\n    filters[\"length_low\"] = filters[\"length_low\"] / pixelsize\n    filters[\"dist_thresh\"] = int(filters[\"dist_thresh\"] / pixelsize)\n\n    return filters\n
"},{"location":"api-seg.html#histoquant.seg.erode_mask","title":"erode_mask(mask, edge_dist)","text":"

Erode the mask outline so that is is edge_dist smaller from the border.

This allows discarding the edges.

Parameters:

Name Type Description Default mask ndarray required edge_dist float

Distance to edges, in pixels.

required

Returns:

Name Type Description eroded_mask ndarray of bool Source code in histoquant/seg.py
def erode_mask(mask: np.ndarray, edge_dist: float) -> np.ndarray:\n    \"\"\"\n    Erode the mask outline so that is is `edge_dist` smaller from the border.\n\n    This allows discarding the edges.\n\n    Parameters\n    ----------\n    mask : ndarray\n    edge_dist : float\n        Distance to edges, in pixels.\n\n    Returns\n    -------\n    eroded_mask : ndarray of bool\n\n    \"\"\"\n\n    if edge_dist % 2 == 0:\n        edge_dist += 1  # decomposition requires even number\n\n    footprint = morphology.square(edge_dist, decomposition=\"sequence\")\n\n    return mask * morphology.binary_erosion(mask, footprint=footprint)\n
"},{"location":"api-seg.html#histoquant.seg.get_collection_from_points","title":"get_collection_from_points(coords, properties, rescale_factor=1.0, offset=0.5)","text":"

Gather coordinates from coords and put them in GeoJSON format.

An entry in coords are pairs of (x, y) coordinates defining the point. properties is a dictionnary with QuPath properties of each detections.

Parameters:

Name Type Description Default coords list required properties dict required rescale_factor float

Rescale output coordinates by this factor.

1.0

Returns:

Name Type Description collection FeatureCollection Source code in histoquant/seg.py
def get_collection_from_points(\n    coords: list, properties: dict, rescale_factor: float = 1.0, offset: float = 0.5\n) -> geojson.FeatureCollection:\n    \"\"\"\n    Gather coordinates from `coords` and put them in GeoJSON format.\n\n    An entry in `coords` are pairs of (x, y) coordinates defining the point.\n    `properties` is a dictionnary with QuPath properties of each detections.\n\n    Parameters\n    ----------\n    coords : list\n    properties : dict\n    rescale_factor : float\n        Rescale output coordinates by this factor.\n\n    Returns\n    -------\n    collection : geojson.FeatureCollection\n\n    \"\"\"\n\n    collection = [\n        geojson.Feature(\n            geometry=shapely.Point(\n                np.flip((coord + offset) * rescale_factor)\n            ),  # shape object\n            properties=properties,  # object properties\n            id=str(uuid.uuid4()),  # object uuid\n        )\n        for coord in coords\n    ]\n\n    return geojson.FeatureCollection(collection)\n
"},{"location":"api-seg.html#histoquant.seg.get_collection_from_poly","title":"get_collection_from_poly(contours, properties, rescale_factor=1.0, offset=0.5)","text":"

Gather coordinates in the list and put them in GeoJSON format as Polygons.

An entry in contours must define a closed polygon. properties is a dictionnary with QuPath properties of each detections.

Parameters:

Name Type Description Default contours list required properties dict

QuPatj objects' properties.

required rescale_factor float

Rescale output coordinates by this factor.

1.0 offset float

Shift coordinates by this amount, typically to get pixel centers or edges. Default is 0.5.

0.5

Returns:

Name Type Description collection FeatureCollection

A FeatureCollection ready to be written as geojson.

Source code in histoquant/seg.py
def get_collection_from_poly(\n    contours: list, properties: dict, rescale_factor: float = 1.0, offset: float = 0.5\n) -> geojson.FeatureCollection:\n    \"\"\"\n    Gather coordinates in the list and put them in GeoJSON format as Polygons.\n\n    An entry in `contours` must define a closed polygon. `properties` is a dictionnary\n    with QuPath properties of each detections.\n\n    Parameters\n    ----------\n    contours : list\n    properties : dict\n        QuPatj objects' properties.\n    rescale_factor : float\n        Rescale output coordinates by this factor.\n    offset : float\n        Shift coordinates by this amount, typically to get pixel centers or edges.\n        Default is 0.5.\n\n    Returns\n    -------\n    collection : geojson.FeatureCollection\n        A FeatureCollection ready to be written as geojson.\n\n    \"\"\"\n    collection = [\n        geojson.Feature(\n            geometry=shapely.Polygon(\n                np.fliplr((contour + offset) * rescale_factor)\n            ),  # shape object\n            properties=properties,  # object properties\n            id=str(uuid.uuid4()),  # object uuid\n        )\n        for contour in contours\n    ]\n\n    return geojson.FeatureCollection(collection)\n
"},{"location":"api-seg.html#histoquant.seg.get_collection_from_skel","title":"get_collection_from_skel(skeleton, properties, rescale_factor=1.0, offset=0.5)","text":"

Get the coordinates of each skeleton path as a GeoJSON Features in a FeatureCollection. properties is a dictionnary with QuPath properties of each detections.

Parameters:

Name Type Description Default skeleton Skeleton required properties dict

QuPatj objects' properties.

required rescale_factor float

Rescale output coordinates by this factor.

1.0 offset float

Shift coordinates by this amount, typically to get pixel centers or edges. Default is 0.5.

0.5

Returns:

Name Type Description collection FeatureCollection

A FeatureCollection ready to be written as geojson.

Source code in histoquant/seg.py
def get_collection_from_skel(\n    skeleton: Skeleton, properties: dict, rescale_factor: float = 1.0, offset=0.5\n) -> geojson.FeatureCollection:\n    \"\"\"\n    Get the coordinates of each skeleton path as a GeoJSON Features in a\n    FeatureCollection.\n    `properties` is a dictionnary with QuPath properties of each detections.\n\n    Parameters\n    ----------\n    skeleton : skan.Skeleton\n    properties : dict\n        QuPatj objects' properties.\n    rescale_factor : float\n        Rescale output coordinates by this factor.\n    offset : float\n        Shift coordinates by this amount, typically to get pixel centers or edges.\n        Default is 0.5.\n\n    Returns\n    -------\n    collection : geojson.FeatureCollection\n        A FeatureCollection ready to be written as geojson.\n\n    \"\"\"\n\n    branch_data = summarize(skeleton, separator=\"_\")\n\n    collection = []\n    for ind in range(skeleton.n_paths):\n        prop = properties.copy()\n        prop[\"measurements\"] = {\"skeleton_id\": int(branch_data.loc[ind, \"skeleton_id\"])}\n        collection.append(\n            geojson.Feature(\n                geometry=shapely.LineString(\n                    (skeleton.path_coordinates(ind)[:, ::-1] + offset) * rescale_factor\n                ),  # shape object\n                properties=prop,  # object properties\n                id=str(uuid.uuid4()),  # object uuid\n            )\n        )\n\n    return geojson.FeatureCollection(collection)\n
"},{"location":"api-seg.html#histoquant.seg.get_image_skeleton","title":"get_image_skeleton(img, minsize=0)","text":"

Get the image skeleton.

Computes the image skeleton and removes objects smaller than minsize.

Parameters:

Name Type Description Default img ndarray of bool required minsize number

Min. size the object can have, as a number of pixels. Default is 0.

0

Returns:

Name Type Description skel ndarray of bool

Binary image with 1-pixel wide skeleton.

Source code in histoquant/seg.py
def get_image_skeleton(img: np.ndarray, minsize=0) -> np.ndarray:\n    \"\"\"\n    Get the image skeleton.\n\n    Computes the image skeleton and removes objects smaller than `minsize`.\n\n    Parameters\n    ----------\n    img : ndarray of bool\n    minsize : number, optional\n        Min. size the object can have, as a number of pixels. Default is 0.\n\n    Returns\n    -------\n    skel : ndarray of bool\n        Binary image with 1-pixel wide skeleton.\n\n    \"\"\"\n\n    skel = morphology.skeletonize(img)\n\n    return morphology.remove_small_objects(skel, min_size=minsize, connectivity=2)\n
"},{"location":"api-seg.html#histoquant.seg.get_pixelsize","title":"get_pixelsize(image_name)","text":"

Get pixel size recorded in image_name TIFF metadata.

Parameters:

Name Type Description Default image_name str

Full path to image.

required

Returns:

Name Type Description pixelsize float

Pixel size in microns.

Source code in histoquant/seg.py
def get_pixelsize(image_name: str) -> float:\n    \"\"\"\n    Get pixel size recorded in `image_name` TIFF metadata.\n\n    Parameters\n    ----------\n    image_name : str\n        Full path to image.\n\n    Returns\n    -------\n    pixelsize : float\n        Pixel size in microns.\n\n    \"\"\"\n\n    with tifffile.TiffFile(image_name) as tif:\n        # XResolution is a tuple, numerator, denomitor. The inverse is the pixel size\n        return (\n            tif.pages[0].tags[\"XResolution\"].value[1]\n            / tif.pages[0].tags[\"XResolution\"].value[0]\n        )\n
"},{"location":"api-seg.html#histoquant.seg.pad_image","title":"pad_image(img, finalsize)","text":"

Pad image with zeroes to match expected final size.

Parameters:

Name Type Description Default img ndarray required finalsize tuple or list

nrows, ncolumns

required

Returns:

Name Type Description imgpad ndarray

img with black borders.

Source code in histoquant/seg.py
def pad_image(img: np.ndarray, finalsize: tuple | list) -> np.ndarray:\n    \"\"\"\n    Pad image with zeroes to match expected final size.\n\n    Parameters\n    ----------\n    img : ndarray\n    finalsize : tuple or list\n        nrows, ncolumns\n\n    Returns\n    -------\n    imgpad : ndarray\n        img with black borders.\n\n    \"\"\"\n\n    final_h = finalsize[0]  # requested number of rows (height)\n    final_w = finalsize[1]  # requested number of columns (width)\n    original_h = img.shape[0]  # input number of rows\n    original_w = img.shape[1]  # input number of columns\n\n    a = (final_h - original_h) // 2  # vertical padding before\n    aa = final_h - a - original_h  # vertical padding after\n    b = (final_w - original_w) // 2  # horizontal padding before\n    bb = final_w - b - original_w  # horizontal padding after\n\n    return np.pad(img, pad_width=((a, aa), (b, bb)), mode=\"constant\")\n
"},{"location":"api-seg.html#histoquant.seg.segment_lines","title":"segment_lines(img, geojson_props, minsize=0.0, rescale_factor=1.0)","text":"

Wraps skeleton analysis to get paths coordinates.

Parameters:

Name Type Description Default img ndarray of bool

Binary image to segment as lines.

required geojson_props dict

GeoJSON properties of objects.

required minsize float

Minimum size in pixels for an object.

0.0 rescale_factor float

Rescale output coordinates by this factor.

1.0

Returns:

Name Type Description collection FeatureCollection

A FeatureCollection ready to be written as geojson.

Source code in histoquant/seg.py
def segment_lines(\n    img: np.ndarray, geojson_props: dict, minsize=0.0, rescale_factor=1.0\n) -> geojson.FeatureCollection:\n    \"\"\"\n    Wraps skeleton analysis to get paths coordinates.\n\n    Parameters\n    ----------\n    img : ndarray of bool\n        Binary image to segment as lines.\n    geojson_props : dict\n        GeoJSON properties of objects.\n    minsize : float\n        Minimum size in pixels for an object.\n    rescale_factor : float\n        Rescale output coordinates by this factor.\n\n    Returns\n    -------\n    collection : geojson.FeatureCollection\n        A FeatureCollection ready to be written as geojson.\n\n    \"\"\"\n\n    skel = get_image_skeleton(img, minsize=minsize)\n\n    # get paths coordinates as FeatureCollection\n    skeleton = Skeleton(skel, keep_images=False)\n    return get_collection_from_skel(\n        skeleton, geojson_props, rescale_factor=rescale_factor\n    )\n
"},{"location":"api-seg.html#histoquant.seg.segment_points","title":"segment_points(img, geojson_props, area_min=0.0, area_max=np.inf, ecc_min=0, ecc_max=1, dist_thresh=0, rescale_factor=1)","text":"

Point segmentation.

First, segment polygons to apply shape filters, then extract their centroids, and remove isolated points as defined by dist_thresh.

Parameters:

Name Type Description Default img ndarray of bool

Binary image to segment as points.

required geojson_props dict

GeoJSON properties of objects.

required area_min float

Minimum and maximum area in pixels for an object.

0.0 area_max float

Minimum and maximum area in pixels for an object.

0.0 ecc_min float

Minimum and maximum eccentricity for an object.

0 ecc_max float

Minimum and maximum eccentricity for an object.

0 dist_thresh float

Maximal distance in pixels between objects before considering them as isolated and remove them. 0 disables it.

0 rescale_factor float

Rescale output coordinates by this factor.

1

Returns:

Name Type Description collection FeatureCollection

A FeatureCollection ready to be written as geojson.

Source code in histoquant/seg.py
def segment_points(\n    img: np.ndarray,\n    geojson_props: dict,\n    area_min: float = 0.0,\n    area_max: float = np.inf,\n    ecc_min: float = 0,\n    ecc_max: float = 1,\n    dist_thresh: float = 0,\n    rescale_factor: float = 1,\n) -> geojson.FeatureCollection:\n    \"\"\"\n    Point segmentation.\n\n    First, segment polygons to apply shape filters, then extract their centroids,\n    and remove isolated points as defined by `dist_thresh`.\n\n    Parameters\n    ----------\n    img : ndarray of bool\n        Binary image to segment as points.\n    geojson_props : dict\n        GeoJSON properties of objects.\n    area_min, area_max : float\n        Minimum and maximum area in pixels for an object.\n    ecc_min, ecc_max : float\n        Minimum and maximum eccentricity for an object.\n    dist_thresh : float\n        Maximal distance in pixels between objects before considering them as isolated and remove them.\n        0 disables it.\n    rescale_factor : float\n        Rescale output coordinates by this factor.\n\n    Returns\n    -------\n    collection : geojson.FeatureCollection\n        A FeatureCollection ready to be written as geojson.\n\n    \"\"\"\n\n    # get objects properties\n    stats = pd.DataFrame(\n        measure.regionprops_table(\n            measure.label(img), properties=(\"label\", \"area\", \"eccentricity\", \"centroid\")\n        )\n    )\n\n    # keep objects matching filters\n    stats = stats[\n        (stats[\"area\"] >= area_min)\n        & (stats[\"area\"] <= area_max)\n        & (stats[\"eccentricity\"] >= ecc_min)\n        & (stats[\"eccentricity\"] <= ecc_max)\n    ]\n\n    # create an image from centroids only\n    stats[\"centroid-0\"] = stats[\"centroid-0\"].astype(int)\n    stats[\"centroid-1\"] = stats[\"centroid-1\"].astype(int)\n    bw = np.zeros(img.shape, dtype=bool)\n    bw[stats[\"centroid-0\"], stats[\"centroid-1\"]] = True\n\n    # filter isolated objects\n    if dist_thresh:\n        # dilation of points\n        if dist_thresh % 2 == 0:\n            dist_thresh += 1  # decomposition requires even number\n\n        footprint = morphology.square(int(dist_thresh), decomposition=\"sequence\")\n        dilated = measure.label(morphology.binary_dilation(bw, footprint=footprint))\n        stats = pd.DataFrame(\n            measure.regionprops_table(dilated, properties=(\"label\", \"area\"))\n        )\n\n        # objects that did not merge are alone\n        toremove = stats[(stats[\"area\"] <= dist_thresh**2)]\n        dilated[np.isin(dilated, toremove[\"label\"])] = 0  # remove them\n\n        # apply mask\n        bw = bw * dilated\n\n    # get points coordinates\n    coords = np.argwhere(bw)\n\n    return get_collection_from_points(\n        coords, geojson_props, rescale_factor=rescale_factor\n    )\n
"},{"location":"api-seg.html#histoquant.seg.segment_polygons","title":"segment_polygons(img, geojson_props, area_min=0.0, area_max=np.inf, ecc_min=0.0, ecc_max=1.0, rescale_factor=1.0)","text":"

Polygon segmentation.

Parameters:

Name Type Description Default img ndarray of bool

Binary image to segment as polygons.

required geojson_props dict

GeoJSON properties of objects.

required area_min float

Minimum and maximum area in pixels for an object.

0.0 area_max float

Minimum and maximum area in pixels for an object.

0.0 ecc_min float

Minimum and maximum eccentricity for an object.

0.0 ecc_max float

Minimum and maximum eccentricity for an object.

0.0 rescale_factor float

Rescale output coordinates by this factor.

1.0

Returns:

Name Type Description collection FeatureCollection

A FeatureCollection ready to be written as geojson.

Source code in histoquant/seg.py
def segment_polygons(\n    img: np.ndarray,\n    geojson_props: dict,\n    area_min: float = 0.0,\n    area_max: float = np.inf,\n    ecc_min: float = 0.0,\n    ecc_max: float = 1.0,\n    rescale_factor: float = 1.0,\n) -> geojson.FeatureCollection:\n    \"\"\"\n    Polygon segmentation.\n\n    Parameters\n    ----------\n    img : ndarray of bool\n        Binary image to segment as polygons.\n    geojson_props : dict\n        GeoJSON properties of objects.\n    area_min, area_max : float\n        Minimum and maximum area in pixels for an object.\n    ecc_min, ecc_max : float\n        Minimum and maximum eccentricity for an object.\n    rescale_factor: float\n        Rescale output coordinates by this factor.\n\n    Returns\n    -------\n    collection : geojson.FeatureCollection\n        A FeatureCollection ready to be written as geojson.\n\n    \"\"\"\n\n    label_image = measure.label(img)\n\n    # get objects properties\n    stats = pd.DataFrame(\n        measure.regionprops_table(\n            label_image, properties=(\"label\", \"area\", \"eccentricity\")\n        )\n    )\n\n    # remove objects not matching filters\n    toremove = stats[\n        (stats[\"area\"] < area_min)\n        | (stats[\"area\"] > area_max)\n        | (stats[\"eccentricity\"] < ecc_min)\n        | (stats[\"eccentricity\"] > ecc_max)\n    ]\n\n    label_image[np.isin(label_image, toremove[\"label\"])] = 0\n\n    # find objects countours\n    label_image = label_image > 0\n    contours = measure.find_contours(label_image)\n\n    return get_collection_from_poly(\n        contours, geojson_props, rescale_factor=rescale_factor\n    )\n
"},{"location":"api-utils.html","title":"histoquant.utils","text":"

utils module, part of histoquant.

Contains utilities functions.

"},{"location":"api-utils.html#histoquant.utils.add_brain_region","title":"add_brain_region(df, atlas, col='Parent')","text":"

Add brain region to a DataFrame with Atlas_X, Atlas_Y and Atlas_Z columns.

This uses Brainglobe Atlas API to query the atlas. It does not use the structure_from_coords() method, instead it manually converts the coordinates in stack indices, then get the corresponding annotation id and query the corresponding acronym -- because brainglobe-atlasapi is not vectorized at all.

Parameters:

Name Type Description Default df DataFrame

DataFrame with atlas coordinates in microns.

required atlas BrainGlobeAtlas required col str

Column in which to put the regions acronyms. Default is \"Parent\".

'Parent'

Returns:

Name Type Description df DataFrame

Same DataFrame with a new \"Parent\" column.

Source code in histoquant/utils.py
def add_brain_region(\n    df: pd.DataFrame, atlas: BrainGlobeAtlas, col=\"Parent\"\n) -> pd.DataFrame:\n    \"\"\"\n    Add brain region to a DataFrame with `Atlas_X`, `Atlas_Y` and `Atlas_Z` columns.\n\n    This uses Brainglobe Atlas API to query the atlas. It does not use the\n    structure_from_coords() method, instead it manually converts the coordinates in\n    stack indices, then get the corresponding annotation id and query the corresponding\n    acronym -- because brainglobe-atlasapi is not vectorized at all.\n\n    Parameters\n    ----------\n    df : pd.DataFrame\n        DataFrame with atlas coordinates in microns.\n    atlas : BrainGlobeAtlas\n    col : str, optional\n        Column in which to put the regions acronyms. Default is \"Parent\".\n\n    Returns\n    -------\n    df : pd.DataFrame\n        Same DataFrame with a new \"Parent\" column.\n\n    \"\"\"\n    df_in = df.copy()\n\n    res = atlas.resolution  # microns <-> pixels conversion\n    lims = atlas.shape_um  # out of brain\n\n    # set out-of-brain objects at 0 so we get \"root\" as their parent\n    df_in.loc[(df_in[\"Atlas_X\"] >= lims[0]) | (df_in[\"Atlas_X\"] < 0), \"Atlas_X\"] = 0\n    df_in.loc[(df_in[\"Atlas_Y\"] >= lims[1]) | (df_in[\"Atlas_Y\"] < 0), \"Atlas_Y\"] = 0\n    df_in.loc[(df_in[\"Atlas_Z\"] >= lims[2]) | (df_in[\"Atlas_Z\"] < 0), \"Atlas_Z\"] = 0\n\n    # build the multi index, in pixels and integers\n    ixyz = (\n        df_in[\"Atlas_X\"].divide(res[0]).astype(int),\n        df_in[\"Atlas_Y\"].divide(res[1]).astype(int),\n        df_in[\"Atlas_Z\"].divide(res[2]).astype(int),\n    )\n    # convert i, j, k indices in raveled indices\n    linear_indices = np.ravel_multi_index(ixyz, dims=atlas.annotation.shape)\n    # get the structure id from the annotation stack\n    idlist = atlas.annotation.ravel()[linear_indices]\n    # replace 0 which does not exist to 997 (root)\n    idlist[idlist == 0] = 997\n\n    # query the corresponding acronyms\n    lookup = atlas.lookup_df.set_index(\"id\")\n    df.loc[:, col] = lookup.loc[idlist, \"acronym\"].values\n\n    return df\n
"},{"location":"api-utils.html#histoquant.utils.add_channel","title":"add_channel(df, object_type, channel_names)","text":"

Add channel as a measurement for detections DataFrame.

The channel is read from the Classification column, the latter having to be formatted as \"object_type: channel\".

Parameters:

Name Type Description Default df DataFrame

DataFrame with detections measurements.

required object_type str

Object type (primary classification).

required channel_names dict

Map between original channel names to something else.

required

Returns:

Type Description DataFrame

Same DataFrame with a \"channel\" column.

Source code in histoquant/utils.py
def add_channel(\n    df: pd.DataFrame, object_type: str, channel_names: dict\n) -> pd.DataFrame:\n    \"\"\"\n    Add channel as a measurement for detections DataFrame.\n\n    The channel is read from the Classification column, the latter having to be\n    formatted as \"object_type: channel\".\n\n    Parameters\n    ----------\n    df : pd.DataFrame\n        DataFrame with detections measurements.\n    object_type : str\n        Object type (primary classification).\n    channel_names : dict\n        Map between original channel names to something else.\n\n    Returns\n    -------\n    pd.DataFrame\n        Same DataFrame with a \"channel\" column.\n\n    \"\"\"\n    # check if there is something to do\n    if \"channel\" in df.columns:\n        return df\n\n    kind = get_df_kind(df)\n    if kind == \"annotation\":\n        warnings.warn(\"Annotation DataFrame not supported.\")\n        return df\n\n    # add channel, from {class_name: channel} classification\n    df[\"channel\"] = (\n        df[\"Classification\"].str.replace(object_type + \": \", \"\").map(channel_names)\n    )\n\n    return df\n
"},{"location":"api-utils.html#histoquant.utils.add_hemisphere","title":"add_hemisphere(df, hemisphere_names, midline=5700, col='Atlas_Z', atlas_type='brain')","text":"

Add hemisphere (left/right) as a measurement for detections or annotations.

The hemisphere is read in the \"Classification\" column for annotations. The latter needs to be in the form \"Right: Name\" or \"Left: Name\". For detections, the input col of df is compared to midline to assess if the object belong to the left or right hemispheres.

Parameters:

Name Type Description Default df DataFrame

DataFrame with detections or annotations measurements.

required hemisphere_names dict

Map between \"Left\" and \"Right\" to something else.

required midline float

Used only for \"detections\" df. Corresponds to the brain midline in microns, should be 5700 for CCFv3 and 1610 for spinal cord.

5700 col str

Name of the column containing the Z coordinate (medio-lateral) in microns. Default is \"Atlas_Z\".

'Atlas_Z' atlas_type (brain, cord)

Type of atlas used for registration. Required because the brain atlas is swapped between left and right while the spinal cord atlas is not. Default is \"brain\".

\"brain\"

Returns:

Name Type Description df DataFrame

The same DataFrame with a new \"hemisphere\" column

Source code in histoquant/utils.py
def add_hemisphere(\n    df: pd.DataFrame,\n    hemisphere_names: dict,\n    midline: float = 5700,\n    col: str = \"Atlas_Z\",\n    atlas_type: str = \"brain\",\n) -> pd.DataFrame:\n    \"\"\"\n    Add hemisphere (left/right) as a measurement for detections or annotations.\n\n    The hemisphere is read in the \"Classification\" column for annotations. The latter\n    needs to be in the form \"Right: Name\" or \"Left: Name\". For detections, the input\n    `col` of `df` is compared to `midline` to assess if the object belong to the left or\n    right hemispheres.\n\n    Parameters\n    ----------\n    df : pandas.DataFrame\n        DataFrame with detections or annotations measurements.\n    hemisphere_names : dict\n        Map between \"Left\" and \"Right\" to something else.\n    midline : float\n        Used only for \"detections\" `df`. Corresponds to the brain midline in microns,\n        should be 5700 for CCFv3 and 1610 for spinal cord.\n    col : str, optional\n        Name of the column containing the Z coordinate (medio-lateral) in microns.\n        Default is \"Atlas_Z\".\n    atlas_type : {\"brain\", \"cord\"}, optional\n        Type of atlas used for registration. Required because the brain atlas is swapped\n        between left and right while the spinal cord atlas is not. Default is \"brain\".\n\n    Returns\n    -------\n    df : pandas.DataFrame\n        The same DataFrame with a new \"hemisphere\" column\n\n    \"\"\"\n    # check if there is something to do\n    if \"hemisphere\" in df.columns:\n        return df\n\n    # get kind of DataFrame\n    kind = get_df_kind(df)\n\n    if kind == \"detection\":\n        # use midline\n        if atlas_type == \"brain\":\n            # brain atlas : beyond midline, it's left\n            df.loc[df[col] >= midline, \"hemisphere\"] = hemisphere_names[\"Left\"]\n            df.loc[df[col] < midline, \"hemisphere\"] = hemisphere_names[\"Right\"]\n        elif atlas_type == \"cord\":\n            # cord atlas : below midline, it's left\n            df.loc[df[col] <= midline, \"hemisphere\"] = hemisphere_names[\"Left\"]\n            df.loc[df[col] > midline, \"hemisphere\"] = hemisphere_names[\"Right\"]\n\n    elif kind == \"annotation\":\n        # use Classification name -- this does not depend on atlas type\n        df[\"hemisphere\"] = [name.split(\":\")[0] for name in df[\"Classification\"]]\n        df[\"hemisphere\"] = df[\"hemisphere\"].map(hemisphere_names)\n\n    return df\n
"},{"location":"api-utils.html#histoquant.utils.ccf_to_stereo","title":"ccf_to_stereo(x_ccf, y_ccf, z_ccf=0)","text":"

Convert X, Y, Z coordinates in CCFv3 to stereotaxis coordinates (as in Paxinos-Franklin atlas).

Coordinates are shifted, rotated and squeezed, see (1) for more info. Input must be in mm. x_ccf corresponds to the anterio-posterior (rostro-caudal) axis. y_ccf corresponds to the dorso-ventral axis. z_ccf corresponds to the medio-lateral axis (left-right) axis.

Warning : it is a rough estimation.

(1) https://community.brain-map.org/t/how-to-transform-ccf-x-y-z-coordinates-into-stereotactic-coordinates/1858

Parameters:

Name Type Description Default x_ccf floats or ndarray

Coordinates in CCFv3 space in mm.

required y_ccf floats or ndarray

Coordinates in CCFv3 space in mm.

required z_ccf float or ndarray

Coordinate in CCFv3 space in mm. Default is 0.

0

Returns:

Type Description ap, dv, ml : floats or np.ndarray

Stereotaxic coordinates in mm.

Source code in histoquant/utils.py
def ccf_to_stereo(\n    x_ccf: float | np.ndarray, y_ccf: float | np.ndarray, z_ccf: float | np.ndarray = 0\n) -> tuple:\n    \"\"\"\n    Convert X, Y, Z coordinates in CCFv3 to stereotaxis coordinates (as in\n    Paxinos-Franklin atlas).\n\n    Coordinates are shifted, rotated and squeezed, see (1) for more info. Input must be\n    in mm.\n    `x_ccf` corresponds to the anterio-posterior (rostro-caudal) axis.\n    `y_ccf` corresponds to the dorso-ventral axis.\n    `z_ccf` corresponds to the medio-lateral axis (left-right) axis.\n\n    Warning : it is a rough estimation.\n\n    (1) https://community.brain-map.org/t/how-to-transform-ccf-x-y-z-coordinates-into-stereotactic-coordinates/1858\n\n    Parameters\n    ----------\n    x_ccf, y_ccf : floats or np.ndarray\n        Coordinates in CCFv3 space in mm.\n    z_ccf : float or np.ndarray, optional\n        Coordinate in CCFv3 space in mm. Default is 0.\n\n    Returns\n    -------\n    ap, dv, ml : floats or np.ndarray\n        Stereotaxic coordinates in mm.\n\n    \"\"\"\n    # Center CCF on Bregma\n    xstereo = -(x_ccf - 5.40)  # anterio-posterior coordinate (rostro-caudal)\n    ystereo = y_ccf - 0.44  # dorso-ventral coordinate\n    ml = z_ccf - 5.70  # medio-lateral coordinate (left-right)\n\n    # Rotate CCF of 5\u00b0\n    angle = np.deg2rad(5)\n    ap = xstereo * np.cos(angle) - ystereo * np.sin(angle)\n    dv = xstereo * np.sin(angle) + ystereo * np.cos(angle)\n\n    # Squeeze the dorso-ventral axis by 94.34%\n    dv *= 0.9434\n\n    return ap, dv, ml\n
"},{"location":"api-utils.html#histoquant.utils.filter_df_classifications","title":"filter_df_classifications(df, filter_list, mode='keep', col='Classification')","text":"

Filter a DataFrame whether specified col column entries contain elements in filter_list. Case insensitive.

If mode is \"keep\", keep entries only if their col in is in the list (default). If mode is \"remove\", remove entries if their col is in the list.

Parameters:

Name Type Description Default df DataFrame required filter_list list | tuple | str

List of words that should be present to trigger the filter.

required mode keep or remove

Keep or remove entries from the list. Default is \"keep\".

'keep' col str

Key in df. Default is \"Classification\".

'Classification'

Returns:

Type Description DataFrame

Filtered DataFrame.

Source code in histoquant/utils.py
def filter_df_classifications(\n    df: pd.DataFrame, filter_list: list | tuple | str, mode=\"keep\", col=\"Classification\"\n) -> pd.DataFrame:\n    \"\"\"\n    Filter a DataFrame whether specified `col` column entries contain elements in\n    `filter_list`. Case insensitive.\n\n    If `mode` is \"keep\", keep entries only if their `col` in is in the list (default).\n    If `mode` is \"remove\", remove entries if their `col` is in the list.\n\n    Parameters\n    ----------\n    df : pd.DataFrame\n    filter_list : list | tuple | str\n        List of words that should be present to trigger the filter.\n    mode : \"keep\" or \"remove\", optional\n        Keep or remove entries from the list. Default is \"keep\".\n    col : str, optional\n        Key in `df`. Default is \"Classification\".\n\n    Returns\n    -------\n    pd.DataFrame\n        Filtered DataFrame.\n\n    \"\"\"\n    # check input\n    if isinstance(filter_list, str):\n        filter_list = [filter_list]  # make sure it is a list\n\n    if col not in df.columns:\n        # might be because of 'Classification' instead of 'classification'\n        col = col.capitalize()\n        if col not in df.columns:\n            raise KeyError(f\"{col} not in DataFrame.\")\n\n    pattern = \"|\".join(f\".*{s}.*\" for s in filter_list)\n\n    if mode == \"keep\":\n        df_return = df[df[col].str.contains(pattern, case=False, regex=True)]\n    elif mode == \"remove\":\n        df_return = df[~df[col].str.contains(pattern, case=False, regex=True)]\n\n    # check\n    if len(df_return) == 0:\n        raise ValueError(\n            (\n                f\"Filtering '{col}' with {filter_list} resulted in an\"\n                + \" empty DataFrame, check your config file.\"\n            )\n        )\n    return df_return\n
"},{"location":"api-utils.html#histoquant.utils.filter_df_regions","title":"filter_df_regions(df, filter_list, mode='keep', col='Parent')","text":"

Filters entries in df based on wether their col is in filter_list or not.

If mode is \"keep\", keep entries only if their col in is in the list (default). If mode is \"remove\", remove entries if their col is in the list.

Parameters:

Name Type Description Default df DataFrame required filter_list list - like

List of regions to keep or remove from the DataFrame.

required mode keep or remove

Keep or remove entries from the list. Default is \"keep\".

'keep' col str

Key in df. Default is \"Parent\".

'Parent'

Returns:

Name Type Description df DataFrame

Filtered DataFrame.

Source code in histoquant/utils.py
def filter_df_regions(\n    df: pd.DataFrame, filter_list: list | tuple, mode=\"keep\", col=\"Parent\"\n) -> pd.DataFrame:\n    \"\"\"\n    Filters entries in `df` based on wether their `col` is in `filter_list` or not.\n\n    If `mode` is \"keep\", keep entries only if their `col` in is in the list (default).\n    If `mode` is \"remove\", remove entries if their `col` is in the list.\n\n    Parameters\n    ----------\n    df : pandas.DataFrame\n    filter_list : list-like\n        List of regions to keep or remove from the DataFrame.\n    mode : \"keep\" or \"remove\", optional\n        Keep or remove entries from the list. Default is \"keep\".\n    col : str, optional\n        Key in `df`. Default is \"Parent\".\n\n    Returns\n    -------\n    df : pandas.DataFrame\n        Filtered DataFrame.\n\n    \"\"\"\n\n    if mode == \"keep\":\n        return df[df[col].isin(filter_list)]\n    if mode == \"remove\":\n        return df[~df[col].isin(filter_list)]\n
"},{"location":"api-utils.html#histoquant.utils.get_blacklist","title":"get_blacklist(file, atlas)","text":"

Build a list of regions to exclude from file.

File must be a TOML with [WITH_CHILDS] and [EXACT] sections.

Parameters:

Name Type Description Default file str

Full path the atlas_blacklist.toml file.

required atlas BrainGlobeAtlas

Atlas to extract regions from.

required

Returns:

Name Type Description black_list list

Full list of acronyms to discard.

Source code in histoquant/utils.py
def get_blacklist(file: str, atlas: BrainGlobeAtlas) -> list:\n    \"\"\"\n    Build a list of regions to exclude from file.\n\n    File must be a TOML with [WITH_CHILDS] and [EXACT] sections.\n\n    Parameters\n    ----------\n    file : str\n        Full path the atlas_blacklist.toml file.\n    atlas : BrainGlobeAtlas\n        Atlas to extract regions from.\n\n    Returns\n    -------\n    black_list : list\n        Full list of acronyms to discard.\n\n    \"\"\"\n    with open(file, \"rb\") as fid:\n        content = tomllib.load(fid)\n\n    blacklist = []  # init. the list\n\n    # add regions and their descendants\n    for region in content[\"WITH_CHILDS\"][\"members\"]:\n        blacklist.extend(\n            [\n                atlas.structures[id][\"acronym\"]\n                for id in atlas.structures.tree.expand_tree(\n                    atlas.structures[region][\"id\"]\n                )\n            ]\n        )\n\n    # add regions specified exactly (no descendants)\n    blacklist.extend(content[\"EXACT\"][\"members\"])\n\n    return blacklist\n
"},{"location":"api-utils.html#histoquant.utils.get_data_coverage","title":"get_data_coverage(df, col='Atlas_AP', by='animal')","text":"

Get min and max in col for each by.

Used to get data coverage for each animal to plot in distributions.

Parameters:

Name Type Description Default df DataFrame

description

required col str

Key in df, default is \"Atlas_X\".

'Atlas_AP' by str

Key in df , default is \"animal\".

'animal'

Returns:

Type Description DataFrame

min and max of col for each by, named \"X_min\", and \"X_max\".

Source code in histoquant/utils.py
def get_data_coverage(df: pd.DataFrame, col=\"Atlas_AP\", by=\"animal\") -> pd.DataFrame:\n    \"\"\"\n    Get min and max in `col` for each `by`.\n\n    Used to get data coverage for each animal to plot in distributions.\n\n    Parameters\n    ----------\n    df : pd.DataFrame\n        _description_\n    col : str, optional\n        Key in `df`, default is \"Atlas_X\".\n    by : str, optional\n        Key in `df` , default is \"animal\".\n\n    Returns\n    -------\n    pd.DataFrame\n        min and max of `col` for each `by`, named \"X_min\", and \"X_max\".\n\n    \"\"\"\n    df_group = df.groupby([by])\n    return pd.DataFrame(\n        [\n            df_group[col].min(),\n            df_group[col].max(),\n        ],\n        index=[\"X_min\", \"X_max\"],\n    )\n
"},{"location":"api-utils.html#histoquant.utils.get_df_kind","title":"get_df_kind(df)","text":"

Get DataFrame kind, eg. Annotations or Detections.

It is based on reading the Object Type of the first entry, so the DataFrame must have only one kind of object.

Parameters:

Name Type Description Default df DataFrame required

Returns:

Name Type Description kind str

\"detection\" or \"annotation\".

Source code in histoquant/utils.py
def get_df_kind(df: pd.DataFrame) -> str:\n    \"\"\"\n    Get DataFrame kind, eg. Annotations or Detections.\n\n    It is based on reading the Object Type of the first entry, so the DataFrame must\n    have only one kind of object.\n\n    Parameters\n    ----------\n    df : pandas.DataFrame\n\n    Returns\n    -------\n    kind : str\n        \"detection\" or \"annotation\".\n\n    \"\"\"\n    return df[\"Object type\"].iloc[0].lower()\n
"},{"location":"api-utils.html#histoquant.utils.get_injection_site","title":"get_injection_site(animal, info_file, channel, stereo=False)","text":"

Get the injection site coordinates associated with animal.

Parameters:

Name Type Description Default animal str

Animal ID.

required info_file str

Path to TOML info file.

required channel str

Channel ID as in the TOML file.

required stereo bool

Wether to convert coordinates in stereotaxis coordinates. Default is False.

False

Returns:

Type Description x, y, z : floats

Injection site coordinates.

Source code in histoquant/utils.py
def get_injection_site(\n    animal: str, info_file: str, channel: str, stereo: bool = False\n) -> tuple:\n    \"\"\"\n    Get the injection site coordinates associated with animal.\n\n    Parameters\n    ----------\n    animal : str\n        Animal ID.\n    info_file : str\n        Path to TOML info file.\n    channel : str\n        Channel ID as in the TOML file.\n    stereo : bool, optional\n        Wether to convert coordinates in stereotaxis coordinates. Default is False.\n\n    Returns\n    -------\n    x, y, z : floats\n        Injection site coordinates.\n\n    \"\"\"\n    with open(info_file, \"rb\") as fid:\n        info = tomllib.load(fid)\n\n    if channel in info[animal]:\n        x, y, z = info[animal][channel][\"injection_site\"]\n        if stereo:\n            x, y, z = ccf_to_stereo(x, y, z)\n    else:\n        x, y, z = None, None, None\n\n    return x, y, z\n
"},{"location":"api-utils.html#histoquant.utils.get_leaves_list","title":"get_leaves_list(atlas)","text":"

Get the list of leaf brain regions.

Leaf brain regions are defined as regions without childs, eg. regions that are at the bottom of the hiearchy.

Parameters:

Name Type Description Default atlas BrainGlobeAtlas

Atlas to extract regions from.

required

Returns:

Name Type Description leaves_list list

Acronyms of leaf brain regions.

Source code in histoquant/utils.py
def get_leaves_list(atlas: BrainGlobeAtlas) -> list:\n    \"\"\"\n    Get the list of leaf brain regions.\n\n    Leaf brain regions are defined as regions without childs, eg. regions that are at\n    the bottom of the hiearchy.\n\n    Parameters\n    ----------\n    atlas : BrainGlobeAtlas\n        Atlas to extract regions from.\n\n    Returns\n    -------\n    leaves_list : list\n        Acronyms of leaf brain regions.\n\n    \"\"\"\n    leaves_list = []\n    for region in atlas.structures_list:\n        if atlas.structures.tree[region[\"id\"]].is_leaf():\n            leaves_list.append(region[\"acronym\"])\n\n    return leaves_list\n
"},{"location":"api-utils.html#histoquant.utils.get_mapping_fusion","title":"get_mapping_fusion(fusion_file)","text":"

Get mapping dictionnary between input brain regions and new regions defined in atlas_fusion.toml file.

The returned dictionnary can be used in DataFrame.replace().

Parameters:

Name Type Description Default fusion_file str

Path to the TOML file with the merging rules.

required

Returns:

Name Type Description m dict

Mapping as {old: new}.

Source code in histoquant/utils.py
def get_mapping_fusion(fusion_file: str) -> dict:\n    \"\"\"\n    Get mapping dictionnary between input brain regions and new regions defined in\n    `atlas_fusion.toml` file.\n\n    The returned dictionnary can be used in DataFrame.replace().\n\n    Parameters\n    ----------\n    fusion_file : str\n        Path to the TOML file with the merging rules.\n\n    Returns\n    -------\n    m : dict\n        Mapping as {old: new}.\n\n    \"\"\"\n    with open(fusion_file, \"rb\") as fid:\n        df = pd.DataFrame.from_dict(tomllib.load(fid), orient=\"index\").set_index(\n            \"acronym\"\n        )\n\n    return (\n        df.drop(columns=\"name\")[\"members\"]\n        .explode()\n        .reset_index()\n        .set_index(\"members\")\n        .to_dict()[\"acronym\"]\n    )\n
"},{"location":"api-utils.html#histoquant.utils.get_starter_cells","title":"get_starter_cells(animal, channel, info_file)","text":"

Get the number of starter cells associated with animal.

Parameters:

Name Type Description Default animal str

Animal ID.

required channel str

Channel ID.

required info_file str

Path to TOML info file.

required

Returns:

Name Type Description n_starters int

Number of starter cells.

Source code in histoquant/utils.py
def get_starter_cells(animal: str, channel: str, info_file: str) -> int:\n    \"\"\"\n    Get the number of starter cells associated with animal.\n\n    Parameters\n    ----------\n    animal : str\n        Animal ID.\n    channel : str\n        Channel ID.\n    info_file : str\n        Path to TOML info file.\n\n    Returns\n    -------\n    n_starters : int\n        Number of starter cells.\n\n    \"\"\"\n    with open(info_file, \"rb\") as fid:\n        info = tomllib.load(fid)\n\n    return info[animal][channel][\"starter_cells\"]\n
"},{"location":"api-utils.html#histoquant.utils.merge_regions","title":"merge_regions(df, col, fusion_file)","text":"

Merge brain regions following rules in the fusion_file.toml file.

Apply this merging on col of the input DataFrame. col whose value is found in the members sections in the file will be changed to the new acronym.

Parameters:

Name Type Description Default df DataFrame required col str

Column of df on which to apply the mapping.

required fusion_file str

Path to the toml file with the merging rules.

required

Returns:

Name Type Description df DataFrame

Same DataFrame with regions renamed.

Source code in histoquant/utils.py
def merge_regions(df: pd.DataFrame, col: str, fusion_file: str) -> pd.DataFrame:\n    \"\"\"\n    Merge brain regions following rules in the `fusion_file.toml` file.\n\n    Apply this merging on `col` of the input DataFrame. `col` whose value is found in\n    the `members` sections in the file will be changed to the new acronym.\n\n    Parameters\n    ----------\n    df : pandas.DataFrame\n    col : str\n        Column of `df` on which to apply the mapping.\n    fusion_file : str\n        Path to the toml file with the merging rules.\n\n    Returns\n    -------\n    df : pandas.DataFrame\n        Same DataFrame with regions renamed.\n\n    \"\"\"\n    df[col] = df[col].replace(get_mapping_fusion(fusion_file))\n\n    return df\n
"},{"location":"api-utils.html#histoquant.utils.renormalize_per_key","title":"renormalize_per_key(df, by, on)","text":"

Renormalize on column by its sum for each by.

Use case : relative density is computed for both hemispheres, so if one wants to plot only one hemisphere, the sum of the bars corresponding to one channel (by) should be 1. So :

df = df[df[\"hemisphere\"] == \"Ipsi.\"] df = renormalize_per_key(df, \"channel\", \"relative density\") Then, the sum of \"relative density\" for each \"channel\" equals 1.

Parameters:

Name Type Description Default df DataFrame required by str

Key in df. df is normalized for each by.

required on str

Key in df. Measurement to be normalized.

required

Returns:

Name Type Description df DataFrame

Same DataFrame with normalized on column.

Source code in histoquant/utils.py
def renormalize_per_key(df: pd.DataFrame, by: str, on: str):\n    \"\"\"\n    Renormalize `on` column by its sum for each `by`.\n\n    Use case : relative density is computed for both hemispheres, so if one wants to\n    plot only one hemisphere, the sum of the bars corresponding to one channel (`by`)\n    should be 1. So :\n    >>> df = df[df[\"hemisphere\"] == \"Ipsi.\"]\n    >>> df = renormalize_per_key(df, \"channel\", \"relative density\")\n    Then, the sum of \"relative density\" for each \"channel\" equals 1.\n\n    Parameters\n    ----------\n    df : pd.DataFrame\n    by : str\n        Key in `df`. `df` is normalized for each `by`.\n    on : str\n        Key in `df`. Measurement to be normalized.\n\n    Returns\n    -------\n    df : pd.DataFrame\n        Same DataFrame with normalized `on` column.\n\n    \"\"\"\n    norm = df.groupby(by)[on].sum()\n    bys = df[by].unique()\n    for key in bys:\n        df.loc[df[by] == key, on] = df.loc[df[by] == key, on].divide(norm[key])\n\n    return df\n
"},{"location":"api-utils.html#histoquant.utils.select_hemisphere_channel","title":"select_hemisphere_channel(df, hue, hue_filter, hue_mirror)","text":"

Select relevant data given hue and filters.

Returns the DataFrame with only things to be used.

Parameters:

Name Type Description Default df DataFrame

DataFrame to filter.

required hue (hemisphere, channel)

hue that will be used in seaborn plots.

\"hemisphere\" hue_filter str

Selected data.

required hue_mirror bool

Instead of keeping only hue_filter values, they will be plotted in mirror.

required

Returns:

Name Type Description dfplt DataFrame

DataFrame to be used in plots.

Source code in histoquant/utils.py
def select_hemisphere_channel(\n    df: pd.DataFrame, hue: str, hue_filter: str, hue_mirror: bool\n) -> pd.DataFrame:\n    \"\"\"\n    Select relevant data given hue and filters.\n\n    Returns the DataFrame with only things to be used.\n\n    Parameters\n    ----------\n    df : pd.DataFrame\n        DataFrame to filter.\n    hue : {\"hemisphere\", \"channel\"}\n        hue that will be used in seaborn plots.\n    hue_filter : str\n        Selected data.\n    hue_mirror : bool\n        Instead of keeping only hue_filter values, they will be plotted in mirror.\n\n    Returns\n    -------\n    dfplt : pd.DataFrame\n        DataFrame to be used in plots.\n\n    \"\"\"\n    dfplt = df.copy()\n\n    if hue == \"hemisphere\":\n        # hue_filter is used to select channels\n        # keep only left and right hemispheres, not \"both\"\n        dfplt = dfplt[dfplt[\"hemisphere\"] != \"both\"]\n        if hue_filter == \"all\":\n            hue_filter = dfplt[\"channel\"].unique()\n        elif not isinstance(hue_filter, (list, tuple)):\n            # it is allowed to select several channels so handle lists\n            hue_filter = [hue_filter]\n        dfplt = dfplt[dfplt[\"channel\"].isin(hue_filter)]\n    elif hue == \"channel\":\n        # hue_filter is used to select hemispheres\n        # it can only be left, right, both or empty\n        if hue_filter == \"both\":\n            # handle if it's a coordinates DataFrame which doesn't have \"both\"\n            if \"both\" not in dfplt[\"hemisphere\"].unique():\n                # keep both hemispheres, don't do anything\n                pass\n            else:\n                if hue_mirror:\n                    # we need to keep both hemispheres to plot them in mirror\n                    dfplt = dfplt[dfplt[\"hemisphere\"] != \"both\"]\n                else:\n                    # we keep the metrics computed in both hemispheres\n                    dfplt = dfplt[dfplt[\"hemisphere\"] == \"both\"]\n        else:\n            # hue_filter should correspond to an hemisphere name\n            dfplt = dfplt[dfplt[\"hemisphere\"] == hue_filter]\n    else:\n        # not handled. Just return the DataFrame without filtering, maybe it'll make\n        # sense.\n        warnings.warn(f\"{hue} should be 'channel' or 'hemisphere'.\")\n\n    # check result\n    if len(dfplt) == 0:\n        warnings.warn(\n            f\"hue={hue} and hue_filter={hue_filter} resulted in an empty subset.\"\n        )\n\n    return dfplt\n
"},{"location":"guide-create-pyramids.html","title":"Create pyramidal OME-TIFF","text":"

This page will guide you to use the create_pyramids script, in the event the CZI file does not work directly in QuPath. The script will generate pyramids from OME-TIFF files exported from ZEN.

Tip

The create_pyramids.py script can also pyramidalize images using Python only with the --no-use-qupath option, but I find it slower and less reliable.

This Python script uses QuPath under the hood, via a companion script called createPyramids.groovy. It will find the OME-TIFF files and make QuPath run the groovy script on it, in console mode (without graphical user interface).

This script is standalone, eg. it does not rely on the histoquant package. But installing the later makes sure all dependencies are installed (namely typer and tqdm with the QuPath backend and quite a few more for the Python backend).

"},{"location":"guide-create-pyramids.html#installation","title":"Installation","text":"

You will need a virtual environment with the required dependencies.

Follow those instructions to install miniconda3 if you didn't already.

Then, install the required dependencies.

RecommendedMinimal

Install the histoquant package by following those instructions.

Alternatively, if you don't plan to use the histoquant package, you can create a minimal conda environment with only the libraries required for create_pyramids.py. With QuPath backend

conda create -n hq python=3.12\nconda activate hq\npip install typer tqdm\n
With Python backend
conda create -n hq python=3.12\nconda activate hq\npip install typer tqdm numpy tifffile scikit-image\n

"},{"location":"guide-create-pyramids.html#export-czi-to-ome-tiff","title":"Export CZI to OME-TIFF","text":"

OME-TIFF is a specification of the TIFF image format. It specifies how the metadata should be written to the file to be interoperable between softwares. ZEN can export to OME-TIFF so you don't need to pay attention to metadata. Therefore, you won't need to specify pixel size and channels names and colors as it will be read directly from the OME-TIFF files.

  1. Open your CZI file in ZEN.
  2. Open the \"Processing tab\" on the left panel.
  3. Under method, choose Export/Import > OME TIFF-Export.
  4. In Parameters, make sure to tick the \"Show all\" tiny box on the right.
  5. The following parameters should be used (checked), the other should be unchecked :
    • Use Tiles
    • Original data \"Convert to 8 Bit\" should be UNCHECKED
    • OME-XML Scheme : 2016-06
    • Use full set of dimensions (unless you want to select slices and/or channels)
  6. In Input, choose your file
  7. Go back to Parameters to choose the output directory and file prefix. \"_s1\", \"_s2\"... will be appended to the prefix.
  8. Back on the top, click the \"Apply\" button.

The OME-TIFF files should be ready to be pyramidalized with the create_pyramids.py script.

"},{"location":"guide-create-pyramids.html#usage","title":"Usage","text":"

The script is located under scripts/pyramids. Copy the two files (.py and .groovy) elsewhere on your computer.

To use the QuPath backend (recommended), you need to set its path in the script. To do so, open the create_pyramids.py file with a text editor (Notepad or vscode to get nice syntax coloring). Locate the QUPATH_PATH line :

QUPATH_PATH: str = (\n    \"C:/Users/glegoc/AppData/Local/QuPath-0.5.1/QuPath-0.5.1 (console).exe\"\n)\n\"\"\"Full path to the QuPath (console) executable.\"\"\"\n

Info

The AppData directory is hidden by default. In the file explorer, you can go to the \"View\" tab and check \"Hidden items\" under \"Show/hide\".

And replace the path to the \"QuPath-0.X.Y (console).exe\" executable. QuPath should be installed in C:\\Users\\USERNAME\\AppData\\Local\\QuPath-0.X.Y\\ by default. Save the file. Then run the script on your images :

  1. Open a terminal (PowerShell) so that it can find the create_pyramids.py script, by either :
    • open PowerShell from the start menu, then browse to the location of your script:
      cd /path/to/your/scripts\n
    • From the file explorer, browse to where the script is and in an empty space, Shift+Right Button to \"Open PowerShell window here\"
  2. Activate the virtual environment :
    conda activate hq\n
  3. Copy the path to your OME-TIFF images (for example \"D:\\Data\\Histo\\NiceMouseName\\NiceMouseName-tiff\\\")
  4. In the terminal, run the script on your images :
    python create_pyramids.py \"D:\\Data\\Histo\\NiceMouseName\\NiceMouseName-tiff\\\"\n

Warning

Make sure to use double quotes when specifying the path (\"D:\\some\\path\"), because if there are whitespaces in it, each whitespace-separated bits will be parsed as several arguments for the script.

Tip

create_pyramids.py can behave like a command line interface. In the event you would need to modify the default values used in the script (tile size and the like), you can either edit the script or, preferably, use options when calling the script like so :

python create_pyramids.py --OPTION VALUE /path/to/images\n
Learn more by asking for help :
python create_pyramids.py --help\n

Upon completion, this will create a subdirectory \"pyramidal\" next to your OME-TIFF files where you will find the pyramidal images ready to be used in QuPath and ABBA. You can safely delete the original OME-TIFF exported from ZEN.

You can check the API documentation for this script here.

"},{"location":"guide-install-abba.html","title":"Install ABBA","text":"

You can head to the ABBA documentation for installation instructions. You'll see that a Windows installer is available. While it might be working great, I prefer to do it manually step-by-step to make sure everything is going well.

You will find below installation instructions for the regular ABBA Fiji plugin, which proposes only the mouse and rat brain atlases. To be able to use the Brainglobe atlases, you will need the Python version. The two can be installed alongside each other.

"},{"location":"guide-install-abba.html#abba-fiji","title":"ABBA Fiji","text":""},{"location":"guide-install-abba.html#install-fiji","title":"Install Fiji","text":"

Install the \"batteries-included\" distribution of ImageJ, Fiji, from the official website.

Warning

Extract Fiji somewhere you have write access, otherwise Fiji will not be able to download and install plugins. In other words, put the folder in your User directory and not in C:\\, C:\\Program Files and the like.

  1. Download the zip archive and extract it somewhere relevant.
  2. Launch ImageJ.exe.
"},{"location":"guide-install-abba.html#install-the-abba-plugin","title":"Install the ABBA plugin","text":"

We need to add the PTBIOP update site, managed by the bio-imaging and optics facility at EPFL, that contains the ABBA plugin.

  1. In Fiji, head to Help > Update...
  2. In the ImageJ updater window, click on Manage Update Sites. Look up PTBIOP, and click on the check box. Apply and Close, and Apply Changes. This will download and install the required plugins. Restart ImageJ as suggested.
  3. In Fiji, head to Plugins > BIOP > Atlas > ABBA - ABBA start, or simply type abba start in the search box. Choose the \"Adult Mouse Brain - Allen Brain Atlas V3p1\". It will download this atlas and might take a while, depending on your Internet connection.
"},{"location":"guide-install-abba.html#install-the-automatic-registration-tools","title":"Install the automatic registration tools","text":"

ABBA can leverage the elastix toolbox for automatic 2D in-plane registration.

  1. You need to download it here, which will redirect you to the Github releases page (5.2.0 should work).
  2. Download the zip archive and extract it somewhere relevant.
  3. In Fiji, in the search box, type \"set and check\" and launch the \"Set and Check Wrappers\" command. Set the paths to \"elastix.exe\" and \"transformix.exe\" you just downloaded.

ABBA should be installed and functional ! You can check the official documentation for usage instructions and some tips here.

"},{"location":"guide-install-abba.html#abba-python","title":"ABBA Python","text":"

Brainglobe is an initiative aiming at providing interoperable, model-agnostic Python-based tools for neuroanatomy. They package various published volumetric anatomical atlases of different species (check the list), including the Allen Mouse brain atlas (CCFv3, ref.) and a 3D version of the Allen mouse spinal cord atlas (ref).

To be able to leverage those atlases, we need to make ImageJ and Python be able to talk to each other. This is the purpose of abba_python, that will install ImageJ and its ABBA plugins inside a python environment, with bindings between the two worlds.

"},{"location":"guide-install-abba.html#install-conda","title":"Install conda","text":"

If not done already, follow those instructions to install miniconda3.

"},{"location":"guide-install-abba.html#install-abba_python-in-a-virtual-environment","title":"Install abba_python in a virtual environment","text":"
  1. Open a terminal (PowerShell).
  2. Create a virtual environment with Python 3.10, OpenJDK and PyImageJ :
    conda create -c conda-forge -n abba_python python=3.10 openjdk=11 maven pyimagej notebook\n
  3. Install the latest functional version of abba_python with pip :
    pip install abba-python==0.9.6.dev0\n
  4. Restart the terminal and activate the new environment :
    conda activate abba_python\n
  5. Download the Brainglobe atlas you want (eg. Allen mouse spinal cord) :
    brainglobe install -a allen_cord_20um\n
  6. Launch an interactive Python shell :
    ipython\n
    You should see the IPython prompt, that looks like this :
    In [1]:\n
  7. Import abba_python and launch ImageJ from Python :
    from abba_python import abba\nabba.start_imagej()\n
    The first launch needs to initialize ImageJ and install all required plugins, which takes a while (>5min).
  8. Use ABBA as the regular Fiji version ! The main difference is that the dropdown menu to select which atlas to use is populated with the Brainglobe atlases.

Tip

Afterwards, to launch ImageJ from Python and do some registration work, you just need to launch a terminal (PowerShell), and do steps 4., 6., and 7.

"},{"location":"guide-install-abba.html#install-the-automatic-registration-tools_1","title":"Install the automatic registration tools","text":"

You can follow the same instructions as the regular Fiji version. You can do it from either the \"normal\" Fiji or the ImageJ instance launched from Python, they share the same configuration files. Therefore, if you already did it in regular Fiji, elastix should already be set up and ready to use in ImageJ from Python.

"},{"location":"guide-install-abba.html#troubleshooting","title":"Troubleshooting","text":""},{"location":"guide-install-abba.html#java_home-errors","title":"JAVA_HOME errors","text":"

Unfortunately on some computers, Python does not find the Java virtual machine even though it should have been installed when installing OpenJDK with conda. This will result in an error mentionning \"java.dll\" and suggesting to check the JAVA_HOME environment variable.

The only fix I could find is to install Java system-wide. You can grab a (free) installer on Adoptium, choosing JRE 17.X for your platform. During the installation :

  • choose to install \"just for you\",
  • enable \"Modify PATH variable\" as well as \"Set or override JAVA_HOME\" variable.

Restart the terminal and try again. Now, ImageJ should use the system-wide Java and it should work.

"},{"location":"guide-install-abba.html#abba-qupath-extension","title":"ABBA QuPath extension","text":"

To import registered regions in your QuPath project and be able to convert objects' coordinates in atlas space, the ABBA QuPath extension is required.

  1. In QuPath, head to Edit > Preferences. In the Extension tab, set your QuPath user directory to a local directory (usually C:\\Users\\USERNAME\\QuPath\\v0.X.Y).
  2. Create a folder named extensions in your QuPath user directory.
  3. Download the latest ABBA extension for QuPath from GitHub (choose the file qupath-extension-abba-x.y.z.zip).
  4. Uncompress the archive and copy all .jar files into the extensions folder in your QuPath user directory.
  5. Restart QuPath. Now, in Extensions, you should have an ABBA entry.
"},{"location":"guide-pipeline.html","title":"Pipeline","text":"

While you can use QuPath and histoquant functionalities as you see fit, there exists a pipeline version of those. It requires a specific structure to store files (so that the different scripts know where to look for data). It also requires that you have detections stored as geojson files, which can be achieved using a pixel classifier and further segmentation (see here) for example.

"},{"location":"guide-pipeline.html#purpose","title":"Purpose","text":"

This is especially useful to perform quantification for several animals at once, where you'll only need to specify the root directory and the animals identifiers that should be pooled together, instead of having to manually specify each detections and annotations files.

Three main scripts and function are used within the pipeline :

  • exportPixelClassifierProbabilities.groovy to create prediction maps of objects of interest
  • segment_image.py to segment those maps and create geojson files to be imported back to QuPath as detections
  • pipelineImportExport.groovy to :
    • clear all objects
    • import ABBA regions
    • mirror regions names
    • import geojson detections (from $folderPrefix$segmentation/$segTag$/geojson)
    • add measurements to detections
    • add atlas coordinates to detections
    • add hemisphere to detections' parents
    • add regions measurements
      • count for punctal objects
      • cumulated length for lines objects
    • export detections measurements
      • as CSV for punctual objects
      • as JSON for lines
    • export annotations as CSV
"},{"location":"guide-pipeline.html#directory-structure","title":"Directory structure","text":"

Following a specific directory structure ensures subsequent scripts and functions can find required files. The good news is that this structure will mostly be created automatically using the segmentation scripts (from QuPath and Python), as long as you stay consistent filling the parameters of each script. The structure expected by the groovy all-in-one script and histoquant batch-process function is the following :

some_directory/\n    \u251c\u2500\u2500AnimalID0/  \n    \u2502   \u251c\u2500\u2500 animalid0_qupath/\n    \u2502   \u2514\u2500\u2500 animalid0_segmentation/  \n    \u2502       \u2514\u2500\u2500 segtag/  \n    \u2502           \u251c\u2500\u2500 annotations/  \n    \u2502           \u251c\u2500\u2500 detections/  \n    \u2502           \u251c\u2500\u2500 geojson/  \n    \u2502           \u2514\u2500\u2500 probabilities/  \n    \u251c\u2500\u2500AnimalID1/  \n    \u2502   \u251c\u2500\u2500 animalid1_qupath/\n    \u2502   \u2514\u2500\u2500 animalid1_segmentation/  \n    \u2502       \u2514\u2500\u2500 segtag/  \n    \u2502           \u251c\u2500\u2500 annotations/  \n    \u2502           \u251c\u2500\u2500 detections/  \n    \u2502           \u251c\u2500\u2500 geojson/  \n    \u2502           \u2514\u2500\u2500 probabilities/  \n

Info

Except the root directory and the QuPath project, the rest is automatically created based on the parameters provided in the different scripts. Here's the description of the structure and the requirements :

  • animalid0 should be a convenient animal identifier.
  • The hierarchy must be followed.
  • The experiment root directory, AnimalID0, can be anything but should correspond to one and only one animal.
  • Subsequent animalid0 should be lower case.
  • animalid0_qupath can be named as you wish in practice, but should be the QuPath project.
  • animalid0_segmentation should be called exactly like this -- replacing animalid0 with the actual animal ID. It will be created automatically with the exportPixelClassifierProbabilities.groovy script.
  • segtag corresponds to the type of segmentation (cells, fibers...). It is specified in the exportPixelClassifierProbabilities script. It could be anything, but to recognize if the objects are polygons (and should be counted per regions) or polylines (and the cumulated length should be measured), there are some hardcoded keywords in the segment_images.py and pipelineImportExport.groovy scripts :
    • Cells-like when you need measurements related to its shape (area, circularity...) : cells, cell, polygons, polygon
    • Cells-like when you consider them as punctual : synapto, synaptophysin, syngfp, boutons, points
    • Fibers-like (polylines) : fibers, fiber, axons, axon
  • annotations contains the atlas regions measurements as TSV files.
  • detections contains the objects atlas coordinates and measurements as CSV files (for punctal objects) or JSON (for polylines objects).
  • geojson contains objects stored as geojson files. They could be generated with the pixel classifier prediction map segmentation.
  • probabilities contains the prediction maps to be segmented by the segment_images.py script.

Tip

You can see an example minimal directory structure with only annotations stored in resources/multi.

"},{"location":"guide-pipeline.html#usage","title":"Usage","text":"

Tip

Remember that this is merely an example pipeline, you can shortcut it at any points, as long as you end up with TSV files following the requirements for histoquant.

  1. Create a QuPath project.
  2. Register your images on an atlas with ABBA and export the registration back to QuPath.
  3. Use a pixel classifier and export the prediction maps with the exportPixelClassifierProbabilities.groovy script. You need to get a pixel classifier or create one.
  4. Segment those maps with the segment_images.py script to generate the geojson files containing the objects of interest.
  5. Run the pipelineImportExport.groovy script on your QuPath project.
  6. Set up your configuration files.
  7. Then, analysing your data with any number of animals should be as easy as executing those lines in Python (either from IPython directly or in a script to easily run it later) :
import histoquant as hq\n\n# Parameters\nwdir = \"/path/to/some_directory\"\nanimals = [\"AnimalID0\", \"AnimalID1\"]\nconfig_file = \"/path/to/your/config.toml\"\noutput_format = \"h5\"  # to save the quantification values as hdf5 file\n\n# Processing\ncfg = hq.Config(config_file)\ndf_regions, dfs_distributions, df_coordinates = hq.process.process_animals(\n    wdir, animals, cfg, out_fmt=output_format\n)\n\n# Display\nhq.display.plot_regions(df_regions, cfg)\nhq.display.plot_1D_distributions(dfs_distributions, cfg, df_coordinates=df_coordinates)\nhq.display.plot_2D_distributions(df_coordinates, cfg)\n

Tip

You can see a live example in this demo notebook.

"},{"location":"guide-prepare-qupath.html","title":"Prepare QuPath data","text":"

histoquant uses some QuPath classifications concepts, make sure to be familiar with them with the official documentation. Notably, we use the concept of primary classification and derived classification : an object classfied as First: second is of classification First and of derived classification second.

"},{"location":"guide-prepare-qupath.html#qupath-requirements","title":"QuPath requirements","text":"

histoquant assumes a specific way of storing regions and objects information in the TSV files exported from QuPath. Note that only one primary classification is supported, but you can have any number of derived classifications.

"},{"location":"guide-prepare-qupath.html#detections","title":"Detections","text":"

Detections are the objects of interest. Their information must respect the following :

  • Atlas coordinates should be in millimetres (mm) and stored as Atlas_X, Atlas_Y, Atlas_Z. They correspond, respectively, to the anterio-posterior (rostro-caudal) axis, the inferio-superior (dorso-ventral) axis and the left-right (medio-lateral) axis.
  • They must have a derived classification, in the form Primary: second. Primary would be an object type (cells, fibers, ...), the second one would be a biological marker or a detection channel (fluorescence channel name), for instance : Cells: some marker, or Fibers: EGFP.
  • The classification must match exactly the corresponding measurement in the annotations (see below).
"},{"location":"guide-prepare-qupath.html#annotations","title":"Annotations","text":"

Annotations correspond to the atlas regions. Their information must respect the following :

  • They should be imported with the ABBA extension as acronyms and splitting left/right. Therefore, the annotation name should be the region acronym and its classification should be formatted as Hemisphere: acronym (for ex. Left: PAG).
  • Measurements names should be formatted as : Primary classification: derived classification measurement name. For instance :
    • if one has cells with some marker and count them in each atlas regions, the measurement name would be : Cells: some marker Count.
    • if one segments fibers revealed in the EGFP channel and measures the cumulated length in \u00b5m in each atlas regions, the measurement name would be : Fibers: EGFP Length \u00b5m.
  • Any number of markers or channels are supported.
"},{"location":"guide-prepare-qupath.html#measurements","title":"Measurements","text":""},{"location":"guide-prepare-qupath.html#metrics-supported-by-histoquant","title":"Metrics supported by histoquant","text":"

While you're free to add any measurements as long as they follow the requirements, keep in mind that for atlas regions quantification, histoquant will only compute, pool and average the following metrics :

  • the base measurement itself
    • if \"\u00b5m\" is contained in the measurement name, it will also be converted to mm (\\(\\div\\)1000)
  • the base measurement divided by the region area in \u00b5m\u00b2 (density in something/\u00b5m\u00b2)
  • the base measurement divided by the region area in mm\u00b2 (density in something/mm\u00b2)
  • the squared base measurement divided by the region area in \u00b5m\u00b2 (could be an index, in weird units...)
  • the relative base measurement : the base measurement divided by the total base measurement across all regions in each hemisphere
  • the relative density : density divided by total density across all regions in each hemisphere

It is then up to you to select which metrics among those to compute and display and name them, via the configuration file.

For punctal detections (eg. objects whose only the centroid is considered), only the atlas coordinates are used, to compute and display spatial distributions of objects across the brain (using their classifications to give each distributions different hues). For fibers-like objects, it requires to export the lines detections atlas coordinates as JSON files, with the exportFibersAtlasCoordinates.groovy script (this is done automatically when using the pipeline).

"},{"location":"guide-prepare-qupath.html#adding-measurements","title":"Adding measurements","text":""},{"location":"guide-prepare-qupath.html#count-for-cell-like-objects","title":"Count for cell-like objects","text":"

The groovy script under scripts/qupath-utils/measurements/addRegionsCount.groovy will add a properly formatted count of objects of selected classifications in all atlas regions. This is used for punctual objects (polygons or points), for example objects created in QuPath or with the segmentation script.

"},{"location":"guide-prepare-qupath.html#cumulated-length-for-fibers-like-objects","title":"Cumulated length for fibers-like objects","text":"

The groovy script under scripts/qupath-utils/measurements/addRegionsLength.groovy will add the properly formatted cumulated lenghth in microns of fibers-like objects in all atlas regions. This is used for polylines objects, for example generated with the segmentation script.

"},{"location":"guide-prepare-qupath.html#custom-measurements","title":"Custom measurements","text":"

Keeping in mind histoquant limitations, you can add any measurements you'd like.

For example, you can run a pixel classifier in all annotations (eg. atlas regions). Using the Measure button, it will add a measurement of the area covered by classified pixels. Then, you can use the script located under scripts/qupath-utils/measurements/renameMeasurements.groovy to rename the generated measurements with a properly-formatted name. Finally, you can export regions measurements.

Since histoquant will compute a \"density\", eg. the measurement divided by the region area, in this case, it will correspond to the fraction of surface occupied by classified pixels. This is showcased in the Examples.

"},{"location":"guide-prepare-qupath.html#qupath-export","title":"QuPath export","text":"

Once you imported atlas regions registered with ABBA, detected objects in your images and added properly formatted measurements to detections and annotations, you can :

  • Head to Measure > Export measurements
  • Select relevant images
  • Choose the Output file (specify in the file name if it is a detections or annotations file)
  • Chose either Detections or Annoations in Export type
  • Click Export

Do this for both Detections and Annotations, you can then use those files with histoquant (see the Examples).

"},{"location":"guide-qupath-objects.html","title":"Detect objects with QuPath","text":"

The QuPath documentation is quite extensive, detailed, very well explained and contains full guides on how to create a QuPath project and how to find objects of interests. It is therefore a highly recommended read, nevertheless, you will find below some quick reminders.

"},{"location":"guide-qupath-objects.html#qupath-project","title":"QuPath project","text":"

QuPath works with projects. It is basically a folder with a main project.qproj file, which is a JSON file that contains all the data about your images except the images themselves. Algonside, there is a data folder with an entry for each image, that stores the thumbnails, metadata about the image and detections and annotations but, again, not the image itself. The actual images can be stored anywhere (including a remote server), the QuPath project merely contains the information needed to fetch them and display them. QuPath will never modify your image data.

This design makes the QuPath project itself lightweight (should never exceed 500MB even with millions of detections), and portable : upon opening, if QuPath is not able to find the images where they should be, it will ask for their new locations.

Tip

It is recommended to create the QuPath project locally on your computer, to avoid any risk of conflicts if two people open it at the same time. Nevertheless, you should backup the project regularly on a remote server.

To create a new project, simply drag & drop an empty folder into QuPath window and accept to create a new empty project. Then, add images :

  • If you have a single file, just drag & drop it in the main window.
  • If you have several images, in the left panel, click Add images, then Choose files on the bottom. Drag & drop does not really work as the images will not be sorted properly.

Then, choose the following options :

Image server

Default (let QuPath decide)

Set image type

Most likely, fluorescence

Rotate image

No rotation (unless all your images should be rotated)

Optional args

Leave empty

Auto-generate pyramids

Uncheck

Import objects

Uncheck

Show image selector

Might be useful to check if the images are read correctly (mostly for CZI files).

"},{"location":"guide-qupath-objects.html#detect-objects","title":"Detect objects","text":""},{"location":"guide-qupath-objects.html#built-in-cell-detection","title":"Built-in cell detection","text":"

QuPath has a built-in cell detection feature, available in Analyze > Cell detection. You hava a full tutorial in the official documentation.

Briefly, this uses a watershed algorithm to find bright spots and can perform a cell expansion to estimate the full cell shape based on the detected nuclei. Therefore, this works best to segment nuclei but one can expect good performance for cells as well, depending on the imaging and staining conditions.

Tip

In scripts/qupath-utils/segmentation, there is watershedDetectionFilters.groovy which uses this feature from a script. It further allows you to filter out detected cells based on shape measurements as well as fluorescence itensity in several channels and cell compartments.

"},{"location":"guide-qupath-objects.html#pixel-classifier","title":"Pixel classifier","text":"

Another very powerful and versatile way to segment cells if through machine learning. Note the term \"machine\" and not \"deep\" as it relies on statistics theory from the 1980s. QuPath provides an user-friendly interface to that, similar to what ilastik provides.

The general idea is to train a model to classify every pixel as a signal or as background. You can find good resources on how to procede in the official documentation and some additionnal tips and tutorials on Michael Neslon's blog (here and here).

Specifically, you will manually annotate some pixels of objects of interest and background. Then, you will apply some image processing filters (gaussian blur, laplacian...) to reveal specific features in your images (shapes, textures...). Finally, the pixel classifier will fit a model on those pixel values, so that it will be able to predict if a pixel, given the values with the different filters you applied, belongs to an object of interest or to the background.

This is done in an intuitive GUI with live predictions to get an instant feedback on the effects of the filters and manual annotations.

"},{"location":"guide-qupath-objects.html#train-a-model","title":"Train a model","text":"

First and foremost, you should use a QuPath project dedicated to the training of a pixel classifier, as it is the only way to be able to edit it later on.

  1. You should choose some images from different animals, with different imaging conditions (staining efficiency and LED intensity) in different regions (eg. with different objects' shape, size, sparsity...). The goal is to get the most diversity of objects you could encounter in your experiments. 10 images is more than enough !
  2. Import those images to the new, dedicated QuPath project.
  3. Create the classifications you'll need, \"Cells: marker+\" for example. The \"Ignore*\" classification is used for the background.
  4. Head to Classify > Pixel classification > Train pixel classifier, and turn on Live prediction.
  5. Load all your images in Load training.
  6. In Advanced settings, check Reweight samples to help make sure a classification is not over-represented.
  7. Modify the different parameters :
    • Classifier : typically, RTrees or ANN_MLP. This can be changed dynamically afterwards to see which works best for you.
    • Resolution : this is the pixel size used. This is a trade-off between accuracy and speed. If your objects are only composed of a few pixels, you'll the full resolution, for big objects reducing the resolution will be faster.
    • Features : this is the core of the process -- where you choose the filters. In Edit, you'll need to choose :
      • The fluorescence channels
      • The scales, eg. the size of the filters applied to the image. The bigger, the coarser the filter is. Again, this will depend on the size of the objects you want to segment.
      • The features themselves, eg. the filters applied to your images before feeding the pixel values to the model. For starters, you can select them all to see what they look like.
    • Output :
      • Classification : QuPath will directly classify the pixels. Use that to create objects directly from the pixel classifier within QuPath.
      • Probability : this will output an image where each pixel is its probability to belong to each of the classifications. This is useful to create objects externally.
  8. In the bottom-right corner of the pixel classifier window, you can select to display each filters individually. Then in the QuPath main window, hitting C will switch the view to appreciate what the filter looks like. Identify the ones that makes your objects the most distinct from the background as possible. Switch back to Show classification once you begin to make annotations.
  9. Begin to annotate ! Use the Polyline annotation tool (V) to classify some pixels belonging to an object and some pixels belonging to the background across your images.

    Tip

    You can select the RTrees Classifier, then Edit : check the Calculate variable importance checkbox. Then in the log (Ctrl+Shift+L), you can inspect the weight each features have. This can help discard some filters to keep only the ones most efficient to distinguish the objects of interest.

  10. See in live the effect of your annotations on the classification using C and continue until you're satisfied.

    Important

    This is machine learning. The lesser annotations, the better, as this will make your model more general and adapt to new images. The goal is to find the minimal number of annotations to make it work.

  11. Once you're done, give your classifier a name in the text box in the bottom and save it. It will be stored as a JSON file in the classifiers folder of the QuPath project. This file can be imported in your other QuPath projects.

"},{"location":"guide-qupath-objects.html#built-in-create-objects","title":"Built-in create objects","text":"

Once you imported your model JSON file (Classify > Pixel classification > Load pixel classifier, three-dotted menu and Import from file), you can create objects out of it, measure the surface occupied by classified pixels in each annotation or classify existing detections based on the prediction at their centroid.

In scripts/qupath-utils/segmentation, there is a createDetectionsFromPixelClassifier.groovy script to batch-process your project.

"},{"location":"guide-qupath-objects.html#probability-map-segmentation","title":"Probability map segmentation","text":"

Alternatively, a Python script provided with histoquant can be used to segment the probability map generated by the pixel classifier (the script is located in scripts/segmentation).

You will first need to export those with the exportPixelClassifierProbabilities.groovy script (located in scripts/qupath-utils).

Then the segmentation script can :

  • find punctal objects as polygons (with a shape) or points (punctal) than can be counted.
  • trace fibers with skeletonization to create lines whose lengths can be measured.

Several parameters have to be specified by the user, see the segmentation script API reference. This script will generate GeoJson files that can be imported back to QuPath with the importGeojsonFiles.groovy script.

"},{"location":"guide-qupath-objects.html#third-party-extensions","title":"Third-party extensions","text":"

QuPath being open-source and extensible, there are third-party extensions that implement popular deep learning segmentation algorithms directly in QuPath. They can be used to find objects of interest as detections in the QuPath project and thus integrate nicely with histoquant to quantify them afterwards.

"},{"location":"guide-qupath-objects.html#instanseg","title":"InstanSeg","text":"

QuPath extension : https://github.com/qupath/qupath-extension-instanseg Original repository : https://github.com/instanseg/instanseg Reference papers : doi:10.48550/arXiv.2408.15954, doi:10.1101/2024.09.04.611150

"},{"location":"guide-qupath-objects.html#stardist","title":"Stardist","text":"

QuPath extension : https://github.com/qupath/qupath-extension-stardist Original repository : https://github.com/stardist/stardist Reference paper : doi:10.48550/arXiv.1806.03535

There is a stardistDetectionFilter.groovy script in scripts/qupath-utils/segmentation to use it from a script which further allows you to filter out detected cells based on shape measurements as well as fluorescence itensity in several channels and cell compartments.

"},{"location":"guide-qupath-objects.html#cellpose","title":"Cellpose","text":"

QuPath extension : https://github.com/BIOP/qupath-extension-cellpose Original repository : https://github.com/MouseLand/cellpose Reference papers : doi:10.1038/s41592-020-01018-x, doi:10.1038/s41592-022-01663-4, doi:10.1101/2024.02.10.579780

There is a cellposeDetectionFilter.groovy script in scripts/qupath-utils/segmentation to use it from a script which further allows you to filter out detected cells based on shape measurements as well as fluorescence itensity in several channels and cell compartments.

"},{"location":"guide-qupath-objects.html#sam","title":"SAM","text":"

QuPath extension : https://github.com/ksugar/qupath-extension-sam Original repositories : samapi, SAM Reference papers : doi:10.1101/2023.06.13.544786, doi:10.48550/arXiv.2304.02643

This is more an interactive annotation tool than a fully automatic segmentation algorithm.

"},{"location":"guide-register-abba.html","title":"Registration with ABBA","text":"

The ABBA documentation is quite extensive and contains guided tutorials and a video tutorial. You should therefore check it out ! Nevertheless, you will find below some quick reminders.

"},{"location":"guide-register-abba.html#import-a-qupath-project","title":"Import a QuPath project","text":"

Always use ABBA with a QuPath project, if you import the images directly it will not be possible to export the results back to QuPath. In the toolbar, head to Import > Import QuPath Project.

  • Select the .qproj file corresponding to the QuPath project to be aligned.
  • Initial axis position : this is the initial position where to put your stack. It will be modified afterwards.
  • Axis increment between slices : this is the spatial spacing, in mm, between two slices. This would correspond to the slice thickness multiplied by the number of set. If your images are ordered from rostral to caudal, set it negative.

Warning

ABBA is not the most stable software, it is highly recommended to save in a different file each time you do anything.

"},{"location":"guide-register-abba.html#navigation","title":"Navigation","text":""},{"location":"guide-register-abba.html#interface","title":"Interface","text":"
  • Left Button + drag to select slices
  • Right Button for display options
  • Right Button + drag to browse the view
  • Middle Button to zoom in and or out
"},{"location":"guide-register-abba.html#right-panel","title":"Right panel","text":"

In the right panel, there is everything related to the images, both yours and the atlas.

In the Atlas Display section, you can turn on and off different channels (the first is the reference image, the last is the regions outlines). The Displayed slicing [atlas steps] slider can increase or decrease the number of displayed 2D slices extracted from the 3D volume. It is comfortable to set to to the same spacing as your slices. Remember it is in \"altas steps\", so for an atlas imaged at 10\u00b5m, a 120\u00b5m spacing corresponds to 12 atlas steps.

The Slices Display section lists all your slices. Ctrl+A to select all, and click on the Vis. header to make them visible. Then, you can turn on and off each channels (generally the NISSL channel and the ChAT channel will be used) by clicking on the corresponding header. Finally, set the display limits clicking on the empty header containing the colors.

Right Button in the main view to Change overlap mode twice to get the slices right under the atlas slices.

Tip

Every action in ABBA are stored and are cancellable with Right Button+Z, except the Interactive transform.

"},{"location":"guide-register-abba.html#find-position-and-angle","title":"Find position and angle","text":"

This is the hardest task. You need to drag the slices along the rostro-caudal axis and modify the virtual slicing angle (X Rotation [deg] and Y Rotation [deg] sliders at the bottom of the right panel) until you match the brain structures observed in both your images and the atlas.

Tip

With a high number of slices, most likely, it will be impossible to find a position and slicing angle that works for all your slices. In that case, you should procede in batch, eg. sub-stack of images with a unique position and slicing angle that works for all images in the sub-stack. Then, remove the remaining slices (select them, Right Button > Remove Selected Slices), but do not remove them from the QuPath project.

Procede as usual, including saving (note the slices range it corresponds to) and exporting the registration back to QuPath. Then, reimport the project in a fresh ABBA instance, remove the slices that were already registered and redo the whole process with the next sub-stack and so on.

Once you found the correct position and slicing angle, it must not change anymore, otherwise the registration operations you perform will not make any sense anymore.

"},{"location":"guide-register-abba.html#in-plane-registration","title":"In-plane registration","text":"

The next step is to deform your slices to match the corresponding atlas image, extracted from the 3D volume given the position and virtual slicing angle defined at the previous step.

Info

ABBA makes the choice to deform your slices to the atlas, but the transformations are invertible. This means that you will still be able to work on your raw data and deform the altas onto it instead.

In image processing, there are two kinds of deformation one can apply on an image :

  • Affine (or linear) : simple, image-wide, linear operations - translation, rotation, scaling, shearing.
  • Spline (or non-linear) : complex non-linear operations that can allow for local deformation.

Both can be applied manually or automatically (if the imaging quality allows it). You have different tools to achieve this, all of which can be combined in any order, except the Interactive transform tool (coarse, linear manual deformation).

Change the overlap mode (Right Button) to overlay the slice onto the atlas regions borders. Select the slice you want to align.

"},{"location":"guide-register-abba.html#coarse-linear-manual-deformation","title":"Coarse, linear manual deformation","text":"

While not mandatory, if this tool shall be used, it must be before any operation as it is not cancellable. Head to Register > Affine > Interactive transform. This will open a box where you can rotate, translate and resize the image to make a first, coarse alignment.

Close the box. Again, this is not cancellable. Afterwards, you're free to apply any numbers of transformations in any order.

"},{"location":"guide-register-abba.html#automatic-registration","title":"Automatic registration","text":"

This uses the elastix toolbox to compute the transformations needed to best match two images. It is available in both affine and spline mode, in the Register > Affine and Register > Spline menus respectively.

In both cases, it will open a dialog where you need to choose :

  • Atlas channels : the reference image of the atlas, usually channel number 0
  • Slices channels : the fluorescence channel that looks like the most to the reference image, usually channel number 0
  • Registration re-sampling (micrometers) : the pixel size to resize the images before registration, as it is a computationally intensive task. Going below 20\u00b5m won't help much.

For the Spline mode, there an additional parameter :

  • Number of control points along X : the algorithm will set points as a grid in the image and perform the transformations from those. The higher number of points, the more local transformations will be.
"},{"location":"guide-register-abba.html#manual-registration","title":"Manual registration","text":"

This uses BigWarp to manually deform the images with the mouse. It can be done from scratch (eg. you place the points yourself) or from a previous registration (either a previous BigWarp session or elastix in Spline mode).

"},{"location":"guide-register-abba.html#from-scratch","title":"From scratch","text":"

Register > Spline > BigWarp registration to launch the tool. Choose the atlas that allows you to best see the brain structures (usually the regions outlines channels, the last one), and the reference fluorescence channel.

It will open two viewers, called \"BigWarp moving image\" and \"BigWarp fixed image\". Briefly, they correspond to the two spaces you're working in, the \"Atlas space\" and the \"Slice space\".

Tip

Do not panick yet, while the explanations might be confusing (at least they were to me), in practice, it is easy, intuitive and can even be fun (sometimes, at small dose).

To browse the viewer, use Right Button + drag (Left Button is used to rotate the viewer), Middle Button zooms in and out.

The idea is to place points, called landmarks, that always go in pairs : one in the moving image and one where it corresponds to in the fixed image (or vice-versa). In practice, we will only work in the BigWarp fixed image viewer to place landmarks in both space in one click, then drag it to the corresponding location, with a live feedback of the transformation needed to go from one to another.

To do so :

  1. Press Space to switch to the \"Landmark mode\".

    Warning

    In \"Landmark mode\", Right Button can't be used to browse the view anymore. To do so, turn off the \"Landmark mode\" hitting Space again.

  2. Use Ctrl+Left Button to place a landmark.

    Info

    At least 4 landmarks are needed before activating the live-transform view.

  3. When there are at least 4 landmarks, hit T to activate the \"Transformed\" view. Transformed will be written at the bottom.

  4. Hold Left Button on a landmark to drag it to deform the image onto the atlas.
  5. Add as many landmarks as needed, when you're done, find the Fiji window called \"Big Warp registration\" that opened at the beginning and click OK.

Important remarks and tips

  • A landmark is a location where you said \"this location correspond to this one\". Therefore, BigWarp is not allowed to move this particular location. Everywhere else, it is free to transform the image without any restrictions, including the borders. Thus, it is a good idea to delimit the coarse contour of the brain with landmarks to constrain the registration.
  • Left Button without holding Ctrl will place a landmark in the fixed image only, without pair, and BigWarp won't like it. To delete landmarks, head to the \"Landmarks\" window that lists all of them. They highlight in the viewer upon selection. Hit Del to delete one. Alternatively, click on it on the viewer and hit Del.
"},{"location":"guide-register-abba.html#from-a-previous-registration","title":"From a previous registration","text":"

Head to Register > Edit last Registration to work on a previous registration.

If the previous registration was done with elastix (Spline) or BigWarp, it will launch the BigWarp interface exactly like above, but with landmarks already placed, either on a grid (elastix) or the one you manually placed (BigWarp).

Tip

It will ask which channels to use, you can modify the channel for your slices to work on two channels successively. For instance, one could make a first registration using the NISSL staining, then refine the motoneurons with the ChAT staining, if available.

"},{"location":"guide-register-abba.html#abba-state-file","title":"ABBA state file","text":"

ABBA can save the state you're in, from the File > Save State menu. It will be saved as a .abba file, which is actually a zip archive containing a bunch of JSON, listing every actions you made and in which order, meaning you will stil be able to cancel actions after quitting ABBA.

To load a state, quit ABBA, launch it again, then choose File > Load State and select the .abba file to carry on with the registration.

Save, save, save !

Those state files are cheap, eg. they are lightweight (less than 200KB). You should save the state each time you finish a slice, and you can keep all your files, without overwritting the previous ones, appending a number to its file name. This will allow to roll back to the previous slice in the event of any problem you might face.

"},{"location":"guide-register-abba.html#export-registration-back-to-qupath","title":"Export registration back to QuPath","text":""},{"location":"guide-register-abba.html#export-the-registration-from-abba","title":"Export the registration from ABBA","text":"

Once you are satisfied with your registration, select the registered slices and head to Export > QuPath > Export Registrations To QuPath Project. Check the box to make sure to get the latest registered regions.

It will export several files in the QuPath projects, including the transformed atlas regions ready to be imported in QuPath and the transformations parameters to be able to convert coordinates from the extension.

"},{"location":"guide-register-abba.html#import-the-registration-in-qupath","title":"Import the registration in QuPath","text":"

Make sure you installed the ABBA extension in QuPath.

From your project with an image open, the basic usage is to head to Extensions > ABBA > Load Atlas Annotations into Open Image. Choose to Split Left and Right Regions to make the two hemispheres independent, and choose the \"acronym\" to name the regions. The registered regions should be imported as Annotations in the image.

Tip

With ABBA in regular Fiji using the CCFv3 Allen mouse brain atlas, the left and right regions are flipped, because ABBA considers the slices as backward facing. The importAbba.groovy script located in scripts/qupath-utils-atlas allows you to flip left/right regions names. This is OK because the Allen brain is symmetrical by construction.

For more complex use, check the Groovy scripts in scripts/qupath-utils/atlas. ABBA registration is used throughout the guides, to either work with brain regions (and count objects for instance) or to get the detections' coordinates in the atlas space.

"},{"location":"main-citing.html","title":"Citing","text":"

While histoquant does not have a reference paper as of now, you can reference the GitHub repository.

Please make sure to cite all the softwares used in your research. Citations are usually the only metric used by funding agencies, so citing properly the tools used in your research ensures the continuation of those projects.

  • Fiji : https://imagej.net/software/fiji/#publication
  • QuPath : https://qupath.readthedocs.io/en/stable/docs/intro/citing.html
  • ABBA : doi:10.1101/2024.09.06.611625
  • Brainglobe :
    • AtlasAPI : https://brainglobe.info/documentation/brainglobe-atlasapi/index.html#citation
    • Brainrender : https://brainglobe.info/documentation/brainrender/index.html#citation
  • Allen brain atlas (CCFv3) : doi:10.1016/j.cell.2020.04.007
  • 3D Allen spinal cord atlas : doi:10.1016/j.crmeth.2021.100074
  • Skeleton analysis (for fibers-like segmentation) : doi:10.7717/peerj.4312
"},{"location":"main-configuration-files.html","title":"The configuration files","text":"

There are three configuration files : altas_blacklist, atlas_fusion and a modality-specific file, that we'll call config in this document. The former two are related to the atlas you're using, the latter is what is used by histoquant to know what and how to compute and display things. There is a fourth, optional, file, used to provide some information on a specific experiment, info.

The configuration files are in the TOML file format, that are basically text files formatted in a way that is easy to parse in Python. See here for a basic explanation of the syntax.

Most lines of each template file are commented to explain what each parameter do.

"},{"location":"main-configuration-files.html#atlas_blacklisttoml","title":"atlas_blacklist.toml","text":"Click to see an example file atlas_blacklist.toml
# TOML file to list Allen brain regions to ignore during analysis.\n# \n# It is used to blacklist regions and all descendants regions (\"WITH_CHILD\").\n# Objects belonging to those regions and their descendants will be discarded.\n# And you can specify an exact region where to remove objects (\"EXACT\"),\n# descendants won't be affected.\n# Use it to remove noise in CBX, ventricual systems and fiber tracts.\n# Regions are referenced by their exact acronym.\n#\n# Syntax :\n#   [WITH_CHILDS]\n#   members = [\"CBX\", \"fiber tracts\", \"VS\"]\n#\n#   [EXACT]\n#   members = [\"CB\"]\n\n\n[WITH_CHILDS]\nmembers = [\"CBX\", \"fiber tracts\", \"VS\"]\n\n[EXACT]\nmembers = [\"CB\"]\n

This file is used to filter out specified regions and objects belonging to them.

  • The atlas regions present in the members keys will be ignored. Objects whose parents are in here will be ignored as well.
  • In the [WITH_CHILDS] section, regions and objects belonging to those regions and all descending regions (child regions, as per the altas hierarchy) will be removed.
  • In the [EXACT] section, only regions and objects belonging to those exact regions are removed. Descendants regions are not taken into account.
"},{"location":"main-configuration-files.html#atlas_fusiontoml","title":"atlas_fusion.toml","text":"Click to see an example file atlas_blacklist.toml
# TOML file to determine which brain regions should be merged together.\n# Regions are referenced by their exact acronym.\n# The syntax should be the following :\n# \n#   [MY]\n#   name = \"Medulla\"  # new or existing full name\n#   acronym = \"MY\"  # new or existing acronym\n#   members = [\"MY-mot\", \"MY-sat\"]  # existing Allen Brain acronyms that should belong to the new region\n#\n# Then, regions labelled \"MY-mot\" and \"MY-sat\" will be labelled \"MY\" and will join regions already labelled \"MY\".\n# What's in [] does not matter but must be unique and is used to group.\n# The new \"name\" and \"acronym\" can be existing Allen Brain regions or a new (meaningful) one.\n# Note that it is case sensitive.\n\n[PHY]\nname = \"Perihypoglossal nuclei\"\nacronym = \"PHY\"\nmembers = [\"NR\", \"PRP\"]\n\n[NTS]\nname = \"Nucleus of the solitary tract\"\nacronym = \"NTS\"\nmembers = [\"ts\", \"NTSce\", \"NTSco\", \"NTSge\", \"NTSl\", \"NTSm\"]\n\n[AMB]\nname = \"Nucleus ambiguus\"\nacronym = \"AMB\"\nmembers = [\"AMBd\", \"AMBv\"]\n\n[MY]\nname = \"Medulla undertermined\"\nacronym = \"MYu\"\nmembers = [\"MY-mot\", \"MY-sat\"]\n\n[IRN]\nname = \"Intermediate reticular nucleus\"\nacronym = \"IRN\"\nmembers = [\"IRN\", \"LIN\"]\n

This file is used to group regions together, to customize the atlas' hierarchy. It is particularly useful to group smalls brain regions that are impossible to register precisely. Keys name, acronym and members should belong to a [section].

  • [section] is just for organizing, the name does not matter but should be unique.
  • name should be a human-readable name for your new region.
  • acronym is how the region will be refered to. It can be a new acronym, or an existing one.
  • members is a list of acronyms of atlas regions that should be part of the new one.
"},{"location":"main-configuration-files.html#configtoml","title":"config.toml","text":"Click to see an example file config_template.toml
########################################################################################\n# Configuration file for histoquant package\n# -----------------------------------------\n# This is a TOML file. It maps a key to a value : `key = value`.\n# Each key must exist and be filled. The keys' names can't be modified, except:\n#   - entries in the [channels.names] section and its corresponding [channels.colors] section,\n#   - entries in the [regions.metrics] section.                                                                                   \n#\n# It is strongly advised to NOT modify this template but rather copy it and modify the copy.\n# Useful resources :\n#   - the TOML specification : https://toml.io/en/\n#   - matplotlib colors : https://matplotlib.org/stable/gallery/color/color_demo.html\n#\n# Configuration file part of the python histoquant package.\n# version : 2.1\n########################################################################################\n\nobject_type = \"Cells\"  # name of QuPath base classification (eg. without the \": subclass\" part)\nsegmentation_tag = \"cells\"  # type of segmentation, matches directory name, used only in the full pipeline\n\n[atlas]  # information related to the atlas used\nname = \"allen_mouse_10um\"  # brainglobe-atlasapi atlas name\ntype = \"brain\"  # brain or cord (eg. registration done in ABBA or abba_python)\nmidline = 5700  # midline Z coordinates (left/right limit) in microns\noutline_structures = [\"root\", \"CB\", \"MY\", \"P\"]  # structures to show an outline of in heatmaps\n\n[channels]  # information related to imaging channels\n[channels.names]  # must contain all classifications derived from \"object_type\"\n\"marker+\" = \"Positive\"  # classification name = name to display\n\"marker-\" = \"Negative\"\n[channels.colors]  # must have same keys as names' keys\n\"marker+\" = \"#96c896\"  # classification name = matplotlib color (either #hex, color name or RGB list)\n\"marker-\" = \"#688ba6\"\n\n[hemispheres]  # information related to hemispheres\n[hemispheres.names]\nLeft = \"Left\"  # Left = name to display\nRight = \"Right\"  # Right = name to display\n[hemispheres.colors]  # must have same keys as names' keys\nLeft = \"#ff516e\"  # Left = matplotlib color (either #hex, color name or RGB list)\nRight = \"#960010\"  # Right = matplotlib color\n\n[distributions]  # spatial distributions parameters\nstereo = true  # use stereotaxic coordinates (Paxinos, only for brain)\nap_lim = [-8.0, 0.0]  # bins limits for anterio-posterior\nap_nbins = 75  # number of bins for anterio-posterior\ndv_lim = [-1.0, 7.0]  # bins limits for dorso-ventral\ndv_nbins = 50  # number of bins for dorso-ventral\nml_lim = [-5.0, 5.0]  # bins limits for medio-lateral\nml_nbins = 50  # number of bins for medio-lateral\nhue = \"channel\"  # color curves with this parameter, must be \"hemisphere\" or \"channel\"\nhue_filter = \"Left\"  # use only a subset of data. If hue=hemisphere : channel name, list of such or \"all\". If hue=channel : hemisphere name or \"both\".\ncommon_norm = true  # use a global normalization for each hue (eg. the sum of areas under all curves is 1)\n[distributions.display]\nshow_injection = false  # add a patch showing the extent of injection sites. Uses corresponding channel colors\ncmap = \"OrRd\"  # matplotlib color map for heatmaps\ncmap_nbins = 50  # number of bins for heatmaps\ncmap_lim = [1, 50]  # color limits for heatmaps\n\n[regions]  # distributions per regions parameters\nbase_measurement = \"Count\"  # the name of the measurement in QuPath to derive others from\nhue = \"channel\"  # color bars with this parameter, must be \"hemisphere\" or \"channel\"\nhue_filter = \"Left\"  # use only a subset of data. If hue=hemisphere : channel name, list of such or \"all\". If hue=channel : hemisphere name or \"both\".\nhue_mirror = false  # plot two hue_filter in mirror instead of discarding the other\nnormalize_starter_cells = false  # normalize non-relative metrics by the number of starter cells\n[regions.metrics]  # names of metrics. Do not change the keys !\n\"density \u00b5m^-2\" = \"density \u00b5m^-2\"\n\"density mm^-2\" = \"density mm^-2\"\n\"coverage index\" = \"coverage index\"\n\"relative measurement\" = \"relative count\"\n\"relative density\" = \"relative density\"\n[regions.display]\nnregions = 18  # number of regions to display (sorted by max.)\norientation = \"h\"  # orientation of the bars (\"h\" or \"v\")\norder = \"max\"  # order the regions by \"ontology\" or by \"max\". Set to \"max\" to provide a custom order\ndodge = true  # enforce the bar not being stacked\nlog_scale = false  # use log. scale for metrics\n[regions.display.metrics]  # name of metrics to display\n\"count\" = \"count\"  # real_name = display_name, with real_name the \"values\" in [regions.metrics]\n\"density mm^-2\" = \"density (mm^-2)\"\n\n[files]  # full path to information TOML files\nblacklist = \"../../atlas/atlas_blacklist.toml\"\nfusion = \"../../atlas/atlas_fusion.toml\"\noutlines = \"/data/atlases/allen_mouse_10um_outlines.h5\"\ninfos = \"../../configs/infos_template.toml\"\n

This file is used to configure histoquant behavior. It specifies what to compute, how, and display parameters such as colors associated to each classifications, hemisphere names, distributions bins limits...

Warning

When editing your config.toml file, you're allowed to modify the keys only in the [channels] section.

Click for a more readable parameters explanation

object_type : name of QuPath base classification (eg. without the \": subclass\" part) segmentation_tag : type of segmentation, matches directory name, used only in the full pipeline

atlas Information related to the atlas used

name : brainglobe-atlasapi atlas name type : \"brain\" or \"cord\" (eg. registration done in ABBA or abba_python). This will determine whether to flip Left/Right when determining detections hemisphere based on their coordinates. Also adapts the axes in the 2D heatmaps. midline : midline Z coordinates (left/right limit) in microns to determine detections hemisphere based on their coordinates. outline_structures : structures to show an outline of in heatmaps

channels Information related to imaging channels

names Must contain all classifications derived from \"object_type\" you want to process. In the form subclassification name = name to display on the plots

\"marker+\" : classification name = name to display \"marker-\" : add any number of sub-classification

colors Must have same keys as \"names\" keys, in the form subclassification name = color, with color specified as a matplotlib named color, an RGB list or an hex code.

\"marker+\" : classification name = matplotlib color \"marker-\" : must have the same entries as \"names\".

hemispheres Information related to hemispheres, same structure as channels

names

Left : Left = name to display Right : Right = name to display

colors Must have same keys as names' keys

Left : ff516e\" # Left = matplotlib color (either #hex, color name or RGB list) Right : 960010\" # Right = matplotlib color

distributions Spatial distributions parameters

stereo : use stereotaxic coordinates (as in Paxinos, only for mouse brain CCFv3) ap_lim : bins limits for anterio-posterior in mm ap_nbins : number of bins for anterio-posterior dv_lim : bins limits for dorso-ventral in mm dv_nbins : number of bins for dorso-ventral ml_lim : bins limits for medio-lateral in mm ml_nbins : number of bins for medio-lateral hue : color curves with this parameter, must be \"hemisphere\" or \"channel\" hue_filter : use only a subset of data

  • If hue=hemisphere : it should be a channel name, a list of such or \"all\"
  • If hue=channel : it should be a hemisphere name or \"both\"

common_norm : use a global normalization (eg. the sum of areas under all curves is 1). Otherwise, normalize each hue individually

display Display parameters

show_injection : add a patch showing the extent of injection sites. Uses corresponding channel colors. Requires the information TOML configuration file set up cmap : matplotlib color map for 2D heatmaps cmap_nbins : number of bins for 2D heatmaps cmap_lim : color limits for 2D heatmaps

regions Distributions per regions parameters

base_measurement : the name of the measurement in QuPath to derive others from. Usually \"Count\" or \"Length \u00b5m\" hue : color bars with this parameter, must be \"hemisphere\" or \"channel\" hue_filter : use only a subset of data

  • If hue=hemisphere : it should be a channel name, a list of such or \"all\"
  • If hue=channel : it should be a hemisphere name or \"both\"

hue_mirror : plot two hue_filter in mirror instead of discarding the others. For example, if hue=channel and hue_filter=\"both\", plots the two hemisphere in mirror. normalize_starter_cells : normalize non-relative metrics by the number of starter cells

metrics Names of metrics. The keys are used internally in histoquant as is so should NOT be modified. The values will only chang etheir names in the ouput file

\"density \u00b5m^-2\" : relevant name \"density mm^-2\" : relevant name \"coverage index\" : relevant name \"relative measurement\" : relevant name \"relative density\" : relevant name

display

nregions : number of regions to display (sorted by max.) orientation : orientation of the bars (\"h\" or \"v\") order : order the regions by \"ontology\" or by \"max\". Set to \"max\" to provide a custom order dodge : enforce the bar not being stacked log_scale : use log. scale for metrics

metrics name of metrics to display

\"count\" : real_name = display_name, with real_name the \"values\" in [regions.metrics] \"density mm^-2\"

files Full path to information TOML files and atlas outlines for 2D heatmaps.

blacklist fusion outlines infos

"},{"location":"main-configuration-files.html#infotoml","title":"info.toml","text":"Click to see an example file info_template.toml
# TOML file to specify experimental settings of each animals.\n# Syntax should be :\n#   [animalid0]  # animal ID\n#   slice_thickness = 30  # slice thickness in microns\n#   slice_spacing = 60  # spacing between two slices in microns\n#   [animalid0.marker-name]  # [{Animal id}.{segmented channel name}]\n#   starter_cells = 190  # number of starter cells\n#   injection_site = [x, y, z]  # approx. injection site in CCFv3 coordinates\n#\n# --------------------------------------------------------------------------\n[animalid0]\nslice_thickness = 30\nslice_spacing = 60\n[animalid0.\"marker+\"]\nstarter_cells = 150\ninjection_site = [ 10.8937328, 6.18522070, 6.841855301 ]\n[animalid0.\"marker-\"]\nstarter_cells = 175\ninjection_site = [ 10.7498512, 6.21545461, 6.815487203 ]\n# --------------------------------------------------------------------------\n[animalid1-SC]\nslice_thickness = 30\nslice_spacing = 120\n[animalid1-SC.EGFP]\nstarter_cells = 250\ninjection_site = [ 10.9468211, 6.3479642, 6.0061113 ]\n[animalid1-SC.DsRed]\nstarter_cells = 275\ninjection_site = [ 10.9154874, 6.2954872, 8.1587125 ]\n# --------------------------------------------------------------------------\n

This file is used to specify injection sites for each animal and each channel, to display it in distributions.

"},{"location":"main-getting-help.html","title":"Getting help","text":"

For help in QuPath, ABBA, Fiji or any image processing-related questions, your one stop is the image.sc forum. There, you can search with specific tags (#qupath, #abba, ...). You can also ask questions or even answer to some by creating an account !

For help with histoquant in particular, you can open an issue in Github (which requires an account as well), or send an email to me or Antoine Lesage.

"},{"location":"main-getting-started.html","title":"Getting started","text":""},{"location":"main-getting-started.html#quick-start","title":"Quick start","text":"
  1. Install QuPath, ABBA and miniconda3.
  2. Create an environment :
    conda create -c conda-forge -n hq python=3.12 pytables\n
  3. Activate it :
    conda activate hq\n
  4. Download the latest release .zip, unzip it and install it with pip, from inside the histoquant-xxx folder :
    pip install .\n
    If you want to build the doc :
    pip install .[doc]\n
"},{"location":"main-getting-started.html#slow-start","title":"Slow start","text":"

Tip

If all goes well, you shouldn't need any admin rights to install the various pieces of software used before histoquant.

Important

Remember to cite all softwares you use ! See Citing.

"},{"location":"main-getting-started.html#qupath","title":"QuPath","text":"

QuPath is an \"open source software for bioimage analysis\". You can install it from the official website : https://qupath.github.io/. The documentation is quite clear and comprehensive : https://qupath.readthedocs.io/en/stable/index.html.

This is where you'll create QuPath projects, in which you'll be able to browse your images, annotate them, import registered brain regions and find objects of interests (via automatic segmentation, thresholding, pixel classification, ...). Then, those annotations and detections can be exported to be processed by histoquant.

"},{"location":"main-getting-started.html#aligning-big-brain-and-atlases-abba","title":"Aligning Big Brain and Atlases (ABBA)","text":"

This is the tool you'll use to register 2D histological sections to 3D atlases. See the dedicated page.

"},{"location":"main-getting-started.html#python-virtual-environment-manager-conda","title":"Python virtual environment manager (conda)","text":"

The histoquant package is written in Python. It depends on scientific libraries (such as NumPy, pandas and many more). Those libraries need to be installed in versions that are compatible with each other and with histoquant. To make sure those versions do not conflict with other Python tools you might be using (deeplabcut, abba_python, ...), we will install histoquant and its dependencies in a dedicated virtual environment.

conda is a software that takes care of this. It comes with a \"base\" environment, from which we will create and manage other environments. It is included with the Anaconda distribution, but the latter is bloated : its \"base\" environment already contains tons of libraries, and tends to self-destruct at some point (eg. becomes unable to resolve the inter-dependencies), which makes you unable to install new libraries nor create new environments.

This is why it is highly recommended to install miniconda3 instead, a minimal installer for conda :

  1. Download and install miniconda3 (choose the \"latest\" version for your system). During the installation, choose to install for the current user, add conda to PATH and make python the default interpreter.
  2. Open a terminal (PowerShell in Windows). Run :
    conda init\n
    This will activate conda and its base environment whenever you open a new PowerShell window. Now, when opening a new PowerShell (or terminal), you should see a prompt like this :
    (base) PS C:\\Users\\myname>\n
  3. Run :
    conda config --add channels conda-forge\n
    Then :
    conda config --set channel_priority flexible\n
    This will make conda download the packages from the \"conda-forge\" online repository, which is more complete and up-to-date. The flag -c conda-forge in the subsequent instructions won't be necessary anymore.

Tip

If Anaconda is already installed and you don't have the rights to uninstall it, you'll have to use it instead. You can launch the \"Anaconda Prompt (PowerShell)\", run conda init and follow the same instructions below (and hope it won't break in the foreseeable future).

"},{"location":"main-getting-started.html#installation","title":"Installation","text":"

This section explains how to actually install the histoquant package. The following commands should be run from a terminal (PowerShell). Remember that the -c conda-forge bits are not necessary if you did the step 3. above.

  1. Create a virtual environment with python 3.12 and some libraries:
    conda create -c conda-forge -n hq python=3.12 pytables\n
  2. Get a copy of the histoquant Source code .zip package, from the Releases page.
  3. We need to install it inside the hq environment we just created. First, you need to activate the hq environment :
    conda activate hq\n
    Now, the prompt should look like this :
    (hq) PS C:\\Users\\myname>\n
    This means that Python packages will now be installed in the hq environment and won't conflict with other toolboxes you might be using. Then, we use pip to install histoquant. pip was installed with Python, and will scan the histoquant folder, specifically the \"pyproject.toml\" file that lists all the required dependencies. To do so, you can either :
    • pip install /path/to/histoquant\n
    • Change directory from the terminal :
      cd /path/to/histoquant\n
      Then install the package, \".\" denotes \"here\" :
      pip install .\n
    • Use the file explorer to get to the histoquant folder, use Shift+Right Button to \"Open PowerShell window here\" and run :
      pip install .\n

histoquant is now installed inside the hq environment and will be available in Python from that environment !

Tip

You will need to perform step 3. each time you want to update the package.

If you already have registered data and cells in QuPath, you can export Annotations and Detections as TSV files and head to the Example section.

"},{"location":"main-using-notebooks.html","title":"Using notebooks","text":"

A Jupyter notebook is a way to use Python in an interactive manner. It uses cells that contain Python code, and that are to be executed to immediately see the output, including figures.

You can see some rendered notebooks in the examples here, but you can also download them (downward arrow button on the top right corner of each notebook) and run them locally with your own data.

To do so, you can either use an integrated development environment (basically a supercharged text editor) that supports Jupyter notebooks, or directly the Jupyter web interface.

IDEJupyter web interface

You can use for instance Visual Studio Code, also known as vscode.

  1. Download it and install it.
  2. Launch vscode.
  3. Follow or skip tutorials.
  4. In the left panel, open Extension (squared pieces).
  5. Install the \"Python\" and \"Jupyter\" extensions (by Microsoft).
  6. You now should be able to open .ipynb (notebooks) files with vscode. On the top right, you should be able to Select kernel : choose \"hq\".
  1. Create a folder dedicated to working with notebooks, for example \"Documents\\notebooks\".
  2. Copy the notebooks you're interested in in this folder.
  3. Open a terminal inside this folder (by either using cd Documents\\notebooks or, in the file explorer in your \"notebooks\" folder, Shift+Right Button to \"Open PowerShell window here\")
  4. Activate the conda environment :
    conda activate hq\n
  5. Launch the Jupyter Lab web interface :
    jupyter lab\n
    This should open a web page where you can open the ipynb files.
"},{"location":"tips-abba.html","title":"ABBA","text":""},{"location":"tips-brain-contours.html","title":"Brain contours","text":"

With histoquant, it is possible to plot 2D heatmaps on brain contours.

All the detections are projected in a single plane, thus it is up to you to select a relevant data range. It is primarily intended to give a quick, qualitative overview of the spreading of your data.

To do so, it requires the brain regions outlines, stored in a hdf5 file. This can be generated with brainglobe-atlasapi. The generate_atlas_outlines.py located in scripts/atlas will show you how to make such a file, that the histoquant.display module can use.

Alternatively it is possible to directly plot density maps without histoquant, using brainglobe-heatmap. An example is shown here.

"},{"location":"tips-formats.html","title":"Data format","text":""},{"location":"tips-formats.html#some-concepts","title":"Some concepts","text":""},{"location":"tips-formats.html#tiles","title":"Tiles","text":"

The representation of an image in a computer is basically a table where each element represents the pixel value (see more here). It can be n-dimensional, where the typical dimensions would be \\((x, y, z)\\), time and the fluorescence channels.

In large images, such as histological slices that are more than 10000\\(\\times\\)10000 pixels, a strategy called tiling is used to optimize access to specific regions in the image. Storing the whole image at once in a file would imply to load the whole thing at once in the memory (RAM), even though one would only need to access a given rectangular region with a given zoom. Instead, the image is stored as tiles, small squares (512--2048 pixels) that pave the whole image and are used to reconstruct the original image. Therefore, when zooming-in, only the relevant tiles are loaded and displayed, allowing for smooth large image navigation. This process is done seamlessly by software like QuPath and BigDataViewer (the Fiji plugin ABBA is based on) when loading tiled images. This is also leveraged for image processing in QuPath, which will work on tiles instead of the whole image to not saturate your computer RAM.

Most images are already tiled, including Zeiss CZI images. Note that those tiles do not necessarily correspond to the actual, real-world, tiles the microscope did to image the whole slide.

"},{"location":"tips-formats.html#pyramids","title":"Pyramids","text":"

In the same spirit as tiles, it would be a waste to have to load the entire image (and all the tiles) at once when viewing the image at max zoom-out, as your monitor nor your eyes would handle it. Instead, smaller, rescaled versions of the original image are stored alongside it, and depending on the zoom you are using, the sub-resolution version is displayed. Again, this is done seamlessly by QuPath and ABBA, allowing you to quickly switch from an image to another, without having to load the GB-sized image. Also, for image processing that does not require the original pixel size, QuPath can also leverage pyramids to go faster.

Usually, upon openning a CZI file in ZEN, there is a pop-up suggesting you to generate pyramids. It is a very good idea to say yes, wait a bit and save the file so that the pyramidal levels are saved within the file.

"},{"location":"tips-formats.html#metadata","title":"Metadata","text":"

Metadata, while often overlooked, are of paramount importance in microscopy data. It allows both softwares and users to interpret the raw data of images, eg. the values of each pixels. Most image file formats support this, including the microcope manufacturer file formats. Metadata may include :

  • Pixel size. Usually expressed in \u00b5m for microscopy, this maps computer pixel units into real world distance. QuPath and ABBA uses that calibration to scale your image properly, so that it match the atlas you'll register your slices on,
  • Channels colors and names,
  • Image type (fluorescence, brightfield, ...),
  • Dimensions,
  • Magnification...

Pixel size is the parameter that is absolutely necessary. Channel names and colors are more a quality of life feature, to make sure not to mix your difference fluorescence channels. CZI files or exported OME-TIFF files include this out of the box so you don't really need to pay attention.

"},{"location":"tips-formats.html#bio-formats","title":"Bio-formats","text":"

Bio-formats is an initiative of the Open Microscopy Environment (OME) consortium, aiming at being able to read proprietary microscopy image data and metadata. It is used in QuPath, Fiji and ABBA.

This page summarizes the level of support of numerous file formats. You can see that Zeiss CZI files and Leica LIF are quite well supported, and should therefore work out of the box in QuPath.

"},{"location":"tips-formats.html#zeiss-czi-files","title":"Zeiss CZI files","text":"

QuPath and ABBA supports any Bio-formats supported, tiled, pyramidal images.

If you're in luck, adding the pyramidal CZI file to your QuPath project will just work. If it doesn't, you'll notice immediately : the tiles will be shuffled and you'll see only a part of the image instead of the whole one. Unfortunately I was not able to determine why this happens and did not find a way to even predict if a file will or will not work.

In the event you experience this bug, you'll need to export the CZI files to OME-TIFF files from ZEN, then generate tiled pyramidal images with the create_pyramids.py script included in histoquant. See the instructions.

"},{"location":"tips-formats.html#markdown-md-files","title":"Markdown (.md) files","text":"

Markdown is a markup language to create formatted text. It is basically a simple text file that could be opened with any text editor software (notepad and the like), but features specific tags to format the text with heading levels, typesetting (bold, itallic), links, lists... This very page is actually written in markdown, and the engine that builds it renders the text in a nicely formatted manner.

If you open a .md file with vscode for example, you'll get a magnigying glass on the top right corner to switch to the rendered version of the file.

"},{"location":"tips-formats.html#toml-toml-files","title":"TOML (.toml) files","text":"

TOML, or Tom's Obvious Minimal Language, is a configuration file format (similar to YAML). Again, it is basically a simple text file that can be opened with any text editor and is human-readable, but also computer-readable. This means that it is easy for most software and programming language to parse the file to associate a variable (or \"key\") to a value, thus making it a good file format for configuration. It is used in histoquant (see The configuration files page).

The syntax looks like this :

# a comment, ignored by the computer\nkey1 = 10  # the key \"key1\" is mapped to the number 10\nkey2 = \"something\"  # \"key2\" is mapped to the string \"something\"\nkey3 = [\"something else\", 1.10, -25]  # \"key3\" is mapped to a list with 3 elements\n[section]  # we can declare sections\nkey1 = 5  # this is not \"key1\", it actually is section.key1\n[section.example]  # we can have nested sections\nkey1 = true  # this is section.example.key1, mapped to the boolean True\n

You can check the full specification of this language here.

"},{"location":"tips-formats.html#csv-csv-tsv-files","title":"CSV (.csv, .tsv) files","text":"

CSV (or TSV) stands for Comma-Separated Values (or Tab-Separated Values) and is, once again, a simple text file formatted in a way that allows LibreOffice Calc (or Excel) to open them as a table. Lines of the table are delimited with new lines, and columns are separated with commas (,) or tabulations. Those files are easily parsed by programming languages (including Python). QuPath can export annotations and detections measurements in TSV format.

"},{"location":"tips-formats.html#json-and-geojson-files","title":"JSON and GeoJSON files","text":"

JSON is a \"data-interchange format\". It is used to store data, very much like toml, but supports more complex data and is more efficient to read and write, but is less human-readable. It is used in histoquant to store fibers-like objects coordinates, as they can contain several millions of points (making CSV not usable).

GeoJson is a file format used to store geographic data structures, basically objects coordinates with various shapes. It is based on and compatible with JSON, which makes it easy to parse in numerous programming language. It used in QuPath to import and export objects, that can be point, line, polygons...

"},{"location":"tips-qupath.html","title":"QuPath","text":""},{"location":"tips-qupath.html#custom-scripts","title":"Custom scripts","text":"

While QuPath graphical user interface (GUI) should meet a lot of your needs, it is very convenient to use scripting to automate certain tasks, execute them in batch (on all your images) and do things you couldn't do otherwise. QuPath uses the Groovy programming language, which is mostly Java.

Warning

Not all commands will appear in the history.

In QuPath, in the left panel in the \"Workflow\" tab, there is an history of most of the commands you used during the session. On the bottom, you can click on Create workflow to select the relevant commands and create a script. This will open the built-in script editor that will contain the groovy version of what you did graphically.

Tip

The scripts/qupath-utils folder contains a bunch of utility scripts.

They can be run in batch with the three-dotted menu on the bottom right corner of the script editor : Run for project, then choose the images you want the script to run on.

"},{"location":"demo_notebooks/cells_distributions.html","title":"Cells distributions","text":"

This notebook shows how to load data exported from QuPath, compute metrics and display them, according to the configuration file. This is meant for a single-animal.

There are some conventions that need to be met in the QuPath project so that the measurements are usable with histoquant:

  • Objects' classifications must be derived, eg. be in the form \"something: else\". The primary classification (\"something\") will be refered to \"object_type\" and the secondary classification (\"else\") to \"channel\" in the configuration file.
  • Only one \"object_type\" can be processed at once, but supports any numbers of channels.
  • Annotations (brain regions) must have properly formatted measurements. For punctual objects, it would be the count. Run the \"add_regions_count.groovy\" script to add them. The measurements names must be in the form \"something: else name\", for instance, \"something: else Count\". \"name\" is refered to \"base_measurement\" in the configuration file.

You should copy this notebook, the configuration file and the atlas-related configuration files (blacklist and fusion) elsewhere and edit them according to your need.

The data was generated from QuPath with stardist cell detection on toy data.

In\u00a0[1]: Copied!
import pandas as pd\n\nimport histoquant as hq\n
import pandas as pd import histoquant as hq In\u00a0[2]: Copied!
# Full path to your configuration file, edited according to your need beforehand\nconfig_file = \"../../resources/demo_config_cells.toml\"\n
# Full path to your configuration file, edited according to your need beforehand config_file = \"../../resources/demo_config_cells.toml\" In\u00a0[3]: Copied!
# - Files\n# animal identifier\nanimal = \"animalid0\"\n# set the full path to the annotations tsv file from QuPath\nannotations_file = \"../../resources/cells_measurements_annotations.tsv\"\n# set the full path to the detections tsv file from QuPath\ndetections_file = \"../../resources/cells_measurements_detections.tsv\"\n
# - Files # animal identifier animal = \"animalid0\" # set the full path to the annotations tsv file from QuPath annotations_file = \"../../resources/cells_measurements_annotations.tsv\" # set the full path to the detections tsv file from QuPath detections_file = \"../../resources/cells_measurements_detections.tsv\" In\u00a0[4]: Copied!
# get configuration\ncfg = hq.config.Config(config_file)\n
# get configuration cfg = hq.config.Config(config_file) In\u00a0[5]: Copied!
# read data\ndf_annotations = pd.read_csv(annotations_file, index_col=\"Object ID\", sep=\"\\t\")\ndf_detections = pd.read_csv(detections_file, index_col=\"Object ID\", sep=\"\\t\")\n\n# remove annotations that are not brain regions\ndf_annotations = df_annotations[df_annotations[\"Classification\"] != \"Region*\"]\ndf_annotations = df_annotations[df_annotations[\"ROI\"] != \"Rectangle\"]\n\n# convert atlas coordinates from mm to microns\ndf_detections[[\"Atlas_X\", \"Atlas_Y\", \"Atlas_Z\"]] = df_detections[\n    [\"Atlas_X\", \"Atlas_Y\", \"Atlas_Z\"]\n].multiply(1000)\n\n# have a look\ndisplay(df_annotations.head())\ndisplay(df_detections.head())\n
# read data df_annotations = pd.read_csv(annotations_file, index_col=\"Object ID\", sep=\"\\t\") df_detections = pd.read_csv(detections_file, index_col=\"Object ID\", sep=\"\\t\") # remove annotations that are not brain regions df_annotations = df_annotations[df_annotations[\"Classification\"] != \"Region*\"] df_annotations = df_annotations[df_annotations[\"ROI\"] != \"Rectangle\"] # convert atlas coordinates from mm to microns df_detections[[\"Atlas_X\", \"Atlas_Y\", \"Atlas_Z\"]] = df_detections[ [\"Atlas_X\", \"Atlas_Y\", \"Atlas_Z\"] ].multiply(1000) # have a look display(df_annotations.head()) display(df_detections.head()) Image Object type Name Classification Parent ROI Centroid X \u00b5m Centroid Y \u00b5m Cells: marker+ Count Cells: marker- Count ID Side Parent ID Num Detections Num Cells: marker+ Num Cells: marker- Area \u00b5m^2 Perimeter \u00b5m Object ID 4781ed63-0d8e-422e-aead-b685fbe20eb5 animalid0_030.ome.tiff Annotation Root NaN Root object (Image) Geometry 5372.5 3922.1 0 0 NaN NaN NaN 2441 136 2305 31666431.6 37111.9 aa4b133d-13f9-42d9-8c21-45f143b41a85 animalid0_030.ome.tiff Annotation root Right: root Root Polygon 7094.9 4085.7 0 0 997 0.0 NaN 1284 41 1243 15882755.9 18819.5 42c3b914-91c5-4b65-a603-3f9431717d48 animalid0_030.ome.tiff Annotation grey Right: grey root Geometry 7256.8 4290.6 0 0 8 0.0 997.0 1009 24 985 12026268.7 49600.3 887af3eb-4061-4f8a-aa4c-fe9b81184061 animalid0_030.ome.tiff Annotation CB Right: CB grey Geometry 7778.7 3679.2 0 16 512 0.0 8.0 542 5 537 6943579.0 30600.2 adaabc05-36d1-4aad-91fe-2e904adc574f animalid0_030.ome.tiff Annotation CBN Right: CBN CB Geometry 6790.5 3567.9 0 0 519 0.0 512.0 55 1 54 864212.3 7147.4 Image Object type Name Classification Parent ROI Atlas_X Atlas_Y Atlas_Z Object ID 5ff386a8-5abd-46d1-8e0d-f5c5365457c1 animalid0_030.ome.tiff Detection NaN Cells: marker- VeCB Polygon 11523.0 4272.4 4276.7 9a2a9a8c-acbe-4308-bc5e-f3c9fd1754c0 animalid0_030.ome.tiff Detection NaN Cells: marker- VeCB Polygon 11520.2 4278.4 4418.6 481a519b-8b40-4450-9ec6-725181807d72 animalid0_030.ome.tiff Detection NaN Cells: marker- VeCB Polygon 11506.0 4317.2 4356.3 fd28e09c-2c64-4750-b026-cd99e3526a57 animalid0_030.ome.tiff Detection NaN Cells: marker- VeCB Polygon 11528.4 4257.4 4336.4 3d9ce034-f2ed-4c73-99be-f782363cf323 animalid0_030.ome.tiff Detection NaN Cells: marker- VeCB Polygon 11548.7 4203.3 4294.3 In\u00a0[6]: Copied!
# get distributions per regions, spatial distributions and coordinates\ndf_regions, dfs_distributions, df_coordinates = hq.process.process_animal(\n    animal, df_annotations, df_detections, cfg, compute_distributions=True\n)\n\n# have a look\ndisplay(df_regions.head())\ndisplay(df_coordinates.head())\n
# get distributions per regions, spatial distributions and coordinates df_regions, dfs_distributions, df_coordinates = hq.process.process_animal( animal, df_annotations, df_detections, cfg, compute_distributions=True ) # have a look display(df_regions.head()) display(df_coordinates.head()) Name hemisphere Area \u00b5m^2 Area mm^2 count density \u00b5m^-2 density mm^-2 coverage index relative count relative density channel animal 0 ACVII Left 8307.1 0.008307 1 0.00012 120.378953 0.00012 0.002132 0.205275 Positive animalid0 0 ACVII Left 8307.1 0.008307 1 0.00012 120.378953 0.00012 0.000189 0.020671 Negative animalid0 1 ACVII Right 7061.4 0.007061 0 0.0 0.0 0.0 0.0 0.0 Positive animalid0 1 ACVII Right 7061.4 0.007061 1 0.000142 141.614977 0.000142 0.000144 0.021646 Negative animalid0 2 ACVII both 15368.5 0.015369 1 0.000065 65.068159 0.000065 0.001362 0.153797 Positive animalid0 Image Object type Name Classification Parent ROI Atlas_X Atlas_Y Atlas_Z hemisphere channel Atlas_AP Atlas_DV Atlas_ML animal Object ID 5ff386a8-5abd-46d1-8e0d-f5c5365457c1 animalid0_030.ome.tiff Detection NaN Cells: marker- VeCB Polygon 11.5230 4.2724 4.2767 Right Negative -6.433716 3.098278 -1.4233 animalid0 9a2a9a8c-acbe-4308-bc5e-f3c9fd1754c0 animalid0_030.ome.tiff Detection NaN Cells: marker- VeCB Polygon 11.5202 4.2784 4.4186 Right Negative -6.431449 3.104147 -1.2814 animalid0 481a519b-8b40-4450-9ec6-725181807d72 animalid0_030.ome.tiff Detection NaN Cells: marker- VeCB Polygon 11.5060 4.3172 4.3563 Right Negative -6.420685 3.141780 -1.3437 animalid0 fd28e09c-2c64-4750-b026-cd99e3526a57 animalid0_030.ome.tiff Detection NaN Cells: marker- VeCB Polygon 11.5284 4.2574 4.3364 Right Negative -6.437788 3.083737 -1.3636 animalid0 3d9ce034-f2ed-4c73-99be-f782363cf323 animalid0_030.ome.tiff Detection NaN Cells: marker- VeCB Polygon 11.5487 4.2033 4.2943 Right Negative -6.453296 3.031224 -1.4057 animalid0 In\u00a0[7]: Copied!
# plot distributions per regions\nfigs_regions = hq.display.plot_regions(df_regions, cfg)\n# specify which regions to plot\n# figs_regions = hq.display.plot_regions(df_regions, cfg, names_list=[\"GRN\", \"IRN\", \"MDRNv\"])\n\n# save as svg\n# figs_regions[0].savefig(r\"C:\\Users\\glegoc\\Downloads\\regions_count.svg\")\n# figs_regions[1].savefig(r\"C:\\Users\\glegoc\\Downloads\\regions_density.svg\")\n
# plot distributions per regions figs_regions = hq.display.plot_regions(df_regions, cfg) # specify which regions to plot # figs_regions = hq.display.plot_regions(df_regions, cfg, names_list=[\"GRN\", \"IRN\", \"MDRNv\"]) # save as svg # figs_regions[0].savefig(r\"C:\\Users\\glegoc\\Downloads\\regions_count.svg\") # figs_regions[1].savefig(r\"C:\\Users\\glegoc\\Downloads\\regions_density.svg\") In\u00a0[8]: Copied!
# plot 1D distributions\nfig_distrib = hq.display.plot_1D_distributions(\n    dfs_distributions, cfg, df_coordinates=df_coordinates\n)\n
# plot 1D distributions fig_distrib = hq.display.plot_1D_distributions( dfs_distributions, cfg, df_coordinates=df_coordinates )

If there were several animal in the measurement file, it would be displayed as mean +/- sem instead.

In\u00a0[9]: Copied!
# plot heatmap (all types of cells pooled)\nfig_heatmap = hq.display.plot_2D_distributions(df_coordinates, cfg)\n
# plot heatmap (all types of cells pooled) fig_heatmap = hq.display.plot_2D_distributions(df_coordinates, cfg)"},{"location":"demo_notebooks/density_map.html","title":"Density map","text":"

Draw 2D heatmaps as density isolines.

This notebook does not actually use histoquant and relies only on brainglobe-heatmap to extract brain structures outlines.

Only the detections measurements with atlas coordinates exported from QuPath are used.

You need to select the range of data to be used, the regions outlines will be extracted at the centroid of that range. Therefore, a range that is too large will be misleading and irrelevant.

In\u00a0[10]: Copied!
import brainglobe_heatmap as bgh\nimport matplotlib.pyplot as plt\nimport numpy as np\nimport pandas as pd\nimport seaborn as sns\n
import brainglobe_heatmap as bgh import matplotlib.pyplot as plt import numpy as np import pandas as pd import seaborn as sns In\u00a0[11]: Copied!
# path to the exported measurements from QuPath\nfilename = \"../../resources/cells_measurements_detections.tsv\"\n
# path to the exported measurements from QuPath filename = \"../../resources/cells_measurements_detections.tsv\"

Settings

In\u00a0[12]: Copied!
# atlas to use\natlas_name = \"allen_mouse_10um\"\n# brain regions whose outlines will be plotted\nregions = [\"root\", \"CB\", \"MY\", \"GRN\", \"IRN\"]\n# range to include, in Allen coordinates, in microns\nap_lims = [9800, 10000]  # lims : [0, 13200] for coronal\nml_lims = [5600, 5800]  # lims : [0, 11400] for sagittal\ndv_lims = [3900, 4100]  # lims : [0, 8000] for top\n# number of isolines\nnlevels = 5\n# color mapping between classification and matplotlib color\npalette = {\"Cells: marker-\": \"#d8782f\", \"Cells: marker+\": \"#8ccb73\"}\n
# atlas to use atlas_name = \"allen_mouse_10um\" # brain regions whose outlines will be plotted regions = [\"root\", \"CB\", \"MY\", \"GRN\", \"IRN\"] # range to include, in Allen coordinates, in microns ap_lims = [9800, 10000] # lims : [0, 13200] for coronal ml_lims = [5600, 5800] # lims : [0, 11400] for sagittal dv_lims = [3900, 4100] # lims : [0, 8000] for top # number of isolines nlevels = 5 # color mapping between classification and matplotlib color palette = {\"Cells: marker-\": \"#d8782f\", \"Cells: marker+\": \"#8ccb73\"} In\u00a0[13]: Copied!
df = pd.read_csv(filename, sep=\"\\t\")\ndisplay(df.head())\n
df = pd.read_csv(filename, sep=\"\\t\") display(df.head())
 Image Object ID Object type Name Classification Parent ROI Atlas_X Atlas_Y Atlas_Z 0 animalid0_030.ome.tiff 5ff386a8-5abd-46d1-8e0d-f5c5365457c1 Detection NaN Cells: marker- VeCB Polygon 11.5230 4.2724 4.2767 1 animalid0_030.ome.tiff 9a2a9a8c-acbe-4308-bc5e-f3c9fd1754c0 Detection NaN Cells: marker- VeCB Polygon 11.5202 4.2784 4.4186 2 animalid0_030.ome.tiff 481a519b-8b40-4450-9ec6-725181807d72 Detection NaN Cells: marker- VeCB Polygon 11.5060 4.3172 4.3563 3 animalid0_030.ome.tiff fd28e09c-2c64-4750-b026-cd99e3526a57 Detection NaN Cells: marker- VeCB Polygon 11.5284 4.2574 4.3364 4 animalid0_030.ome.tiff 3d9ce034-f2ed-4c73-99be-f782363cf323 Detection NaN Cells: marker- VeCB Polygon 11.5487 4.2033 4.2943 

Here we can filter out classifications we don't wan't to display.

In\u00a0[14]: Copied!
# select objects\n# df = df[df[\"Classification\"] == \"example: classification\"]\n
# select objects # df = df[df[\"Classification\"] == \"example: classification\"] In\u00a0[15]: Copied!
# get outline coordinates in coronal (=frontal) orientation\ncoords_coronal = bgh.get_structures_slice_coords(\n    regions,\n    orientation=\"frontal\",\n    atlas_name=atlas_name,\n    position=(np.mean(ap_lims), 0, 0),\n)\n# get outline coordinates in sagittal orientation\ncoords_sagittal = bgh.get_structures_slice_coords(\n    regions,\n    orientation=\"sagittal\",\n    atlas_name=atlas_name,\n    position=(0, 0, np.mean(ml_lims)),\n)\n# get outline coordinates in top (=horizontal) orientation\ncoords_top = bgh.get_structures_slice_coords(\n    regions,\n    orientation=\"horizontal\",\n    atlas_name=atlas_name,\n    position=(0, np.mean(dv_lims), 0),\n)\n
# get outline coordinates in coronal (=frontal) orientation coords_coronal = bgh.get_structures_slice_coords( regions, orientation=\"frontal\", atlas_name=atlas_name, position=(np.mean(ap_lims), 0, 0), ) # get outline coordinates in sagittal orientation coords_sagittal = bgh.get_structures_slice_coords( regions, orientation=\"sagittal\", atlas_name=atlas_name, position=(0, 0, np.mean(ml_lims)), ) # get outline coordinates in top (=horizontal) orientation coords_top = bgh.get_structures_slice_coords( regions, orientation=\"horizontal\", atlas_name=atlas_name, position=(0, np.mean(dv_lims), 0), ) In\u00a0[16]: Copied!
# Coronal projection\n# select objects within the rostro-caudal range\ndf_coronal = df[\n    (df[\"Atlas_X\"] >= ap_lims[0] / 1000) & (df[\"Atlas_X\"] <= ap_lims[1] / 1000)\n]\n\nplt.figure()\n\nfor struct_name, contours in coords_coronal.items():\n    for cont in contours:\n        plt.fill(cont[:, 0] / 1000, cont[:, 1] / 1000, lw=1, fc=\"none\", ec=\"k\")\n\n# see https://seaborn.pydata.org/generated/seaborn.kdeplot.html to customize\nax = sns.kdeplot(\n    df_coronal,\n    x=\"Atlas_Z\",\n    y=\"Atlas_Y\",\n    hue=\"Classification\",\n    levels=nlevels,\n    common_norm=False,\n    palette=palette,\n)\nax.invert_yaxis()\nsns.despine(left=True, bottom=True)\nplt.axis(\"equal\")\nplt.xlabel(None)\nplt.ylabel(None)\nplt.xticks([])\nplt.yticks([])\nplt.plot([2, 3], [8, 8], \"k\", linewidth=3)\nplt.text(2, 7.9, \"1 mm\")\n
# Coronal projection # select objects within the rostro-caudal range df_coronal = df[ (df[\"Atlas_X\"] >= ap_lims[0] / 1000) & (df[\"Atlas_X\"] <= ap_lims[1] / 1000) ] plt.figure() for struct_name, contours in coords_coronal.items(): for cont in contours: plt.fill(cont[:, 0] / 1000, cont[:, 1] / 1000, lw=1, fc=\"none\", ec=\"k\") # see https://seaborn.pydata.org/generated/seaborn.kdeplot.html to customize ax = sns.kdeplot( df_coronal, x=\"Atlas_Z\", y=\"Atlas_Y\", hue=\"Classification\", levels=nlevels, common_norm=False, palette=palette, ) ax.invert_yaxis() sns.despine(left=True, bottom=True) plt.axis(\"equal\") plt.xlabel(None) plt.ylabel(None) plt.xticks([]) plt.yticks([]) plt.plot([2, 3], [8, 8], \"k\", linewidth=3) plt.text(2, 7.9, \"1 mm\")
 Out[16]: 
Text(2, 7.9, '1 mm')
 In\u00a0[17]: Copied! 
# Sagittal projection\n# select objects within the medio-lateral range\ndf_sagittal = df[\n    (df[\"Atlas_Z\"] >= ml_lims[0] / 1000) & (df[\"Atlas_Z\"] <= ml_lims[1] / 1000)\n]\n\nplt.figure()\n\nfor struct_name, contours in coords_sagittal.items():\n    for cont in contours:\n        plt.fill(cont[:, 0] / 1000, cont[:, 1] / 1000, lw=1, fc=\"none\", ec=\"k\")\n\n# see https://seaborn.pydata.org/generated/seaborn.kdeplot.html to customize\nax = sns.kdeplot(\n    df_sagittal,\n    x=\"Atlas_X\",\n    y=\"Atlas_Y\",\n    hue=\"Classification\",\n    levels=nlevels,\n    common_norm=False,\n    palette=palette,\n)\nax.invert_yaxis()\nsns.despine(left=True, bottom=True)\nplt.axis(\"equal\")\nplt.xlabel(None)\nplt.ylabel(None)\nplt.xticks([])\nplt.yticks([])\nplt.plot([2, 3], [7.1, 7.1], \"k\", linewidth=3)\nplt.text(2, 7, \"1 mm\")\n
# Sagittal projection # select objects within the medio-lateral range df_sagittal = df[ (df[\"Atlas_Z\"] >= ml_lims[0] / 1000) & (df[\"Atlas_Z\"] <= ml_lims[1] / 1000) ] plt.figure() for struct_name, contours in coords_sagittal.items(): for cont in contours: plt.fill(cont[:, 0] / 1000, cont[:, 1] / 1000, lw=1, fc=\"none\", ec=\"k\") # see https://seaborn.pydata.org/generated/seaborn.kdeplot.html to customize ax = sns.kdeplot( df_sagittal, x=\"Atlas_X\", y=\"Atlas_Y\", hue=\"Classification\", levels=nlevels, common_norm=False, palette=palette, ) ax.invert_yaxis() sns.despine(left=True, bottom=True) plt.axis(\"equal\") plt.xlabel(None) plt.ylabel(None) plt.xticks([]) plt.yticks([]) plt.plot([2, 3], [7.1, 7.1], \"k\", linewidth=3) plt.text(2, 7, \"1 mm\")
 Out[17]: 
Text(2, 7, '1 mm')
 In\u00a0[18]: Copied! 
# Top projection\n# select objects within the dorso-ventral range\ndf_top = df[(df[\"Atlas_Y\"] >= dv_lims[0] / 1000) & (df[\"Atlas_Y\"] <= dv_lims[1] / 1000)]\n\nplt.figure()\n\nfor struct_name, contours in coords_top.items():\n    for cont in contours:\n        plt.fill(-cont[:, 0] / 1000, cont[:, 1] / 1000, lw=1, fc=\"none\", ec=\"k\")\n\n# see https://seaborn.pydata.org/generated/seaborn.kdeplot.html to customize\nax = sns.kdeplot(\n    df_top,\n    x=\"Atlas_Z\",\n    y=\"Atlas_X\",\n    hue=\"Classification\",\n    levels=nlevels,\n    common_norm=False,\n    palette=palette,\n)\nax.invert_yaxis()\nsns.despine(left=True, bottom=True)\nplt.axis(\"equal\")\nplt.xlabel(None)\nplt.ylabel(None)\nplt.xticks([])\nplt.yticks([])\nplt.plot([0.5, 1.5], [0.5, 0.5], \"k\", linewidth=3)\nplt.text(0.5, 0.4, \"1 mm\")\n
# Top projection # select objects within the dorso-ventral range df_top = df[(df[\"Atlas_Y\"] >= dv_lims[0] / 1000) & (df[\"Atlas_Y\"] <= dv_lims[1] / 1000)] plt.figure() for struct_name, contours in coords_top.items(): for cont in contours: plt.fill(-cont[:, 0] / 1000, cont[:, 1] / 1000, lw=1, fc=\"none\", ec=\"k\") # see https://seaborn.pydata.org/generated/seaborn.kdeplot.html to customize ax = sns.kdeplot( df_top, x=\"Atlas_Z\", y=\"Atlas_X\", hue=\"Classification\", levels=nlevels, common_norm=False, palette=palette, ) ax.invert_yaxis() sns.despine(left=True, bottom=True) plt.axis(\"equal\") plt.xlabel(None) plt.ylabel(None) plt.xticks([]) plt.yticks([]) plt.plot([0.5, 1.5], [0.5, 0.5], \"k\", linewidth=3) plt.text(0.5, 0.4, \"1 mm\")
 Out[18]: 
Text(0.5, 0.4, '1 mm')
 In\u00a0[\u00a0]: Copied! 
\n
"},{"location":"demo_notebooks/fibers_coverage.html","title":"Fibers coverage","text":"

Plot regions coverage percentage in the spinal cord.

This showcases that any brainglobe atlases should be supported.

Here we're going to quantify the percentage of area of each spinal cord regions innervated by axons.

The \"area \u00b5m^2\" measurement for each annotations can be created in QuPath with a pixel classifier, using the Measure button.

We're going to consider that the \"area \u00b5m^2\" measurement generated by the pixel classifier is an object count. histoquant computes a density, which is the count in each region divided by its aera. Therefore, in this case, it will be actually the fraction of area covered by fibers in a given color.

The data was generated using QuPath with a pixel classifier on toy data.

In\u00a0[1]: Copied!
import pandas as pd\n\nimport histoquant as hq\n
import pandas as pd import histoquant as hq In\u00a0[2]: Copied!
# Full path to your configuration file, edited according to your need beforehand\nconfig_file = \"../../resources/demo_config_fibers.toml\"\n
# Full path to your configuration file, edited according to your need beforehand config_file = \"../../resources/demo_config_fibers.toml\" In\u00a0[3]: Copied!
# - Files\n# not important if only one animal\nanimal = \"animalid1-SC\"\n# set the full path to the annotations tsv file from QuPath\nannotations_file = \"../../resources/fibers_measurements_annotations.tsv\"\n
# - Files # not important if only one animal animal = \"animalid1-SC\" # set the full path to the annotations tsv file from QuPath annotations_file = \"../../resources/fibers_measurements_annotations.tsv\" In\u00a0[4]: Copied!
# get configuration\ncfg = hq.config.Config(config_file)\n
# get configuration cfg = hq.config.Config(config_file) In\u00a0[5]: Copied!
# read data\ndf_annotations = pd.read_csv(annotations_file, index_col=\"Object ID\", sep=\"\\t\")\ndf_detections = pd.DataFrame()  # empty DataFrame\n\n# remove annotations that are not brain regions\ndf_annotations = df_annotations[df_annotations[\"Classification\"] != \"Region*\"]\ndf_annotations = df_annotations[df_annotations[\"ROI\"] != \"Rectangle\"]\n\n# have a look\ndisplay(df_annotations.head())\n
# read data df_annotations = pd.read_csv(annotations_file, index_col=\"Object ID\", sep=\"\\t\") df_detections = pd.DataFrame() # empty DataFrame # remove annotations that are not brain regions df_annotations = df_annotations[df_annotations[\"Classification\"] != \"Region*\"] df_annotations = df_annotations[df_annotations[\"ROI\"] != \"Rectangle\"] # have a look display(df_annotations.head()) Image Object type Name Classification Parent ROI Centroid X \u00b5m Centroid Y \u00b5m Fibers: EGFP area \u00b5m^2 Fibers: DsRed area \u00b5m^2 ID Side Parent ID Area \u00b5m^2 Perimeter \u00b5m Object ID dcfe5196-4e8d-4126-b255-a9ea393c383a animalid1-SC_s1.ome.tiff Annotation Root NaN Root object (Image) Geometry 1353.70 1060.00 108993.1953 15533.3701 NaN NaN NaN 3172474.0 9853.3 acc74bc0-3dd0-4b3e-86e3-e6c7b681d544 animalid1-SC_s1.ome.tiff Annotation root Right: root Root Polygon 864.44 989.95 39162.8906 5093.2798 250.0 0.0 NaN 1603335.7 4844.2 94571cf9-f22b-453f-860c-eb13d0e72440 animalid1-SC_s1.ome.tiff Annotation WM Right: WM root Geometry 791.00 1094.60 20189.0469 2582.4824 130.0 0.0 250.0 884002.0 7927.8 473d65fb-fda4-4721-ba6f-cc659efc1d5a animalid1-SC_s1.ome.tiff Annotation vf Right: vf WM Polygon 984.31 1599.00 6298.3574 940.4100 70.0 0.0 130.0 281816.9 2719.5 449e2cd1-eca2-4708-83fe-651f378c3a14 animalid1-SC_s1.ome.tiff Annotation df Right: df WM Polygon 1242.90 401.26 1545.0750 241.3800 74.0 0.0 130.0 152952.8 1694.4 In\u00a0[6]: Copied!
# get distributions per regions, spatial distributions and coordinates\ndf_regions, dfs_distributions, df_coordinates = hq.process.process_animal(\n    animal, df_annotations, df_detections, cfg, compute_distributions=False\n)\n\n# convert the \"density \u00b5m^-2\" column, which is actually the coverage fraction, to a percentage\ndf_regions[\"density \u00b5m^-2\"] = df_regions[\"density \u00b5m^-2\"] * 100\n\n# have a look\ndisplay(df_regions.head())\n
# get distributions per regions, spatial distributions and coordinates df_regions, dfs_distributions, df_coordinates = hq.process.process_animal( animal, df_annotations, df_detections, cfg, compute_distributions=False ) # convert the \"density \u00b5m^-2\" column, which is actually the coverage fraction, to a percentage df_regions[\"density \u00b5m^-2\"] = df_regions[\"density \u00b5m^-2\"] * 100 # have a look display(df_regions.head()) Name hemisphere Area \u00b5m^2 Area mm^2 area \u00b5m^2 area mm^2 density \u00b5m^-2 density mm^-2 coverage index relative count relative density channel animal 0 10Sp Contra. 1749462.18 1.749462 53117.3701 53.11737 3.036211 30362.113973 1612.755645 0.036535 0.033062 Negative animalid1-SC 0 10Sp Contra. 1749462.18 1.749462 5257.1025 5.257103 0.300498 3004.98208 15.797499 0.030766 0.02085 Positive animalid1-SC 1 10Sp Ipsi. 1439105.93 1.439106 64182.9823 64.182982 4.459921 44599.206328 2862.51007 0.023524 0.023265 Negative animalid1-SC 1 10Sp Ipsi. 1439105.93 1.439106 8046.3375 8.046337 0.559121 5591.205854 44.988729 0.028911 0.022984 Positive animalid1-SC 2 10Sp both 3188568.11 3.188568 117300.3524 117.300352 3.678778 36787.783216 4315.219935 0.028047 0.025734 Negative animalid1-SC In\u00a0[7]: Copied!
# plot distributions per regions\nfig_regions = hq.display.plot_regions(df_regions, cfg)\n# specify which regions to plot\n# fig_regions = hq.display.plot_regions(df_regions, cfg, names_list=[\"Rh9\", \"Sr9\", \"8Sp\"])\n\n# save as svg\n# fig_regions[0].savefig(r\"C:\\Users\\glegoc\\Downloads\\nice_figure.svg\")\n
# plot distributions per regions fig_regions = hq.display.plot_regions(df_regions, cfg) # specify which regions to plot # fig_regions = hq.display.plot_regions(df_regions, cfg, names_list=[\"Rh9\", \"Sr9\", \"8Sp\"]) # save as svg # fig_regions[0].savefig(r\"C:\\Users\\glegoc\\Downloads\\nice_figure.svg\")"},{"location":"demo_notebooks/fibers_length_multi.html","title":"Fibers length in multi animals","text":"In\u00a0[1]: Copied!
import histoquant as hq\n
import histoquant as hq In\u00a0[2]: Copied!
# Full path to your configuration file, edited according to your need beforehand\nconfig_file = \"../../resources/demo_config_multi.toml\"\n
# Full path to your configuration file, edited according to your need beforehand config_file = \"../../resources/demo_config_multi.toml\" In\u00a0[3]: Copied!
# Files\nwdir = \"../../resources/multi\"\nanimals = [\"mouse0\", \"mouse1\"]\n
# Files wdir = \"../../resources/multi\" animals = [\"mouse0\", \"mouse1\"] In\u00a0[4]: Copied!
# get configuration\ncfg = hq.Config(config_file)\n
# get configuration cfg = hq.Config(config_file) In\u00a0[5]: Copied!
# get distributions per regions\ndf_regions, _, _ = hq.process.process_animals(\n    wdir, animals, cfg, compute_distributions=False\n)\n\n# have a look\ndisplay(df_regions.head(10))\n
# get distributions per regions df_regions, _, _ = hq.process.process_animals( wdir, animals, cfg, compute_distributions=False ) # have a look display(df_regions.head(10))
Processing mouse1: 100%|\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588| 2/2 [00:00<00:00, 15.24it/s]\n
Name hemisphere Area \u00b5m^2 Area mm^2 length \u00b5m length mm density \u00b5m^-1 density mm^-1 coverage index relative count relative density channel animal 0 ACVII Contra. 9099.04 0.009099 468.0381 0.468038 0.051438 51438.184688 24.07503 0.00064 0.022168 marker3 mouse0 1 ACVII Contra. 9099.04 0.009099 4260.4844 4.260484 0.468234 468234.495068 1994.905762 0.0019 0.056502 marker2 mouse0 2 ACVII Contra. 9099.04 0.009099 5337.7103 5.33771 0.586623 586623.45698 3131.226069 0.010104 0.242734 marker1 mouse0 3 ACVII Ipsi. 4609.90 0.004610 0.0 0.0 0.0 0.0 0.0 0.0 0.0 marker3 mouse0 4 ACVII Ipsi. 4609.90 0.004610 0.0 0.0 0.0 0.0 0.0 0.0 0.0 marker2 mouse0 5 ACVII Ipsi. 4609.90 0.004610 0.0 0.0 0.0 0.0 0.0 0.0 0.0 marker1 mouse0 6 ACVII both 13708.94 0.013709 468.0381 0.468038 0.034141 34141.086036 15.979329 0.000284 0.011001 marker3 mouse0 7 ACVII both 13708.94 0.013709 4260.4844 4.260484 0.310781 310781.460857 1324.079566 0.000934 0.030688 marker2 mouse0 8 ACVII both 13708.94 0.013709 5337.7103 5.33771 0.38936 389359.811918 2078.289878 0.00534 0.142623 marker1 mouse0 9 AMB Contra. 122463.80 0.122464 30482.7815 30.482782 0.248913 248912.588863 7587.548059 0.041712 0.107271 marker3 mouse0 In\u00a0[6]: Copied!
figs_regions = hq.display.plot_regions(df_regions, cfg)\n
figs_regions = hq.display.plot_regions(df_regions, cfg)"},{"location":"demo_notebooks/fibers_length_multi.html#fibers-length-in-multi-animals","title":"Fibers length in multi animals\u00b6","text":"

This example uses synthetic data to showcase how histoquant can be used in a pipeline.

Annotations measurements should be exported from QuPath, following the required directory structure.

Alternatively, you can merge all your CSV files yourself, one per animal, adding an animal ID to each table. Those can be processed with the histoquant.process.process_animal() function, in a loop, collecting the results at each iteration and finally concatenating the results. Finally, those can be used with display module. See the API reference for the process module.

"}]} \ No newline at end of file diff --git a/sitemap.xml b/sitemap.xml new file mode 100644 index 0000000..0f8724e --- /dev/null +++ b/sitemap.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/sitemap.xml.gz b/sitemap.xml.gz new file mode 100644 index 0000000000000000000000000000000000000000..614cde08ec09af8afcfd427f732b6c92e582552d GIT binary patch literal 127 zcmV-_0D%7=iwFn+d0S@!|8r?{Wo=<_E_iKh04<9_3V)_WXo8&M?ytk3HC}0~zlG)Vu * { + --md-code-fg-color: #d52a2a; + } */ + +/* change bullet style in nested lists */ + article ul ul { + list-style-type: circle !important; +} +article ul ul ul { + list-style-type: square !important; +} \ No newline at end of file diff --git a/tips-abba.html b/tips-abba.html new file mode 100644 index 0000000..5831754 --- /dev/null +++ b/tips-abba.html @@ -0,0 +1,1290 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + ABBA - histoquant + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + + + + +

ABBA#

+ + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/tips-brain-contours.html b/tips-brain-contours.html new file mode 100644 index 0000000..f61be73 --- /dev/null +++ b/tips-brain-contours.html @@ -0,0 +1,1294 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + Brain contours - histoquant + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + + + + +

Brain contours#

+

With histoquant, it is possible to plot 2D heatmaps on brain contours.

+

All the detections are projected in a single plane, thus it is up to you to select a relevant data range. It is primarily intended to give a quick, qualitative overview of the spreading of your data.

+

To do so, it requires the brain regions outlines, stored in a hdf5 file. This can be generated with brainglobe-atlasapi. The generate_atlas_outlines.py located in scripts/atlas will show you how to make such a file, that the histoquant.display module can use.

+

Alternatively it is possible to directly plot density maps without histoquant, using brainglobe-heatmap. An example is shown here.

+ + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/tips-formats.html b/tips-formats.html new file mode 100644 index 0000000..f767ff0 --- /dev/null +++ b/tips-formats.html @@ -0,0 +1,1566 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + Data format - histoquant + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+ +
+
+ + + +
+
+ + + + + + + + + + +

Data format#

+

Some concepts#

+

Tiles#

+

The representation of an image in a computer is basically a table where each element represents the pixel value (see more here). It can be n-dimensional, where the typical dimensions would be \((x, y, z)\), time and the fluorescence channels.

+

In large images, such as histological slices that are more than 10000\(\times\)10000 pixels, a strategy called tiling is used to optimize access to specific regions in the image. Storing the whole image at once in a file would imply to load the whole thing at once in the memory (RAM), even though one would only need to access a given rectangular region with a given zoom. Instead, the image is stored as tiles, small squares (512--2048 pixels) that pave the whole image and are used to reconstruct the original image. Therefore, when zooming-in, only the relevant tiles are loaded and displayed, allowing for smooth large image navigation. This process is done seamlessly by software like QuPath and BigDataViewer (the Fiji plugin ABBA is based on) when loading tiled images. This is also leveraged for image processing in QuPath, which will work on tiles instead of the whole image to not saturate your computer RAM.

+

Most images are already tiled, including Zeiss CZI images. Note that those tiles do not necessarily correspond to the actual, real-world, tiles the microscope did to image the whole slide.

+

Pyramids#

+

In the same spirit as tiles, it would be a waste to have to load the entire image (and all the tiles) at once when viewing the image at max zoom-out, as your monitor nor your eyes would handle it. Instead, smaller, rescaled versions of the original image are stored alongside it, and depending on the zoom you are using, the sub-resolution version is displayed. Again, this is done seamlessly by QuPath and ABBA, allowing you to quickly switch from an image to another, without having to load the GB-sized image. Also, for image processing that does not require the original pixel size, QuPath can also leverage pyramids to go faster.

+

Usually, upon openning a CZI file in ZEN, there is a pop-up suggesting you to generate pyramids. It is a very good idea to say yes, wait a bit and save the file so that the pyramidal levels are saved within the file.

+

Metadata#

+

Metadata, while often overlooked, are of paramount importance in microscopy data. It allows both softwares and users to interpret the raw data of images, eg. the values of each pixels. Most image file formats support this, including the microcope manufacturer file formats. Metadata may include :

+
    +
  • Pixel size. Usually expressed in µm for microscopy, this maps computer pixel units into real world distance. QuPath and ABBA uses that calibration to scale your image properly, so that it match the atlas you'll register your slices on,
  • +
  • Channels colors and names,
  • +
  • Image type (fluorescence, brightfield, ...),
  • +
  • Dimensions,
  • +
  • Magnification...
  • +
+

Pixel size is the parameter that is absolutely necessary. Channel names and colors are more a quality of life feature, to make sure not to mix your difference fluorescence channels. CZI files or exported OME-TIFF files include this out of the box so you don't really need to pay attention.

+

Bio-formats#

+

Bio-formats is an initiative of the Open Microscopy Environment (OME) consortium, aiming at being able to read proprietary microscopy image data and metadata. It is used in QuPath, Fiji and ABBA.

+

This page summarizes the level of support of numerous file formats. You can see that Zeiss CZI files and Leica LIF are quite well supported, and should therefore work out of the box in QuPath.

+

Zeiss CZI files#

+

QuPath and ABBA supports any Bio-formats supported, tiled, pyramidal images.

+

If you're in luck, adding the pyramidal CZI file to your QuPath project will just work. If it doesn't, you'll notice immediately : the tiles will be shuffled and you'll see only a part of the image instead of the whole one. Unfortunately I was not able to determine why this happens and did not find a way to even predict if a file will or will not work.

+

In the event you experience this bug, you'll need to export the CZI files to OME-TIFF files from ZEN, then generate tiled pyramidal images with the create_pyramids.py script included in histoquant. See the instructions.

+

Markdown (.md) files#

+

Markdown is a markup language to create formatted text. It is basically a simple text file that could be opened with any text editor software (notepad and the like), but features specific tags to format the text with heading levels, typesetting (bold, itallic), links, lists... This very page is actually written in markdown, and the engine that builds it renders the text in a nicely formatted manner.

+

If you open a .md file with vscode for example, you'll get a magnigying glass on the top right corner to switch to the rendered version of the file.

+

TOML (.toml) files#

+

TOML, or Tom's Obvious Minimal Language, is a configuration file format (similar to YAML). Again, it is basically a simple text file that can be opened with any text editor and is human-readable, but also computer-readable. This means that it is easy for most software and programming language to parse the file to associate a variable (or "key") to a value, thus making it a good file format for configuration. It is used in histoquant (see The configuration files page).

+

The syntax looks like this : +

# a comment, ignored by the computer
+key1 = 10  # the key "key1" is mapped to the number 10
+key2 = "something"  # "key2" is mapped to the string "something"
+key3 = ["something else", 1.10, -25]  # "key3" is mapped to a list with 3 elements
+[section]  # we can declare sections
+key1 = 5  # this is not "key1", it actually is section.key1
+[section.example]  # we can have nested sections
+key1 = true  # this is section.example.key1, mapped to the boolean True
+

+

You can check the full specification of this language here.

+

CSV (.csv, .tsv) files#

+

CSV (or TSV) stands for Comma-Separated Values (or Tab-Separated Values) and is, once again, a simple text file formatted in a way that allows LibreOffice Calc (or Excel) to open them as a table. Lines of the table are delimited with new lines, and columns are separated with commas (,) or tabulations. Those files are easily parsed by programming languages (including Python). QuPath can export annotations and detections measurements in TSV format.

+

JSON and GeoJSON files#

+

JSON is a "data-interchange format". It is used to store data, very much like toml, but supports more complex data and is more efficient to read and write, but is less human-readable. It is used in histoquant to store fibers-like objects coordinates, as they can contain several millions of points (making CSV not usable).

+

GeoJson is a file format used to store geographic data structures, basically objects coordinates with various shapes. It is based on and compatible with JSON, which makes it easy to parse in numerous programming language. It used in QuPath to import and export objects, that can be point, line, polygons...

+ + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/tips-qupath.html b/tips-qupath.html new file mode 100644 index 0000000..1ae6aed --- /dev/null +++ b/tips-qupath.html @@ -0,0 +1,1358 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + QuPath - histoquant + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + + + + +

QuPath#

+

Custom scripts#

+

While QuPath graphical user interface (GUI) should meet a lot of your needs, it is very convenient to use scripting to automate certain tasks, execute them in batch (on all your images) and do things you couldn't do otherwise. QuPath uses the Groovy programming language, which is mostly Java.

+
+

Warning

+

Not all commands will appear in the history.

+
+

In QuPath, in the left panel in the "Workflow" tab, there is an history of most of the commands you used during the session. On the bottom, you can click on Create workflow to select the relevant commands and create a script. This will open the built-in script editor that will contain the groovy version of what you did graphically.

+
+

Tip

+

The scripts/qupath-utils folder contains a bunch of utility scripts.

+
+

They can be run in batch with the three-dotted menu on the bottom right corner of the script editor : Run for project, then choose the images you want the script to run on.

+ + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + \ No newline at end of file