From c899e220496d4a36eeef1ecc6b7f150cecd3c65a Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 13 Jan 2025 15:30:22 +0000 Subject: [PATCH] Deployed c161518 with MkDocs version: 1.6.1 --- .nojekyll | 0 404.html | 1133 +++ api-compute.html | 2520 +++++++ api-config-config.html | 1273 ++++ api-config.html | 1917 +++++ api-display.html | 4605 +++++++++++ api-io.html | 2735 +++++++ api-process.html | 2257 ++++++ api-script-qupath-script-runner.html | 1605 ++++ api-script-segment.html | 3292 ++++++++ api-seg.html | 3624 +++++++++ api-utils.html | 4709 ++++++++++++ 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.88dd0f4e.min.js | 16 + assets/javascripts/bundle.88dd0f4e.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 | 2651 +++++++ demo_notebooks/cells_distributions.ipynb | 934 +++ demo_notebooks/density_map.html | 2451 ++++++ demo_notebooks/density_map.ipynb | 523 ++ demo_notebooks/fibers_coverage.html | 2250 ++++++ demo_notebooks/fibers_coverage.ipynb | 505 ++ demo_notebooks/fibers_length_multi.html | 2122 ++++++ demo_notebooks/fibers_length_multi.ipynb | 372 + guide-create-pyramids.html | 1395 ++++ guide-install-abba.html | 1608 ++++ guide-pipeline.html | 1497 ++++ guide-prepare-qupath.html | 1601 ++++ guide-qupath-objects.html | 1768 +++++ guide-register-abba.html | 1740 +++++ images/anaconda-licences.png | Bin 0 -> 143832 bytes images/cuisto-pipeline.svg | 4 + index.html | 1351 ++++ javascripts/katex.js | 10 + main-citing.html | 1243 +++ main-configuration-files.html | 1666 ++++ main-getting-help.html | 1248 +++ main-getting-started.html | 1486 ++++ main-using-notebooks.html | 1280 ++++ 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-brain-contours.html | 1252 +++ tips-formats.html | 1524 ++++ tips-qupath.html | 1316 ++++ 149 files changed, 73840 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-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.88dd0f4e.min.js create mode 100644 assets/javascripts/bundle.88dd0f4e.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/anaconda-licences.png create mode 100644 images/cuisto-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-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..7912f04 --- /dev/null +++ b/404.html @@ -0,0 +1,1133 @@ + + + + + + + + + + + + + + + + + + + + + + + cuisto + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ +

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..b94211d --- /dev/null +++ b/api-compute.html @@ -0,0 +1,2520 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + cuisto.compute - cuisto + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + Skip to content + + +
+
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + + + + +

cuisto.compute

+ +
+ + + + +
+ +

compute module, part of cuisto.

+

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 cuisto/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) + +#

+ + +
+ +

Derive metrics from meas_base_name.

+

The measurements columns of df_annotations must be properly formatted, eg : +object_type: channel meas_base_name

+

Derived metrics include : +- raw measurement +- areal density +- relative raw measurement +- relative density

+

Supports objects that are counted (polygons or points) and objects whose length is +measured (fibers-like).

+ + +

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 + +
+

Base measurement name in the input DataFrame used to derive metrics.

+
+
+ required +
+ metrics_names + + dict + +
+

Maps hardcoded measurement names to display names.

+
+
+ required +
+ + +

Returns:

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

DataFrame with brain regions name, area and metrics.

+
+
+ +
+ Source code in cuisto/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:
+    """
+    Derive metrics from `meas_base_name`.
+
+    The measurements columns of `df_annotations` must be properly formatted, eg :
+    object_type: channel meas_base_name
+
+    Derived metrics include :
+    - raw measurement
+    - areal density
+    - relative raw measurement
+    - relative density
+
+    Supports objects that are counted (polygons or points) and objects whose length is
+    measured (fibers-like).
+
+    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
+        Base measurement name in the input DataFrame used to derive metrics.
+    metrics_names : dict
+        Maps hardcoded measurement names to display names.
+
+    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 meas_base_name.endswith("µm"):
+        # 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 cuisto/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..5fc17bc --- /dev/null +++ b/api-config-config.html @@ -0,0 +1,1273 @@ + + + + + + + + + + + + + + + + + + + + + + + Api config config - cuisto + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + + + + +

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 cuisto 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..9e259e5 --- /dev/null +++ b/api-config.html @@ -0,0 +1,1917 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + cuisto.config - cuisto + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + Skip to content + + +
+
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + + + + +

cuisto.config

+ +
+ + + + +
+ +

config module, part of cuisto.

+

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 cuisto/config.py +
31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
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
+    if self.atlas["name"]:
+        self.bg_atlas = BrainGlobeAtlas(self.atlas["name"], check_latest=False)
+    else:
+        self.bg_atlas = None
+
+    self.get_blacklist()
+    self.get_leaves_list()
+
+
+ + + +
+ + + + + + + + + +
+ + +

+ get_blacklist() + +#

+ + +
+ +

Wraps cuisto.utils.get_blacklist.

+ +
+ Source code in cuisto/config.py +
48
+49
+50
+51
+52
+53
def get_blacklist(self):
+    """Wraps cuisto.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 cuisto/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 cuisto/config.py +
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
+92
+93
+94
+95
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 cuisto/config.py +
55
+56
+57
+58
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..a091ad4 --- /dev/null +++ b/api-display.html @@ -0,0 +1,4605 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + cuisto.display - cuisto + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + Skip to content + + +
+
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + + + + + +
+
+ + + + + + + + + + +

cuisto.display

+ +
+ + + + +
+ +

display module, part of cuisto.

+

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 cuisto/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 cuisto/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 cuisto/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 cuisto/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 cuisto/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 cuisto/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 cuisto/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 cuisto/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 cuisto/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 cuisto/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..9514eaa --- /dev/null +++ b/api-io.html @@ -0,0 +1,2735 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + cuisto.io - cuisto + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + Skip to content + + +
+
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+ +
+
+ + + +
+
+ + + + + + + + + + +

cuisto.io

+ +
+ + + + +
+ +

io module, part of cuisto.

+

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 cuisto/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 cuisto/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 'pipelineImportExport.groovy" or +'exportFibersAtlasCoordinates.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 cuisto/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 'pipelineImportExport.groovy" or 
+    'exportFibersAtlasCoordinates.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 cuisto/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 cuisto/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 +cuisto.process.process_animals().

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

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ All requested DataFrames. + +
+ +
+
+ +
+ Source code in cuisto/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
+        cuisto.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 cuisto/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, mode="w")
+    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..df0b6d3 --- /dev/null +++ b/api-process.html @@ -0,0 +1,2257 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + cuisto.process - cuisto + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + Skip to content + + +
+
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + + + + +

cuisto.process

+ +
+ + + + +
+ +

process module, part of cuisto.

+

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

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

+ process_animal(animal, df_annotations, df_detections, cfg, compute_distributions=True, leaf_regions_only=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 +
+ leaf_regions_only + + bool + +
+

If True and a Brainglobe atlas is specified, bar plot per regions will keep only +leaf regions, eg. regions with no child -- if there are any. 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 cuisto/process.py +
def process_animal(
+    animal: str,
+    df_annotations: pd.DataFrame,
+    df_detections: pd.DataFrame,
+    cfg,
+    compute_distributions: bool = True,
+    leaf_regions_only: 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 : cuisto.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.
+    leaf_regions_only : bool, optional
+        If True and a Brainglobe atlas is specified, bar plot per regions will keep only
+        leaf regions, eg. regions with no child -- if there are any. 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 if any
+    if leaf_regions_only & (len(cfg.atlas["leaveslist"]) > 0):
+        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
+        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, **kwargs) + +#

+ + +
+ +

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 +
+ kwargs + + passed to cuisto.process.process_animal(). + +
+ +
+
+ {} +
+ + +

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 cuisto/process.py +
def process_animals(
+    wdir: str,
+    animals: list[str] | tuple[str],
+    cfg,
+    out_fmt: str | None = None,
+    compute_distributions: bool = True,
+    **kwargs,
+) -> 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: cuisto.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.
+    kwargs : passed to cuisto.process.process_animal().
+
+    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,
+            **kwargs,
+        )
+
+        # 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-qupath-script-runner.html b/api-script-qupath-script-runner.html new file mode 100644 index 0000000..9543d26 --- /dev/null +++ b/api-script-qupath-script-runner.html @@ -0,0 +1,1605 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + qupath_script_runner - cuisto + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + 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..96d68af --- /dev/null +++ b/api-script-segment.html @@ -0,0 +1,3292 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + segment_images - cuisto + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + 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 cuisto.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 = cuisto.seg.get_pixelsize(images_list[0])  # get pixel size
+    edge_dist = int(edge_dist / pixelsize)
+    filters = cuisto.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 = cuisto.seg.pad_image(mask, img.shape)  # resize mask
+            # apply mask, eroding from the edges
+            img = img * cuisto.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 = cuisto.seg.segment_lines(
+                img,
+                geojson_props,
+                minsize=filters["length_low"],
+                rescale_factor=rescale_factor,
+            )
+
+        elif seg_method == "polygons":
+            collection = cuisto.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 = cuisto.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..8bec7cc --- /dev/null +++ b/api-seg.html @@ -0,0 +1,3624 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + cuisto.seg - cuisto + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + Skip to content + + +
+
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + + + + + +
+
+ + + + + + + + + + +

cuisto.seg

+ +
+ + + + +
+ +

seg module, part of cuisto.

+

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 cuisto/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 cuisto/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 cuisto/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 cuisto/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 cuisto/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 cuisto/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 cuisto/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 cuisto/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 cuisto/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 cuisto/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 cuisto/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..80051aa --- /dev/null +++ b/api-utils.html @@ -0,0 +1,4709 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + cuisto.utils - cuisto + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + Skip to content + + +
+
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + + + + + +
+
+ + + + + + + + + + +

cuisto.utils

+ +
+ + + + +
+ +

utils module, part of cuisto.

+

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. +If no altas is provided (None), the col column is set to an empty string.

+ + +

Parameters:

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

DataFrame with atlas coordinates in microns.

+
+
+ required +
+ atlas + + BrainGlobeAtlas or None + +
+ +
+
+ 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 cuisto/utils.py +
def add_brain_region(
+    df: pd.DataFrame, atlas: BrainGlobeAtlas | None, 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.
+    If no altas is provided (None), the `col` column is set to an empty string.
+
+    Parameters
+    ----------
+    df : pd.DataFrame
+        DataFrame with atlas coordinates in microns.
+    atlas : BrainGlobeAtlas or None
+    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()
+
+    if atlas is None:
+        # no atlas provided set required col as empty string
+        df[col] = ""
+        return df
+
+    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 cuisto/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 cuisto/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 cuisto/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 cuisto/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 cuisto/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. If atlas is None, +return an empty list.

+ + +

Parameters:

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

Full path the atlas_blacklist.toml file.

+
+
+ required +
+ atlas + + BrainGlobeAtlas or None + +
+

Atlas to extract regions from.

+
+
+ required +
+ + +

Returns:

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

Full list of acronyms to discard.

+
+
+ +
+ Source code in cuisto/utils.py +
def get_blacklist(file: str, atlas: BrainGlobeAtlas | None) -> list:
+    """
+    Build a list of regions to exclude from file.
+
+    File must be a TOML with [WITH_CHILDS] and [EXACT] sections. If `atlas` is None,
+    return an empty list.
+
+    Parameters
+    ----------
+    file : str
+        Full path the atlas_blacklist.toml file.
+    atlas : BrainGlobeAtlas or None
+        Atlas to extract regions from.
+
+    Returns
+    -------
+    black_list : list
+        Full list of acronyms to discard.
+
+    """
+    # if no atlas provided, return empty list
+    if atlas is None:
+        return []
+
+    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(get_child_regions(atlas, region))
+
+    # add regions specified exactly (no descendants)
+    blacklist.extend(content["EXACT"]["members"])
+
+    return blacklist
+
+
+
+ +
+ +
+ + +

+ get_child_regions(atlas, parent_region) + +#

+ + +
+ +

Get list of regions that are child of parent_region.

+

If no atlas is provided, returns an empty list.

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
+ atlas + + BrainGlobeAtlas or None + +
+

Atlas to extract regions from.

+
+
+ required +
+ + +

Returns:

+ + + + + + + + + + + + + +
Name TypeDescription
child_list + list + +
+

List of regions.

+
+
+ +
+ Source code in cuisto/utils.py +
def get_child_regions(atlas: BrainGlobeAtlas | None, parent_region: str) -> list:
+    """
+    Get list of regions that are child of `parent_region`.
+
+    If no atlas is provided, returns an empty list.
+
+    Parameters
+    ----------
+    atlas : BrainGlobeAtlas or None
+        Atlas to extract regions from.
+
+    Returns
+    -------
+    child_list : list
+        List of regions.
+
+    """
+    if atlas is None:
+        return []
+
+    return [
+        atlas.structures[id]["acronym"]
+        for id in atlas.structures.tree.expand_tree(
+            atlas.structures[parent_region]["id"]
+        )
+    ]
+
+
+
+ +
+ +
+ + +

+ 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 cuisto/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 cuisto/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 cuisto/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. If no atlas is provided, returns an empty list.

+ + +

Parameters:

+ + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
+ atlas + + BrainGlobeAtlas or None + +
+

Atlas to extract regions from.

+
+
+ required +
+ + +

Returns:

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

Acronyms of leaf brain regions.

+
+
+ +
+ Source code in cuisto/utils.py +
def get_leaves_list(atlas: BrainGlobeAtlas | None) -> 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. If no atlas is provided, returns an empty list.
+
+    Parameters
+    ----------
+    atlas : BrainGlobeAtlas or None
+        Atlas to extract regions from.
+
+    Returns
+    -------
+    leaves_list : list
+        Acronyms of leaf brain regions.
+
+    """
+    leaves_list = []
+
+    if atlas is None:
+        return 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 cuisto/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 cuisto/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 cuisto/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 cuisto/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 cuisto/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 zcmV-0GtbO-Pew8T0RR9105dQE5&!@I0DHgy05Zz}0RR9100000000000000000000 z0000QWE+nf9D_y%U;u+y2ucZqJP`~Efx={gu1*VtE&vjOAOSW4Bm;<81Rw>2CI=u4 zf-W0DZWU}?WrmFd7|-aTJu;BTK}>n@NQAI)07T@8;QucPoQ%P<@vCJNgcL*p>nI*Y z)7qm^>nMFPo}|p!T;F@tzEgan4lS(3`cy}}4ZklqETzSoum-PRCuDlQaPcneZDG|=h0-{nS2W;Ep*%3Natpk+1oZy2d@>HJ47$+ucA##mX-o~P>gB42_X_0IQs*6@lm26MfT@qNSJS8RumtQ;<$>SZqP(J9|8q>!q?i=|GXRQSg&B~ro30h_ zzx&rhL~A>LQB*SCJwwP-!oJkb-%l;+d;a!nOOsM|0j*0x4qQh!um9xjT3Nw`|(Ml`2p2P)How&i>uyX68!ob98kN#jT_n zfdpYnZ7E$*RM2rELdGWArRyN9jLjjoLx=j`CR#v5S5wQz*tD_*YY8C=RuoyI-1R>k zW9z@eSM4SW3Q7$ygt7bYiXbfJ@#nt}#<7bvXfG$wQJ$bGVUPhCpdo8PH$xso7?1}b zg0MPaAXk+j!GeVd5h@e}glysfx8DK2A%JskSz!*~Tv(Wz4LFx27UcmB8~}Ty8(eyR zVIClX`Rh;&;QkKKl7l>s2wpNBj^)Ao_1c|`KTLR=ayf4CJ%79{c!STh zk|iUEdsuSu7h~_unk)-GuBv=qmtS?W;mpZ?DcxxB!OP8E~(2ne<^Jr<3_AJj?&djya`&r#0Z+ws(HdbYb9 zntZjYeH7K-SOn0_%Shy;8eWh!mf?!A)n75_QJQ#z=@^q6k$iqRJ~GbJFPLIK_CEuW zHcqnS$dhle0)@ni6f03`i8AFXRH{;~R-Jkc8Z~LwqE(x2J$m(9X|=Tm4cln5t+v}~ zm)-W*OJbk>MvOY(phJ#0=7dYGxaNji?zm^d1CLCa^2AfmJomy&)82aTqt9mX72oh3 zKk$zz6s8D8DMoRSqprgcz?e+8oTt+>@`jnx8H@TI>4I-Z}z4$X7IV?%y3dv%2rQh~M+@-kAq0=SmX(1$gt7p}rJ<@y;6p~H{# z6%ZWZ6egf>jL6T*=4|A}{28TO{>F0dxw(sh;IjPW9Kbm!Giix{%Yu<%(MiMJBjAi%~$&n5RtS0bawSmB@ zf(%v{5Ujd~umUGAK{`^iKdU9?ZSX6rfEHN928J1s20CY{wAd;NawuA`hSfEMAiU<^cM} z>H-#l4*`Jg(j)`~Hp@1}JeEXkTs-}|Y$JrX004_xWGHBq42{qVHkiRFtsc-y00)b$Y9d_F1s1su>ECA!Y7NFHa zE;K_sOg?XA9ZumJA(0Rn|Jg&ach=vSFN!I!FyQaOuk9=U`ym@`Ipm1rKwl~NnbTZm zu|SX~5af^z3bF)(G*X)P+3C4|l5Jc+aPGSNesJd!|2{7Ty};-DOkaF|@#K}K=l@=; z^UM-}uTT7c_jLDv$N#?nTL1`X@vB_(CV*w6%aG__Qz$3GNa)4JB=m>Z)7Wl{!@FrSG zM>!1Px!W*A{CIT>vNLR22s=u$TUn~-XGZin zms9>N=yCjdc)O6L;M&!3;k0fHd;E1)g}?GDM%9AJnv-p>PZgclE;+*_7`xkjS z_-y#@$n7yqj> z9VA|ps|V29cbvzS_emqbxqvtTvoNpLeFtr&Ci2A&k=6PYCHqtX8}4LU=9)ardybEv2-bwUuZECqyeA?9|U{ ze81|~a=8jtj#6Vn^NWX;qQ=Ggr3Mm#AXyZPa*B-kUpwcttJTmedtK%CZ>Is1iEW%m zPC5IzXBetp6O^d57WR6lsUc{DCTa%8$rg#Gf+@M0(PemWRRePkK@`~7D&jsRGHQ&a zl(-lZ(+Rt7%$Y&mM80~Spzq9)k;;tW zOh6}XIOuCWauJ|G?*~-Il$-(Cdw$@+#r~$U3Ui5}EE?w{{1zS^xjlXnFyw_aiuhQV zFwi*|Y@Lkr{5z{E2EKNbNIO8|H+Nd3aG@PjJ8U&`R;*2)^-M1aGc(|-QLI_l6Y9~G zPrxWBlCG_WbJVi7s(erFX5@~dfg*;!Wt4mYJWuc6vM9qxOeoKl&5%)d@{k*I&OR>` zaA47eH{6aQ*rZ3ykcVr>!ZJG3t%GnZ6Y($~o0?}Od3cG>Ejj3^Sy|(q7O^A?IcUNo zd29wc@ZQ!{%zaL2yqOns;C792b(7^3@^RJYDwYz$oz}rzwvlt@PbDjcE@&qjuLoc;E^Q` zED2%hD$+Qjgf$r3JjbkG8*nrqCIpBOTnvb@Jc)1VQw^Tj-6?j4vJ4YnWhkOS+#BOQ z{0_&-dzC8qmN^5-igT9`iw<#A&>qoVRu-UoEps_sHpA8uGhOfnpcooQKpncDuBE`>oe_Cvc<;kAc)lK#J|JMnqF7OV<56%iDWbbU z$8LqxzH_Gpc~6(Aj^xEgKgrAaqD9elroUpTPHTYrIV8mHX*OH0$jO<)&4HuzogJ;TW4#s?C{JNtn#DhznsV9?lExT{udurSA^^Lk(3qu(fv4fF|8=>o$+rb zJwn)+$&Ee0`P3?AwI^Pg^S9p9uWFWmEG;fG3peGHbj@YzZVJtdAO2V#XN$i zQ97N+X6mb66J;F&6i0I?>46Lhd<_T5UUcHQ1fq9OL?SkURa(1=C`quakqzQpdL7I) zmIs+p>0~u|#4qpt8ZgDsrHwEY#BKh5tEM~-_U=F6Kn0114;gGq=dv0cKpNCu@rf_) ze$Nja7frAl88BN*EXV^M&`ZT1b@rEW&>H4EzUxR@%I8`9LYN>kJZ3ll;Lgsm!dhTAKj;soo}9# z&w8Lnnx93gpN5~Giq1Qg%x37NP)25D+j<_p7B9uFqo?ojcQt{%K8S^3Wo5G2I*zWV z_PKSl*jIjC@74nktBd+rVvfIW@@$sQY{$b~I@+5hQf5jj-<6v6bu~TKuV_)7*19Zh z<{Nv>xw;t|*~?=GU#0Y1{S0#1$=BI58fgV0xa zRUMa zG*Mhm8+q^BD*v6Vr!p?l!ri^Xx_dBi04P4?pF=LQTJEROSGOBbF`+f+yPHaRG~ugCB?F`RcHk~I*M;3 zNI1toH9)E`z`*|;-3dm!N((uFt(F6mLs7Y^M-#ysI`%j6($ z@*a1UbE19}Qch)0n2vAmaIUz zXiYgcpC&9W?ndk2kyoU{`aIP*|Ha-|A&N*1zN{N7M%h^3h+HqhGlR=GQ@vs{976q1 z~&8k}*N2rf7Gat*sLerc7aim6Vs(4IWR!v?1VYCwKddL_n*vk>`cQ=wwEyVIr zcvkZqN9vr7pXRiGJG{}J@Rzz$0a`iCpylxT^29&XezugQt<4@7ADZU}>rl^6+$9tr zQs@t>Q2%!;!v?)o8vQ7|sPZhg9})>P4XG>pb*nszjcKB4wI~JW2+}j$O5E5Xco056 z0oSnrT)GT8Cpc}D5w!@Gv1M z^}D0dNW*m+FkMS*3n=l>ymrD8ICMAGQV#K9(IRI>sqEX{=99 zPQmI?Xh!pYbGv=u$Rp%viTs|WV`7D9%n$*A^6Q2VWq@?m$Xc@V?Lw*Uotn=yU8>zsnz zCoCqnsIDNuQ{K|ss~|DhgKu-5ILO&D$mVPT9`@#c+NMa3lMZ1H;!`yvIO6s^96jiG zB0*Jmg>lvpNZ0e-`q($xu~;&#^WN1k=?$Karp($R+)qdAKu@iTSmtV2;g;WZ1)ToY z_FB`bOlkarNO$ij+=ePeNtKtu!RgZ1YT6z;zO}2qJK{Wu9u9LFDY$jGTmMww$ki-s zH~Xv=j_bx3d(SPGJ`hG2?I zubYF#i!D3wA+HPag5?Osk1Yg@;WfDLZT&C`MDUY4c7wk0f+o^wHZh1Xyz1YtW&JP= z1as4RcZ0r(l6vAfZMvFicQSWQwHmH^eiAcEOpv=jmJNG0aR(_r;i955tEgsY=4s;6 zWkaYR9(+bPqfLxpY*|XWR8@`jp_n3*_dk>merGlFSk0^KzTJXJo{K$T35qE3-L08j zj8&o)pO%L=UMf}ET`HBr(a6cS$j;Z4O5x-w?atGBt)>0iT>G_#ot(e9;E+YGDYOT1 zls>mtxVCe(eRDnfJtO+d9SQ3=Y)O^@yPdmq^czsQNfyoy$J^TD@haRt*RmwXG4kFJQF)kM+ zM36?PBLB6L$F>hx1ALK+)4D-Oul@Vx}&D46%Gw_TMNx4#EFDHkj z{Lhq_zsRr>9Xa|gz7eZ}lTYkQ4*G!|AxFxG-)|u3l?LewMYfFYcYbmW&*Wp56 zXYLW)1pcid>m65wOAOBUg=yG|wXE(4e@mDUROkn@uoc_o*9C^mNOWIkN*A=qZ9D=P zZzf+{BxE?MeDP)eK<^NN$9bO8>o)9ugKOFq>L|e%!@@&WQ}%8c9io#>)rrjfik97I z4P5^~_MrF}r{t8eJ~=5G9gZt#_hfpd(F&54zuQPnN3+j79p7oxe;hMYUuu*OOWg}F zR%iOR!pkj*v(nxAwBbI&$If7;o?zRzH5@m!99)gWBMp z^|0+cM0F)l2>m>FX)C6_=?e4UbNquG>moc+SzsWGCa)RQP#zs#UK9jF>&xT9%JTDq z(vRsGc?fHx9%&nSyC~_RE2SP}Q3zv9oiQlXj)*JBkKFYsN8jH3C!x4{Wg<_IYNayf zgDJ*sCKJSsYvLj2Q=TnN;)}83T#RNG7}MOe(vfxcx0*uRTw{kw~P6lih9UbtmS1aWlK{i{x+>OTxx&u zpfbtX+*0saIa(yV9q-A9Lgn@gVT>=^>7`c~$<&KWa`6h%m<_Zk=GYX6`z{*3_YVXp z76%2?Al+HK?q?r(%Ql!6uy`xru3sgS+s9qsDbu8Io&N1II*#r=MJHK+>{^c8VREKS z6upDXUC*H9=Als=A7A7SUgQoxcL@K@yYpL)Xws_Zd4p$p!{@n!=K}BX&fL>MQbT1U zD|@!@t4+hB&ch+|VZ7v1X~AjxW0ZKh-dMm)n(Gt-Tj8>8(p|SMxG$j(7K2EnLmQWr zfy=m`SK+2KU_j;?l1F?_+XllN*j`4@p+<>vVsS;F+c~89c(jggwoVIoaI;avN$%j| zh0{8Wv+S9(+R~>V-KyiDVbcd|LOOhk&WRYE|7w1@It^XqhHUMIb~S0ydm)(in|6F> z#k5YL=(R60;hLC58j)g4@dbcv8h|xFP#IU7${U>E8Go1n7K`Xfg+tuMgNi3SAOBCA z0uexy)F8V_X>cvZblHI^4Q@0MVBinGR;n~l@&|{|#@qXm(%^~h^g^9$n`Rj<@4?xr zwRnq2932UFErkcap+NA_CFJc@pb$y$zXQU~wE)Yt4|g0=5dmOV>B<>?2zSARfwx%5 z`K|P#)i@SR`m(Ofy>L#A=hHUKU$IglDRazL>)9z=x$MK)Pud!@)RjjrJ8C|=lB;o?zwi}e)5CBrC~hBV0!F{@xN2#-BH!Y4hjw)V6}2N zt&cP8R6mZ?e$eR2Ezf<^Sn-kx6Okx08TGGXTvxezYUk8=bMC-hY)sOTzori-Z;zSglX3Nj6Wz2fl^RwvCJ|xjUD5ArUHxmqp< z`hQ<;OW*C4*K2|@oryl_cRIz_ca(pPO}lt0bmUdmHBi*yBO=eedrkKjdOaPkps*dW zmw`fOU%39I!nUCQpFRIcPDGF2^dInA)=8YWqcB77xRyPZPj*&F2LAkj#c&zg*86G=!@#0Mm(8rEFZifGB^7|W;vkV zxNJd_+0Y9MnY|oPg0Urjh65gk!lvI{fYM?@VW zC9G*ajGj7EKLM!)c{D7UGTDrgs(gp1y|bqPGZ*W_+c9Gtl48xcUYJ=1l;-FcCfIFf zwPwR;tn5{-xp>$%6BGppQ4kjO#L(<`Gy22DhDfSrZAiHR6$dgbDz&t>mS2B+We+(Fm%QmtUzNxD{xS+H(!lsLi*qk=9eb)pZ=it@RT| z$VKkbQ${XWOIxXI>z2Z<3tIfrK#+x8KYNx(7yWkN&oK~ASyMi0CC5#+ek3nRs} z$(~#eS$he+vp0j@715Y8Yn>BdIMwS?s7{Y9_BlYN3QnKslZfHF$abbfUIu1idY$Qt zV0+r@v@?ozSmhPL+#0=rW5(L~OOrhjI=jpsZ)c0+hdyMwWNVPmmdJZJX&HzqfbU{O&0QsaX)(U7X_aOwTFUn7JU#*)>7HvMzi3ckvHNBL>@2xeWK1RPU~hXmXlX?pj;9kG9YNU{2n(A&3OLE46p zyUVhC$K8O9JoJgL4)h-n;10;|y=}_9RGHzlW|6%qb{%_wz))k4T+rU-uJ|2wTjw!( z4Xl(JCyPzcC{dcFnw+<&Hw6m_%UTwT6J^!_DMebKaOK12F&V{OO~aoH^I3F|KR9Fl zdwrHqEZ?KihZb7JXleY>dNewaL9?iw~Z59qd|iZ&o84oeDv ztZe>c$gX_`+vMNdI*HxKqPO|8z0JC<#X})Ob4;#e(1z~m~E=+{q+a#>wU3{*&60<0tMgqvu`(zwHe|@^#&Y z8QXjtQCmPsf5CQ_3`72#br$ugMBy-Be5x&gI{?3MSP}!~mkx0SFc)H^ygbj?H&cTr za(*~F@@c;vA)5!vUu}-;e}S&wi9wfubJ=i4!3W)<4iU-WE*rJDSs3d!U!Pm-4-iJJ zZ}^%I4~D) zR4b&2UgTbl?+b{&CBB(MPx}e+)s7Xzn4|8{h!fbE;T&dFKRa<(?WN!ecw%!LW|Qd^ zfzm7$s;bBlQh_idrr|EeS0O;4x=4#?ZcmKBl!NN6Mv=#JXG4`x0#wP`jhjW$yk1J~ zpob*OgNDsRA~+C`Qr1REl58iG*{qOyQv?8XMy?^M$Z0dGP?$ykdk|hG4)5wl8LVg$ z#<9qOO@m#qYy}xCTrli|o}rEV9LeYQ2JF+&PiEtmEN&a-y`?;MW5-nuHdS1ojnbn? zQ%M1a&>NzPDv#4+nhl^`M%orKJR)Ic&SK1Z09{9>ZO~2YBp`;KH}gV=1dSAdi87Pr zq*`ASCOW7A8i6!Gg??DK)}@5nwBR5zm$Ln=kO{SyAc!61eCG-=wOu5-(ENdA!wrnS z#g|{&8P_nchjyaR`o6j4%k6|JHfI@_rkjl;u2WtjVuVLjfIJh@Tf2VILZ zfF$ChH_~;;D}oZ}^J2h^FiA3&msCdrH&ukRzJ3KJF!Au&j*+QLOrnhNN#4PC6Qx8W zN;W{)U^sLPSYv&QQiMi61mb;H?b?H0=OJ9M%9-i5CLDN#jJ>l{>n- z`?=4%H{Cbf_wbML&+#Ad-`r#O-p#rGqCL8Q!M{MQSqf8{@Nsx%8(vlkEvl&~8n0=4 z0!xMP`hFc1SQ9j-R~1#}9K*|Y1PB!Lri$Iw)wx`U)^(R2&B(T!AB8qpz_ivp_4ox% z<$OHY?~&1jCzSfk9zJREGeP(cE*tcY-y0 zCvF17$6SsEljN_eH?6|NH#e)G>9id;v723DICBF4k9=f253y9AsMN`6T>TO_-L+Iv zz}RGhwUJkB9Un{Jt6(gEtgH$gvPd(2G^-9Wl{!(f4xE^cXLU6NA48?hQ2a}QCB4f& zr!jcRAj^c<5CAGd+E9lo;5-2y4nW^ED!2jE|SZvp8!?52q^BEg?H5 zr@(nsnk{bgvURQ<--&ry3vh%Fq~GCT*Y$Jxtkv=Z#Ra7}XIPC8@Sz~719M{m@;tXA z!KwX-Xbnx5^3ztVf@}$8HjDR;4Pa}#w>SH-ui7j7p1nqQkVHCFG4_xIQuY-J_7E^% zD=K9pz+4|iCc3f$63sH;2U!+#bHCy{>tF^K8QlPu!5TEDspnRJYiAH)i;ztmUS_i) z^hwSrHQb$0-^1|AA^G>IJrI$x7wbKd)TZ*1<6UH4o5j~AU+WY3OZzzT`Z5& z&T2BRLTXcRU@!q9YG@}A%`W567Y1Okgh8zRZ6vkd-^;Dhl4tU00|rWH#^3@^EpJqm zwn-?^ETbk*Z>E!_F3CGX_Dm6$;Rb_im5XV=YU}`C`@O&UkAKx)`S<*_ydyu5zmb|e zn2lQR77Ih_minY#Oi#cyce#wceWpFf3y8-xD}p-*&vAp zuq}sic&RbbY$| zWRW)f!aq*Vfd#pH)5iO8gy=Rx-9OduCfhlwry)-}RQa7ZMFv?{!A0(8w@;+3uc3fA z+@zKSLoniQJgL60>1#^NqdAN;dyQ0n^x6ga2~@{%aMyZVFd!Kn@Wy(ja?<1e& zt4WN0Kz>7t3EEk)V2yu4>n2U^2a_#fHUf>SXsO*lGq*hoiVs8$w7_?5n2$@Z6hmsJ zC9#bGrSb&dpC%~FJv2XejMA-$3UB~Wvs-mqi)$;r%cMF1U8~-N_FhFKO_^ZjvQ@x& zLSvXzOL{OkP8x6#z%`570W)-a;n31=hH!!@*V#c4F+9yw(S?Kz_dHsrLWjgmmIqL^ zuhPA>_WC4C`|}gEhlLcHH~Ag`6YULyslsLzR0+Gzrpl7(&0X1+EmXn1VZZXpAI1Bc zzi+g}eVH~RF^@Y{wrxtlhW(8o*=DZmu9NC@e{NYqx$lQ|;9;)+H-Pr5)2*ZS^Aq*a z-+1giRvuexi7)|0*M6P$8QYlC-6dwDK6p5fwMTB)fk%ILn&k(#jNLBZ6X}vZ(Y^Hl zkHJKI9DGEDS>Dwf&jtE@3`Pivv3DTL>fD8d@F{jl|FZknHU@8Y5S{OitwG`CbdlNK zAVGZ`SXuHje-sHPx`b)y0ASx?y9; z8mm;RQUfI(CG%9M!-*w%r@{~wf~6HW+ZedWI0dGw2Xi+Z^eeO&J>8~DKVfQ7aa@Gy zr{gOXB<60a_p4u5f2jz(SH%Oq;|Twics96uDR`G85<30AEf^LW!P1&Cwa3b%f8^~6 z%kj-0T&v?$U^RSWDaI#^n2tIoAAj+I@P_W>cf{kC$2lCr5wFJgTkS%734Nu#>>>+O zp$`^`0xIo2uy&JE{?`KnOH-s~!XDNL&qwZ0SdASbot5|pT8{}dqKq@!0$c)T7v^=6 zd^?QpQo1s8zDLUZ!k59gY<`)2Q_EHqLy$D>htZxf!LMUnN{dl8iisFz(C0i#YCOD- z5Q%ZrF%D)}>TYtyJQK0Sf!`T{HH%Y&J!h5o874SwaRiHzBpJ%-h#F;M0+PjSoYipF zaJJDaapFc?CF;@yRqj%Uo2+G83s8#!iX3=a|G9owMK z5s?LEb){wSehYs?bQ@jo8JO=8i25Dy1b~3nTb`l-7i+CC){3#lz4hHusHpocX2W_Q zD7UI}gk9?#1?*K>^9GW@MvykMNSh4+z*3GIa$M)InWc?wkr zUb)SxCb4ZNi5H*qvj62%Z+Cm~F{pgq(ZbKWztHSzGU)nL?YfLDgs#<-OG>DdY)bvfjw#zD<iN`@*HFvaMTi zTWCIPL%#Db4bi+mDnVXaaVaK;7EWa-U!nAo9GQ}x1@nld5`Xi)ytr`VFPIwxCJY%1k}pZVBKZtB z%ae5AmOr>OzCZV zm9j+&cm(;r%#oVzB~LQLz{$Zml|k8BY^wHE3qgta-%=Pt5PS!METx!yC8p440B43! zo1@vl`*%joqT${;`b$`|fd8T8A)%d0+vZAR_NR%Mo%!JjyuwoC2e zkpsz)pI_b`IvMJj^X+~$O}`w^*3I<{jf#!{e@w7Ae-mKKS0CLwUZeNAdOllv;U&m- zQ0m_C74j~*A-^W~&^(_>dekdayJp{i7dc%S;s1f=EgdhF+>n2fd*QR`1!)?-3y~IC 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 zcmV23I`wzfRw;*DsU|DubQhBxN@^qu~n$z}tf zoh=xYNC9l&6vjRXzjv}v<{y=xUvu@zH15)>0}l^vTTTC?{|+&4>ZQ_FBJEhiJS3uM zN`zQ!k!{arh4vE&bOAzB2!ReGIiPu^)y*K0LmdQ)*i1=;ZXtWu<|n~+aNa-B!^ip; zr?UZkr)T*|bTOLZR*?)4WBR)6Jse2D&R|v|gU7OPWnCE{#w-^>n*)t&6O4uK1M(J4 zU>GGv8)+a)xVz92phr_uBI!2P&0}gF*B%(ef%Wh8*Y(Kf54|e?ASBb>U>9fA+xDr| z;Y6QSDJcgYcA=*+u-ylSbRC>AAkSN1%rBrR2t#QBW86twJ`O$QcPQa8*HR*_Zx0}J zdGq}!ctnbw0V%b!$4!t6TO+Sne>Vh(c^LmV!}qy0lf z7-==~L4J<)VggN@#xQ~AO$_m|_Br3rvRQ5-6ve`3j@2D_TnLYAm+wC}pY#(_Q0L59N_ zvKyxCTsYe^JihP!2z;7vm{5@=v2Ax1*6bb}yH#DqX4byB6uXJkRn^p9QVa+%?6k~9 zqDw5uF=my*6^KTsV>ueP2Yev3_q7DhuDf0h(b@O2teu48RuFu8zXsqH&vaPnBEGsB zL&v5-3>1&RLX0U6cLpSBN_9{lP=Wqe_Pl^+um`)QzAJp1bevHKb85Nd0F6lAPqm?5 z-54F0OmwNo(S&O1-DP#_yB~ej_Fl_7AH+HDzu)}!#(Pln_J#819iT@3%p09@%TRNN zy!mG4mV)MY-))O|8j8ogl)nq;M!)@%bJ^6ZolGI-($42)rP)kyj@Xy!_snNSz4L9>^w;ehA8v`fQIt_+c*u{@9OW0 zCi-1oq0wq}ndI0@;C06$mY%459Ud#$L53J(?p;NsPepoMBW@8(H!%Qs&0X@j5388)&xxGG%LQHdEfpk2p}aSS3)9?ZZEG^ z#`Z@Y7I_H@Ag{`XHZ8Q5=5>NVS5@YuRA#9pkS6HzKJWT%r#k01iB$s7`$Ovi;Bz#7 z_IJjA?^M;21rVqt5Hybc-vz3{A^87f7Q{14u`0V}NPGOt8;V`9lIh^*>!*3pepaAz zl}RgFfF6=G97F<52T&rfu*0(|5xTs^EMbX6;uRG|JCo#=H?;lg144o3_AjfmgK(MM~6aQo=2XM}kH(2FzGA!>z)ietx?( z;{3ufGp1plg^7}-%Z5OL4tr#z;XQgUW%(jAX04eIjTo(wsA32!lQTw4@*iT_AP=kn zijz%^oOKJ3KEH*>`mL7v4e_9;f2AIWA(7u z+Jv;ZBrVDyWXpY3Y0h!^!M<8rq423I`wz zfr$WC0tCSlGI5pSBbfuc$v-Sc~IRZSiXe1)tBF zW3t3SSM^Ya!}go3)w@-MzW z-M6am%v(_zl}QQ#MY|dJ5&oarIW;vrKeyid|F43mQDqP%C~yh_Dw$F;av+%^As|t0 zFpyCps9+Repq?U_b$X|#|2xh9t}I!Wx@()_jHka^=9jv)`uq=A&IF*~?SKW)h0Epv z7DkrmK3)2Dmp3D@OkphP_1t|L?W}J%S+mZk0H03tvGo;Qh>D83Uj_S>Hb4dN4=Qeh zCWT>8(tUDUh)Bs$7djRakzabz-PURP?;AP2_09FoOaOPcC;8ONR0pI<2+5jAu`#K4 zI{w>qMK~l$8UIp!!K3fWT>mqdLKsrTm`cC8A|1wnDqKNN2G<2d8)oi1=OUz!cqwqK zs7GrHDugN)I-!ZS*%?eq<3cI$KX$j6q(Ia6|LH8-8EJH}pAOc0=nFbwSGOsugEBx( zoeHHtT5G^ENV}JnwRr1$Yafu0$cGLflzAztrDIG5z*SxRhPa>dLdel1=-Qt)W%7*-axFD9txxtZ2RJ?OY>0@~_hdoL%;1EMm$u2s% ztUT`Al`g8rMA1z@$P+p7R2$eljHo_~H4Y(gO~+6NzV`bNBkQuJu{ySk0>+@xql!q! z<8{l}>bdv|Bf$iZ8f=PhL!9l!q@g~G5x7VUC^i?eLAorA<7d_&=#GDeK7|mc&j56Y z708AS$bl2cg)5XNFA$qQC{Q3MR2V2qEGR)DC`B45Qzj@|9;iq$s9ZUyQYENXEvQ~2 zs97_pRV%1RALukLXvhX=%NFQ`m!Q|)fglK2KtL|s0S&N*hP|+3kGFCHtjm(3!vO25 z=zvhby8cLPIAFm5a^5W0T@f7)hzPtP2-#PCoQ({bPK5!v`E;I~serI_bJ@Jb$CYp} zxc)OIHTgyqpI!T!avQjt&Cxf{*IVrRjO~CIAMCrlq#U#26ZW0wqr%m_t39CSBCsp^ zNmhJ=TpyoZFV`2djZofWKX)nJ{Ee@|dhPBZsU5}Ho9{If+K+x4!aVz{S+W7erduoA zrU#cCC1!9y>ngvTjWTZ7$DP@wRs5rB)uVJRDK0zxcQF$}9Q} z+j&&CA*bN}0{drvyd0ycrQl4*^mOfJ(|fCorc!Y@%QG~BDooISwcZ6?%jSU|+FefS z$vVu=rkXtr?PI}`72o_(3=kwF_7o#lwp@7%^TgY*SD&*6a19!A&M=-4qsEMzGHuqJ zdFL&=?7Ew7xoyR&HFrGp#D*=;z3>X8uNR_l4$^`hhK>NyrD1)UqH+=~Yfubm0o=X< z2DpJavL0qxp=E6}P#Ly1RW<@>ZTnh=QpRBd7Io{;LPDS!Bz)NtPV0rbEKR){fzi5^ z0BJ(mnnue6PRauM+6)U30`@^zKw08vg~S&D8;w7P0AxYPLXgFviN%lyD#WJhk9k_bf<39O}kXXwtDR=m+LydPPx@~ zotsH487y;q=d`nBkbLzM

UowwPYuM|j=sH0xK85XY7|gbLe-?33P{VIM3sJ^1(_qsbTzt2H6% zJz$1Ht;V`mrcN5@oUK+!Dy$w6ruW<+)S}$O86PQVE~d=tGhN}j)+3!Kww^#3uefb5A~HYv`(w3cR85z}S@?q{-r=2X)0*5pCRaD)Ha?!5W;)$3%1~ z1ni$I3^qT-O|29T$k$REXxr8E({}}Kw}*hfeNsJ5C!Aq>5I`U|8sIkoSI+ev$bfGH z#F5D*Lk8Lvp5(^a3S^7+y#BBT4?X(0F1jUEnx{6?f6ae;EY}HnX3czL zOBXE4SCICT?^|~=Z+wTo@m7fk-f7WlhbG4qNVLkI4G$;ya-q`=O)0hr*m&hTg1v#v zB#RP95{e?st1y4d{${FfXe^pOZXoH418*>&udNBQo{u*~z-adTQ;3nhNxHuVcl_HBzqYOU9Ih2S7rE0c~r+tDn@-lSe zlMIQqBRly#{OR#GZL6nn8#~;`LT;n^bgL19-6*G4;K3&Ew&B2TE8$AxHd031yc46r zcjY!)(+w#ph#gkeA&JLlP3^)}>_(5@@b~0k88Ns4e_@4xM{%)eGy2>A;*JR>+p2ds zopX~j;Ba(|3!ssiNPi|i&j5*#DhvRB0BFAe{0Lb0SHRYL0uYY^{WriNU;ixwgcK~< zIu)U{rS+FU9hO^KnX8SuJb_UJZQXMEVnpWUse^(z#S@NYI=E4Nxw#CX9O=>!?eZtO z{QkbWpbE<*+*UOmLOaeF?v)}o@|of@ISWX|IDQhbUCb72#+ou_F{P@Y zxd#_~vm_>4zeCn7I-V=ReH zX-qOobUFbpu^?zuhjH7b3kBf>OsHJ2fYs%p|HnBA$>E zudhI_3;iDUOROxo8q-^O&tt0`UYIk&QAEMQdW0-JsIQxEj9INdIWG%MuIF|}Nba=e zBVB-I*F7NLg{T#R!wPV)a32LKE*aYrKi6iwRhe192zB+FK)8O3hWI(CCrmEUv>#5qg0}F&!Ukgwzg}BZi!$3bC_;WKt8*EG^`EkZOi9|bbMxl z3S0dhs9s88(~m}u7&8%!~tX^HXa56T{v z1MnH5bD+*cg(MlIf>@UiY+{9o$y(0n3z8B<)$??0t=oeZ#zu*5t6W?Q;J5*JH0wfU&qpx1JiV0e;XGi|7`keTx(!#+JL zJPzyvAlT#d^ySB#Q!4xmAK#+nNb%>x=<+ZY;T=Nlz$2r_v}Smt$_9Hd`kz8z`_JZX zPazw4rH{|ntu9b8nf%1w$(*qAtz|0iXU6p!I@La5mA9=^TZ82Rv@>EA7zFHJ!R=t{RTaj10@VAtLmm4-rbUiJ+x%9)xxOQTQqI~zW^p-pOIz?bZa zxMn0ks8P!r6^*nNT3C{_A<{ZFRjbhLlUH1Zm1E$=1RvRckIBK0_T8$!QEk6IV^<`h*OnV zD>`?qkd_S*r%Cj^Ja{T7PC))Fsmmy-(AKPFY*LCUe`TbrH=k)?fEZmjAzvdijR$Tv z&?Ot;32rLLK&F2~?VLkw4+?0Yk5IF#I}fHL2Du6^Ac!H{C^Wae=(a?)#EJW>yX+N@ zMt8EENW}3dj%bLgRIow~W_*F;397g}7!!?Ln0Y{}AqE4`!4JzW=XIIs7B?w05V!}K7LrH@X)r*Yq9WsAHvWlD9m)HYU7 z^~>jxGJBx35HAyD^iAr5>#_Wi1ilU_(+Ii$5c!IQGPu?5D!h%M6Ocu!&2UiiC<+i% z!U{{en>Hv*OdmGcW|e&^4tK1|9*jQ`3k;?ovrs?bv=3Vpl4h6zg9{odw+{G4J9MxB zkzxyK$6}WnuW%c;A5nRi5z^Xpd@cI1GPQ6qs8K+V%6mgd2w)<$Vu6dpGcSX-_K9Y* z@uIW5`w%mGEM9QGgEK9^-q1J0ZHoZMT|@&s0gk|T+${bBC1JA-g9Nf+Y3Al_uAzP%%> zSLLPdy2I)U)aB{E-2dEs>1L?k+WY%YwyiXH3QqcL7j(?Ms>utJ*jAa}jTXZpE+LzA zN_6ho6rebhe7z&Rp(iZ%W?1t8(L1yJid`7&MJE^O?XDu2mGByK<)jO&chR#_`a2Jt z;)PQDh?Z{tsV_2pVMDBlcR!#9WcMt4g&?_bBG2_Jt=5>oq2$|(ypw1jdgVc1FMuIY z$9>U4Wa6&y{B|GI1RooB!rDPfptFc{BP$gdMtw7aba>2e(8V8U92MP|<{PkoH`s&w-x>meEaFz6}dzYa?kR_c+pxPOlM15F@-1*_qbvO7#fV5F#i46T9XSNX@{7J2cP?97=b zE08WUVUWnic+3&Nvrx{qIRWQOJb%%vg!r4Pe!nX!LUZBy68G=aN_tNX<$d|%gW-4+ zQe5Imf5aWB@eZ1$#}W?PP!f|)`lBb2g$>~mvkwD``F{^e6T~hIRcKT^n%Vh>_SUhT zDJrmiX`90P9Q-ZB=pd6(wdIVaI;ndbrBH_Dr;TV`?zF~FH!suGCO4k+wW`pXHa<=; z)F(D>E=%n;6D|@iE)olk1nz3S5}5BxGevGYtEPGHoxQATy#xGbY-AIMeQu>31cHfh z%u~y$cT@l^gT1Fog`}4M&)weu6lY41bD}#M1WPz{=OKPZ_0NHE7zW#2WUbnI=h1X{ zCe8dIGoLSRhGATq8Q1m1^l_UN9~-p+BKqDi-Cy$*6@F%*K?$nIno`yLsk5}bRqs}#u_(30 z^y+Pi_QRr6o(el&8%n(wHVK(F4ZR_GXBTV3l{V!@Cz|4oNFnisY!NcMbJ}ZKNNho2 zPA;2jdyVJxnzH#}a5wgMYNZ#+jcA^7I0WIq9uCuG7%-YB6AM@Y4BFM(eQs|o zYZZg;#}(W^JxQ87gRKrAg@XWEM0@%nVKp8UJN~j8xD~*vNYNeECp+@i6y6&X1yw1T z3dzGzDVcCgVx4fmBli=(<3*m+po;e?LO40AdJ)g5g*VX8FNjm)fDl_zo`Raf9C@dsmW*^- zY-VN!b{dE`u`Moe&okDzlT<+$JwcZR#u|63=|o;G&RoWYe>3Pp{6EMsWFzXv*M6KU zU!z7Yp=)!;Z=uxUKHD6&WR}%a6`dKo@^gtvaPXy2jT??_>Zi9SfZu7y@?TD7T*exA zD*P~4cL_d#Yp;b@EiX=4Tq2mpigaE_T9L=QQb){1W4w2PyWaekIm5W9{NHyqVl z)Ssj*>hp+MBqbBlQxC($7_!;))qK0FmbM|==5H4z z6sq%S`dTGo!`F7i7njm1eTFaa$bH+kf27$a&v|zpgOfDDrPELq;-<>*dD>_0$vnGj z8#x`|4P&?Z#D0}`(r~lWmn`2oOcv;L7pn@_G99tVOO}a)gK*-$;FzWXPs`BJic!&o zJBs8<9bt`_doR9)TrmGtaxJ;@^V0OP$oHWKIWqD@%|<6P!NiA`1wr`<1r(g(Kd%CR!ugc zG5BuD$iQ@{d5csfeqf$wgn>(as9Y+&-r;4J2*wrQLr+^Tid&vB4JoV2{Vb} zq;US}ZxKp@SH2g*Mv8I-<0<~?N4&o3C*2htczER$>JCp>Ntq_sOrteu+cjoq(!JrN z`@0m?O>Boe(BlbwoaFl>N%u(sHt{yl2}y|M3ro6hrRuM*x5xGu=)_GfP?~51|E&(A zS16166Rhg7-KHbEO?P*tTTT3iL9i&95=`}QiFZb0#n?vUG9@WL++7Cxeqh(p_Xuud z0^gJ0dJO5uK7TR%A;_vG0-Ci1?&x2$$Jm}oEq19<`_wp4duoO~#Vw=%h~T#nTbk|R z3n0E1m%Q)=mVtvtA4Gqi$GXug4`EL~CnC!mO+~o9>V0Qf)gAPzxZyY?0M^Eed7lDw z|J>dy-W+5GUFYY&J_~GbjA+pdercEeNRK6N%!*h2h_|fX#qD9_aL1mx=XxA)?b;Tr zy^W{6ExKphyi&G)Bg0gGFn><*pc!VV?BSa37B3;-+O2WijK^#Ks>i&g=c9YAM!oR{ zrdir9IqnD2?Br^t~37rp@3!|@=3uT&W!LP6T76a-JDj$152CA>ys&*t)r*X5_7Uku}Z+I5nJfy_Ou{031-Aq z2E7XAp9nfp>r8ei4zvnGG=O-m2snpb?;vDihXUi`w4CJ};!q1h4K}nY*Nicv8Jwa+ z_KAVJB3n@}EOk78tgzObY$sUt9oGR^H3DCxxIN7XRdSFwevh%hZS)^0(iiNguI+(* zp9$sp5p)IpCPDlMaU?lV9Hs8fn~Qd$LV8^6AG|*LJ3$_O_2-`de+Li; zYi@)%N((gA!Y_wNzz>ZRqGRKV3 zN<>EbblR-(C22f6;!#4pL5|3Z+@ZeuRF14*KRF07t&rc!>!Gi47meyPQJ0;;A0z|b zoi@~$FLM*H*b~XhGRUX+>kl5RrLd0iSjPsWFGwR#z)`U}O&NXPS5l(!!$2(QtkSqN ze2^^JrY)pqN6nh0BRoTaBf~%_picG*UVfDsMf4Z&e`Y2WI1GdXs+AV-vX7*eEad&o zgd>N6NMx&Go1)M)Ve$3f@{7{Kp~FD@-oZzye3mvU?FXc8I<+dbv1PjJ`Kc8vRk zG^Xh7D7TatnHVvR@-^MZYiPOcu;PPmwj6Ub6stWcn0Dawl-X%oY(QZk>Wk!5ij;Wn z_lD5PD(DdI)FSEFEi)V=$x7E$KbtQV$P+`eqr%`v7ZIL~hsd9!mUeU_KA$>3_va6< zcWXLmYFbCEdBQiiU52%A?_mde1QyxIn55QC;%bnlr~Jb^)g)%_Tswm@YsTQdNfmHaNrPCphEGBi2g&S-J2pel=K&&K?v_?)`n2t zb{cBkRk)CXCIi!#X*{#2VA1@FJsY%4eg3-Y|F`l_pq=Q_BSKGKy!_1PE*&l1w zLV{f?cf!FQvI3aj2~LrLhh0ICzZ<8=hjEl(XA=l6(SfdzO?DPzUzZS_f^1rQC>bFB zOe{sB{oPTp5<0&lWCcWgC%Q&-(!fLqCl*_gKX!vps6>tjnxVgE{*+xnx(`{f{YJl? zf13BH_kFtQ%)|Rk56T$UX}*j+_L&&oIxAyYYiOl4vnMM?)}r<=YwelfE$C^p|E~)5 zo!YEVUe>02%hdJ=2&k`#>iMb?gDSeBXrX3Yc5WoU*WD5;-X9YZ-1qqH378-3Umy>? z8pd9rrSpv+Pd-u-?G;j!v8z{)rDH{P;Y-V@N<&?NpT42DyOdK#jHm6s{UXvI3maXI z$9Op;2kZI6QOHjACGnVM>m5KKF{fk#tw#qQWAlvA5rA_<3c}ksXd@a`>w(uVtV2y5 zw^=8|c$o$r3>PkpJUl%qb~igf7y7Cwk>P8?7lqDu-#QD1Kuq)g z>dEuo^`&h~L);JKqE{2xx2ajo-fv(~QNAisx~Y+oPS4A4OGlG{<5L>_qIo;zaM4NS zFHbg#9Cmyu+xf*ms%VOFfjb>>%wOeC+5V4N?=iNyj(#r%Q@uZNm8o>TOm6;&?Nxg6 zMA|JMQCuzCamUx}Msq`L$xn;%L1@X68$EFYHZ3FT}WV>F2tzh{ONt?P4*HN z=pc(#53;I15woaI$?_c|^5E0hciZ)hgsr6%xfV-AvsjAlQF{(fe^-`E9EPkGJH@^ zL#QA8`!-C9)z2T8EtYYCTvHD9 zpo@6DHM=45wioL{r|#l-(gY)l!vcRz)^a*>7?#=@8U?u?40;d@9Iu68ryI4KX;3qk zO?C_pJo4F)-wk1riQbWKB2sRP+|>|yC5Fffc8Tf?yv`hEB zV6-tiKY!vX$XBIHRo79&>FFm+%CP}pYfq5fwdL0V(igZ{% zkgSc|Rw#EXVVM_xZ1`z|#r*Z{S2yxK9Hz!r2z5`7RY4UC0jVGxipds1w-YZI5oDns zgWUtDY{U)nii!g2$@nf(DC~VXZx0dPqVWt@t!|EPFy-(?Ff`dI8f>pJNl!!Gc zH}(R$HPM={AyR3pwFF6psVTT9f))8Bmvk41R`r9plWrtC!R8e*5eQU$2P4?UPErve zuh!;ajUIi_^K2rkx*YUO7SNAT6OuDBP!YhYeg_`f`Z05o9GTahrC+j-(XZt%e8RO4 z2p7sf9IFVjbO}_8_a$QobkczZ^Tha(> z$!w5IqclF;@jK zZF}s~F`e1z&VFY>2#Nqw>Cax)J#~|i<2A`4v^7VwhL)M8y2X&YD&Ep+Us<5S#MNX znx^cv*S04`4fboV@{RJ6H?(vxBO~+ZJY2^%1dJT&q5T^1BwR{7v~ji^*22aM^q!)F zf)}v=fAU|$Tas*)eyB)>9R3NHV1ct~L7Hhb9Du)Zau1Zgv4xPvriC0BgmeeF%!5G> zvfDY*5Pmg>4lDM5%QS}}dsU-g42hG@fR zi&TEvQV!~1;{vtM_G-=ajbd6lJ$9g=5vhbv$_0}r0WGU}4j)jD)WVOUG2^5p!QYyG z-sZ=+ z%M}ep7Ey%9cQQOP-!t=j^X18{I|0#wBW{02LVAr7#%h^7Qw%kqu$mvi9QmPbKeq`B z3lxqPrjkfhD{sFrVKz^XV!M;w*7i@Qpq)^@+FfQb}sh0P&_?yX!ay+rL>3e~&P$SGQefvrsQyyQ#fH++nAV-j*tHsj_JO zIm)o!IQy-CA8V)(wdsUcS(3umOK_ z=bonjv38r(RKuz+Q%t`3OQl!k<=f<9w#KK8!8cF-OL^QfpR}>6o7d+rcIPYR{~b8r z6q=O>CEEbIk!n6|ehV|`=Bu9Xkgn?4+Aj4RLecX{qNB%quI$kx zMB2V$6zlW~@YGJLtA4#0R<6%|Xy=&A3@e%@);S_kFGXl#ybI zrmmk*qs^)9c7)o>gL^ay1nj6^@l?^0!%ue@~h=lhe zYCDj)-D0Tdg=o|!w*%MJ$#JGfT4L~&(L zZC)a~a!7yJiIs(abJ>A5o9FJlSKbLf=4Hlebx?2h4ZO;?*@^tefAgM+3da z<1>SHz0BLZ&-C&CQUBzn%0AJ2cXA2rXODyf10X({#hKOXJjwg)>y`<|^vBM&m~+`amZ z1l%XgfbkMX8sYq4{g(BTxBZ~o^3rUwOgQh7T-6O{J)s3FXD{Ru!s;9j zh9hZU`uzZ4k9v`3@z-Q3nVOn@LJ7c}N>#o|%>bS;4p!0`y>|;Sguu5+93a%`W{Ib= znNpPhH>y!}0Y}p8ADq8%nFS0rKqUuF0L@WX=;$;pWN+VVs_8uHM2790sy zSYJ`QcwRD@ZZ)JrNe7xR;epV>^NajILyyJcdf>iNFHetXK#33;C_^e}OwNcI$hcDs zdO3_U38#>=9I_8=%{4i^%C@hnbIRMflIywBrXqaPm&+_`*0;$eeIw5z zfNz<*DYG83U%8U!y~1qU1t@3=baSQcgv1Z_jB6ePfs*rr+T#r>U*}=n%Ri(8O~Mlg zXsFjhJ5v*oYB^dIPPY(Jq37&WMTK<={|GheQa7u}l*X)-aNW3%ldUX7_3WpD5W2QJ zAlV7lbT*uYurVc2ntzKCv_XjzFMXY%BUD4G%F9q=_VT_oTWYj@!K;tO%B23~HS?nf ztbk}%RX#Na*KrKduo*WX=_P=MI-xttPjHaXvtv7$4Gm(@x$Ocd&npeMstTZ(6NW24 z>pcE>P-l3|T=(r`q1sU!lXOJ3zCFX(JB+_w7uk%Ms3l*`;G$0>ly6V1g^ZTnr{2-K z>37YmbWnh@y35Tl?D!6HAA2$(jFS+MZe%yMfyVG*3WLw_=m%UWnlUl%Z(wKxG$jvP z7apx%N9V3n_QbNLi_WC#)0j&L`C@Q_J9L4AA2QkjUh%BpF%LpZ+7)OMpyc)9zm2=* zh5dK}6AX?kqy@;<=>UUB9754wv2`VX%`c=p$Vui>c~KTh$}%?6(NDv93Lz6VdnGUK zB@Wh2BEf~L-En^^oCR#2aitLX@BUa}(c6`s>a?;uK&C~q2UTca(RE;C4zi{xtx?1U zR?C5AywSIKqqLoB5*XlxDX=$qAQc)u{CfkzL|Nj*Ep#dow{@(R6jDqvYYF`4`|v1j z^1f0Q*f(WjCl`G|cF#p-G6KsPXsMEyD&pe%5Tt0Z`OF5nhKuBpaGRo`+|*vuBeBKy zMQZ=CNsNOYZuQ^|pZQ0ZSKZ>g&-dN_T#lo={IqQ>LQaIc*oIXMRux;^#eB6OtIq4K zDC2U(*0U5kL;55qIMiBUrm*#NIfnXTjuqdCs4+5J?aI7w14y|zcrlfJQPNIE)R|5# z8Ksh+yo>IxM`D@ zN-eLPqP;$teI3&|sF(ERUv{}ChHmAieX@=tXS|~l%c-hBx%lF_E_BP>`LPz)@3~3j zA2%$;-woA_)6J;FXX40xlLh^acnHMxHKw}oX2|46 z>4tON^QX_+V>fljf8b$piYy-)F>%-FYaY07_Ktc=qwT&5+{id?{E4;-={oXqz*tTu zPNqC~F}+|a&5c4YtgsbvG5=&?Ly06wT#5F979Phg#2NJOJ!i9m51{iMaMu>PTu8=k z_N8)nmK1gkk{tm=NT+=U@}}2KbGv%$u`=F$%bK%HxQ;) zR&i}g(~MLeG`J%p;VI+7pHXiHnmF@eTlq~7$~zV~ogK>Zr)qpA(SY6->e5i01_ zBJceiN6uZVeH$>*vbvNkGkthSBH^xK?~=M!U2HR9s*k;2)W^oh zW}u5PN!)>~>Rs2Q2VhzqHSK0Z>Eu+>WIPj9-NsbwMx};Oc{M_hMxQW;L2?6EYji}0 zeFeeHQ6ni7%~H+tpoWQZCwJYRMx+0Lk-{}atYJO@X8j_p}|7+3zVDKCfp)yLDdUjD)Mpz=owj0^yvNgZRZG|PEfp2;k&J=| zwLqx{A}#hfotDFt#O=3>I1HRGG_ftX&)uO!QK&x^G z-~r^0h(LpKi>!W_I$?Kw=bf80q_u~R?1#^dv%4j!y{MV>Ew;C34BqEN zw+;&^a*TFUl*LKUUHz3&tg0p%N{tmHpzH-4l;_n$aya`Dr+wpQVAX#jkb=*UtRKZ+ zLjQ6;zeL~$xE;C{-h+!BmOu0%RNBqJ!Ay0QkHP7_pd*RNQAmX z%?!j-z4B18nSm-E>+WP@d*p6LIKUcrY@#YofC@XfJ@X?vLT~;bUk}zncL=nxm`Wkx zs);Rb-s;X1*FVxQ)-B-y%1YgS6CZIJcdz06=}1_nquMEM*9E5Fx?A#@@a(-*h=_5{ zx=tM*e3XO_rABb81>FI6uVY(M2JI zCZGyQvdkFhVzRUiD#~Zu$jOr;Lfa@79MS7RP-JR;QBZ#>IWKJti|D;OP+DqRPZO!> z=wQ_HRGN}Jd6aEKCjP8%{hF=SaTQ|XM@uP(HfCc9+vjnG)G_<-rb(#2W*b#)!o_~v z?nx6$PEDy!-|G&2Pr7YLA@@rt4h@&{4HX!zrsP#bXgds~0))!Lz%&lyYuPTx1E^(7 zsqve6TB1?XzKdhqw)8Y}&UAB@`SzfStj6rH=d}9qJh2mu&8NsK}*7RrAm{9s-H>) zs$R5@ii!yvb0VeLgyWBgaZ69Mc=Y&8@^_#cwq;so@d(J?K>h&8UO9gOj&0`@8mC~3 z_x=cI6zyr&aUk^Rsvxrx>j8n_x!;c`KLx`}e-31VQy||5!j&HYVeoy)6|(4ZWM9hd zB1^s5$laQr%lt@&rEKOp>;sjJ3o+<8nldnoOw!PHkHcI}02%Fu$@hI(D>1XoyBw5V zYd;XToX2PD0hLvP_Kp`)w-Y)1(q`J%5c6PBRE>O31bjyHOkh(hA?VIX^VuC2_1f6% zb&v1iBT~?ouM5hM+ct>D6Y|>##hzJ5goV7cjkcK;4rs|A3cDBS1|Q#F4Z?H{M> zf2K-g)qo;mBZfhiGw4dp$4%*veI>*xz44+}IoJLlG@%_V2ZF;gl$eDb=}2HUZPsE& zsw;=APqn@iEGxS;1ll)hA#3mC(FpyI&IA8@5Qmv$u-xgL?AT*_Cb6A`>NH&xvz$rh z)n#6*NDtTJCEYX=J6TfApVgJ0WFv=q7*LPgTJj2w$fiCm@{Rpc!k9+r(ism$3_RP| zM{WFOo~u-1v?frm_CDs3FW8J8N;zZuV%ed&g<8<+Te(!1wHFf6_QyMCruVYb9w#E0 zjy19Qhr>!A*PVg_LxXi}FarMf68Jv_fRzXgcKv6!PH*coCUJ}UofhBHkI1^q9FyrI zg*mEDSHHSUVj9iV<1O6?q&oafCR=PiU=TCZ=O+4DPGSCK|5&Dwmqo=GpZHm;2-af% zIGulS&3e}(O-kBY3so)77>q>nv5pf2 zR(Vo=qSDd~C;zU?+^MBxt4IRVR#MZ~_hO)b02Uk)`fj1hY$+^3!|#dmqsWIT9U3;q zL{m>3vgYbNj%MKLgC4Ea>C;X;L~BX-EyZrkF&j)8RTLr`7X?VK^P|!J(oT%> zf;8r#o-58g_+_aly`;(pChjmC)NczWJ~zN+d?1|j3wYg7q10TO$^9*woojU zbF6Tbgy(a-t~qh~RRpdUTf`#iQ&$s;YL19ZoDJ0spe91JpkkO1Y~`fkVg!hJ`mC5U zVaA3dGpe+x(cmD0p9rxcs4^Gp2nKgaIGTsJAe;=WRFgJ623o9fNj;oVWXi7P&NWR$ zh?FE+1WnCG0sjC1|20xX#z7vT2Vnv@5C4R#F*jClSlR(BW3(_upv&W%&&;116sWI2 zari52@WZuterTs79D)pFCmdoz+JRA~zJ{VW6A*WTQFzEeO;)g1GK#nz+PzK1p$;ZG zio$W2x3%F;u{fNrikuiD4j<)pKubK1P?q4SFCRxt53<|CiX%Ch=_(1vk>hpV6 zsVEspy*hTtR*6tblmX=rlCF*$+Nby^8CizpdNx8*P%^{^fuyTrhkTS0<%aS{>~r_k 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 zcmV+{9@F7>Pew8T0RR9103Iv=5&!@I06S~|03FK!0RR9100000000000000000000 z0000QSR0H|95e=C0D=w(QVD}R5ey2`7|I?CflL4rZ~-;~Bm;vK1Rw>23I`wzfGqEt{`E&e|oPlhP0{bZ3KqDVxLaL~G#VFz!fHXByWK0MJ- zghgRJrBLB}L0vLEulJ)Vg5TJ}aIJFC)2F_xV_M;R7J-j{-%9@q(^B{dEq%lbkG$Q} zpX6fREC`lc8m-)!)w&`-GeC3eYGY$f38O-CMCa(7L)gd=luCn21F1B@NZLpq0h?Da z`hVBn?BG8=UE9A=WOOY*N^}Dl25FUy1 z7y$_e;Sd(5a1P^;gnYJrzh%qmR)K4ow|XA_bY`h7p*DpuCu!G&!K44W#bGQKg)#h} zPIb4wy8ywk6adElyRTRZ07}*`&30$RxAO!52ZolD6id0IiA+SAS7L3ihNwlc5+QYJ z*mmCr018Wj+6F6n755Ei>;>yDNhDS6%JC3gVf+4bvQ@^ zgLxymyeR|Tf;n%`pN|ku|Fs@k%4dqYhkm*uyu z?)w43w#c2G7!{q~U}D(|EEy@DzK9MeXI)JAa~ z8G4q;U_5a^D8?EIMN;jpjYr}flC`UB&lgfq<{-@Kq9Y+YSt6J%osy@W3=N@&S+UGU z^xJwR-re$=)dtPgbdA*tBn!mtZe2Tk#7e79AH;ONAQ*0041#hV2 zimL5Umm1=gX|_qLXSBOVr&YQ=;prB=+vB^Tf9nF<5Mp4c3{zBU;{)U}a8)?xtuPIt z=B*nQ?=Ddhsr8wWl2%1xJ$zMsMY;bBD4Msz3f+qCEu(LWqD0#yyCRe{Go-VSh$r`K zB;a0g4@{{Smgs-Vy@gP=EmAGrT)_>T<&}kytCD;qHSTLrO_bW*iafCu?fU_A?jO4M z(Pw3R9crf~0)YK#L3n=WXG#?)2-|`>fRyw$a`#0p04xn$tMLVO{Nij4fZ(1y!2bX+ z;loJt-Uk=@(lL1#hL;Cj=#qMAd^J1;T`ji?6_9KwzrT;r5G61&vT*_ zMrA~hF%zaQiuYo}mK_oH9Eft{M2s_WE+k$FQj$IkDbhU9dGg}Thc7?M0t8awPn8<= zmr7HMwxC~vLz=v1$b}L}wJMwwU&Rp2lg2V&7AjyKK)xHypf&w~C3BRWKGksojst2j zLv`{Ah4`lI`5}QyWOy9<8BGY8zM7KTXVOVDJ3I9t19Nx~kZTV*fSfuHHgF8Ki?=m0 z9xjKEUJsWs-(OqiJOiHB2f6MG>Tr*>0xRE`^*t~fLu1B(nf#cCJ(~3x z{~jM!ULMXzatE!-p4a*hN3crb(z!!vt3LohYf+`+>PXONyatz|_ccAB`SE`nEw zZ$V+?aBNFk!;P&5_~Qms0;7_9La<#R|M*N?9IvWn3^vHK)@3>I(8J1GFUY9d*)lVr z4>z!QczMZ?^qIHi@Ok~ZhtO53;0=tIhMxUBSqqyT#q#Zk5=E%gFdcBux<1pPCI^z1 z4+kO5M+d-<_u*>)1kB@<4{4QOa&<*1iCvSKucavVlH#ul66)^D*v5-dj z+%Ov%V*UvCM|t3}&X8k16d>hvkMuDX%2c;B%cIR$@3OEB_N*PLhW6_Udi(cRLr#~z zt-b%H>iFkXcfR%l^T|{7a|*F-QOUS;7$=_st#w8uqa4m_|fnh%6 zQ7+_=@(USVSm@8?jso;Y0)EbLxkhdN24FZ_-u^@6bLu0=^J4ZZ0$cd~F|m_-Y7rdf znlwOF*^Kz4%^;%q1bdLRcxjis%)f<1d&NmmfRIJOCX` zS}8Y=`QO{Ojlm?Eu!m}w-5NK8Cz|WfauNrL2cf_Xd4CN;3osB@bxQ2lDJWBm7fx2r zi&8}w&l3;CbSi%~UMG_sY|986&73hYTB|k4AWc^l0tosxHBf??C$~ayP0IL&nZdyv zB(P#?S-|L8O;^S(ci${V54v?~ZevI;hPjParssZlj%3Semx9yfDoX4HwI}m_i4r2F zck@=bzAA2HN5DwldZ^XXg!jp?I0s{~T;m8o=sKl`&V0 zxn7@q)1$39zYH%Ko@CQ&FlzhwN zU0lj$I}8RK1q0v&ouy2tYZ*6HlLouFP=iy(0xwc~to2E2gQtNP&#n`ODU16tA=1GU z7$$LEczg4DpD#`pI66^H%pfEkDoBDAP7;BffjnXYK86vOg$M(2hERLB4}3$gserUL zm?qdf=du#+nm)^JyUuQ#C9Mt4G7_#a66QRS8PeL|jIe0O>IL`B!>=-9erx`7SE-P@ z)Dl~QK1kZ{kel!LhJCg$<78Voi;^m`MY|6xSTUu8Px`o6VJzMvc5Y;}?_*s&-Xng- z!G*g7x|5Ui9d#0wY8uuq%%V53ZosSX7ZJ=p9Ia-a&l?_azLUJ!h?=i|SPLJ4mm7;{ zlpV+fb+z$X6+DZ4r^^1T4QzaLLv_3QgtmZ|e3X=aXt=DGTwl@~zLf1Y%dMUed%AaQ@ zNRG$7=#J`}CJDhN6!nBbcACZ^q z!u@a~6jh`Ld%5X@Zi|3KlN!N7Mn&&)?Kf)UH~s?SW%#QIb`J?rHZ?8vzpA`A2d}_i zgfL$rcdQ%EUF6|qTmCLy^LjX4|3YziD0B(=cZoPiEWiwPvHoQ(Jca&Al?Ax7d};H= z((K|TS@+X@qxLD< z=09qqw(TLS14YB_yK>iE&PaFlOBKiCvY5}LDpKp&U%X}Au;jo6$-yernYQVpr) z%&!CG-LUlJT*nqqZ{<}q^?arcGSHK`k3gjsJQ#sY1EjY%#GJHQ#%H5ZWH)+n}cK>8~=l_M7F zKX$bk?nSn~+l<3mP+jyu-~s;j=YmaZU>hW>&RrlpGAhQ=*bHSu3rVc!m=bi9L6~>F zb5U}@14yvxfuFgQ9>$zE&A_^v@)=v=e5n*BwH)ia2oFG`f_&SYb_(Bt`6O}?<<&$h z&vQUrpaMpH1lS3&=j<_rs57P*bG(j z=H7Y6xq7hg0jtn=T;+Q~-SQtw!l zsA3DSjSI*9yty6SvF2%kqD--4@>!=zm4Y}^Te^K1wNam6N}uOwdFwRX4L273#{edk;52iH^@gS}I>ds4;i~i+T^*VJrm4 z)$I6O`9}2lj}j9=TTb!>x)>hVk=^}yzvaz=!lBZz8Xss6=UWvcG_Qv#kdxy@**ZZI zy0}Iw%2FH{*N7{?uw>-;x89E*JV%tGbGzkpQ&1-!Cb)#qMcJ8-0xQ@hNj6#i1-3{0 za4xR=r?U|qlO^p_HXM!jC5BZnYk?Ag+L#So-WedD#Kj#xwP)rn`d-390)rs9PJFKaG8hl!E_nAO>KK4vr>*1ZSQRQ z4s+a;VhS)oMkB5;uB?!gyM2t4ySLhLz2+$^|45>WcHa17+hdAzY2Q zpKlyk?+Ypooi^Wc|CG{{lD!K4z`l* zTu@~n-!4}8gSyNe)FI$ZM8ri*5@L!r6BYd|C-+1H&>JqQOl*yVOOQ*?1tu{*_Lz8f zVJH*>b?14#b}|m@ijHr@d)SEg2p2f1`U7!bWIet*w#=1U&$OrV=rL*#{{Y(uan%Y=fkyw#4&u z)(%;U)#+Mi+vWSBz!uINr$Sq38L#i8W;9My2*iT1uG!AuDBAv@`fcvJ_Huw^F$8qVy6sVP2GQ;`X&VxC(B#OX<`LapVjTbjIc! zn#_{Y^MbA6GA3vZ`bJ~DnG!1)#h;oHsa{T?$uC;N4PH}F)2+TPm^K}5eKuXdrsJg- z&v9=fJ21>sG{`QL)t-y?^Ic3xyE0V>Gr@*@N^I8Gry>~2OVECd%0$V{#X{7t^ha0F$tKcE(qDHeW3+poMl z7q_2zMMvKt4Pxc2gyuMOSN8<*`*+SABxZ zz%~Ko0^sal_a6Wb(r7v29PB*6uZzak3h+l2oO=afVKlW7fJ$tIXFEsS#S*cpbR*K^ zKdmm-{uYdElF4BZeRq$7qdoSne8=>Jg*^e}hLFA|}9n1R0qsJUb(m{Zm=!TGRt8k94U0tMmJb@zzRQrBc1(RtLl(6HGs6 z8Uqg=4L#D?>lZ@khGM>uLcS($Mo6Ysqe<>4fmyl?)G_O|^Mw{sL#vg1fg&fkM*1|+ zfk3|9*?02r?|96tbiSxtPL5I?SF(5AF~*Kkt{XVYS(l@B>|EgJh;Pe0ILI4?CJ+^p z7c2^}tw00VN)3qJQJdnT$uwJ!&*%e6(^dz4uF0DUnq0JmsS}f6+aT9C%ALzhpv_qh zl)vmx#mp*5kP`X`-8?J04K&K9n6|4Ihn{56E(_Fi<~Cp?Pgv@3-PX2ko}B9&=mo! zERd-ilYz-6$TWt;A+$L?Mu6>3i4;3iS0EhbRP?eJN~V>aa6A82mU{_4aah!Q@CAGa zcp;%V)iEFX+K=iCMB4haNSqO6skE1{{gNpcZ*L!=>CY`4`3-6=i!7I|pB^ ziw<|dLfZxspo5k)kI$mGFA_%qmYZB20SE^l&ww7;IIaj2` z36#7dWI3iIblJhev&o`iovw!q?U`3~R7FLF1+%7>felq;|5|-KQ4RIujh2yjSjEBF zGwvl}1Kp65VW)LAL)BZf%R&nPtv*qDj)~B(aa=mi7r0Zql;}4AFxIOoxW_qj| zaN9btpVjAm#?nw4DqO~@W1azRP-+sf7b{mXG^cl62;r#%8|D|-U_-puslCqd#Zd?a z;X+S9##Xw3ILr^sSy^i_FuOyFTmf7P!3@A5Q+dRRV$?!NLv9B0v8m{xaMX5jKa&_A z0tN*NO(5hTBi#^mD*d=ZMf3O1=A&|c!BO^TV;R#i5RM#XQc6lXs%dUub+-RVJ~?oq zEpVILmZ+YEu{z4QwOSy%ydS=>&(}D=!ujmhpC9J_eQ^kE#X=gF>Z#cJN*y{2HB)+k z8M$L7yK%m-eyE$Da-p>e5)9W(UJ{IW}%h^&ej%TZ7ZtJ6T&h96o(RmF>;_6#JacMu&Dxoz8_Wcm8rg8bE+aA2A+O zV+c`WCdRu-j}yEP8q{kDlPv<%)^(ogKvGXMCXbEL*)-%%YhcllQ%<`4dbMmGv%lB+ zAdl&0vpH|?CI!oV2Xou- zc;anqk?BT1lop4Sc3b4$iX4ja#Nz)FraBC8xRA*jGhB?f5{gpdSK5yYHW6JugU zf{;)okR?{I*?b@uNm25M@pAxy@v4B2ClvHpkOLGg0($a7876=cp8_LXTOKK7;~Z-K z(2h%7|Km|-0-Moj)p(B7v*k|!DJ<2R4q6u-BWLV_X5oqEiii#LwgxSYtVu`?d zCk||xv*g5`B_(QTRJe&33dlBC+A24MKzb4;${4@FB$l+QDs|fQAyi3glaz?XfH?Nl z=HeZeCQ(HdW>Xr(#aJIdUKECih$#$B2c{S}PmEit!-A+lVk?uS439@J*uJ>4SmCD6 zcqCCc0t$u+Nvq0mE)ZYAL@qrQX+bi8smcVgX-X648LV=edUw*19jcgHTMcPGVPJOy z1p#rbY7zn@iG<-+YJ!s03;p#ZrLrfw=u)LU+H1-1$Rv-l*Al+AV4M?L$)n%HFaxDL zx$xMi%%ILeA|;Sxa-V-~j9$v3U~Y?oEC2wS`izPI 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 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 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# zE@3znU<(bdidi;~yH&nXEkFVFGe-hw=wyt%70m!x22lDN;4R#PjpKQHgls?opL4X# zdENk6_GkpZ1IVv`2!JoL0f1qUi?9np37Dm>X7ah;yz-v@{1*#i<5a#|fH0#70$f|=@n^Pay_|}Tuja++aG)WWak0^Ji73x z@Nkp1TBkic9BJpfZFCiY)(QoHIqNH+VWBy;K2J5A1qc=*St3@gY1~4L8f10iEJd?i zyn0m2Fsww;fMqqNRc_-B*cx%I!OKb?<~$iXuTvGgb>+CqK#N9DLt7@ z=dXU5=g9da3NDw96wrMy@?H`ji+_Xh5ER#S9AU zQ)H0Vh%)2KRhl&4lqyE&k*Y(!y@(cxwpfN9I%DP;R%%p*2@n8TCLk1;!V{>_VhB<1 zdq^2eNs}{v4L~j#CpUThiR={tnYF+4007?uGXDj1>;u3l0QmKsGa+IJ444)ttXxSmMe(4eY}m(+G@>canj@b3>B2D;*UmFuC=4k;Y=Y zSY!l*q0Sb=XdwfIcqDlYPA1DwGM-c);DL|QzGUN663ifI--9F+MFjzZ_E80fAyI=- zl+y$hf|QhjAxJ=V0~z9mdOT81jIru0I&-7mO*8!B{M_-s_XO1q!P_`mjlOO=4lR~-Jml)yi-z}7dGEk5|; z@K}Wr|Bse@9%BXnW3!UktrGZ)0v^WtNien(OzSMhuE7a+U5-bf2Ct&BLG4FnM5UEt zgBC^jTU$J_y$77wrJCKu5l}${8AhQ(@lM9*1UB#9FY;Xof6o#(E3}vo9I$5uLm3KA z!uS}=r~@_{T~pg@goxAlxU zq$!16borkXgH*X>78zI;r_rGS?;8Vt!}n^P6q~qxo=&;^Ki+qP?z!2gnLU}r0Z=td zo!vXB;f*%~JH{;AqgqE3*%IqsK9oJnRFCn5(2SHRB)uZTjPbhAHZQ}NAt@2q?9x6F zEURi5i`uPc&tr-mrNzumUnx&$NJn=o3(m! zv`i!l7IHkQ8CDIm7$x}RNk%LyPmOslj#>6HC!q4b2_WtYGMkU_+V(0P(;35aJwXq7 za`}nS)5ehU%S-JEI@=Kqsd|=ikIPAuWo31P8{W!T!9bc74GYYiQ@Ql;6#+B`FCD50H**lMdxvp>X>~qi>3Xs{h+~1~)~`x%As*Oy zLdxr+=}ji3Y-WxJboDyq$vTp(2$aKV7n;fHdnYktpSUmrPPeYYDC3a4qib3fwYixT zB}X@Ns!%*p6=Mw>$;`G@R(i=@m)YVw&`?|oy6I!_5ft@b^#V*kd`6~| z5W^f~|65G@Tiap8WDRPTNad8HMN1VAS>FBG0T8hF7t}fXo1`H}s-28q7=6L0R6xwX z!>nk%Ce7zTq3>->BOt630M>}qk)B^(g))U~vgkiDF49BY+ya#<*wM^}o*L2^(O+HD zjMloVQTSp4Xk>zSQWB;hNG$QNc;WKejTPC<811nyRGy}bcY4Wf58X{qV#HaSE_2%c zYQwwrj|&OvBytE?A=%uD|Aa#{Y~2+Kn)RgSum%lEjIpo|3NlrwN%t;&aZUrTSiG8S zvf{Kuz=7mU$01`66R2dOvJBFNC3Pv)B`1fKNwKbd$(DyQrw6(6De^0PaUL;DOxmBT@f3PdvTyz~2IOkjE?s(AG%?UclmpCNP{}}$`j9owFzZ!*~6qWlaliLzjg!+D%bq*oqM4t zcmWH~Kv~=xZlp%Yw$^bY)B59+ywWHf?(B$HRga&(?o@^zM^;jcQ5rzs?VH>28sT)z z<4PD9(YaWvuiS9{w+giyQST*;FSP82Iu(%^C9yPty13p-r7I&T)WLC(Jq`Y_{sg!D zL-Qs5w{&Ar)+Ee0T67KWOeGl&Pk#Bi&mzs$Wqav|{+b)*Ts`{5=I$1HILIZmMlGkY z7Z*6MnR2WHcj}#*BV4Ys{;!!Tx?`&6;#S}H1$;OW4Fb&Bd zFGxwHi%m#csp}4691Kn>i8_Gd#4viGniCZZ{BSzPAf(%!SJwhg3F*r^dm%E;^n1-E zDeQ73G(MAV?2tdw>EdOojx`9DlU z%^;67TwSn2w|8sawFU%$br%F$&-FI-!ZuFxGqHEG z8Lp=k7LdRQhs&oZ^sUOda?Dl{l)J8#TmkKe593$yq6ND7lU~maTfNl=WBL5>?xR(Q zs=(f>bHM9GH$e_25ULo0t}a~L^Bzo*)Lz% z>hKrvwz?ND!m=4rDm0B-5XR#Lms(PdHo3h1`}g{3#cAszn%c$H9&AsxM+Znc2a-HG zJV#V)@q+fI^%1H0duZ?O3VOj-Q63l#Wrxtw#S8p-e(Zq$tU{nf4hC>h@|6wAsK0G+ zDG=?~w=zJP*K4X@s@8+abXo-H#en8m9pyqv%#-*nMF>GFi2c&jk#+q*X9a*7mUNsj z1LURk9T{JabuIx=!~S}}JbcK+`Bpm$!pfqf3Jb*+NmP&L7p`4!#3R z+5yzj2%v_#4&d5qcn+Y3QKmib$De}P*Jj&iGDiW_@M2~fapiRTK~$W-H15E=Ksg8s zU^z7G0s^-#cdiFFskWwO9X>U+1z)3W@%b9JPK9HvaqsBRN<@{^Vyj820q!rx*!Nyj z>(ZMqu_^>U2ScT1WAM08^~)Ewr6#>5w%V6BLsfnxIVo}=1cxU_#xJIAw4hn!Ejnfs zRcuspT5K0n{)l-h};116u#3^_V;sEmXC1eR05LK&sQmM#>wT z@;vYiUBKuFANRYAzn?5poDj_65J@dp#NtU zX@J9Y=p=R?1yF}k0CfNis9^*|-hogMRpi7%JeyraAPbOHfCA`u48Z>mP&0?gR5EQJ zzaVd4LL4oQ${x~yKUJFmn|+V_z4+4U^T+IoP3(VC2%_> zIjUAVj%rc52bcq6xS)lSt?UvJI7CkD*~vA|Lf^G`L`i&N+5)LR^@l%efh1i}9EZU9 zt^tjXoi~@@L|R1zb+b^(Uq~?Q3#&3uw17%ViASQ@(X4@_igW{?!D6x{7wgfb{6lmm zo%xRdy8SF$6Y1`b&_!6Wta*4{RizRI8WGOrF{cS!Jhw}tj8VI_4ZLKhvjPk0(tHFB z!L_GQ*hII?5{8Cdt}b*yYj($+G17Jx`uAE^1nypPpvar5CZA8>kRd#-xu59O476rKEU998ULpa>+Z3(r@f5j_NcuT^%N)0GvHh9-t_D3ugbBbk8_ms>-J6ob1+p2Y{x;5_K>!Fb$2#^W`WsJq+KLKdS>uhJ9}T) z#gCt!`UM-%=2lRY+YFuc_4zpSXu%I{KqdO?96zSOiM0$zLx$pJ?@P=&hC?tP6vSJC z0i&f~&<&2lD>5e4^ZyS%N>0CVuqdkC#AJ1-?2*=QMt`%^wrdwyfOM&#pNi+kamOWP zx-rQyqNGA9IUUE12U3^x4OJVNTcMQ@OsU||iE6p51Fv-A+voTkyH*PKxqahAvU^N)s?YD={xp9hJGOf9 z;;u+l`j+tOYO;<-k5Q>)n{aa-`1b06=g&6+B$F~_?$zv-po(g`dv6hn6D+sL)li*^ z-Itp3u0Q($3*tCVPWXu86WW{GK~*nl%JRwC>(SX>akwPU;UUkm+Myf9aTdfeO`V2Lsff+JhnJ*Sv<4@n2mDh;q-b^dXS&= z@gb%<=nKq!Y4RsA(uid;DrF37}p$GkXHE_V{ zv5=dhO$>ji;be6d9%TKtUpfLg0*JsVX0Ahs*S#~C6@L`@)%%bJIed!Vl~ULoApiYF zieA~$RUIV?6*)V{2)}&GN%NOFL~tt5%k?28%wY>ekYfN7?sN4sVh$C(F}aN)ef4@af~YJ70uob%JaNgbts zxlGuq1s&&A_OrYZoy2HIia)Ttx8&ZNx2dNdJY2J-xXRH;GA0A0laRm2#l(RZ+RItg zaGcztaUdsFMAsz-SDP`RR?u$?@(G6K=DqBSOfVp%v8gP{9H0-U9#Jt6wV5gEsuEgFuXbaA&Bsuu1+ysmA)_=I!O;G`1Um!85t(` z@U#s~jyEa@Ya(cRLRQwcnB9}q9u0J|YvFdYRlU`FO;~Wtr0qKhyZCx@(Dvkpq^Qn< zhcICQ?$iEegSpW>#X^KzIb^6NB>oRvgAvC}ti~TPM6I$ArPNFOs=mLF`A4CXoU`2O zNBW$c!-kK%4QUvAkif)H!imui1w^7lE|K#Y1L#1nZ`A`Vw0^@_n;g3V%Tlp7#HZzm zTyg(pcHDxuwV0140lc@D+Peka-19C=N{z4fST}^-R|ws?_rkZ2nK$Cp6J7 zz>Bt5(eD@bz}+fte2+*EKIDj#MGE;3u&)rbIt`*^u|jwo^bk?abN%y8`g<>1Dz)a{@-L$=xCaN@Hhp$hOPTmA0Wu)0*iW+{H9O|!uhFbXr{xF&P|p+{`@}6v<}PkRabi<837k##FCwc6f`d}=T zMA<3Om_SS+4{K`Q{PJ3;AFunv6P{w^d1XpaP~Zw4z<;t=S-k6T5$cf_FpPl8pyPHS zN1{_hT8a7R^`@L$-|U+`xgg-G{)FDBpE+k)+@0*)q;`uPUa}XAILU+zr!uf+abJIR z`mm+hUJ%RSl4Dxr4~Jh*pYfeTZOz}&NhA7qQ?0qe6(5)Cb9B%{$(U)~1j}czKF4vU zUHfeXj9V5|c{g-Ra4K03mG_V~d^=N-b?LLioaQ2K?)pezk9#hbTXDBk`&I*ssp&;u$>$uGCL zLEBMu?KR~}k3vA{4Yp<6K9#LM-a*P5Qn2OumK*cm=WtZ#7joOWGaT^KOp)NVdQUkk zby)ETIUA0toTA-t2uYcJQ8xA~v|X+J-H_k;0}_MtNdKQ%Z?_-!Y3jEA_P-Wn)W2`^ zZ>DU>Pm|=^hF+Yl=-*pMey*9aoca(UDM9fDlCG>b_WG@NXdD4Bh?6qlZ_P!fA;t1NA0%{9-B6{wYF^m zkvp$xyj?9XJ`gzvQoJ93qIsjSJjB2tOpM8OwIfnOJP$^rlT&zPUku-WU>{5bV#j=& z&o+Z-=ixS(i=$(1AgapI(FN8PgU*SDVkDE1&}Ab*Ilu>zi0zDy?!<<5tsQrPIp5PT zg?Riz3}z9rqJ7wqqNQO`2xhVV;);R$PIxe!J=w?eM58&L#$F$GaIg<&kCEezM)SP; zrr?|$w7c7fdl}9yiT5A;a&!HD|Gv=0CG)|1C_s^c~KB zzUlt{bm#`R-Vk}sE0@8R>GpF;;qIP0(h8^i%nQgWXPO62MhtGJOLC8cz+RSt%MVy0 z$YZm}-0}YhUC5y=AbR!aNFU>HoS`_xp5^K`g=Gj+lv9fE8l$lq#Z}Z|`nRH%h>8LF z8L8(%rvRz(hNZbh*?;Qkjxw?BP>xZr4*9Cu2^u-EGcW#A&zs*LyH|EU+;YYhQ$!>z z!eFu}g&K^ROCxZEBu(biuAx`% zM^v^NFAur5m(;^c4dBuPOHzi1Q-H6=wJx>XmpAy|kt!nrNpmi+-Ywa|}7sEGAOeS)6?dSIf!Ps5K1fmleEiD!a_aX>!flQ_v|t#n6xtnD9fa9*D$n$8|Vs9rVdXakUDUSYn<}s zhT`#AOXaS*iU(sVo49ayUATdBT;s~YUVFKdTDh}49!RBh;30r{2J>r$q4-M2vv@*# zDB}}WqF3>$C3*453q8smPBQgY>d8jprRCBFuw9lPk=JXTD+j1G;OCjOeVIR zdea-9#%<}Km2)?~E0=EUP<9QjrcZP4K-38$J)Z@>ag7rfiiUzK8y>nR-5^5dN78~^ zW4m?*mUCCehb&n)V(#7o^H;r&7BPCx6Ow;VYw`f_={0Ei4-aP_l);plN#fd}z9 zLZycej-&@@5UDH!m5~0y?}mcQ?K_=WrJfB7BCD_%g(F2GVlq=uv^u#qV zqqB6j0{rphGETwnN7IJd6)`zI z%MUY#y%onhY~Z9K&r6`OvQi?LK$=x}S;7UbqXgp83woBbGZTb)hTirpJgrkw`y)-eF-g$Ggj^L*c@T zlbIP-l4Wn-x}=e&k}vPDgyx-XxGw>CbI#)&g|G2fxZ{HVVkrLn?q|kORzU!3V`|u} zz`w)H0=o0Uj)&$2iy8#q@HdlG!XeP8U2+TjOs0yLdV zSrASKSz!;992RmhO>1eG<7*@9VuVrU`}muXW*Ehtg+76s@jt=<{V~Zp+Zi(}=B{~vMXr=pu;#DHb>FUzaJ~2Wl3#_j?um%lAD7bJd3Gk`+Ps{%^L_qX z()Hc*E56tzEJbBjZnaiN?W}z@R(IOMM5e2KI;QE(Z%L>1>R#VldRy=5;hyTFJ>3uc zWq<6Sd*9}6(eBxOduSW?k$q-4F2B5Q?Kk_&Zl292>cpNUXZcxs+D_-$bq3DtiQ^9+ zdhDs^Ud$KdP=JnVmJ;I#78RFxNB6zeF1pPL>kS*{Mnz3SO9zkTskG2C7h3P0q+*AQ ztDAQcKS^mRYb{>B%aok&Fd36IIVVr>Nu*IKq*HB~O-TnB{hIozuT|3GTI!@m7K73k z>1${$y>;DQ+RLAn1snLF7#xj4a` z0x6&t0xW?G07$<%AB(?wj^v3oyIl_^mYGgKcS7r(dIDC--wl^=nw=U_ObnBkn3WC|=j3E|KUIxZR+M%@JNXvZUMB-Le_x96I?O_qc+@_Lv6E<}7F{_} zFgEJj2*l%odj(NBP3J2kZImB+8s)IZn~XQeKW*EUxA84)rt+ zn~U3xXrLb9fAHNDl=p+6Kw?DX=V=5i+vUz;ex1%mmC6Z||}anIF_p>;X92YlBS zC6a#J_`ZTpBzKb52b|d_lNAza{KRAuS*n}||49Ghp#O>fsFN44dgZFXa3YnGk+X4h zTbgpAUD`EnnAr>-R`wLfOb(05jINCf5*D)UE<*Cch#sU=59PCzi2t9^ToM~rPcjt)dns)Rp`54kgRrh zbI@uJMR|pGN@~-onQ>nCT|18SbF?O(o!K$Ov=O=Mw5*QXjqp`$6k%v+0Pk&i|*LlP3tN2&wE6clZ6o39xDoK(|Xlhs`eHLV$TsW@l z_(41o5!}KHvMR{Szd8URNl~<-k8f_MW~*a%fVA&~lXN)Qh$Y`R5fuRlKM-*nH-XL=l*<{duofa6!vXgAX&gU0xmq+Z75@wFx^! z*K;T1BI=6+UuatOICFnB41L!WDpM7ihTMdncOhcNknmIFbhGDFaMLv>%|=m@Is&9D zD$z~5esutH7*T@heUSqav+$EFDBX%#@#KaHyLGo7p47v_S7t??rM5EQ&1%pgqAsKD zI!^)Hu3T(gjyUS4xD9OakD=K%D{rU{UoPw=H_pBQ7K0W2;+T#k)v09+GHC!#q+CA? zdW&Vps9Bz^!?j;9=%@YW|BMD2JUt}&dBG>K;UlqPufEK@&-+;VI4-1o&% z9JRt_mKebP`u8fq@48d_{c%Eaa@vG#IqR%bQ;&`woj}_Nk+*q`J zz{}R~Vi4GRN|1l<#4Dn^ho1ky5VGWfow8)z4*1sE!XA7amHno0)bjC~Lu+Go%o_{G zuZIRa@}f3jU~F=}*NX zO@=M%$hw^BipUFBTUR9N3mb2ac5ppNg2ZxdqNI$3B+^ULEca!G{j4#iEcREu@@h0A z(ojAId{#>A@mEw#I2a&HdKx+`4%g&rp|q3MH)&&7-dob3H%VSDyZO8>byV0!XQ!sR zEe?nMtRsmZYQO8%dR5vV>u`yg4W0RiH^=^HT8zU~*K!g1E}4UNR9I|W&vX9sf2l?J zz}WLS(V2~@M)w7;|HI+(8Z6m%j+x3`LP#`*ZAy?Cf;gwDPCYy1$Q)lEZhBfrXXvV| z(9IgONBK)tA{0s042Ozz_m_UxZ;lun{ngcJe_XF@PLOh$gdLK{qX`8`*1nR>!B~H; z?#s{oe>d51Z1`?|JD%y6H<*jwAuB<|5L=BN-+)}-s7EB*)2JTH%3uN{9RajS|-;E!j8?6 zI09qKC{|oZ6QIeQX#?Ny6uBT<5y`tL5&?0u)9$r;&SRP4`htg+eyzWk!DdIpMa`Y4 zIg+S`k*qCkS2&Z%2L#Rd4QQoz!>MWH_B#$;r!Ji5Si0_&-E=-8s01zXjR6N4T16<`9WXwXMxZ{EbX-L2 zNd!CZdsL9{aQicSO!vtgan(&-|7ye?H&&D#+AnA7?a*pv2JmzIMg67t_I#+b06<)iA6e%KF7H9mb0D##Xg7!tiNQ9ptZV(ivc&E znxdVgX%gPUUaIPDs1-ajWE62e#`-k*p??Qn8E&Ta!DQk;xwA5`zoAtdRgIo2+^AQ+ z5khdBO{}z+j{hq!9H?pltPd!7k&DXB(=j`EgM+!75Pk zZ-i3u#6pywy7L@2VTbNImfX53DZ1tJy6%r8Wo#zPhh)N2mb5rW%6&GS!DOo42OOl5_`u)yb}9NR`rY4-Sc`4n3jN_`)7h_ASMc~; z4(HjDaQG9S{9F`n)Msdtr4{ZN8---8VzFOFsS8?%^mKWg=M82l1RG{^KtSVrFZscr zuP$vr|K5Vbt3m8+U5cNvzvQ>MpVE8TceCFFZ{LN0*YYC%6=JXYs{;YkT(n@@dRwKL zOUAbJl*G$=(qH(l=SSJrj$xR#Z6C04DiQ>$y*x`3VJ6Dbg31wr=elo96|&;;P~JiF zJMNpM@ScG()?TKo#v(4mB1+o(=VC>=QZh}J7*m$_YH;IDx7Ggq{GUn@yAr^f-Cww} z=-7W-0pDcPTMIY3#UX>sdG9_f>fyg`_+22d<7HToOpS z=~i}Gk5yn;P_}da=u+dj25gg@3&-2{$NS8HiEbn<6=}K z7l%0Us&h{%pxu4#t^3Ec=T55Hyt*eCTGQU>5m!0mr|mEJ_%=;9cG{WsdTcXe|HBr9 z-R@(gWX2Qi%96xjpooCeoekx1g4Otu9w8UQc!DH5?yX3@GK@HXd!oN;K=!(<`ZVU$ZT z?`hn~%VAbeWgIbi%{Hq+wbC$)!}u(Mvk>Kcz&TkyUaU@8T!!QEAQiWQe)(4!d8QSv-Fx30)INpfY6A=oHMD05GY7h^SYbvCGWN z&dJKI?@rIE+iI1)arRwn>`&ua8I(LP8jmm(Q-`^Xpvi$|hBb zsehCL{G#EKO~JfqVoY8Z5MaYkQmDFP?saSM5f&uINGjHqLo!IwcErW03OGdL8l^N4 z#FEj?Nj)Tt#tL)c2+~uf9L16wO?|i!6J-*tv}OnNAc9CxE%Z>`!@)RMAADrT3-yqq z8FnxR&nyx%x@s%3qH4DP6NBBWi7Z_DSMm7J55#}*U(VljmII@hQHPf`U~OSQeF4Wv zHdq>r7v@#Viy}!0ld`8nXeg?`s2i|>>BEO#&;B#B&0dbg1EW^YY%DG*imU_fD2hc< z;X%QQmo$SHM-WCDVwNUmbb*t&Mjc*Nz`7@P+?^xEEbq@8^d2)eQct|#P^s3_rN7I& z=y4Is*;cvKJ1m#}d#{{UY}}>wR1hrF2M!RJP$u_0>kHcL$*&`zjFd{$ca(vdaT@j- zF%aJfJ!U?4o-)tHsliB!W)PYrB|n8d(Tt)oUSWi+>}^JnUhB_zyafE?y=P|1to*D~ zr59eoVtv!BR>SbHQU?i24UCC%%e5DVDa&M8nVV5*xqsWK82Q0{+V78sM|B}dOEJy# zxvcxN?JV^$E4ED%Sowy)C!x}C=lVS2sMf*w^67ny~#O7)FlZfj=JHwEd9=a*HEplZPxXq zF|ho!P;^9!vMl*UU64ZVY;ke2SkWanP)pGOmNrd^-pLLaP9XC_-s@m8BJSsYZdq& z2hWsrRg%qqZA3G6DtIZDp&M-4b`0w-!w9~}Pee$IR<>(jDY#NP+nw>msYgncmY*zd zRne;WF0c$ZrnXmYvMF}PDvy<;9HWH%^S0a0vQDY(4swfTDio#h{$FuO492;jxCI*X zU(HOyeLOCc6K6DrK7u^`x3VfRUJc#TMtV1*9;QTYvIvy#Zx2-&TTDW}*>&>nKX5i= z>8;ID^W5(J|AC|TkASLY@uR#j;yPJ;qunOvXaDQ43es6vs8`o!Waj*y3O*en@~}$~ zXd2j6*EJ0QqO8hH#iIo4vWj(t%4etNe}_jEGmOR&gOXjRxuLi6#pMXT^treM`|ICp zNP@hn-D-KIqRwI#%Q$LxlFTyBbOs~qc2@WEd7KW*V-EMEk!yZOvovLx5>g9lCnD4+ zD^=X8hg4Kn2zH`XNnjb8tp8S#7poH*jS|yEuCQ5G|8;BjNPhGIZ!ErzHqtYM*Sy#5 zUXwHf>2=oYQTimG-pQj6>7%!D4qTT%^Ki5B=LrZGU1!=!L8asSEnLs!1wIzgxOVGA znEponujQS7FBo|Eg^A`J{w*H`Y(%D8O%z2}N2BZyUyQ}_Ap zaM(PEtnU6K>+Xw2_r$7l)*bks!p?_p4ZA|^$<28Ru9xG}n>bF<2t(778%^)as)?;( zT46E2Jb_IfhS|e_Z|o@*Yn2BvX&CFLS7)azCY@uZ(Pn1K#w*HUc`?CAl$D7>S1^0{ zi%i~B;M$h0+m4rfTv8^}t(vaO@{XTW>T2=;=(biQ+leEVNX+B*TDtI^qrvi+&4}6L zC~{9wyxA-2G7Bi&zBCHAm0jD`nN2uav#y|RjdZEUxas+-+8H&L=WChLO)*QC3BlM0 zuP$I+5LB@0v#yFY&iOFJI}2lu!W*d@X4Dr>eiZYo{aE_`d_3T6>HjJ+$j~x~sr9UW zXle(jgLz7{?IN#v@w5f}pd3PjTk!O8msc7fo8273an`NrE5%)OzwYki24TDQb~6Zi zckEeCH7Udqak#|b_Z!q4XL57+p;mHqSzT8!(%lnC2ncZd0h(0-FR-|@V-kqR5f)>2+Ff7X!IO`zC>?ad51z^jwq+ zJKa=xe#S1xlCVbO*ALC|qj@~hQuA4_Xdn`Pq zcb8Z8PcB+tJ)>aY!tnzE?*v)E7)_u(VIAfWN*irdc_raH#QG-;kA6R?(LerkqpP-) z@bvA55q$>H;v}H=5V~u;=xywbyMoP{po;gh4Wp9xJVB`DLFPtPEtM*Io<+almx8KZ zAm*K@Z&xTOU%x~zFbu|~NE1{+@b56xD#ZPGT8%n&;2&JIR&O@`Yj;RzP&7w}sTFMx zx!n(PjI0;6z>kQ1x#AXOc&iB#QWxx%w7?@c&^TxD5NRk5gFcOnXw zF0&QMbxPhYue9c4BsE=LbbQ#6Sb}BSmy4H+BDYOvk=Hc68PO`p%cT#XA_i?pdn|}V z4ubJRzC!rlnuRnx}70?Vt0>EM`#uKd>=O?bYVC)M_{tSkbo zEVUOF#_G?UVRHHmUQp;+!d{^?6JU5jRFoIOxEt0w)U=*1$DT7nN5E`x0#SdGQ$rP5 zT`#IeNErK7|0#E7tus++ZomB>aH!>xGhXM-1GFpdR=ZvZ7btH?21MEE9;NJ;pP+PH zUnpZ&Q;wWG@=OD@4RfJ*qIe)|@3tygN5~|#cC>$zk}SmDK&!42M1=Hzx@A>=1i{L2 zE8G74pVs;2W}{xKZeOc6s)bzsrb4k?YwTf%(4Ov35E2WY<#fsC?6>k3b98Je?Ue_* z{HJa~{6E;g{+0CEBYM}8nlX=Y5-%!xr_mP3Zm88y=5l5?I)eio;3dhv>?zyQB%anl zvKdU3vaefqNpl&dSw8kDl@cdu!aOf3n)ZCq!qZYD9$4+dI7X!xbmXymI+7pHgLG?dN6P_JXr@nMPF8DzWAoKYa6<&^K;n-Lu1rQ>3Mc zJR<`q$d(u8Rnv2YrpiMvnCICKp{bLcqOE&+w@Ig*yw1@-`%71PO;6($b+M#-#;a%s zb}K79_h3r7%QS(Bu4SYT07`Fx9d$53FB41$eWpD=>fO5cliDdQMKn1ei!V59fCN5! z@_AwAtl0lO-vt0%ac0g|0D$}MiU0e5D^nXaUSf$La4r`i;5Eo=_{NHC?XfviJLz6m zUzS(ctI$^C4pCWSK#sjmVxwjS##Bnsh>J|8U9(0jG#OxU4(SF|hs&U~MulPM1{Z9~ zkZyD2tFbi~s3N+^hby#i?GqR$gNdqux{=VqBx686NwZo&sQ|FWF<1!_`fr3>ku2(9 zI}b)3tFp)npp)@ou-n)_oTG+#$>t<1Gw21YRY`9z5w4sxo59PkRbv!}0Y*;uCex)Y z9Kq^9=wf}*Q0tZYLEE1`T@aRYsFjq{7_#qiHpzReOj5W{zqLnKC?wroQ%_ZCP=d93 z!v-6r6KO}rXy~G(KfQU>Gs8DPC1AepyX!|^x0VelJOJ1Uokr~fA+EDaT;!IWu{I8N zh29YD8ml8dJ;bY1c@6>sx-Ls0XOmYgIZAk!-Nnj0u^YI8?H&dPZ0$Y*u`xST*%4ZH z7J=kUhkhP(^Jp!glP_1Ea&QsCgu{W8a-b$+Ey)2;ju;Tol5Q}Gt|J9Xs`L+1Rg@&J z59*Xrioy++)3P8*=o!wH@0MI42bNM#i*00Hot~?RnkGb9xiX=Z!Fh4JG(nVtV(R+* z6^dlji8REP9D_|rh>OPfo9$vSFi#QB$u%sej+Ev*Wx<2ae;|V!qoq|B1REw=pi1T` zmPup-p(H;LR4b{dnw!oNaM3X(l3*AkfBf{3dN){-2jagRdaW*bRpaz z&!$8ZDbiviH+fHq`VUg=^$R+mPkXu=0#YE9AZWotU|@yHt@{W#cmzZwu{rx+8Vef- z4__joBqCxmatg^(&6Tc2_pbyp`cvb~toEDeBWANZoF(ORxjkMV3Jo;D35&xMn&M6( zQ>ZjLgPAGD=5Tp@LEqpau|%5PG^|{qRH-#uo!->UU~bVMVU?@z5P?LY`yU_%>*mK3 zh$M2q38*wWgUMoZxIDf<*i)xsiBu+6)I+M&K-2SPc2OA90=y-|p*WHNGHO*reWMBUm*Z#z zy7DXz2Q|&!2n-Uc^qXRushiP;Khnk{80-ehED5Q=U&(Mo^I7i4H&hG~V0@WnWy6n( z31bKaNkHO*Us)MOMnvmZvOpedpefs2j7;3CMwkNe=^7cbuTjSzX)-_a=B zjC(2(MA8rZ-HWCl1TL9d)qN*?Uhfajkz)DkOz&c1I*el7+7tua`CgVaHROiA8NHRt z50Yy4yLMt37QN^(CtEEZC}(Po!Br<9n@*k2qp37 zR!&)`z^6i6haLXyyMGYueSRJ1kLIPEWuZbC4toy*4;r$%-lgHL5ISw0D$YcWNSIRe zmI|+0KImvlN73=~-JY`kezQmtkLR=B-Je;GkYv{Ehu?NzlHFXV$}3%H=n53w2#lef-fOzeZe%^1DgYX>?wURPWn^c^>P5Vd1HR1+wNbArLF}gIY>Cs%~zV|&G zO}^>RbpJ1q14Qhazh4m>JNvjbNw=kw&mBe^zsmF2O(21QaI(D!DG*2$M{8>reCCda zQ2%4aJ>y&UDpWCR{-Vj$fOVEs-V=2gY=i9`V1K`s+W*41DdE)xeRrqAygK#oAMgZe zFQtSxd<8%U=s=M$d&Mm$d?{{`Tx3BJJ5`}-Wp#!2g&>zH^}V!Xox9vFrJW}lp)|lk zKp42MvaC}|cj+h{pjIyF(2bA;u!Pn^AdR^t-X&nQQ!r@Mtn@wh-dC+i?Y6V2Ok|7+ z!LmBXef8a)1OfI5Bmf}CJ@Z9?)AR{+4p3&-ky$`lkY6kS3cSmRF%U=ycd(Rgcgy>R z{TuT+)3f{m7*M+^48Q?xZCpl41?*ebJtylBp?*usG28|LE1PWo&SGmdg*{5~ijj~Vo8Tl_ZgQ*^gsSlb)*#mMEtS+E zo|eUij%~`o4=SLq>X6!@~s4+woGdd#Aq!oLs(o4-68;8YBdTN z{%0*K>fpmaFqfqI6@|dK<6u+u<_AKtVLL{zvXRonTew($Fs zi#p1~G5xk;uwXK1>T~fiWSZ|dgTr(?k~y1E3##Utwa1SoSPN2uf;0HZmK7=tEhl6U zHJam)HCE#R)BF6#3FCKFaqN_R| zTT64)xY-}5w@>G?KyM4AKG^#FPN&U%l;j}bU`_8bM!^tLhqC!{Le3YuDQx%RnoyfK zI%&rbAHHn4W=)rJM8(rjxS3`HKZy1Fa@VmT<47r}s&&?-$DJ{u`rjMuU}IK{Ff$kl z?&zcmueTM)HS>#!HDXNxOr0za#z&Lha(E$wyT}E=+X3-hlfQ;Dy3mx(6soLo{xQkv)Hw_xb!eM+=aV?Jx_c9iS;O$~^n0e4v%r|j5F}@DA z^GGVCxU*6#T9OOv$*|WP7QC3;CMPXk-Zr+_AG7+6vKGywhQ@`632;^fvN0BVYI5ckP-~G zpE@??y*<#{2r$N}r-w^`_;j`-l}c^boKsWk4sck_-UhHkn`5j~Y|8X$TUIc#vX(QZ zX;P*qoDQu3pJh01Ote|#;1MFwV?QdE+ssEzJG+mdtshkCuu;0F?NIW7J^6Bv6CtpQfU>F4bybM1K}+rjNSrL z+{Naz1$*K%WqT3~0uEo=Spu@I#NE2=5?+C%>_$>X)yDwls6}7vTE_Qm{=6j{Hu~oj zw=%1yL}`gb9%k39YfE!hMvo)ckg^vc(bL*KKc2aN{*F1BB3Y5}>+6SU5p%W&W{N^y zx}U#J#|S!K+wLUv;ZXS3S1fhQ+kN~0L^Lti3l2XHrg2ZO4x5C-D7CDkkAOn8 z9J|NqP=bUQ$Eeda75aeG6V;*lN7KHrJ^#eTPJWif+z{aS&tLUaC#OAU3ol_E&5jX{ za^0NRKIKYXud=1SrE$rf)IF zv7Srn{SOALF+>gFA1SXy;w~I{z`3i_xjtjg;H(L<-8kHW@YITq40$r3dt#{wy*^4! z_lP{aVD~z7YS2ud!3*7Em9fiK1(=<@_$AE@d3xAlEhfP^^xK>Duydjw-W4cfK@9y9 zn&(6Fv~TiQ2>Vf>N60_C*FRmOzw^Ag5wYtP)5f$jUqQ`6P&4v1Q_QmON@)bmRdC*+ z+1n6>*Wgb1VN?0R(_XtVAl*(fmE9UmnRnz?MqyuRXUwV{D!nXOEw@^a$RNm1U-KA>SVcV6QR#@b82A|7M|>kF>5S?uwa9t4^44jhW+Y>S4*0 zt9;CMq{1#lmsnk}o(cPA_4nf^@wP!#wl1s7{_B@R-|QpQTrQmNR0%wTpNZ(^Xukf$ zzfpPf;KvmHvdR!)BL98k==UW<_@Q@~hHHG{>S6E@R~tN5S}p1Z$(6%<3HOr(piCq1d#CzV^Ly<#dx2_h7owaqTH%m82>?keKz6G6_pRkJx9p%{s+;|n( z8X4Id7~H0-x7}R^C%8>HFg5c*S0=d6vfq}~@H`9XU2lE@k`wjv;AL8HaNKoeS(_PK ze)_bm?6#d{8uV9+bF*|?mJF$=ZH=(2X;^cw*7UZv0x%NSiR#`@u$=zqw z{9tSM5erHmz8u(=I&wP0xfJwQo>-M1uza2|yk=BgvY@VZCL$=X;O-~1bepA`hhwr` z7|O}D*47gp??yVoxcbRJ`5Jf3iLs4PI6t)*c~Xu9kFT#h%SZg*_J)na1LY+>E{s7fyn`>ZC*Rdc!-^9vVvRG6@o>bwN0FhgbEA8?BYBY_8 zQz$)^D}w0WitI|VKu}4}j-$sHa;F7s%7qiwkZCm!A1E+mW94qmspvLKi`MpbMKf4q zj036n9j_TK**pwrJ$CA+90eWqPO}5i)s>)m6Rze&hvpzUQkh*v5eh9Gsdt0%EQLMo zSC1jZo{f@WnYu=*w84xG4u6)lg zWhR76k~O9=Qt5gCF`5NE3n`exOtcrBTJ!fG>DfHpj}WSxDYlhP@=@DLCt$I*SK>+* zd!Owa+bulr&bqG<+kuE#*2!ONyF|$tYk!Qt>6*KFk*&9#+;|p8-DU_l<%SIZSw-82 zikq@NmK~HBW3$00oE;Z49~m28sx7a}buVpGSH-xqNze^ckAVoO`j}!{=@1pRl@7zw zrWQoLNiF2oD1hK3DSg)lTKFX?eOfBfy(J|{>F=+g1tUr6n*?a4I4dV{#n)Fk83H2~ zLe+2QPsCUctt_Pp+FOm4*zM{5{J?ba+I1(04aiQ%VK2!3R$x)#^Hxj1ZuwGs zU_*YT@bGj#wSJ@L-+Jp0L^-}}PM!NdA07{@K0=-iu)K`eFwQeFi9e3;gxPWAwL@13 zO-_zBa(8}+^&=-6J-4dkp}&L5cQSpJ^$W|rxFHX8JQifaITP{d9^!po;@*XayK@(W zml5-1NSsLuD325@*snP#gyqOXhpu=vH4)m#-T5pwj2v(D+=5Po{thbN%l27zPPj6Z zBYvNh##gyZm9aj4O==xSMQ(@uI)RC~4HTI~Re0sw1q=3S_K48%6{jWvw2@D9Db|nd zwBy{Aj`Q@lsC*~WXZ3br;kx|TebCKM*S*Lf59M*cX7gy5g~|q18I{|%=T0oTBq$?# z#(CF_s<(2eu1-rEcNA*3-E~u)!jrRdq+c4TQ1x5oc2zG_HvB@a0y}rXgfc>uN$8t1 zs;&& zGFSduw)E>^G=_6{hF@r6d>oEtVD&24EXby|<>lCJ5d zp4xMJX}5H1Z|gnX+Xs8NHEn6E$)_+qfMWt|zxf@*7*j<#2cmC&f&PuC{@PlzXmEYy zz3VL@0;;3YMvLQ+1q3mO=uAG}WVf0*^;hrfzk-m8ymDh07agMU3>w^=2;HOmk)&Z< z$V%Co*$Z06UhEXu0sc#N^+XXmP#)lD%v zkG&BLTk`A_-HeWnNFmuA@vL0Xq{yw#d-uqDzsLVA1Fk;>qUAU?lHj*ShX-wET1`7D zaZ8kEUd(BCTrn#gRa^%3@|^`}_+1W{)mG?qVRwd6vvghG+{!p7js8?5qapwD5C0!~ zxN@YmhtP9npl%jFS6#2u9X3OK#u8S&`iL4zt(g#M6>}W00v#OEweCfE9W$TJdwC$3 zu5HfzYz2oWjsDyOJe|?`lpXYWaW`g`AE~PJu`gl2 z(p#L}p)4A$2a{sRWViy-R>DNsnEH-UzA?&#_YBUX-{)q65WKEDRD!LC0A}^0!x!{; zM#YV5sGL_%0s#gxywq5v6dXz$v6{U3+W? z1e5|==~vo`ikP-8^(Q+kqHss0?EC-e?c=TM4@9q+7k|9PP=@w?^WKHU<>mdU&uvD} z!rR-oe!Wd|>#g9Q8c#g==~hD;pJD7#cV8Skx`Jy3-pibPt0}^gL_CT$X-(lM_4#^h zzL#zc(w2%MH`RNKaKEdvN+^7DvcGr-um2I0#IUVGOh87Z-B<%fZ)p!#Bur$^Igb*X?q>gYe|4pI=0BVn>@ebklHHlru^o3m8qHTc0p(6SC8m z;HG13dKm!{s>^jlAi406HVPvzQHf1(D1%Uns-Q5_d#I7~Api3As{Zbtk?3`b-GN z{eeX+Ln78CX_2GNr>*!KcOZ^U{*(x1wHDP;NR>MAQ)$`xrP1i7&Uat<-6pRhSbgX{ zq!h5V&$82aeS0TQm#aNBm+TaO`8n7;ti~2u|5|<_v|x z*6u0vM#p{HcweV(k<+AD8t>$lS020Jpw#Vatr&kLkwu~?DYJ8yrOS*SQU?ro|Aj&3 z*kF=%dDjPkWOD}ZVB^@pXPsC2E4X78@4kn9{JC#sODM>qXa{2{Om=UB$K@I^ zMTTC1@BbXA50N*v!TQ9>D&`1Qn#hWEe&BoI!d zi-(I)F>aVty*$uAKJ>qz!J^iAmgJrXFJ93^n;}3;pSW*&zVGgW)cFS0-Rf#0{rT!PV+JJHZX2SksARJHG!F8;VJ167(j^UFn$Tb*Hp3MysyQ^D`gr zv~q?M_pu70ODaAip;`T0CZ23Z&(O+BeZl3ud2xost8SbTj z|4Aei2pLRCZpnRh>2OGE0wtyJxEG~Iq`2zE2J8z=Q*5l!;AN+TMOvuL;OP|_CHZ;|D{Alh3X}Va9 zdaWez!Z>T>iE9xxJH>=x?7~!~+T*d-p=FU@B?^a0iX?*mAp}XYxg0MC_YNr4logqi zpWf;;u;?%VFimgAniD4(J&ePsXqO)BoI}`6MC)PDO39|F^0Q!202`=2TGz+6KA_{v z3v&;XhFP6a&+?hu_=lLZ{yzCdse)Q?LXc(Yk$Wq4zo5t=?5wXl7oP-0fSZ+qM)Xtv zRj2LxzO7@mHXY$_1*z$4;;f_jxeQ2t<4!1GFVdARaxXB*AYOOKQJTn%u-I+)CktkH zOIjYpzR9D8~^mDmI;VQ{Jaf)=9EnMT9e=GgtWK$HCkD7uafTB(~Vzhok@YP3Dp4Nk{3WmFIlY&a|fwg%@> zW@-ewdVu3P5QV}xhYGo{NMfB1OKc$>j-$S2gP(`S*gORZZ3FJP*AQ?Ch$Tgw_Mwms z^J=Ve#1Z*63<|BJ5a8s0A5LTkg%haAK5cwO1Mjv5fzr*-aW#tJ0KMb2C|CM5!C_kt zk|tE-+qewnVsMm{za*R>8iedDklv68q(yJYn7if+tN~|o#v5KgqX^b;@ezV6Pzpmx#4&U$o-PC5 z=NmF!93<4p2PtF`1Qf^LIB{;4eqW#^9K^9>;wR| zPyhhIZ(B3+d?>)&yA2?$3}Jc}p1rYKpS>z9!nVO8^PGW+dWfuNW;sews0Yhr5*>rP z8f{#Mqp&cdH{QURKc{us|MPVwWQjju5hS#yf&xac0dgDGD@ty}_Ob)&GjHz_nJP6p zyVn`WDok7tbBS+UNC(HZNKeKlij#k1{5A1 z?S`qShn1;vgJl?bDE2F^jiv(-z-~NMsd86Q-YLXJdChQ;#v{W6SE(2Q!itFzL8`Q? zN~o%Q)f$J#&;ET5p;{Uf)G1f0OanKef`y3SMzu*kL!=LdJzAkzVK@|kE@ zVwg5#=u_7;ZN(2P=EC@8cUnWp*`ze_5`!RkJWI(Zi_uf*N)9O@GEuZb=;UMm{CU`_ zrb9?Ql97X>NrPxD*K+c&bJ8-n^QZ9Pfh^yP>`}L2HKb{kA=!tPa_+Rw!9g| zmb?!FFN=qX(5H9Pq=E#}oe%rCS=k}N?D!-a7BOTgJ?#0oy9GvG*WJX#;&XEU3`g?r zeZ*A-L}ke1vE+CDiy85YyC7NoACBT>91D+xijIwwi%&?*EK8KAnr@hujpKT}z6kAR zk0UN>uB*W`I>KPG*c>j8FA$2v5~)nCP}k7Z($>+{(>E|QGBz!p)fI1rp=f&XWoKEIKq-RQbJNnT1Hk*UIAsL!0YRX-PG@Hm;9q?Qq`}ok(a<>bi#d z-Ob)yCzlhd{z+$!!0EIb$4!;Yrp5LXZ6ij46d7_9C{dxtj0Gz;?9vgr0RR9100000 yL_|bHL_|bHA|fIpA|fIp#u#IaF~%5Uj4_^%FU#{hFaCWJ(ecdxjqO|l00025evX0w 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 zcmV-$Cy&^7Pew8T0RR9104Hz&5&!@I06v%i04E3l0RR9100000000000000000000 z0000SHa|#KK~gFPU_Vn-K~!WX8UTTGFG3Lr3cDn)ObdZV05GXm0X7081A#^aAO(gv z2ZkRE2OGOKCG6NsxE+9`qF0nCN(N03Dl=&edD^7|tMEY(e-)Qt*2dgc#L=%W0yrEGy9YLGb zob(8lHaK}xllYHIH-ogv-C=$)=?FwOLWpJm+l?TozP`ut<9p zhv&E1!5-_ilK(_CtRZ48F0)<2IA9+X2r$F@2i^Y zf1-Smt}9N_rC$-C^y_o%Daht6)A(6n^6Q%}lnW^-F>S~Q)WR+ z1GLkq)Vr=r>uW3Hl4;DiXIL^P!?wn3Z?C(;=fx8O%TChvH`8TJliQ0@j>ZTfM8whg zI(w@a2mm)EEIgeSzxI?{{YaWjnqG~xMRQpd(zf=QwMY|;YV-dd!UT1&FTqT$cbu0N z-^X+QEcSwkip_FPD>>r6pS=j>X(*V|)6E^8H;nGM0T5*7HS6eKMf8>^a}lr|=K|mt zOE&;Vf<31VP(lze{8)Z-t_;sS6KB693EYJoSTeHsGe?P=th_c3GP#3z$S*qe+OQW$ zlaHB7G@XyY4v5=tj1{f~2v7=11N#CcBIE-x4i;&?b%`VKGjn+Rpa+T{?!#{nv9}trn=fE1Q>PpGb{qG~P`BD3Oo_;C> zIi@D@lxCL1l9W|h>bfFrGkpuWtwFsDExucCC^VYP7Scy-T zHq<~ii_j~;#~ogQ{DCs~O6-V67&baQ8% zip!{)5SlVcxn8%q^_ls4IM^u!9M{>c4%vebJtEPe*2PN(D{@XzjpMSep(PpV?*AHkK2}7K$%k8Sd+7UCYYT9?XhaY>)ooaLnB^> zrK9`Aqjo3|vx$Y86yvV`N{+6@iX?p{2J9iQ5d0u!a!Ra7>>>EX;W_zO+s8(?JTaS8 zCcC_dg!`=5CK5-I?2$$&k^|bBu072BHSve_%_W86QL;zbqD$?us4_zG)vKvuqVacz z-i~j=MXcvrAqfDpV+QVb*x2OM=iKEHy115>oZ_2 zaqRWslu%mM3QdH7jkCm?Zm)J2de;kjOtGh0kh<62`!dT(?`c)o_S6cx^^%Gu@^W_* z;A6t{L)D!U)r^j%tIN&UiTY(QE@MvgM2K|r+vEzlOG}obcXthAyTiw~j~zH+?Ye;t!~E2{(n2l}wL=|6 zj!$Y2sVtxMb*ZzoE*vX)?F$7p!fJa)Pg~S@jnWHxb0+A`JH(sPlumZ7(P55*dv{%8 zP;?!_?%43Iv6>PscPZBanoK#JKFWVg=J>sZ5??T-q*pUON^C=&Otj?YQ#UZs*?L7s z>rY|dpZ`$r2n~m*62Ef_aih#1G--H%(|{o*vI{|}Jm ztG~utM6sG`hIoDK{F(;%Q!Sm?(*p;S;4{dYOqdnINfH~1&=NX5mXgRC-PrlRAp$y? zq)M*0O}_eB<$X1O>DY-VCnarNVOv`n(v^qb1omV*uPG-?g}t95H;&3g*<7HTJ>UV6 zVYwN1X!q3D|EC1^!e>qi@xO4n6(}aFhUGXj%ul6|MhOPV_&db0)^<&fI4dm#XxZfL zjP(b{_x@6Z?ucYm^y*{l%2b3aQMDmTG!285$3m@#JK}`VO~yb86G~GZ?3Sp4+&bH0 zVTZU*RK_m2%f`s9D+PRnNGMx-LFom&mD=XaIQ`vsy-Mm`vFXul;L}!=E9)MAFM8I_ z%?}GfxZUhNR}A(R@bmb&nzg{m!!;6vowGWB@p|r^QFKW#aB3Fw$$auIViEWbzG)18 zz=_f7GRnf(nI}!8u{dnA)fBZ3s zUp{z8tuQ1Cm%sk;n#l8!;bluh$=uy<#)+pK1$i7yA?MgNf{p?CSF#d+^;Xw%$wzfjK;7b%rVoKc{xPRyrjkGq%P9$vM& zSRX4$Uy!_vaXk7}Run&yA5)Qa0@Q6!?Y+1Ju^xRnW9_b76fBkg2L%5={r`uLtUq48 zwqQ;Dgcu*gX94eyD1CI=UP{(J8hrzZdSfHiQmIo&q^Xltw}(uutIerI(lq|5)`R#$ zh7Sb(>$}j|G)|Uhil@#zmJ!_YZ^m%?t}psfJI~9~CXbA!&!_~rt&^b+>y8e97oVhz zndKcrY9KG7(>IW_HqhydK2jF2fFLko)f5moI1E-Nz=#Hs&cU9v`Ph=3iLr*Wsg|Uo z=mTd!-nnHf|5|w~Vk^u$c*ZH)zmvyXx+fhdhl-??y!WusR@kKE4X>PIIa1%=b+VOV z<(4vD9OAdbjIGldQmmj&V==esm_#Lh#JIh1+$oZ}xK(F1wyDNbG?=phw|QOsvUSJP zjDrJdqQT>!cg4!BEAykbt$Ml2*Eg?Pu?l2>z`@xq@`V!+#|*NU{GNCw``)VGdvA+x zOMAa_MCLEFn$7(MAsit$DM~Hb;CT<=G_-ED=*E9QHH{eay-OAEXgG zk&zV)DCj8^c(q4TFkR<#+9o~{>0rEl`t}$ok(dtf!_~iif7vVrk3XZPXk9*68~acJ z)D>H+C=C&wB`gV9uUKSo4z-naEqdx*eE(lRVB4wFBP&C$+IvtMqy{rsq?sps$S)Ka zPLz7R$4mJJL80{FJWUa1A6kRbI(n`KtsFV6ifV2{I^rP2mI|GhG_+^kB(6$5g}Zw_ zamcHyh}#;=L)shK0OvKsLu$h_KKEZ!o64(LVa`$JsB%ZA#d&g1?*I6y)yPh&hWlMMVGBw|75o=xUrXdCjMXl_F`TH1_7XSLEw4F=3a+W~EwC zG)V>X=8NQRfIB!++|NDqgLsJ^1b#RC>wU>MYpphf;Ml_W=_kSFT4TWi!EaLHzUMU- z8NQlfW-V%MSx>8U7p_{wF3lbjjB@64@iiiGO@<)H9L){4tTOZQHdIt8u7F|1U%#Gi zBK{AbE$IEZY0LrK*RY*ggmWJn^X>;8L` zztSAnBsc|$A@Q(wVw+D3iMe9IsiwF;ug3f*HFK;g)tcfRVa;qr<%|% z$M%u6rg`|lxcqv*1MD~@er{{a1eO+v;mzxvUBs!}I2Cq|qr%J5=_jx%nz3`hT#8yU zfk%MGAIPY)@5vO6A2qfElMhc4PMX`8%9l4KnO!rmgkwYMZtUjsm{-eQ!M$1bs|_Cl z{;+5`4qKb3U{obKT~Dz-AXl_~fCxJ?%j)*xf4IbJRcD}-UuVw<3)hO!D?9`n;J+C> zd(~(*(`M@4l%dE}jPIfAu#@IZozAdC454QoCZ&W&C4PIeLrLt0gB;+oy(z; z+#7$T^cF98vcR6U3|uK9=WT0up;u>JG85=@6XBu;v!<#Yz`Ga&}nB(Ytjho=2;IvTZ14C~XUD#eP^+!pZ>ugBuZ> z4&BQtm73l8(nMb@Sa7N(3|(%uqJ-zD3loNd0oNOxxa|2nOfvmPq9{|GDW74;#+vfR zIT=u_I&PX|@DzEP(j!^T%i-nvpr*KWJ8qF5evV1~?Z60qa=Bp(Td-{f+7QGh$Z+|k z3B?TweE4Kz^fuKgWTn|hZ4YN)I-@lUS1l}@5py>5^~E5DXt+54e6S>Rfu$`j=Z^G_Va$POi2OB5yJOO zaQGag5pIKL2?tMQOcrK{(R0k=R-sPf#!`?NbI!gJ;o|+Lx8(t8#lY%<=KVUhc;6X1 z<3V_#AK5b70Ygjk0V5I1|KW;w6?%5U9G+yFa1la@nJvg|WGPi1R*dy{B|?kt6^k3W z$^Y7LsbWko5Mb8zb@x@Po%o*Wq6UmKZOe~8?7Tqe=vO8YQET-2Bsm1kAg-0+b5CO* z+PP~dyJe(RQm8Bk1gZ61bg|EaReWwKww zOL2S3UBqMA@@&OA*Z6tIqfa&6Up z-`)8I7xNYQiZy0O*ss2yr-tpS&R6HDDc{#_CVvx3&tj)$eFM9NDRUltbQ+~mAU>9H z#)WMURs1)kL)w`77g~$fHrWky8!-g`WN7FLKFLaC&@7~2k24#t-5=9D(u6HI9x4zg z@XrvZ(F0&T`TovLBf|Qv*pEy8CFBD_WnlS1Qs!_b&R?J#;+4T;e@;S^#Q!~luPKD} z&;x*MNlWmucY;u~-9nnPZ{M^WjeHXM*s<)Hx`@i9JzPFVu)nB2Vyi5zar90JZjfUq zAmT6$BCQXm{vxz(=h`ih%hAW2G>N^VzP~~eVR$(zCsvHZInnqz2^rD40+TqRalWJ; z-vn}(T{^HL-W+eGx^QOekeNq zA^AGz?Yd=SG-NygJA~N#2ggNU9Tz1Z05t47gx~St2SCRG$p~<~fU~dG{r6V|Ms@?O z3W}@(vOYvcUV|ELry-?c6nY6!jmYD+179;#<0Fo7obzyk(>R?oIFpl{;w;V$F3hz- z*t%a(DVrK@hzwI!7?;y3ubjPQU5iQ)PW4S93}7j7TU%k9tk3db-@?U&;~ z=``@J3g(61)nLKZdOrYgWy=w<35hR*o=H`V;F~}P@Rd65)fmbF**Z;6_0z_k zddd?c%hs0QH)#_XpxG^Ogoq(wY>{qgCsPH|a4t-T3t$;s0iEjMuCN!@!mY3ZF5k5> z;;dappa3zr73Qj!nIP1-0;|;=X)D{LLwmet=j!`mUS!#FJqq?@bb zz-jAr#em7<^-2xLl5!Oph=Zgos0}V6biF)@V+qoxr(+qFpb?nU2LnJZB5x_K2HyEU zIN+sKrolA58uX_$aw=YkH=qftZ~!}T1V`~61<{k}TnbSsRZ|-cQGuSLf9W|>cs#G; z@0CcI)e-T@-7--Q$?F=f)$3*Y1%oj6m^L$DzOo5+y8YgMayD1t>YUe2cRg-}Tkp0% z|M~{k;ZknMJ?egU7pf2Oio4^UxHs<0aWFFl1N#GzU%fmDUqVLA>HN(KnLTHuL6R;o z$GYfx#JPH_%*EqNu9M$B<@Vb*mvU?+n&&|x0WYKS&OH>()`g;~QG-|W0CB}}wA|c$ z8l5!BveoVZzGqOT@7gwRHqR=-CG8;~tAhJLlnggsU7Rw!$&y$c@;H{v^yQw_lJ&+0 zK}7*oyYqsiEIBY8-Pb>JaQ-ZZEMIZhS#JGc@v|?1!*2QZbtOk`Ir!Z5=QcmH09OxJ zh-Cxt_T3+9%-1iu?rkg?d+06j=NL3~rH)Df?eZ&^K8hXP$8aDMNI`sYoh;tE7K$)nhwy?YLqt@C-1B_UQqu%21nUOR{nnG zW-Hm98l?{;x2={VeY!%Xk0Kv(7rywf_1f ze6_`UZrdZPc`#|#wAZT!-mJ@@e5MP>Q)=+?A-XgQ&k=;HL9*pd*EK&0YBGI|yvGAGrKtfq%z6u@^nJ=MlRkrSIXfB(Qeq z-(kINZ*DthwHvQbp+}jy=u1v(LH$bt@a@FY;W`Nx$biJZu&fis@5auY$Y%ErXqv}p zJ*YT|ogPN55(312_^s#F7nLlVBkEN<4EC4dtvCajY1Ns|q(xh2(tNxwWJgf<%rn_-zW%358vhLBR1X1H`gVH75Xbi=3>ty;E< zDd-lS`RiOPE{UE3HkqA03I&-QEGo9cG4xJ>D5F9g$tn zvt)FfJivcQzWIwDcHW1dI28 znYfCI^l~mcM>Fw?u4t@F$J)zwJ1?$aTm{GiE^8(@ijl>WA4@eck#U-e*tFFFGSk`- z{3E05a67l^EESpev_Eb{J?5~<5IVAJS@SB}j5AxM0niGvYDyFi=>J zleH}Ta!a#^F6CN5dg0sAy}P!-d&}m%uR^%Pv9?q)R%mPHb5E;P31_uUb5pa!$y(9T ze$crp42WaB_0E2Az9*Q^hrQ*oAJ3?@ZE4{T>;$`fp)guRDcui3fk1fc=^GS^mdh0l zq(h~Y?71+`P)yJ=iyN9K_|FxO&1Z3J)|qDw3=KUQuFs8Ny4>lAQec>{#FUs2S7|~3 zJ>if9I0l-?z1vDsFj<4pF`=-(r1BH+cnD$AVbnvglY+a39+s=1V!_|+2?G1jS7d)u zh;sT`FpT3-)2y2am$4sWu=RuGMR62>s3T&vLZFuzvYV~)>W)8M1&b5eJbIsq z<`*ZhOyMz1_x-qP6wS-wn=MfqmSwbcJU) z$+R3-T>L2Qff=9#jS4P-UR;5l3;uxzV1@mh9!fa=_N<0gSIP9_8Peb0?}T2_|9J?! zmvEt)Qe{}3P^AUgzA?sU%wA1r^R%^PZx|Y)z90B5W`8g#)96h=qrrqas@8m+h zr(@@erK=nIMr0?|ggs7+Z-#?zgM|MrJWV&EdRU&MI^HmqA`8*IPU!^x>*p;mDwyqe z4SN(%9yF4+m3(NVKp5Hpa+l z$9iHZJ;xy2P9;HvgBY1K{K#XjKb2p8tMyOM59IS1VdVx3PY?(^*4^HKrJ7q>+uPr; z8v#rr9It14;v{Pz{K_jF-McTOpihh+V}tHPs3SVB7~e)(a*E&u8%V z21bhh`XYOXNIcGio%6!O%`$v9KSD5G>|1n^MIJ-yMIKr(Sep##C94`E(D^RejW?+A zQl=*$g?|boT@gqfi)#y0IYm^Rl(M*Fg1y&F8%|DJC9~x(7|%NrIhze1WS^hB~fUt#ux;{a57wm)UPKpBz?>mTr?~Z{Z7B$o=Q^~Oqb98;Zr9FR)ZvdY5{N__wV&BiY9&?Z0n0k)OO)*ru-WTqr8PJi4Q!uXV@HT|0N|*tYE{A!$a9 z9)wD5@XiUw_*Cp3m-**`C@iE>791MYPIoUQV(-(=I&fMCNG6_OXquo8RFo59%$NU;8FxhCeExlu3nr zaB=V7U1RsH>-!FgJl)Qo#jlqUnpZ4w>w>(7=XcM~Rf2Lf> z=U75?>+{i=6R%mg!h472rFxnWIKK|9t=W+n%5Rvp2|If^9?g1TYctJ3-=te zG%L63`F3!AQhe<-03HbA)&w@*CrfxUfOctKm7)NO&Sht7A_S5P*T`4~wM%7tp3hS# z`l-d4_Ye1?%u{ni9nA~wu32F?-PDVVN+x6mI)ha$t`hR?Gs6eje%YSRBub#q<3YJG zrZ=9+pXdtq2k4@f@N#5m^sPFdeC#-CLucwd^{oqvuHL3+P0y^1tzRXgh>#RR6Ni|- z5pOCKVu;a2FUuc7tAQ>V6Q+uByTG#wGS=DBz~%Z!Q9HXLSL^Dcl;AUO-h{Ti>4(iK z5nJI1D2nW$76;Y^!A`SYT3U7<*_3xG$@!wjLfvahfB9sJo--ir#2qDDhc)n$;Yu_<3&w>9~>l6pcQEmMh=| zN8MNv(taT`-S=bRgz?VMRe9SOF3111)k_dHf_F9(D}!`GkW4RLLm3*2o+|Qq^D*}T zqkH2Og*4+VZFCZgGK}T@OhwGH3i*Lw9w(^kKpKiK3C{mHnE{1g6xpP2A;M)^4B;Wu5Ue(|N9Z6dA~VQMwp-g zfYR62oB6Yj5FA8+^Pdz_6yNW9m)+8q>HKM~wL+znZe_;SY%+%i!>K!hPsW zIOudWs21C;o`{oOyG}QlXr5U%%gMUPKI3c=Rd0{&YT0S5ay~L$sBw*nh>Rq9jKt#8 zFA2LPd)r*QCH8u)?egLjXo&_AKh-TlTilV2k+^rPZbEoAr+e7Bzh-toY0C5 zP|*g>&}wc-jgMA<4IVE^b!#+hu_yr*x5Q%@43s@x#qE^u;uXuX9ra%7b{PA(6m z^%bS4df#gO#oZZC$k20!UA^kqHOr-0&s&)!G(@82g5`@vNa~RI9>_6m;^ax)E(J)R zhwVoeM!KLAo(Z`~JTtA3oswn5uYf|_w&Bzu)G3Ucl8k_enjuP);!^EEUfP#7G6Ow<$_gT>(qTG~29U6P(YnL?$} z8B7+N!{zY>LXm-?k+F%`R3gR0Cm9In$^&XZ?}w+eG)X6fG5b><1L z{HIMc)|6Eg6~@#?&OArxysvUoq2y5z>9<;}vVFR>ZGIuG8RT<3`4QcWTg%Q99Uh^jk9d#Xsr}4?R)D71 zGKa93q?jHOTUL4x@C%4tptMH}X-x7C&(H1u5TisSqPDRCTi@lqt7JruS`a-LsUlzn zCY2^nn9aqAM&9#9sXu(YECh5j&CX{N!V(M^D8SqOMl_^RKtU3aCJ@nvpYxOYKbKPo zzi=T$4HOUA-@wk!u8T24p^ljj>n!ulzT^@}4`gh(RK4>YY&nuRRoVYvukXGjqh$U9 z>L8t-O|wPyWxY^?%&edeQb^7!U6)~k^+qtfo4wyv#%}X9?bgYLO~-E@QA8}*0}>!& zr~Z?!Hk0`KGs%h96dl(?QBkd4c5lH~Fq;gLrMxW~#H>3pt&j?Socm1i06>mOs8btD z(f%ntVK!stj(ICkk|xayMZo>9nf6crF}e~8kE+5|xyfuU+1a@b(7WASj<}GNaEn`D z1tcqMtC$ozv=y>KOO*ZpZM|#n{W?G5z#!JWbaP12QPM@L`hA~?zTJ<^Mj!s-Z#T$b zzDWz-(UB6W9I89Jdk!yt=VSBHiDuliU4=0aCXtlsQjrX-RhK zRssv6W$t~ZBQ^J{V||1OMXqB}3sH(b{OB5w;V>$+L9hn%yAvP)*r0<6<0rAb_f=+q z;JeLI4Z|(EQN`gmi02*?l$L_ZWIc% zgNcGoT3+krYoo*gh!IYNss;|^zbHz+Xa)2N6^RimPKj=%;u$0`GD&2Hg@ae7SdwxT zDpjdgqZUD(dJPzuAS@Pa99)ff_+W@80#?n0T8Omj(MGFXnhvY2v6fD{44u|nC$k)~ z_J9czJvXX1lmqHh$erz|py02!ZWT3B0`#|ozJ7yJXw9AiFcohfR;vIeIooQyNnLByS;l{!i<=FByl8+SbBc+PaU zpKvDqoZ~1ly?-q$XPK&6vTZYO7*Ce`xO(N}kdtu+8@}%Q%sSl6#B3+cQ;h2rWlKep zyCyHjwyvtBE?;zP(yqJO?tmkdoMy$OJqu+6ZDE@v{env5<(1VMTfdg^fV<%A5%79# zuWPoM#*Mw99W6IBWMRC7^;YDwXSj(c%jB=wt4&iLm?3Xc&2}DktA-WWP-KUeW|k_L zm%A^ycAh2*>A#q|SZ_ewYZZ!XD5tE;rhc&ci=+!yvIzyvcaV%tSF*VBwXxYM_TAZU zVDG{*zY|T}sN?LtQL7G|~HnATNP%2caRwT5Q0`z$c)Fw7wu3hYeR zeP}c^@n}MgfK8wZC&Qo~QPLf1ub+Qg!4W}S+{!jX>?c2Y1y4OL$!z7Rn%!I8oK1%p zTnU*_xC036=fDqAW-$`icl(lGrt#0diqx?A_OFDx55wdL1Y0l@eePJ-{1UK=$(D`oJ)eK`$d%%Yd=&&VSCWM8&BS zi4zS@o)k+(IhCnGrS9JNhdzqO0v zNmkuq3?|bh`vJK|D$2g^iUXu4E~?BL=nB&u>6Ci=E%o}K zx5CZ#B~>Zw2DxoN@Q{_(fZ{9hk(Z#t984JK)1-SuWRMvpoNQ}bM}JOb;&=>lnGmlY9=$(F}FtDCRd7!V?1V}bQ2~W(| z^n>wM@N+fbOv zhBmdPj$doJ+yXv$Rsd${2n8W)hJXoP%sBUYC=UO%p{(@y~Ee%sGs@wH4@Sqj28W5ps|S<(d;qik~N?jerZbWHfo zd+AX-fF>9Q9qLZTK&Z_|Lt?PF9MA1;(HLV-}dHWFQ-Kw@?ZX_^nC8=Q6xHj zIM>^MUxCzp$`u|J@LtFLG}40Br%qe{)Z*Kiik$MciK8*+t|Cf7f{otj0}`|ar#rk;;_#A>0Xg&a8? zEJ(zK!>@Mlj4b}(^}p>~vpxiD^BG-SOHHfKCcy(5gQA0OJD$?wq;|%nH!!X;B~0pKsQSi+2Wx|acRu*%zrdSxwkyU}@#PT_`N0$quzQ?h@7~w5SaM=_gmIW* z&SZ?0!_Ptq1q{Y&0%0wKQ3%@N{jGxAJQ-JZHoehuCjCLm$a-IRXA616jHMZ$rF6`1 z_1DDpnzI`CDwTzwnfP9fzxJ8PGFx~`RU?m5xWNZws0;PQ=;6vBu6Z<_D!YR8J57FV z^m|n4Z{Ap1Im;Z__Zd6i#d>tf$4?Wzi$<&Ct5VbfKb<(W(lsjJhig(Fyte&dcL7P;K!9VPJr7l?oW9tjrOb!B^o?8gc!3LuAB< zFK^}qv6y)gzyBVC#Gn#(`s{RA zKN7u!8$!5f(%R`m;CNbANA2r_^w{W(FCP0}B&|*EPDCGv#X8G&?Io<<{@-{H`>wD9 zKB5(X^y2cY>u0~ZLR{S4bFSN0xB{l%$phj3K0aj$i7hY7Kl}g-R~mFpyhwP;%z-Th zUO(p(s%W$h0%5hA>f^+u>Q%2!BCO%gHEm{rD04tpUK5%J1en174uG*OfNvkbMVk#k z`vU!GkVN_N5&EdaXu5#41M)JYy|IcwP)`cv-3Ra0e>|yqZmZt(Cby|OLB9Tdk&GNd$nJ!a*VjE;9ffp<)dJvi6JP>; zGu8=aj^QT?3lo`rn%4<4^854gR}&LG%V>1Z@<8mhq)JfAcr473TmER7kDszjB@6Kafw!Ja_9_%+2$RUEK!^$K|GPgAU;@#Ldvu|koZwF$ zh7=0#qIWBqeOm1>!O)w2>IQI&vjL2)x(qEdvt|zG7fVjlu^=Bu*1Z|0s+R0sd%AH}~`iFtpqWVwZ z;J-)8u9`xG5BzKqT~|i2)>Wc!e0!ZV9E<_{QSxx>o0UuN7MDKQ&fRfthv@kBS8tZw z7vDbE%H4Ku8_3yPmpd*YOUP$aiW;xeB{VTrJ6fhnZu{gPU2#(A}M=r&A)cJiPvg{-Jcca<2azImew{(63VZ zDpT0WhU?GQC8SAPaMRPm$pmyiTU1jD@J&Gh#)dAC+L3y60dmIX2Lvvu_BjcTa=#Y0 zYyl%Vv5(BuhZUUS*ZL~ndUZR>Jne+Bc6A5oKia^&a&py zQhbR#|0E)oi_N%C-@jiJOial2Isn{E?Xa?n4tf2tckS@)a6M{>)rOvz1nde;XQqcv zo(Qhbyo26pqaCGE`%+4ZHU}dC`6%!)*dO7%M4}Fi+2{~w z>reF^Om{_DQ4^9qwj-jYf!smmTRz8#1s9gcPqZV`mnem6_3oocj({`w=yw3jqP%y=v$IcXa?@+6SL=y2+B5~D@qM5=~+lk`t1pE*1#lQhj zbBvGSN$UkVOhKsPVWW=J;~lMM?914FGo_HmndM+hySrLrwZBLHtNy`Sn-WbR(eM|; z6nOKNiu;qtNpSaHf3;CW9;Lq3VGpAi4f=j;2Jp)Bm(}{7ws4DO zFEcf#js~Wei~8fTGMN@tQix`JPEHJM_&j= zdv4_fuqYomb|F+N(S?7kh!5)3!r`wA!KgW`sofa=%W?ezAur6F)#5g6AK3jar zT0|GYMqZk{{jezIJfYM$gZ=$CX^WZ?odFi)iQl;Q>KgFrDQdXs+}VQ(#-d~R-}qQ% zGmxWk%gv^;AP6=D`8naEqxW}*es$B>6#4z|_Yr&7ufG^XiQ^OFc1f};g86V=_|`21 zVFI9i4Mq7xM9f3;Q9j|}C~rGztF*H@ zat3pq{WPs|hYqXmjp}q(s2t67K;1d90P=tG*h};+gr55FHJogs9B;_af{2G5GxP5YuMh^R@X=HmQgW63w{=(pn$w{p&Eif&X zzp}JX;5H3GMEH=`tFEbqsUM~ulO3>l|EvAkm{wjx)Q_`a`CJytD&zF;?w&|BX7+js zJhuU#X$XbxCo`v>OjUsQPsL_c@IkMo>`8R;F}SZiOkKtMDTE|Shg3>w!{hg-7T+0s z)1Nfoe}|bCH82=}M8^cc{R7%C=njyM4WdwJ&IZaS4~ZQT39;?L>y4?|d&VFiC)>r4 z3`fZ!ZzL+lo6nHJ;mHP|XSK0oNgtWRrmmLCXl*Rkfs_*Y0R^OsJbEk$iHQw_j~q!4 zgA^d<`q{KbYC!?Ev2dpUxFbKlqo~*lWiX24Qh3;Gk}VzCIW;}OD(<|L#gp@7yzAAt z>UdyPSit4%&a5%$>Qh;d%tjh0s@Bn6i{pN$?fymS^iXXC}$;`i{ll zVk$|_+*>mBnVr(dN&M7VC(}8-zk1a!I!ypms6tpw_uQo}U+&pUqX}j0{}GyaRWCq% zp}&d;QsoLptF*Fiv@Fi^${jGRJ&1n#O-u+MozDzs3d-`Rim=Unogm(b_Bq>7+r_?% zDC%u|O^Md{;ja`#efe2fG3-e8Q^_2D%6r02aUOd=%!*XD;I|IpdoqEKeGO&Q!C`Ak z=6HG7g7};Lk)XXxT}$V3;#xI>{e$YbRyC)Fp=K1vMMfrOfjJ$#Yv0s3ySU?AHe1G# zbFNq6syWvh`;C>ef<@598Y<5`63M%-U34`UpBOKbVdi4GjD@%DGAq9J~jY4zT+!^^s@L zncaQ6FQMMeFvn=8@WzhkM|}QmgaMgBkH-H&ZB^l)#GPLs2mHQ`VW*#LL z1qlQ_N{A03GL7#q_)7})#oj)}HH8xY3js8JZL!b!dJAi4OW8%_BH+H~=AN$tmY1)* zSlBSUaY-p?FMzu0+2pKk+slJ#LQCxFQ}l8d!A1MB{7D&I%0O8q*~e3aSJBB?yG!BN zO7|7nB0RnZr}d~!_~vg;mIp-4UQ=TXqax*r85sog+DmqZv&VDonSx zuu!)ZCh@r=RSd1MOYeO~M3P_*Mx{9KMB4Gtg6#RSG{4^Q3p*6z6&I zp(mewH0OYim`(lS*FS!-rqBKdalD>Y?%0pFFNiOnoAuNxc(Gk-v0uk?yT8}$rp70K zY4t$#_iz9ZkOht>DP73VKn0JpS8}2iiE{ZQHbBKxPVn0r$GH{vQF?6Lhcfsrx<6dP@7rY&94wsyo7g|$kFe|>w?ah=dzk|Ju?$tu3kD-)Tk zpp)7w%Egz(w2tYSL}sATUA=z1owgZi`2#%B9&zcN!S6rjVu3cuoBD-Qh;z7+Mo*bpoH}xf=!%F*agGmG)Fbql!1s3 zay$X^BeXl{W*q;g*paub@E?Wa21f|gk}Ynq1~H$3b3t==!JHW1m$^*Lbqky3^V@NU z9EWMxZ-}KZKSfpT9AgKF+Fz=$AAILT*`>vP?*Zaz{52n-1%2QUI0J5Y>vv?^729pJ z+haFj_dOZ3*VuR3qxL`3eI0Tf+8s7H^g5hyc;fJ>!+#xqq>@z~YaC}Bf8ZsI2$O;7 zz)WMVjyu)kU>%in-bqrOsqvJP`j-ye{ceN%BmF4T>os~ey{8#7JI9apseYD!%D?L0 z$yQ{qXaD9*G$R&DT*kfJt$Zsnsg-`_zng?miGnDL%VMx_rLa@@6%MRg+qSWn>T&5hbMP;zT3(W}ksFPLO{=l1;ZUJ(Q7*V4_&;wgpXPUcIb0XA4!=Llro? z_nFM5IS-}X!NihaN}5h3;l#v3v05h%{uHYmmixLOhZeH2hNmi>#BuE1>4PX~wm3&# z3L~SL7=2C+X1Qr>`W}ha=e9%A(DWbq7E}}$K@fDbL5RH@vCJ4S+V*zmamqkitOKH@ z1ne6Wjs%7;t9#eZSKeFL6rg=Sp#=G_j{Eed(F!cS>St%QjGtNi?8LMAb9(|Zw}X{M zLG}env7_#Afwr1ydsP5pV(gjBs4cSGbWtc>-Xa_5bK{EqJ;5u1aMc^#5$`0a;1^dC)

-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..fc60d2f --- /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 `cuisto`:\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 followed by a pixel classifier \"Classify\" function on toy data." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "import pandas as pd\n", + "\n", + "import cuisto" + ] + }, + { + "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 = cuisto.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 = cuisto.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 = cuisto.display.plot_regions(df_regions, cfg)\n", + "# specify which regions to plot\n", + "# figs_regions = cuisto.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+lTUhPT8fy5csRGxuL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lpYCAN58801cvnwZO3bsQHJyMpYvXw4/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 = cuisto.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/8xZcoUADp37kyWLFnsG5CIAwsJCaFJkyYMHToUgGbNmhEQ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uXTpEvXq1bNbDCIiIiKSPighF0mkDBky0LVrV0aNGkVISAjffPMNrVu35u2336Z8+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 = cuisto.display.plot_2D_distributions(df_coordinates, cfg)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "cuisto-env", + "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.8" + } + }, + "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..33a3356 --- /dev/null +++ b/demo_notebooks/density_map.html @@ -0,0 +1,2451 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + Density map - cuisto + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + + + + + + + + +

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..ac5cdd9 --- /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 `cuisto` 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": 1, + "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": 2, + "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": 3, + "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": 4, + "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": 5, + "metadata": {}, + "outputs": [], + "source": [ + "# select objects\n", + "# df = df[df[\"Classification\"] == \"example: classification\"]" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "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": 7, + "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": 7,
+     "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": [
+    "# 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": 8,
+   "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": 8,
+     "metadata": {},
+     "output_type": "execute_result"
+    },
+    {
+     "data": {
+      "text/html": [
+       "
\n"
+      ],
+      "text/plain": []
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    },
+    {
+     "data": {
+      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAgMAAAGFCAYAAABg2vAPAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAAD5UUlEQVR4nOzddXxV9f/A8de5tbzrDsYGjBw1QkCQLqUEEbsTA8HGVvypqF8LEwVFUJASpCUcnRLS6411x727eX5/HJjMBWMMBtvn+Xh8H192T33OwHve5xPvtyTLsowgCIIgCE2WqqEbIAiCIAhCwxLBgCAIgiA0cSIYEARBEIQmTgQDgiAIgtDEiWBAEARBEJo4EQwIgiAIQhMnggFBEARBaOJEMCAIgiAITZwIBgRBEAShiRPBgCAIgiA0cSIYEARBEIQmTgQDgiAIgtDEiWBAEARBEJo4EQwIgiAIQhOnaegGCIIgNAV2ux2z2dzQzRAaGa1Wi1qtvuTziGBAEAThMjObzSQkJGC32xu6KUIj5OHhQUBAAJIk1fkcIhgQBEG4jGRZJj09HbVaTWhoKCqVGJ0V6ocsyxgMBrKysgAIDAys87lEMCAIgnAZWa1WDAYDQUFBODs7N3RzhEbGyckJgKysLPz8/Oo8ZCBCVEEQhMvIZrMBoNPpGrglQmN1Lsi0WCx1PocIBgRBEK6ASxnPFYSa1Me/LREMCIIgCEITJ4IBQRAEQWjiRDAgCIIgIEkSy5cvv+zX2bJlC5IkUVBQUP7Z8uXLadmyJWq1milTpjB37lw8PDwue1v69+/PlClTLvt1rgUiGBAEQWgCMjIyePLJJ4mIiMDBwYHQ0FBGjRrFxo0br2g7evfuTXp6Ou7u7uWfPfLII0yYMIGUlBTefvttbr31Vk6dOlVv16wqAAFYunQpb7/9dr1d51omlhYKgiA0comJifTp0wcPDw9mzpxJVFQUFouFdevWMXnyZE6cOHHF2qLT6QgICCj/uaSkhKysLIYNG0ZQUFD55+eWzF1OXl5el/0a1wrRMyAIgtDIPf7440iSxJ49exg/fjyRkZG0b9+eqVOnsmvXriqPeeGFF4iMjMTZ2ZmIiAheffXVCkvXDh06xIABA9Dr9bi5uREdHc2+ffsASEpKYtSoUXh6euLi4kL79u1ZvXo1UPEtfcuWLej1egAGDhyIJEls2bKlymGClStX0r17dxwdHfHx8WHcuHHl2+bNm0e3bt3Q6/UEBARw++23lyfiSUxMZMCAAQB4enoiSRL33nsvUHmYID8/n7vvvhtPT0+cnZ0ZMWIEp0+fLt9+rl3r1q2jbdu2uLq6Mnz4cNLT0+vwt3J1EcGAIAhCI5aXl8fatWuZPHkyLi4ulbZXNzav1+uZO3cux44d49NPP+W7777jf//7X/n2O+64g5CQEPbu3cv+/ft58cUX0Wq1AEyePBmTyURMTAxHjhzh/fffx9XVtdI1evfuzcmTJwFYsmQJ6enp9O7du9J+q1atYty4cYwcOZK///6bjRs30qNHj/LtFouFt99+m0OHDrF8+XISExPLH/ihoaEsWbIEgJMnT5Kens6nn35a5T3fe++97Nu3jxUrVrBz505kWWbkyJEVgiCDwcCHH37IvHnziImJITk5mWeffbbK811TZEEQBOGyMRqN8rFjx2Sj0dgg19+9e7cMyEuXLq1xP0BetmxZtdtnzpwpR0dHl/+s1+vluXPnVrlvVFSU/MYbb1S5bfPmzTIg5+fny7Isy/n5+TIgb968uXyfOXPmyO7u7uU/9+rVS77jjjtqbP/59u7dKwNycXFxldc854YbbpCffvppWZZl+dSpUzIgb9++vXx7Tk6O7OTkJC9atKi8XYAcGxtbvs+sWbNkf3//WrftcqiPf2OiZ0AQBKERk2W5TsctXLiQPn36EBAQgKurK6+88grJycnl26dOncqDDz7I4MGDee+994iLiyvf9tRTT/HOO+/Qp08fXn/9dQ4fPnxJ93Dw4EEGDRpU7fb9+/czatQomjVrhl6v54YbbgCo0N4LOX78OBqNhp49e5Z/5u3tTevWrTl+/Hj5Z87OzrRo0aL858DAwPIhiWuZCAYEQRAasVatWiFJ0kVNEty5cyd33HEHI0eO5I8//uDvv/9m+vTpFUowv/HGGxw9epQbb7yRTZs20a5dO5YtWwbAgw8+SHx8PHfddRdHjhyhW7dufP7553W+h5omE5aWljJs2DDc3NyYP38+e/fuLW/H5SgZfW4o5BxJkuoccF1NRDAgCILQiHl5eTFs2DBmzZpFaWlppe3/XW4HsGPHDsLCwpg+fTrdunWjVatWJCUlVdovMjKSZ555hvXr13PzzTczZ86c8m2hoaE8+uijLF26lGnTpvHdd9/V+R46duxY7RLIEydOkJuby3vvvUffvn1p06ZNpTf1c3UhztWJqErbtm2xWq3s3r27/LPc3FxOnjxJu3bt6tz2a4UIBgRBEBq5WbNmYbPZ6NGjB0uWLOH06dMcP36czz77jF69elXav1WrViQnJ/Prr78SFxfHZ599Vv62DWA0GnniiSfYsmULSUlJbN++nb1799K2bVsApkyZwrp160hISODAgQNs3ry5fFtdvP766/zyyy+8/vrrHD9+vHxSIkCzZs3Q6XR8/vnnxMfHs2LFikq5A8LCwpAkiT/++IPs7GxKSkqqvOcxY8bw0EMPsW3bNg4dOsSdd95JcHAwY8aMqXPbrxUiGBAEQWjkIiIiOHDgAAMGDGDatGl06NCBIUOGsHHjRr766qtK+48ePZpnnnmGJ554gs6dO7Njxw5effXV8u1qtZrc3FzuvvtuIiMjmThxIiNGjODNN98ElDfwyZMn07ZtW4YPH05kZCRffvllndvfv39/fvvtN1asWEHnzp0ZOHAge/bsAcDX15e5c+fy22+/0a5dO9577z0+/PDDCscHBwfz5ptv8uKLL+Lv788TTzxR5XXmzJlDdHQ0N910E7169UKWZVavXl1paKAxkuTGMNghCIJwlSorKyMhIYHw8HAcHR0bujlCI1Qf/8ZEz4AgCIIgNHEiGBAEQRCEJk4EA4IgCILQxIlgQBAEQRCaOBEMCIIgCEITJ4IBQRAEQWjiRDAgCIIgCE2cCAYEQRAEoYkTwYAgCIJw2bzxxht07ty5/Od7772XsWPHNlh7LlX//v2ZMmVKQzej3olgQBAEQahSRkYGTz75JBERETg4OBAaGsqoUaOqLRokXLs0Dd0AQRAE4eqTmJhInz598PDwYObMmURFRWGxWFi3bh2TJ0++qJLIjYHZbC6vfngtnPdiiZ4BQRAEoZLHH38cSZLYs2cP48ePJzIykvbt2zN16lR27dpVvl9BQQEPPvggvr6+uLm5MXDgQA4dOlTr6yxevJioqCicnJzw9vZm8ODBVZZars65YYd3330Xf39/PDw8eOutt7BarTz33HN4eXkREhJSobwywAsvvEBkZCTOzs5ERETw6quvYrFYyrefG96YPXt2jTn/V61ahbu7O/PnzwcgJSWFiRMn4uHhgZeXF2PGjCExMbFSe2fMmEFQUBCtW7eu9b1eTqJnQBAE4QqSZRnZUtYg15a0jkiSdMH98vLyWLt2LTNmzMDFxaXSdg8Pj/I/33LLLTg5ObFmzRrc3d355ptvGDRoEKdOncLLy6vG66Snp3PbbbfxwQcfMG7cOIqLi9m6dSvn6udt2bKFAQMGkJCQQPPmzas9z6ZNmwgJCSEmJobt27fzwAMPsGPHDvr168fu3btZuHAhjzzyCEOGDCEkJAQAvV7P3LlzCQoK4siRIzz00EPo9Xqef/758vPGxsayZMkSli5dilqtrnTdBQsW8Oijj7JgwQJuuukmLBYLw4YNo1evXmzduhWNRsM777zD8OHDOXz4cHkPwMaNG3Fzc2PDhg01/n6uJBEMCIIgXEGypYzTr/dqkGu3enMnks7pgvvFxsYiyzJt2rSpcb9t27axZ88esrKycHBwAODDDz9k+fLlLF68mIcffrjG49PT07Fardx8882EhYUBEBUVVb7d2dmZ1q1bX7CEsJeXF5999hkqlYrWrVvzwQcfYDAYePnllwF46aWXeO+999i2bRuTJk0C4JVXXik/vnnz5jz77LP8+uuvFYIBs9nMTz/9hK+vb6Vrzpo1i+nTp7Ny5UpuuOEGABYuXIjdbmf27NnlQdecOXPw8PBgy5YtDB06FAAXFxdmz559VQwPnCOCAUEQBKGC2la2P3ToECUlJXh7e1f43Gg0EhcXd8HjO3XqxKBBg4iKimLYsGEMHTqUCRMm4OnpCUCPHj1qNTehffv2qFT/jnr7+/vToUOH8p/VajXe3t5kZWWVf7Zw4UI+++wz4uLiKCkpwWq14ubmVuG8YWFhVQYCixcvJisri+3bt9O9e/fyzw8dOkRsbCx6vb7C/mVlZRV+H1FRUeWBwPz583nkkUfKt61Zs4a+ffte8J7rmwgGBEEQriBJ60irN3c22LVro1WrVkiSdMEHcUlJCYGBgWzZsqXStvOHEqqjVqvZsGEDO3bsYP369Xz++edMnz6d3bt3Ex4eXqu2ApV6DiRJqvIzu90OwM6dO7njjjt48803GTZsGO7u7vz666989NFHFY6paogEoEuXLhw4cIAffviBbt26lfcClJSUEB0dXT5/4HznBxXnn3f06NH07Nmz/Ofg4ODa3HK9E8GAIAjCFSRJUq266huSl5cXw4YNY9asWTz11FOVHooFBQV4eHjQtWtXMjIy0Gg0NY7p10SSJPr06UOfPn147bXXCAsLY9myZUydOrUe7qRqO3bsICwsjOnTp5d/lpSUVOvjW7RowUcffUT//v1Rq9V88cUXAHTt2pWFCxfi5+dXqZehOnq9vlJPQkMQqwkEQRCESmbNmoXNZqNHjx4sWbKE06dPc/z4cT777DN69VLmPAwePJhevXoxduxY1q9fT2JiIjt27GD69Ons27fvgtfYvXs37777Lvv27SM5OZmlS5eSnZ1N27ZtAdizZw9t2rThzJkz9XpvrVq1Ijk5mV9//ZW4uDg+++wzli1bdlHniIyMZPPmzSxZsqQ8CdEdd9yBj48PY8aMYevWrSQkJLBlyxaeeuopUlNT6/Ue6psIBgRBEIRKIiIiOHDgAAMGDGDatGl06NCBIUOGsHHjRr766itAeatfvXo1/fr147777iMyMpJJkyaRlJSEv7//Ba/h5uZGTEwMI0eOJDIykldeeYWPPvqIESNGAGAwGDh58mSFJX/1YfTo0TzzzDM88cQTdO7cmR07dvDqq69e9Hlat27Npk2b+OWXX5g2bRrOzs7ExMTQrFkzbr75Ztq2bcsDDzxAWVlZrXsKGook13amiCAIgnDRysrKSEhIqHGtuiBcivr4NyZ6BgRBEAShiRPBgCAIgiA0cSIYEARBEIQmTgQDgiAIgtDEiWBAEARBEJo4EQwIgiAIQhMnggFBEARBaOJEMCAIgiAITZwIBgRBEAShiRPBgCAIgnDZvPHGG3Tu3Ln853vvvZexY8c2WHsuVf/+/ctrETQmIhgQBEEQqpSRkcGTTz5JREQEDg4OhIaGMmrUKDZu3NjQTRPqmQgGBEEQhEoSExOJjo5m06ZNzJw5kyNHjrB27VoGDBjA5MmTG7p5tWazWzFaDZSYCyky5VNsLsBoKcVmt13Uecxm82VpX3Xnbd68OVu2bLks16yKCAYEQRCESh5//HEkSWLPnj2MHz+eyMhI2rdvz9SpU9m1a1f5fgUFBTz44IP4+vri5ubGwIEDOXToUK2vs3jxYqKionBycsLb25vBgwdTWlpa6+PPDTu8++67+Pv74+HhwZtvvkmxsZAnnnkcHx8fWoS1YPYPszFYSyi1FFNozuPpZ5+kZauWODs7ExERwauvvlqhOuK54Y3Zs2fXWABo1apVuLu7M3/+fABSUlKYOHEiHh4eeHl5MWbMGBITEyu1d8aMGQQFBdG6deta3+vlpGnoBgiCIDQlsixjtV+et8wL0ah0SJJ0wf3y8vJYu3YtM2bMwMXFpdJ2Dw+P8j/fcsstODk5sWbNGtzd3fnmm28YNGgQp06dwsvLq3w/WZYrXTs9PZ3bbruNDz74gHHjxlFcXMzWrVs5V0x3y5YtDBgwgISEBJo3b15tezdt2kRISAhb/trClq2befzhyWzZtpnr+vRk1eYV/LF0Nc8/9RLDh44gKDgQi92Mi6sL//t6JkFBwaScOsOjjzyGXq/n+eefLz9vbGwsS5YsYenSpajV6krXXbBgAY8++igLFizgpptuwmKxMGzYMHr16sXWrVvRaDS88847DB8+nMOHD6PT6QDYuHEjbm5ubNiw4YJ/F1eKCAYEQRCuIKvdzGd/T2+Qaz/VZQZatcMF94uNjUWWZdq0aVPjftu2bWPPnj1kZWXh4KCc98MPP2T58uUsWDifO++7nVJLMVa7hUxDKipJjdlWhk22Icsy6enpWK1Wbr75ZsLCwgCIiooqP7+zszOtW7dGq9XW2A4vLy8++Pg9Sq1FjLt9FB/N/JgyYxnTX56Ok8aFnh368NlHX3Bwz2HaTGoHwNuvv0OhKQ+bbKVZWChTp01l0cJFFYIBs9nMTz/9hK+vb6Vrzpo1i+nTp7Ny5UpuuOEGABYuXIjdbmf27Nnlgc+cOXPw8PBgy5YtDB06FAAXFxdmz55dHhxcDUQwIAiCIFRw7s38Qg4dOkRJSQne3t4VPjcajZw4fYwymwFZtpd/bpdt2GQbFruZvLIs2ke1Y9CgQURFRTFs2DCGDh3KhAkT8PT0BKBHjx6cOHGixjbYZTuRbVtRZMkHQC2pCQwIIKpDR1x1buX7eXt7k5WVVf7zssXL+fSzT4mNjaW0tBSb1Yabm1uFc4eFhVUZCCxevJisrCy2b99O9+7dK/w+YmNj0ev1FfYvKysjLi6u/OeoqKhKgcCjjz7Kzz//XP6zwWBgxIgRFXokSkpKavxdXAoRDAiCIFxBGpWOp7rMaLBr10arVq2QJOmCD+KSkhICAwPZvHkzRmspBksJMkog4enhiavWDSeNCxqVBl+nIGyyFY1Ki4SExW6mwJzDyjW/c2DPQdavX8/nn3/O9OnT2b17N+Hh4TVeW5ZlSi3FmGxGVBoVEhIuWj3OWj1qlabSw1aSJOx2JTDZuXMnd9xxB2+++SaDBg/E7mhh+eIVfPv57ArHVDVEAtClSxcOHDjADz/8QLdu3cp7AUpKSoiOji6fP3C+84OKqs771ltv8eyzz5b/3L9/f95//3169uxZ4++hvohgQBAE4QqSJKlWXfUNycvLi2HDhjFr1iyeeuqpSg+vgoICPDw86Nq1KxkZGRTbCghqFgB4o1XpcNG64aB2RJIk1CoNIKFWqVGjRqvSoVM5oFM7YraVUWjOo0uPTvTp04fXXnuNsLAwli1bxtSpU6ttn9lmosicj9WuTPhTo8LbKQCNqnaPtB07dhAWFsb06cpwTZEpn1kpX5UHMhfSokULPvroI/r3749areaLL74AoGvXrixcuBA/P79KvQwX4ufnh5+fX/nPGo2G4OBgWrZseVHnqSuxmkAQBEGoZNasWdhsNnr06MGSJUs4ffo0x48f57PPPqNXr17IskyvG3rSrUdX7p54LzEbt5KfVsSJA7G8/fo77N+/v9pzS5KEp4MPxw6c4NOZXxCzawsn4o6xdOlSsrOzadu2LQB79uyhTZs2nDlzBgCb3UahKY+8siysdgsqSYVO5YBW7VDrQACUno/k5GR+/fVX4uLi+OHruaxZuRagPMC4kMjISDZv3sySJUvKkxDdcccd+Pj4MGbMGLZu3UpCQgJbtmzhqaeeIjU1tdbtawiiZ0AQBEGoJCIiggMHDjBjxgymTZtGeno6vr6+REdHM+vLWRSYcjDZyvh56Y/MfOtjnnnsObKzswkICKBfv374+/vXeH5JkgjwDmbvjv18N+t7SopLCG0WyocffsiIESMAZdz85MmTmMxllJgLKbWUIKN09TtpXNDr3M/2PFyc0aNH88wzz/DEE09gMpm48cYbefbFabw/YyZGqwG9zr1W52ndujWbNm0q7yH46KOPiImJ4YUXXuDmm2+muLiY4OBgBg0adNE9BVeaJNd2poggCIJw0crKykhISKhxrfq1xGq3UFCWg1W2IiGh13ngpHGp1ZLFqsiyjMFSTLGlEAC1pCmfZ2CX7ZjtJkxWY3kXvlalQ6/zQFfPQy1Gq4FCUy4alRYfp4B6PfflVh//xkTPgCAIglArJquRAlMeMnbUkhoPBx+06ktbHidJEi46NzQqLYXmfGyylZKzgcH5NCotrlo3HNROdQ48auJwNriw2i3Y7DbUqsp5BRozEQwIgiAIF2SwlFBkLgBkdCoH3B286/WB6aBxwkftQJnVgNlWhl22I0kSGpUOB7Uj2lomTKorlaRGo9JitVuw2M2oVU6X7VpXIxEMCIIgCNWSZZkSSxGlliJAGat303lelgezSlLhrHXFWeta7+euDa1Kh9VuOZshUgQDgiAIgoAsyxSZ8zFalVoBrlp3XLT6y/qG3pA0KiXTYW1XFDQmIhgQBEEQKrHLdgpNuZhsZYCEm84TZ23VSXgaC7WkPBJt8sVVNGwMRDAgCEK9MRgMpKenk5eXR35+fvn/CgsLMRqNlJWVVfqf3W5Ho9Gg0WhQq9UV/qxSqZAkCZVKhZOTEy4uLlX+z9/fn8DAQLy9va/at9ZraeGWXbZTUJaD2W5CQsLdwRtHTePvNj83B8ImWxu4JRfnXGbFSyGCAUEQaiTLMtnZ2WRmZpKTk0NOTg65ublkZGSQlpZGQkICqampZGRkUFBQUOl4tVqNm5sbjo6OODk5Vfh/BwcHVCoVNpsNq9WK1Wqt8OdzX3J2ux2DwUBpaSmlpaUYDIYq26rT6QgPD6dLly706tWLgQMH0r59+wYNELRaLZIkkZ2dja+v71UbrJxjs9vKs/upJBV6nSdYJcqsZQ3dtMvOLtuwmJRAwCgZr/q/K1mWMZvNZGdno1KpLqnwkcgzIAhNXFFREXFxcZw5c4b09HRSU1NJSkoiKSmJtLQ0UlJSMBqNFY5RqVT4+/sTFBREWFgYzZo1IzAwkMDAQIKCgvDy8sLLywtPT0/0+vofY7bb7RiNRgwGA8XFxWRkZJQHJ6dOnWLfvn3s378fs9lMs2bNmDRpEtOmTauQ7vVKKikpITU19arvHbDLdgyW4vKZ/M4afZNbYldkzgcZXHXuqKRrI0mvs7MzgYGBIhgQBKF6OTk5nD59mrS0NNLT00lJSSE2NpaUlBQSExPJzs4u31eSJAICAmjWrBlhYWGEhIQQEhJC8+bNy7vhfXx8cHd3R6W6ur8ojUYjf/31F6tWrWLOnDnYbDZef/11nn/++QZpu81mw2K5eiemFZnzWZuwkFJLIc5aN4Y1n4iHg/eFD2xkFhz/HJPNwNiW9+Hp2DDB48U4N7R2qQG3CAYEoZGQZZmEhAQOHz5MTEwMu3fv5vTp0xUe9jqdjqCgIFq2bFn+Rt+qVSsiIiIIDQ3F19f3grXjr0V5eXm8++67fPTRR0ybNo2ZM2de9V3AV1KOMYPFp76l1FKEh4MPt0Q+gpuDZ0M3q17INivWklzsZSVIag0avQ8qh+onQs4+8n8UmnKZ1OYJgl2bX7mGNjAxZ0AQrlE2m409e/awfft2du7cybZt28rrtYeEhNCvXz+GDRtG69atadeuXXn3fVN8CHp5efHhhx/i6urKm2++ybPPPktAwLWVcvZyyTScYfGpbyizGvBxCmB8q4dx1TV8Hn3ZbsOUcZqyM8ex5KZgM+Qj26xIWkc0zh6o9T5o3P3QuHgiaR2RbVZshgKsBemYc5IxZ8Vjzk7EUpAOcsUJdlrvUFzb3IBHr1vReYdW2KY5t6KgiS0vFD0DgnANSUtLY8OGDWzYsIG1a9eSm5uLs7Mz3bp1o0+fPvTp04cuXboQGBjYJB/6F3Lo0CE6d+7Mtm3b6NOnT0M3p8GdKU5gWez3mGxlBDiHcnPkQzhpnBusPbLdjjFhP0WHVlNybAu20vz6ObFKg8rBGew27KbSfz9Xa/Dqew8+gx9DUitBwLxj/yPLcIabWz1AuHvb+rn+NUD0DAjCVUyWZY4cOcKyZctYsmQJR44cQZIkunTpwiOPPMKNN95Ijx490GjEf8q1ca6MbLNmzRq4JQ0vueg0y2J/wGq3EOwazriW9+NQx+WDRUVFpKWlUVJSgt1ux2azoVKpCAwMxN/fHweHmosK2a1mig6sIC/mJyy5yeWfqxxccAzpgM4vHLWLF5JGi2wpw1aaj7UoC2tRNjZDIXaLCUmlRu3shsbNH51PM3R+4eh8w9F5h6J29UE6O0/EZijEkLCfgt2/YTi9k7wt32NKO0HQnR+h0joioQTRTe01WXyDCMJVRpZldu3axZIlS1i4cCGpqano9XrGjh3Lyy+/zODBg/Hx8WnoZl6TDh06hLOzM0FBQQ3dlAYVV3CMlXE/YZOthLlFMqbFvbUuOJSfn8+aNWtYtGgR+/btIzMzE6u15nX5zs7OhISE0KlTJ0aMGMGQIUMICQlBtlkp3Lec3E3fYi1ShrhUDi7oOw5D32k4zs27IKnrdw6L2tkdffuB6NsPpPjIetJ/e43SU9tJX/QKQbfPrNdrXUvEMIEgXAWsVisxMTEsW7aMlStXkpSUhK+vL7feeitjxoyhb9++F3y7Ei7suuuuIyQkhMWLFzd0UxrMqfzDrIr/Gbtsp4VHe26KuAuNqub3wuLiYn788Ue+/PJLTpw4Ub5EUqfTERgYWL7yxMnJCY1Gg1arxWw2k5iYWJ6DIj8/v8LSymFRgbwytBm+WiV/gcbNF8++9+DR/WalS/8KMcTvJeWHx8BmxW/Ui6x0TyPbmMb4Vg/R3L31FWtHQxM9A4LQQEpKSli/fj1//PEHK1asIDc3l5CQEMaOHcvNN99Mv379UKub1hrvyyk2Npbdu3czefLkhm5Kgzmee4A1Cb8iY6eNVxeGN59UYx6BY8eO8frrr7N8+fLyt//mzZszceJEbr/9dqKiomq9TNNkMnH06FF2b16L/vhSuvtagTIKjFYWnrBx/QMPMq7PxCs+18U5ojt+I6eRtfJ9cjZ8gXXcjYBSxbApEcGAIFxBJpOJtWvX8sMPP7Bu3TpMJhNt2rTh4YcfZuzYsXTv3l1M/LtMPv/8c7y9vZkwYUJDN6VBHM3Zx9rEhYBMe+9uDG0+sdqkOidOnOChhx5i27ZtAOj1eh555BGeeuopQkNDqzzmQnQ6HRHWePTFq7H7WkFSk+MbzfTf/uavnfv437pJhIe/xI8//kjfvn3rept14nHdRAr3/44p7QRmYwGoQatqfEtsayKCAUG4zGw2GzExMfzyyy8sWrSIwsJCoqOjeffddxk7diwREREN3cRGLyUlhW+++YaXXnoJJ6fGn2P/v84PBDr6XMfgsJuRqggE7HY7//vf/3jxxRexWq0EBQXx/vvvM2nSpEuapGrJP0PGkrcwxO0GwDGkA/7jXqF1UBu2PKMEH1OmTGHdunX069eP3r17M3/+fJo3b17na14MSaXGe8BDpM2fhsVWBmptredQNBYiGBCEy+Tw4cPMmzePBQsWkJaWRlhYGE888QSTJk2iQ4cODd28JmXGjBno9XqmTp3a0E254o7nHigPBDr59mJQs3FVBgL5+fmMHTuWmJgYAF555RVee+21S0pCJcsyRft/J3PlB8hmA5LWEZ+hk/HsfTvSecMTbdq0Ye3atRw7dow777yTHTt2EBERweDBg/n666+vSMDs2vYGVC6eWM8OzelUjpf9mlcTEQwIQj1KTEzk119/ZcGCBRw5cgRvb29uu+02br/9dnr27HnVp/BtjBISEpgzZw5vvvkmer2+oZtzRcXm/8OahF8BmY6+11UbCKSlpdGrVy9SUlLw8fFh6dKll9xVby3JI3PZW5Qc2wKAU1hnAia8hc6n+mWd7dq148CBA8TExPDwww+zYcMGWrRoQbdu3fjggw/o37//ZRtGk9QaHFv3xq42ATSJKo3nE6sJBOESFRYW8uOPP/LTTz+xf/9+nJycGDNmDLfffjvDhg27pOIhwqWRZZkbb7yRo0ePcvToUVxdXRu6SVdMSnEcS059h0220t67G8OaT6wyEMjKyiIqKoqsrCyGDBnCwoUL8fS8tFTEpSe3k77kdWzFOUhqLd5DHser790VegNqY+vWrTz11FMcPHgQUCYvfvPNNwwdOvSS2ledlB0/skh3BJVdZkr3D5vU/B3RMyAIdWC1Wtm6dSvz58/nl19+wWw2M2rUKKZNm8ZNN93U5N5Ar1YrV65kzZo1LF26tEkFAjnGdH6PnYNNttLCoz1Dm99SZSBgNBrp3bs3WVlZ3H333cyZM+eSeq/sFhM56z4jf/t8AHR+EQRO+j8cA+u2RK9v3778/fffHD9+nCeffJKNGzcybNgwevfpzRfzPyLdFk+mIRWzzYSHgzdtvaOJ8ule5b3WhtXTB0pBZ7E1qUAARM+AINSaLMts2bKFhQsX8ttvv5GXl0fz5s257777ePDBB5t8IpurjdFoJCoqivDwcNavX99kvtwNlhLmH/+UInM+wa7hTIh8GE01M+NfeeUVZsyYwXXXXceOHTsu6XdkyoglfeHLmDJOAeDRaxK+I6ag0tbf2PvRo0eZ+tZkosaFEdjSt8p9ItzbMarF3RfMnVCVE/HrWZW3HvciAw8O/PJSm3tNET0DgnABWVlZfPfdd8ydO5fY2FjCwsJ45JFHxFLAq9zMmTNJTk5m9erVTebvyGa38Uf8PIrM+Xg4+DCm5b3VBgIFBQXMnKlk3Pvxxx/r/DuS7TbydywgZ93nyFYzalcvAsa/gWubfnW+j6pY7BbSXU8w9LluAJSVmNiz4h8CHZvzyguvcsaQwM60DcQXHuOv1JUMajbuoq9hwAyAo9Fcr22/FohgQBCqYLFYWL9+PT/88AMrV65Eo9EwceJEZs+eTb9+/ZrMw+ValZyczPvvv8/TTz9NZGRkQzfnitmetoaU4jh0KgfGtrwPJ031pXr/WL6YSC8113fqhE/WHnJT/wKVCrWzBzqfZjgGt6ux1C+AKSuBzGVvY0w8AIBL6+sJGP8mGr13vd5XkbmA32PnkGU4A0An394Eu7fhm8XDWZGyha2/7yEmJgbfFkEsi/2eg1nbifLpiZ/zxfXWlViKAHA015xeuTESwwSCcJYsyxw7dowFCxbwww8/kJGRQceOHbn//vu566678PLyaugmCrU0btw49uzZw/Hjx3Fzu7LleGVZJi8vj4SEBJKTk4mPjyc1NZW8vLzy/+Xn51NaWopKpUKtVmO327Hb7Xh6euLj40NAQAChoaGEh4fTs2fPWmX6Syw8yZLT3wEwqsXdRHp2rLDdWpqPIW4Phri9GJP+xpQRR40xrUqNc0R33DqPxLX9QNSO/865sBZlk/fXHPJ3LQK7FUnnjN/Iqbj3GF/vgXK2IY0lp2dTainCSePCyPA7aO6uBHhlZWWMGzeOtWvX4uHhwc6dOzmt3cOp/MNE+fRkaPNbLupaqw9/yXFzPG0T8xg54Yd6vY+rnegZEJo8i8XC8uXLee+99zhw4ABubm7ceeedPPjgg3Tu3Fn0AlxjNm3axPLly1mwYMFlDwQsFgsHDx5k165dHD58mCNHjnD8+HGKiorK93F1dSU0NBRvb2+8vLxo3bo1np6euLq6YrfbsVqtqFQqJEmioKCAnJwckpOT2b59OykpKdhsNtzd3Rk9ejT33HMPAwYMqBQYGK2Gs7kEoLNfn/JAwFqSR9HB1RT/s4Gy5MMVSvFJEuQabBRLLkT1vAGVgwuy3YatOAdTVjzWgnQMsbswxO5CWvY2DiHt0Oh9sRZlUZZ6FOw2AFza9MN/9AtoPYPr/febXpLEktOzMdmMeDv6c3OrB3Bz+Dcod3R0ZPXq1bzyyiu8++67dO7cmRVbF4MEp/MPMzhsfLVZFqtSZFZKJrtKTSvHAIieAaEJO336ND/88AM//fQTaWlp9O/fn2nTpjFo0KAmmaWuMbBYLERHR+Pq6sr27dvrPZCTZZmjR4+yefNm1q9fz6ZNmzAYDOh0Otq3b0+HDh1o3749ERERhIeHExYWho+PT53bYTQa2bFjB1u2bGHJkiUcP36cQYMG8f333xMWFla+35qEXziWux8vRz/ubPcMtow48mJ+pPifDWD7t8tbF9AKlxY9cAqP5vYpb3AyKQNJkjh58mSla5tzUyg6uIbiQ6sxZydW2u7UvAveAx7CJbJ3ne7tQjJKk/nt1LeYbWUEuTZnXMv7cdRUX8Do66+/5rHHHsPBUcd7Mc9gk6zc0fYpAlxqX676290vUqy2MjjTmU43vlUft3HNEMGA0KTY7XZWrFjBF198wcaNG/Hw8OD222/nkUceoWPHjhc+gXBVe//993n55ZfZs2cP0dHR9XJOWZbZs2cPc+fOZcWKFaSlpaHT6ejduzfDhw+nX79+dO3a9bJXlZRlmZUrVzJ58mTsdjsnTpxAr9eTUhTLolNfAxK3hNyGZvMiig+vLT/OMaQ9bl1uwrX9QLTu/oASNDVv3pxu3bqxYsUKkpKSaNas+oemOSeJstSj2AyFqJ3dcWzWEZ1XyGW712xDGgtPfoXJZiTENYKbWz2AVl3971eWZcxZcWxZ/D1zZn9H0GODCO4aytCwW4jy7Vmra9plG5/sex5ZkphojiK09z31dTvXBBEMCE1CUVER8+bNY9asWRw/fpzrrruOyZMnM378eNEL0EjEx8fTrl07nnzyyfJZ8peiuLiYOXPm8O2333L06FGaNWvG+PHjGTFiBH369MHZ+cqV2T1fUlISbdu25amnnuLd/5vBT0c/JrcskzayP63+WIpsNoIkoe84DK++95AnufPPP/+Ql5dHQUEBycnJ/P7775w4cYKtW7fSv39/Pv74Y5544okGuZ//KjTl8suJLyi1FBPoEsaEyIfR1RAIlMbuJmftp5SdOVb+2T+dIkls2Qz3oiAeHFi7FNT5Zdn88M/7qGw2HvG/B+fmnS/1Vq4pIhgQGi1ZltmxYwfz5s1j/vz5GI1GxowZw7PPPkuvXr0aunlCPbLb7QwYMIDk5GQOHz58SUmf8vPz+fTTT/n0008pLi7m5ptv5v7772fIkCFXTUnp119/nffff591h5exr2gjOhv0X7UFncWKU1hnHG54jE/n/c6iRYuIi4srP06lUhEUFETv3r158MEHGTJkCMOGDcNisbBp06YGvCOF0VrKLye+IL8sGx+nQG5t/Xi1aYHtZiNZf3xA4d5lAEgaHU5hnZHUWg7LqRzv2IrifQl08LmtVpUqTyZt4Y/sP9AXlvBgv09RaS9vT8/VRkwgFBods9nMokWL+PTTT9m3bx8hISE888wzPPzww4SEXL6uTaHhfPHFF8TExLBx48ZLCgTWrFnDww8/TF5eHg899BDTpk2rc8ney+nZZ5/l62+/ZueZdWj1Glr+cxKdDXxGPMMf8TJTeg/HYrFw9913c8MNN9CzZ0+8vb1xcXGpNPnwjjvu4J577uHUqVMNugzTareyIvZH8suy0es8uLnVg9UGAtbSfM78+DRlKYdBkvDoORHvQY+gcVUmF6bv/47j8kmaBeu5bexE5F8XcsstNa8syEo/CBpwt+uaXCAAIhgQGpGioiK++uorPvnkEzIyMhg6dChr165lyJAhokBQIxYbG8sLL7zAk08+ycCBA+t0jpKSEh599FHmz5/P4MGD+eGHH67KIOAcvV7Pe98/T54+HUdDGaEpeZxsfgt3P/cle/bs4Y477uB///sfvr5VZ+k738SJE3nuuef47LPP+OKLL65A6yuTZZk/kxaTWhKPTu3Iza0eQK9zr3Jfm7GI1NmPYMo4hcrJjaDbZ+LSsuK8ALfm3SHhJGg1tA/Sc+uttwLUGBDkFCWClwZvl/pfFXEtEN+QwjUvPj6ep556iuDgYF599VVGjRrFkSNHWLduHcOGDROBQCP39NNPExAQwP/93//V6fj09HQGDhzI77//zty5c1m/fv1VHQgAWM2llLmnAhBwOJ4xX+xnzMMvolKp2LRpEz///HOtAgFQluc99thjzJkzh4KCgsvY6urtz4zhaO4+JFSMirgLH6fAKveTbVbS5j+HKeMUar0PzR6ZUykQANColayLdpXET998hk6n49Zbb2XRokVVntduKiVfLgXAP6BTPd3VtUV8SwrXJJvNxh9//MGwYcNo2bIlCxYsYMqUKSQkJPDtt9/SoUOHhm6icAXExMSwevVq3n//fVxcas6WV5Vjx47Rp08fzpw5w19//cU999xz1eeVkGWZfevfxuCgRmeyMGDUe6yMOUBGRgY7d+5kwIABF33Ohx56CIPBwMqVKy9Di2uWWHiSmNQ/AOgfOorm7tUXNcr7aw6GuN1IOmdC7v0CB/8WVe53biKcJENE8zD279+PTqdj0qRJLFu2rNL+xce2UOym/PvxD2iaq4pEMCBcUywWC1999RUtWrRg1KhRFBQU8P3335OcnMzbb79NcHDT7OJrirKzs7nnnnvo2bNnrSaI/deOHTvo1asXLi4u7Nixg65du16GVta/wn3LOa7OBiDKvTNeYR1p164d/v7+dT5ncHAwPXv2ZPny5fXUytopMOWyKv5nZGTae3eji9/11e5rzk4iZ+M3APiPnY5jUJtq97XbldwKKtmO2sWT9u3bs2/fPrRaLRMmTGDVqlUV9s84sQGrVoNKBm9Hv3q4s2uPCAaEa0JRURGffvopkZGRTJ48mT59+rBr1y527drFfffd12DLvISG8+yzz1JaWsrChQsveiho6dKlDB48mM6dO7N9+/YKCXyuZpaCdOI3f06eryeSDNGRN9fbuceOHcuaNWsoLS2tt3PWxGIz8XvsXMpsRgJdmjE4rOZUxtnrPgO7FZfW1+PWeWSN5zaZSwBQW23ofJS/2w4dOrBjxw7UajWjR49m48aNgDIHIT3vBADeOh/Udah22BiIYEC4qsXHx/P0008TEhLCs88+S+/evTl06BDz58+nZ8+eV32XrnB5lJSUsHDhQp577rmLfpD/9ttvTJw4kVGjRrFu3borXrvgUmT9MZOUIE8Amru3qXaSXV3ccsstGI3GSm/Nl4Msy6xPWkyOMR1njZ5RLe6ptroiKL0CJceUpY++I5654H/3JTnKckodGtQuHuWfR0dHs2XLFiRJYtiwYWzbto2iQ2spclNeJvzdIy7xzq5dIhgQrkrHjx/n7rvvplWrVixYsIAnnniChIQE5s+fT1RUVEM3T2hgCQkJmEwm+vTpc1HH/fzzz9x2221MmjSJBQsW4Oh47eSgNyYdpPjoJtJCAwBo59OtXs/fokULOnTowIYNG+r1vFX5O2sbJ/L+ViYMtrjzgkFN4f7fQZZxaX19tfMEzleUGw+Ai1Pl6om9e/dm/fr1yLLMgAEDSIv5hUIPZTnqxVY5bExEMCBcVWJiYrjxxhtp164dmzZt4pNPPiEpKYl3331X5AgQyp17m09NTa3V/haLheeff5677rqLu+++mx9//PGqSSBUW7mbvqPIQ4/BxQmNSksL93b1fo3OnTtz9OjRCp9Z7RbiCo6xPyOGf3L2UmwuvKRrpBTHsSVFmah4Q+hNhOhrfrjLskzxkfUAuHUddcHzy7JMcZHy78LNK7zKfQYOHMiqVato5qFBnZ9Aoafy78nPuel+xzTNwRHhqiLLMtu2beP1119n8+bNREVFMXfuXCZNmnTZ870L16awsDBuuOEGXnvtNQYMGFDjMrpt27bxzDPPcPDgQT788EOmTp16zQ0vmbMTKT21nYx2Sjd2c7fWaNW6er9OeHh4eSZCu2znYNZ2dqZtoMxmKN9HJamI9r+B64NHXFRFQIAiUz4r435Cxk5br6509et7wWPM2YlY8lKR1FpcW194f1PacUpVSkVFr8DqexGHDx/Oz288RFnubkyODkhI+Dk33QnIIhgQGsy5wivvvfceO3fupGPHjixbtowxY8Zcc1/WwpX31Vdf0bdvX9q3b8+tt95Kz549iYiIwNHRkcLCQvbu3cu6devYtGlT+UTBHj16NHSz66TwwAoAcsOaAxDhUf+9AgB5eXm4ublhsJSyKn4eycWxALhq3QlyDaPInE9GaQp7MzZTaMrjpog7kGoZEFhsZn6Pm4vRWoqfczBDwibU6r9zQ9weAJyad0XlcOGJwoUHVmJ0VYZ/3J2rXxkg2234FZ0g2dsDgNSTmZx2Pk27dpfnd3u1E8GA0CBiYmJ4+eWX2b59O9dffz0rV65k5MiRIkGQUGtt27bln3/+4bXXXmP9+vWVsue5uLjQvXt3Fi1axPjx46/pf1slx7Zg0WrId1buobnb5UkbfODAAXr27caik1+SW5aJVqXjhtBRRPn0LO8FOJl3kDUJv3Aq/xA70nzpEzz8gueVZZl1SYvIMpzBSePCmBb31Lpnw5h0EACn8Asv/bRbTBQdXINhmLKvh0PlOQPnGOL2YC3KoqClkpMk4eAZejzSg6NHj14zq0vqkwgGhCvq4MGDPPPMM2zZsoXOnTuzfv16hgwZ0tDNEq5RAQEBfPvttwAUFBSQmpqKyWTC2dmZyMjIa25eQFWsxTmYs+LJC/BBBjwcfNDrPOr9OoWFhRw79Q8T3ruB3LJMXLXujI98CB+ngAr7tfbqjE22sSbhF3anbyTcvQ1Brs1rPPeOtHWczDuISlIxqsXduDl41bpdZSn/AOAUeuGJwyX//EmxZEJWqVBLGlxr+D0V/a2smigKCgZsDOw+jOUfKr1Ip06dqnUGx8bi2g2VhWtKZmYmjz/+ONHR0WRlZfH7779z4MABEQgI9cbDw4MOHToQHR1N27ZtG0UgAGBKPwVAUajythp8gQdvXf2+4ndunzEC2dmCq9adSW0erxQInNPOO5p23tHIyKxNWIjFbqn2vAezdrAr/U8ABodNIPQCEwbPZzMWYclLAcAxpP0F9y/Ys4QSvZJJ0MvRt9o5DXazkeKjm7CpVOQ5KPkK7x7zAG+99RYFBQV07dr1iuVbuFqIYEC4rIqKinj11Vdp0aIFCxYsYObMmRw8eJDRo0eLeQGCUAuWgjQACr2U5XeBLs0uy3UOFG6hRXQoOpUD4yMfxL2GLnaAAaFjcdW6kW/KZseZdVXu80/OHjYmK+l/ewUNJcrn4uZsnAuENB6BqJ1rXn5Yln4KY+IBis8uE/Ryqj4jY+mp7chmA8VhEdix46p1w03nxauvvsrDDz9MamoqN9xwA3a7/aLaey0TwYBwWRiNRmbOnEl4eDgffvghTzzxBPHx8UydOhWttvrkIoIgVGQzFiMD+U7K17W/S/0XUdp1eguh1yld9yMibq+2UND5HDVODA4bD8C+zC3EFvy7JFGW7exK+5N1iYsAmc5+fegVePG9gOeCAceg6usVnFOwSylCZAxVeh58a7iH4iNKT0VRa2W+QIi+RfnLyddff83AgQPZv38/991330W3+VolggGhXtlsNn766SciIyN5+eWXmThxIqdPn+a9997Dy6v244SCIChUGh0mRx0mNUhIeFfTdV9XBksxW7OUQkEdvXrR0uPC3fHntPBoT2ff3gD8EfcTO9PWczRnL7+e/JLtaWsB6OZ/AwNDx150T6Asy6TkHycpPBhzYPMa97WVlVB0UJkD8G8CoaqXCdqtZkpOxACQ6+EKQIjrv/kIJEli9erVhIeH89NPP/HTTz9dVLuvVWICoVBvDh48yH333cfBgwcZMmQImzdvpmXLlg3dLEG4pmncA8rHwT0cvNHWkLa3LtYnLEHlAOZ8mQFdx1z08f1Dx1BqKeZ0wRF2pK0v/1yj0jIgdAwdfa+76HMaLCWsTfiVhAAjBLTlBOmMLYqlmVvV3ydFf69CNhuRAltQYFfqEvhXEwwYE/Yjmw3g5kemNReAEH3FNMQODg7s3r2bkJAQHnnkEUaNGoWnp+dF38e1RPQMCJfMarXy5ptv0qNHD2w2G7t372b9+vUiEBCEeuAQ1IZSV2V9vYeufnvX4guOEVf0DzarnSGhE9DUoUiPWqVmVIu7GRp2C83dWhPsGk43//7c3+GFOgUCxeYCfj3xBQlFJ1DZ7GgsVizYWJ/0G7IsV9pflmUK9ynzEszdBgMybjpPnLX6Ks9fenIbAGVRPbHKFpw1erwcK88v8PX1ZebMmZSVlXHrrbde9H1ca0QwIFySgwcP0q9fP95++22ef/559u7de80mdhGEq5HOK5gyX2X82zm/oN7Oa7Vb2Ji8HIAzewro1qZXnc8lSRJRvj0ZH/kQk9pM5obQm+q0/NFit7A8dg75phz0Gjf6btzNoDXbUUtqCk25FJpyKx1jSjuBKe0EkkZHcbAynyKghkmWpad2AJATrPxOm7m1rHYI48knnyQyMpINGzawa9eui76fa4kIBoQ6SU9P55577qFr167k5+cTExPDO++8I9IHC8JlYA5RxrRVp/ZhLc6pl3Puy/iLInMeBZnFjOtyV72c81L9lbKiPDHRaOd+6ItLcXYLwE2ndNEXWyrXRTiXL8C1bX/SzRlA9csvrUVZmLMTQFKRoTMBEObWqtr2SJLEL7/8AsC0adPqfF/XAjFnQLgodrudWbNmMX36dBwcHJg1axYPPvigWCEgCJeR0dkJjPk4FuSROudxgm77AJ1vcwDsJgPGpIOUxu7CmHAAc3YidosRrbs/btFj8R7wINJ/si8aLMXsydgMwNGVybz1Vf8rfEeVJRae4lD2TgBGht+B48nDFAI6nzAcNc5ggjKrscIxst1G0WFlWaNrpxGklWwEINi16gJFhri9AEihbck0Kks2m+mrDwYAunbtSnh4ODt37iQrKws/v+pTHF/LRDAg1FpsbCyPPvooGzdu5PHHH+edd95p9JNqBOFqcO6N2MWuw5R5ioSPx6L1DgW7HUtBOsiV18Nb8tPI/fNLrEVZBIx7pcK2nWkbsNhNpBzLYEzvSQ2e88Nqt7IxeQkAnf360Nw9kqxc5Y1f6x2K9WxSo/9OnjQmHcRWnI3KyQ1DaDimU2Xo1I74VlOK2BC/D4DCyHbI5OPl6Iebw4W/w5599lkmT57Mp59+yowZM+p8n1czMUwgXFBRUREvvfQS7du3JzY2lvXr1zNr1iwRCAjCFWC1WzBalWx4kXd9gUvrviBJWHJTsOSfAdmOxiMQt+gxBN76Ls2nLCHixXX4j30FJInCPYsxZZwuP1+hKY/DObsB2D7vMJNundQg93W+v7O2UWDKxUXrxvXBIwCw5itv7lrP4PL7d9RULFRUcvwvAFxb9yXVkAgoywSryzxoiFd6BjK9lcmF4e5tatW+++67D41Gw5w5cy7irq4tomdAqJbVauWbb77hjTfeoLS0lJdeeonnn38eZ+cLVw4TBKF+lFiKANBIGly9wtHf+7lSryAnCSQVOq8QNG6V8+h79JxA6altlBzbQvGRDTgEKN3hu9L/xC7biN+fyrCeo+tlno8l/wyFe5dTcmo7lpwkUGlwatYRr/7349y8S43Hmmxl7ElXyiZfHzwcB7VScdBSkAmA5O5HiekgAG7/WU1RejZfgEvbfiQVKQFPdd3+1qIsLHmpyJKKMxQASino2nBycqJnz55s376d1NRUQkJCanXctUT0DAiVyLLMihUr6NSpE0888QSjRo3i1KlTvPHGGyIQEIQrrNSsBAMuWrfy7nyN3gfn8Gicm3epMhA4x6V1XwCMyYcApVfgaI7SVb76y6089NBDl9Q2a3EuGcveJv7D0eRu/g7TmWPYTaXYjYWUntxKyjf3kb/jlxrPcTBrO2U2A56OvrTz7nbeubMBKHZWhgYc1U44ndczYCnMxJydCJIKhxbdSS2JB6BZNRMCDfH7AShr0Z4SaxEalZbg/+QXqMlLL70EwIsvvljrY64lIhgQKjh16hSDBw9mzJgxBAQEsHfvXn744YdGGQkLwrWg9GzPgIvO7aKPdQhQSh2bMpUH5d6MzcjYyTpZSOvAqEsq1Vv09yoSPh5L4Z4lYLfh3LInARNn0PyZZYQ98QtuXUcBkLXyfUpjd1d5Dpvdyt9Zyrr/ngGDyrv3ZVnGdnbVRK5GmfXv6xxUYW7DudLGDoGtSbfmYLVbcNW6VVtc6dwQQU4LJV1xM32ri0rgdOONNxIUFMTChQsxGAy1Pu5aIYIBAVDKl7766qt07NiRxMREVq1axZ9//km3bt0ufLAgCJdNiaUYAFftxQcDOl/lYW8rzqakNJN/cpQH4tJP1jNpUt3mCtjNRtJ/e5X0RdOxlxXjENSG0EfmEPrAN7h3uREHv3Acg9sSMOEt3HsotQsyl72DbLNWOtep/MOUWopx1brRxuvf4QS7qQTZpkwaTLNkAVQqk1yWfBgAp2ZRJBQeB6C5e5tqJ0Ma4vYAkO6mBAAtPNpd9L2/+eabWK1Wnn/++Ys+9mongoEmTpZlPvvsM5o3b86HH37ItGnTOHLkCCNHjmzwGcaCIPzbM1BdRr2aqJ3cULsq4+z7kzdgk62oSx2JP5DKTTfddNHnsxZlk/LdgxQdWAmSCu9BjxL2+M9VzguQJAm/kVNRu3hiyUsprwdwvnNLCTv69kKt+rfktK0kT/mDzpmU0kQAmukrZjQ1pv4DgENoR+LPBgMR7m2rbLcl/wyWvFRMTo5k2fMBCK9m35rcf//9uLm5MXv2bEwm00UffzUTwUATlpWVxahRo3j66aeZNGkSsbGxzJgxQ8wLEISrSMnZZYWu2ppL+FZH5xeBTaXin1KlquChVXH07t0bHx+fizqPOTeF5K/voSz1KGpnD0If+AafwY8iqaufh65ycCkfLij5Z2OFbUWmPM6UJAASHXy6V9hmPRsMGPwDKbUo4/vn9wzIdnt5RUOjXwAFphzUkrraBELnsg7mtesEgL9zCHrdxf8+VSoVI0aMwGQy8ccff1z08VczEQw0QbIss3TpUjp06MCePXtYtWoVX331FcHBVRf2EASh4ZSYlWCgLg8vAAffcM6EBlCGBVetO799tYIxYy6uIJE5J4mUb+/Hkp+G1iuUZo/Pw7lF9wsfiLLsD8CQsK/C5yfylEmNofqISqmLbWcnD2YEKwl+mulbojlvfN9SkK4UJlJrSZYKzp6nJbqzKxH+q+RsPYLMEGU+QUuPDrVqe1XGjRsHIIIB4dqWnZ3NqFGjGD9+PL179y4fEhAE4epUbC4AQF/HngG1ZyCJLZQJwG4lgZSWGBgyZEitj7cUpJMy+xGsRdno/FvQ7NE56LxDa328Q5CyfM9amIndVFr+eVyh0lMR6dmx8jXz05GBVF+Xs/t0qrDdnJ0AgNYnjNiz52nlGVXl9e0WE4bY3Vg1atI1ZQC09Kx7MNCzZ09AqcvSmIg8A03I1q1bmThxIjabjWXLljFmzBgxL0AQrmKyLP8bDNSh8A9Ars5OkYsbajsc/TMePz8/oqKqfnD+l81YROqcyVgLM9D5hhP64HdoXC+ucqLayQ1J54RsNmItyUPn4EKZ1Uh6SRIAER7tKx1jzk2h0ENPkQ7UkqbSw/tcEiVrUDgZhhRAokUV5wEwxO5CtpSRExmJDRseDj54V1GlsLZ8fZWlnCkpKXU+x9VI9Aw0ET/++CMDBw6kTZs2HDp0iLFjx4pAQBCuckZrKVbZCki41jEYOG5PBaCZQcO6PzYwcOBAVKoLf/XLNitp85/DnBWPxs2PkPu/uuhA4ByVzkk5p0V5Mz9TEo+MjKeDL25V3Jcp8zTJ4cqwZUvPDuWJiMq3p58EIC1ImfcQqo/ApZoJlsX//AlA1tmS6pGeHS/pu8/Z2RmVSkVpaemFd76GiGCgCfj000+59957uffee1m/fj2BgYEN3SRBEGrhXK+Ai9YVjeriO3JNtjIStcrSxObWAPbt28fw4cNrdWz22k8xxO1G0jkRfO/naD2qXr9fG7JVWSYoqZVx/7SzvQLB+soFhexWMyVZsZxpplyvo891lfY5N3kw0dkMVD3UcO66Jcf/wqZWkeZkA6ofTqgtSZJwcnLCZrNd0nmuNiIYaORmzpzJlClTeO655/j2229FdUFBuIYUmpVZ9f9Nw1tbx87EYFNJuBaVcDpJeRuuTTBQfHQT+dvmARB4yzs4BtYubW9VZJsVe5kSkKiclFwJmQaltyLApfLcA2PCfpJCvLFpNHg7+hOqb1Fhu91sxJydSImrEzn2QiRU1QYDpbE7sRuLyGkejhUbbjpP/J0vPYGai4sLdnvl4lDXMhEMNGI//vgjzz//PNOnT+eDDz4QwwKCcI0pNJ0NBmpRWa8qh5OVLvKIIhXL/9xF165d8fevebzcUphJxpI3APDsezf6DoPqdO1zrEVnawyotaidPQDIL1NWC/g4Vu5tyD+yjvhWSrKkaP9+lb63TBmnQbaT3kJJJRzm1qraHAzFh5TyxpmtlWAm0rNTvXwPOjs7i54B4dpw8uRJHnvsMe677z7efvvthm6OIAh1UGjKBcC9Dj0DqYeWkeNoR7LbaRkxluXLlzNhwoQaj5FlmYwlb2A3FuEY3A7foU/Wqd3nM+edAUDjEYikUiHL9vLcCf8NcmzGIv4pOozJyQFXlTPtvKMrnc+YfAgZOBOqBBJV7QNKD0Lxsc1YzxsiaOPV+ZLvB8DV1VW5RiPqHRDBQCNksVi45557CA0N5YsvvhA9AoJwjcovU/LzezrWPkGQLMvk71zIgSPzAQi0OrEq5hRWq5X77ruvxmOL9v+O4fROJI0DARNnIGkufVjRfLYugs5PmR9gsZuxy8pD1FHjUmHf9G1zORWpDB1cFzISdRXzJMqSD5Pv7U6Jg4RWpat2FUHJsS3IZgM5rdpgxYaHgzd+zvWTS0WvV3oiLBZLvZzvaiCWFjZCH374IXv37mXHjh0im6AgXMPyTUp3uqej3wX3tZWVUHJsMwW7f8OYfJi0ob0A6NhqLHdOfpibbrqJgIDqJwFai3PJWvURAD5DHsfBr/LkPlmWMWfGYc5NxjGoNVrPCz9cTRnKzP9zJZSt9n9rFGikf1MQm3OS2VG0B4tnAF6SnijfHlWez5jyDykRQYDS7a9TV12CuejQGgDSW7UAjLTx6lpvL0Y6nQ6gUQ0ViGCgkTly5Aivv/46zz77bHlyDEEQri3WkjwKT2+n2FagfLB/A4X6QDR6b1QOriDbsZUVYy3MxJybjCn1GIakv+FsMaBiL09K9S6oJQ1Zx4s5ePAg7777bo3XzF798dnCQ23x7HNHpe2mzDgyl71dXi0QSUXAhDdxP5tuuDplZ5S6AY5BbQAqPLxNtjIcNc7IVgv7NrxFSqsAkGWGtL6rvILh+WylBZSVZJEWqswB+G8a43OsJXmUntqBWaclXafUEDi/ENKlOhdUyLJcb+dsaCIYaGRefvllWrRowVtvvdXQTREE4SKZc1PI2fAlxUfWU6h3hsE90ZrMlKydRUktjtf5NkffaSSZ4d6Qt5MI97Z8+vZntGvXrsZVBIbEvyk6uAokCf+x0yvVGyg9tYMz859FNhuQNDrULl5YCzPIXv0xbp1GVFufQLZaMGXEAuAYrFQJ1Ki0OKqdKLMZKTTl4aBy5NiKV9nTXBmH7+rZnRB9RJXnK0s7TlqIPzaNBk8HX4JdK/dewNncAnYrWR26YceOr1MQ3k4X7l2pLREMCFe1zMxM1qxZwxdffIGDQ9VdZ4IgXH1ku428v34gd+O35aV7y5opSXI8JGfcutyEtSgLa0kustkIkgqVgwsavQ9a71Ac/FviHNENnW9zZFkm9ugHALiZ/VixYgXffvtttV3kst1G1sr3AXDvNg6n0IrZ/krj9nDmp6eRbRacI7oTMPEdNK5exM4YhK00H1PGqfIH/X+Zc5PAbkXl4IrG49/8JoEuYSQUnWBn2nr8YmPZF2DEptUSpPalX8Qt1f6eTOknSYpQlgZG+fao9p6KDyurCNKaBQEG2nl3rfacl0IEA8JVaeXKlciyzMSJExu6KYIg1JK1JI/0X1/EELcHAOeW1+E7Ygo5ciKk/0lAUDSBvat/QP5XXlkW+WXZqCU1G36Nwd3dnTvvvLPa/YsOrMSUdgKVoys+Q5+osM2ck0TavKnINguu7QcRNOm98kmFKp0zdmMRcg0z6i25Sj4BnU+zCg/unkGDSSg6QVzhMeJ8AbT448a4qKcqlDL+r7SCWAqD3FDJEu29q55TYCnMxJh4gFIXJ7LUBiQk2nhdnmCgMRHBQCNy4sQJwsPD8fKqW4ISQRCuLHNOEqlzJmPJS0XSOeE/+iXcuo5CkiSyY3cC4ON0cZn/4gqUwj2h+pZ8+etMxo8fj6Nj1dX87GYjORtmAeA94KEK6YZlq4W0X17AbirBKawzgZP+rzwQsJuNWM9WFtS4+VbbFpuhAAC1q/e/55Vl3JLi6Xgshdhm3sgqFW3dO3J9h3vRqnU13ttJh0LAgQiVH85alyr3KTn+F8gyGVGdAQhzi8RV51bjeS+WGCYQrmqnT5+mVauq63kLgnB1KUs/Rer3j2ArzUfrFULw3Z/g4N+yfHuOIR24+GAgvlCZsOdq8uH06dN8/PHH1e6bt3Ue1qJstJ5BePS+rcK23C2zMaWdQO3sQeBt76PS/PugNiYfBrsNjZsvGrcaxuLPPjRthgJkq4XS2F3kbplNWdIhmgEt81oQNOl9HAJaVn+OswyWUpI9lWAkSl91xkE4u6QQSA70ACy08+52wXNfLBEMCFe1tLQ0Onfu3NDNEAThAkyZseWBgENQG0LunYVG/+/bs8lWVp6K2Pci1saXWQ2klSQCELc3FY1Gw4ABA6rc11qSR17MXAB8hj1V4WFvzk4id8v3APiNeQmte8WshSXHtwDg3Kp3jcv1nCOUB3FZyhFOvfrvzH9J44Dn9XfiPfAhVNqqey3+60jOLuwqFe75RQSFVh082E2lGOP3kuvjSanKgk7teEnlii9EBAPCVamsrAwnJ6eGboYgCDWw5KeR+sNj2ErzcQxuR8gDX6N2qtiNnX22V8BV646Tpva5QpKLTiMj4+Xox4Y/dxIdHY2LS9Xd6bkbv0Y2G3AMboc+amiFbVlrPgabFZfIPpW2yVYLxYfWAqBvX3OqYq1nMJ7X30X+zl/AZkXt4olb5xvx6nd3zT0K/2GzW/k7azsA4bHJaHpW3e1vSDiAbLNwJlKpZ9DasxNaVf3XYxE9A8JVzWw2i1UEgnAVs5WVkPrjk1iLstH5tyDk/q8qBQIA2cY0APycgy7q/ElFpwFo7taarVs/57bbbqtyP3N2IgV7lgLgO/IZpPNKGhuTDlF6/C9QqfG98dlKb/7F/2zAVpqPxs0Xl8jeF2yT343T8Bn8KHaTAbWrd4Vr1dbJ/EOUWopwMJoISslE0lb9PWeI34tFoybN3wOADj5VTzK8VCIYEK5qJpNJBAOCcJWS7XYyFr2COTMOjZsvIfd9idrZvcp9sw1KMODjdHHlxpOLlTX9HviTmppKt25Vj5dnr/kE7FZc2t6Ac0TFxD05G78BwL3r6EpZCGVZJi/mR2V7j1uqzS/wXyoHF1QOVfdQXIgsy+zN2AxAeFwKKlkuL4X8X8aE/aSFBmBTgZejH4Euzep0zYtpW2MhgoEa2O12Tpw4wcmTJzl58iTZ2dlkZGRgMpnw9fUlICCAwMBAOnToQLdu3cpTVDYUi8UiShQLwlUqf9s8So5vQVJrCbrzf5XG4c93rsSvv0vty+0WmwsoMOUgIZF5Uplv0KVL5ax7pad3KmP+KjW+w6dU2FaWdgLD6R2gUuM14IFKx5Yc24wp/SSSzhnP667MEuaEwhPkGDPQqnSExSu/F6p4CNstZZSlnSS5v7KMMMqn52Wry9IY672IYKAKR48eZd68efz888+cOaNU3HJ3dycgIAB/f38cHR2Jj48nPT2drKws7HY7zs7OXHfddQwdOpTRo0fTtm3bK95urVbbqApnCEJjUZZ2guz1nwPgN+r5Sol9zme1W8gxZgDg71z7YOBMSYJyfudgDm08gl6vp0WLFhX2ka0Wsv6YCYDndbdWevM/99av7zAEnVfFa8s2Kznrv1CO7X0bahePWretrmRZZnf6RgA6evdAa1l99vPKuQ1M6aco1DtR6OmGSlJfllUEVbWvsRDBwHni4uJ48cUXWbx4MV5eXkycOJEJEyYQFRWFr69vldGgxWLh4MGDbNmyhZiYGN566y1efPFFxowZw2OPPcaQIUNQ1WGMrC50Op0IBgThKiPbLGQsfg1sVlzbD8S9R81lhLMN6dhlG04aF9x0njXue760kiQAgl3D2XhiOW3btq303ZO3dS7mrHjULp54D360wjZrUTbFRzYA4NXvnkrnL9y3TDnW2aPK7ZdDSnEcaaWJqCUN0QH9STv7+bksjecrO3Oc5HBljkVLjw7V5iGoD+eeBY2phLEIBgCr1cr//d//8c477+Dt7c3cuXO57bbbatXtr9Vq6d69O927d+e5557DZDIxf/58/ve//zF8+HBatWrFK6+8wp133nnZgwKdTofZbL6s1xAE4eLk7/gVU/opVE7u+I+ZfsEu5vIhAueQi+qOTi9VgoEAl2akpKTQrFnF8XJTxmlyN34LgO+Nz1aauFiwZwnYrTiFdcYxuGLPps1YRM76s8mJBj1S5aTHi2E3GSg5EYMhdhdl6aewleYjaXQ4Bkbi1nU0Lq2vR5IkdqatB5SJgHoHD5BUINvLCzKdrzTjOGeaKXMsonwub5E2MUzQCCUkJHD77bezd+9enn/+eV555ZVLKvvr4ODA/fffz3333ce2bdv45JNPuOeee/jwww95/vnnmTRpEhrN5fm1Ozo6UlpaelnOLQjCxbOW5JG78WsAfEdMqZBLoDrnBwO1ZbNbyycdBrqEkpaWRocO/w5F2M1G0n59CdlmwaVNP9w6j6xwvGyzUrhvGQAeVcwFyF73OTZDATr/Fnj0rH1q5P8yZcaSv+1nig6vU2os/IclJ4niIxvQdxyGdfj9pJbEo5bU9AgcCICk1iBbzVX2DMSaUrBqPdFLToS5XTiJkVBRkw4G9u3bx/Dhw3Fzc2Pr1q306tWr3s4tSRJ9+/alb9++bN++nRkzZnDXXXfx/vvv89tvv9GmTZt6u9Y5gYGBpKen1/t5BUGom9zN32E3leIQ3A736DG1Oia95Nwbfmitr5NXloVNtuGgdsTdwZvMzEwCApTMhbLdTsbi1zBnxqLW+xBw82uV3mxLTsRgLcxE7eKJ639yBxhT/qFwz2IA/Ee/WOsVBOez5KeRs34WRYdWl0/+03qH4tp+IE7NOqFx88VuMlB6Yiv5u36l6PA6dofYwQk6+PTETeehnOhs3YL/zhmQbVZifZR2RXl0Qaqi/LFQsyYbDCQnJ9O/f3+ioqJYtWrVZc3n36dPH1avXs3+/fu566676NmzJwsWLODGG2+s1+uEhoayY8eOej2nIAh1Yy3OoXDPEgB8hz1Zq/X1JlsZuWVZAAS61n5ZXLZReQnwdQpCkiTKyspwdHREttvIXPa2MhdArSHotg/Q6H0qHV+wayGgVC1UnbeG32w1smPXJ5zp3QnZw5csXTbRlhKcta61apdst5G39Sdy//wa2WoCwLXDYDz73IFTWOdKQYlLy564RPZm/9o3yHGSUaPiusB/gxNJUiED/GesPiVtH4UeelQ2Ox1DBteqbZdCDBM0ItOnT0ev17N27Vrc3ate61vfoqOj2bVrF3fddRejR49m1qxZPProoxc+sJZCQ0NJSkqqt/MJglB3+TsWIFvNODbriHPL62p1TEZpCiDjpvPERVv7cfm8swGEl5OS1U+lUuFkKST1+0cxxO8FSUXgLe/gHF65ep85OxFD7G6QJDx6ji//PLnoNKtPzqE03OPsJzI5GZs4lX+IW1tPvmDxH3PeGdIXvkRZ8mEAnCK64TdyKmpnd0qOx1C4ZwnW4mwktRYH/5boO4/AMbA1Tq2u43RuF8BGy6wyXHX/fj/Ldpvyh/9UNjyUrbwEheSbcHGo36JETUWTDAby8/NZuHAh77333hULBM5xc3Nj6dKlTJ06lccee4zS0lKmTZtWL+eOiIigoKCA/Px8PD1rPwtZEIT6ZbeYKDyb4c+r3721fpPMKE0GlEmA/yXb7ZjST2BMPIg5JxFbaQGy3YZK50RGoAxO4JCWTM7pr/l8TDA985ZjyJORdE4E3vIO+g5Vpw7O2/YzAC5t+qH1DC5fzrc9bS1I4FRqpINjK7xa9GZn2gYKTLmsiv+Zia0fq/a+Sk/tIO3XF7Ebi1A5uuI7choaN1+y13yKIW535f1PbiMvZi6evW8n87obKNDa0JothO3ehbVvLhq9N7IsI1uVCdIViiZZS4mzpYEEbeXapzi+FOfuuzH1EDTJYGDr1q1YLBbGjx9/4Z0vA7VazSeffIKrqyvPPvssLi4u9dJDEBERAUB8fDzR0dGXfD5BEOqm5PgWbIYCNO4BuLa9odbHpZ8NBs7PnGctyaNg568U7v8da2FmlccVenQHJ3fkfWvITcumV6gjIOMS2Qe/m55H5xtW5XGWggyK9v8OgFffu7HLNjYkLeGfnD0AhCacoWumnRaPf4akUhPiGsGPxz4itSSe2IKjtKqiCFDB7t/I/P3/QLbjGNIBn2FPkbfl+3+DAEnCKTwa54geaD2DkK1llJ7eRck/f5K9eyFb/XJADW3SStCZzRgTD6CPGoJsKVNWEgAqh38neR/N2YtNAreCYkJ8r6/17/pSNKYg4JwmGQwcOHAAb2/vSktvriRJknjnnXcoLCzkySefpEWLFgwZMuSSznmufPHx48dFMCAIDajooJIcx63rTUj/6dKujizL5RUHg1zDsFtM5MXMJe+vOcqDEJB0zjiHR+MQ2AqNqw+o1MgWIyaHY4Ad75Bo3IOd+fbXPyh0i+Cj/5tV4zVzNsxCtllwiuiGLqwTK+PmEVvwDxIS7Q+epHlcMoEPflt+Dx6OPkT79WN3xkZ2pW+gpUf7Cg/G3E3fkbNBuaa+6ygcAyI58+MTyFYzkkaHR8+JePa5Ha1nxZoLHj0mUPj3KrYc/QGj2o6bWk97tRsl7Kcs7QT6qCHYDIXKzioNkk4JBuyynYNZyhBB87gUnMZG1ep3LVTWZIOB6OjoBo/uJEnif//7H/Hx8UyYMIH9+/fTsmXdl8R4eHjQpk0btm/fzp133lmPLRUEobZsZSUYTikPKLdOw2t9XL4pG6O1FI2kwb2wlKRFt2HOigfAIbgdXn3vxrXdgAoT/EAJIkwHXgAZmt34Im46D/6e9zdlZwprvJ4x6RBFB1YC4DlsMr/HziGx6CRqSUOfLA1ucck4t7wOlxYVi/1EB9zAvsy/yDKcIdOQUj6kkbPxG3L//AoAr/73Y85NJXv1R4BS6th/7MuVshqez962J/EWpQZBp1QDjl5tKAGsBUo2RmtxDgAaV6/y7+7EwhMUmvPQmi2EZJWg8w2v8tzChTXJ9RcHDx6kc+fODd0MQEla9Ouvv+Ln58ett96KyWS6pPNdf/31bN26tZ5aJwjCxTKc3olss6D1CcPBv/bB/ZmzvQI+sgtnvr5Pyfbn6k3gpPcImzwft07DKwUCAFa7GfvZ7nNHtVLCvFmzZiQmJlZ7LbuljIylbwLg3G0Ua4y7SCw6iUalZUzorbjvUDIReg96pNKxThpnWnkqb+D/5OwFIG/rvH8DgYEPY4jbS8mR9aDW4DfqBULum1VjICDLMhuTl2JXgW9mLh4HdqBy0gNgM5Uo91mg5FHQeASUH3cgaxsAoYlp6EM71qkiYl009Ivk5dDkgoH09HRSUlKuqm50Nzc3Fi5cyJEjR3j77bcv6Vz9+/fn6NGjZGRk1FPrBEG4GKVnewVcW/e9qOPODRG4nDyEbDXj0qYf4VOW4NZpeI0PH4v932x8GpVSqKxdu3acPn262peLrD8+xJwVj93dl+1tfUkpjkOrcmB8q4fwiDuFbDXhENQGp7DOVR7fwUepdHgy7yAFh9aU9wB4DXiQkmObKUs5gsrJndAHvsWz920XfHiezD9IUtEpsEOr/SeQy4r5+hPlnMZSJRgw5ygrpXReSv6FXGMWSUWnkGSZ5nEpOLe4vFkHz9cYJxA2uWDg3Ftzv379GrglFXXt2pXp06fz3nvvsXfv3jqfZ+jQoUiSxLp16+qxdYIg1FZp7C4AnFvVbjkhKG/GyRkHAPDMLcCr/wME3/VJrYoBVfU8ioqKwmazcfz48UrbCnYvpnDPYsw6LXuH9eeMIRkHtSMTIh8mRB9ByVGlMJBb5xurfdiF6lvirNFTZjNyJOZTQBn3Lz25DXPGadR6H5o9OqfKpYz/ZbCUsjFRyX647rsd2AqV5YO+Lsrjae2GjURGRrJ56U8ApBTLyLLM31nKd7l/Rh7OhjKcW3Sv4uxCbTW5YOD48eP4+PiUZ+e6mrz00kt069aN0aNHk5aWduEDquDr60t0dDRr166t59YJgnAhlvwzWAvSQaXBufmFH4TnnNnyNUUaK8gyraPvqnWSIgCN6t9ldha7svQuKioKlUrF/v37K+xbcmwLmSv+D6OjA3tGDiHblo+jxplbIh9VJi2ajRgSlaDEtU31L0wqSUUrfWsA0gK9cI7sjSknCVPaCUySI4sKW/PH1r/Jz8+/YPt/3fcNZXYDWQl5TB71PKERkQCMHKj0rET3GcDw4cPxVys9BFNnfE6f/r05kqWseGh+KhG13geHgMha/b6EqjW5YODAgQN06tSpoZtRJZ1Ox++//45KpeKee+6pc3nMkSNHsmbNGlG0SBCuMEO88vB1DG5XYflbTQr3r+D0UeXN2FN2IqDPxVUE1EgadGpHAErMBQDo9Xo6dOjA9u3by/crORFD2oLnKHJ1ZOewvhSozbhq3bi19eP4uyjj+WVnjoPNisbNF61P9autZLsd733KuTNC/JHcfDHG76XUbOfOn47x5fzfmTBhAv7+/owZM4b58+dXCgyKi4t57fPnyNemYbfJ3B79GGNGjy1PNWw1KPu37tKbj2e8jp+TDJLEm18uILCLO3bJhodZjXdOPq5t+l6x+QKNVZP67VksFv78808GDhzY0E2plr+/P9988w1//vlnnd/ux48fT2FhIZs2barn1gmCUBNDwj4AnCNqNyfJmHSQjGVvkeurJAlrHtDtoq8pSRKeDkqK4Rzjv3kIhgwZwurVq7Hb7RT+vYoz86aS7ufBjkG9MGjA09GX29o8gY/Tv72kpozTADgEta1xPDx/+884HdyKo9GEVaMmNm0HdllmcXYQK7cfITU1laSkJGbOnElmZiZ33nknvr6+DBw4kKeffpr777+fjj3a4xClLJnsFTyYThFKN7/dUACArTAbAK1PM4yJSpCl82vBgOEj6TlOyW8QfjoRCXBtN+Cif2+XojHNFTinSQUDx44dw2AwXHXzBf7rxhtvpG/fvkydOhWjsXJlrwuJioqiRYsW/Prrr5ehdYIgVEWWZQxxynwf54gLj19bi3M4M/85sFkpCFHezEP0EXW6drCrsqQuofDfOQLjxo0jOyuTQ3Ne5MziVznWPpx9vTthVUGovgW3tXkSN4eKNVksuSkA6HyqTlIEUJZ+ipx1nyMBIRYPAFLDgsjw68O7P60lLEw5tlmzZjz99NPs2rWLlJQUvvjiC5ycnNiwYQPHTx7jof/dgqOrA4EuYfQOHgqAbLNgKVRSK5vzlLaczDaRsE1JjGTyasnizT+jdgG70UbAqdOoHFxqne65vjWmoKBJBQMxMTHodDq6dq39WF5DkCSJr776ioSEBKZMmXLRwwWSJPHQQw/xyy+/kJWVdZlaKQjC+Sy5Kcp8AbUGp+ZdatxXtttIXzgdW3E29uBWFDpIgESovkWdrt3Soz2gzO7POVu0KLpVMAvubUtxyQFiBvckPlJ5SHf168v4Vg/jpKk8jGEtUr4vtB5Vz6mSrRYyfnsF2WZBE3Ed5nV/ApAV6EP049WvhAoJCeHRRx9l1apVHD16lDfnT8PBR8JR7cyNEXdgMVvZsGEDM195BuxWjBY72CzkG6z0HDyGwmNbAHjw9Vn8FbcGgPZljqjtdlzbD6yQnliomyYVDGzZsoXrrrsOZ+fajeU1pPbt2/Pll1/y7bff8vHHH1/08Q899BAqlYrvvvvuMrROEIT/Kj2prHl3CuuMSudU4755MT9iiNuNpHXEcuMDAPg5B+Gkcam0r91SRsnxv8hZP4uMZe+Q9ceH5O9cSNmZY8g2ZVlhiD6C5m6tscpWFp74knV/vcHajS9QcGc/9vbpTKneBWeNnjEt72NAszGoq8mKaCtVxunVLlXXNsmLmYsp/RRqZw+2H0ulo8qIV04hsiRxKKdyzYGq7M/8iyM5uwGJVrbuTH38OXx9fRk6dCintq9S2qFTqiI6Nu/CoY2L8XPVImsceeXHn4joEoIKFaF/K0Mybp1G1Oq6Qs2aVAbCQ4cOMXr06IZuRq3df//9nDx5kueff57w8HBuvvnmWh/r5eXFnXfeyddff82LL76IWl27lKiCINRNyfG/gJpn4YMySS9nw5cA+I9+kZ0UANBM36rCfnazkbyYueTv+AW7sajKc6kcXHEMaYfWM5iuko1cXyvFTkb+cQFaKevxzUYz3qYw7un/OA6amoMU29nrqJwqV/4zZyeSu+lbQMkn0Pn3mYBEV5/r+JPjHMreQbR/vxrLGx/N2ctfqX8AcHBJLM++9yGhoaFMmzaNcePG4XPsF4oPrcFd74qtyEDzPmMwZ8aRD7i17489xAh5EKHyR5efjVrvi3PLK5dfoDFrMsFAaWkp8fHxREVdW7mr3333XZKTk5k4cSLfffcd9913X62Pffzxx5k9ezZLlixh4sSJl7GVgtC0WUvzyycP1jSZzW4xkf7bK2C34tp+EPquo0k88g4Azd3/XRpnTDlC+q8vYclLBUDjHoBLq15o3P2wm42YM+MwJh/CXlaCIW5P+XF9JYmUsEBKm7XAOagtwcHdef7+V0mM/ZP7Dz99wfuwm5U5Sipdxd5TWZbJWPY2ss2CS2QfDLG7cdBIHMmBMZ3v5vCpL8gynGHbmTUMbX5Lledec3AJRy07kCSJmAX7KT2s5o8//mD48OGo1Wpkm5W433cCYDs7XOESeT05G5TMhuqOAzmZrwxLhJ9KBMC966ha1364HBrTnIEmEwwcO3YMWZZp3759QzfloqjVan7++Wfc3d25//772bt3Lx988AGurtVH3+d06dKFAQMG8Mknn3DLLbc0qn+4gnA1KT6yAew2HILaovMOrXa/3I1fY86MQ+3qhf/Y6WQb0yi1FKFV6Qh2VSYPFh1cQ/riV5Ulfu4B+N04Fdf2gyo99GS7DVPGaUxpJ7AWZYMkofUIpGV4V7QegeX7vfXaO3Tv3p2ffvqJ+++/v8b7KC8R/J+0x0V/r8KYsB9J64g+aggZS95AltQ8v/QoGZ2+Yew9Y1h48kuO5Owm2LU57X3+nUAZnxTHx8veJPx6PyRJwpyo4d0Hvqj0XWxI2IfNUICkdUK2GHFq3hVT+ilsJbmoXTw5rbdgN9gJcgzG4bCSgMi925ga70eovSYTDOzbtw+NRnPN9QyAEhB89dVXdOzYkWeffZbly5fz/vvvc8cdd6C6wNraadOmcdNNN/HHH38watSoK9RiQWhaivavAMCt88hq9zGm/ENezI8A+I99BY2rF3FpSm9CmFskGpWGgr1LyVz6FgCu7QcSMOFN1I76Ks8nqdQ4BrXBMahNjW3r1q0bkyZN4sUXX2Ts2LF4eXlVu698LrWx+t9Hg62smOw1yrwlr/4PkLdVeRB7XX8HIwrjeOGFFxgxYgQ9AgayJ2MTaxMXkVaSRDO3lqTkJLIjcQPh1/sB0MN/ENdHV51e+VylR0mtQbYov8uCPYsBcO5yI4dylTkJrbJMIMs4t+pV46qHy6muOWCuZk1mAuGxY8eIjIzEyanmMbOrlSRJPP744xw/fpzevXtz9913Ex0dzfz587HZbNUeN3LkSAYMGMD06dNr3E8QhLopSztBWeo/oNLg1uXGKvexW81kLHkdZDv6TsPRt1dyncQVHAUgwqMdRYfWkrlMmZHvcd1Egm7/sNpA4GLIsswHU+/l0WgXtr9zM1l/fIglv5oMp3blO+L8Xoic9bOwleSh9QlD4+KpFFBy9sB7wIO8//77+Pv7M378eFrrutHZtzcgczhnF3/E/8yhom24eDnhKLkwruUD9A0dUWUgYCsrUXpXAHtZMZLGAaewjuWTMrPataPMakCvdcdtp5Jq3aPHhEv+3Qj/ajLBQGpqKqGh1XffXSvCwsJYvHgxW7duxcfHhzvvvJPx48dTVFT1BCNJkpgxYwZHjhxhwYIFV7i1gtD4FexU8nnoOwxC41r1W3fe5tnK8ICLJ36jXlCOK8shy3AGCYmgIpsyl0CW8bhuIn6jX6qXjHqlsbtJmnUHhqUvcEdndyIdCsjf/jOJn07EfHY+QtWUB3ZZ2gkKdi0CwO+m58jdrKxO8ur/AGonN1xdXVmxYgUZGRn079+fdrpeTIh8hCBVC1L+ySRpfybd3YfwSJdXifBoW+3Vig6uRjYbUTkoqyn0nYZTeOAPkO04tbyOw4YTALQxeyCX5KPxCMS17Q2X/PsR/tVkgoG0tDSCgoIauhn15vrrr2fDhg2sXLmSTZs20bVrVw4dOlTlvr169WLUqFG8++67ondAEOqRtTi3vHvbs/dtVe5jyjhN7pYfAPAb/SKas8v2TuYr/72GOIWSv+BlsFlx7TAYv1EvXPL8HmtxLmm/vEDq949gOnMMSeuIW/QY1uT5czrHhN1UQtYfM6s/gSwj223KkIVsR99xGJb8NKyFmWjc/PC47t8JyR06dCAmJoaCggIiIyO5b+wj3NXjSda9v4/Xxv+Pfq2GoVFVPyIt2+0U7PgF+HcCo3v0WAr3LgXAdN0wso1paCQtfruUFRuevW5FUjfcKPe5YYLGNA+ryQQDqamphIRUX0/7WnXTTTdx8OBB3Nzc6N27N0uXLq1yv1dffZUTJ04wZ86cK9xCQWi88nfMR7aacQyNqrLcr2yzkrH4dWX1QLsB6KPOZtqTZY7nKgWB/I4exlaaj0NQGwJvefuSZ8cXHV5H4ifjKT68DiQVHr1uI+KFNQROeJOHPl7KrKNKgp7S439hLcmrcKyk1p5tt4X87QsoO3MMlYMrvsOfJu8v5bvD64b7K00wjIyMZN++fTzzzDNkZ2fzwQcfcODAAXx8fC7Y3pITf2HOTgC1VukJiOhGWeo/2MtK0PqEcdJRKVDUUhOElBaLysEF9x7jL+l3JFTWJIIBi8VCenp6oxgmqEpERATbtm1j1KhR3HLLLcyePbvSPt27d+f2229n+vTpFBQUXPlGCkIjYzMUUrBT6UL3uqHqJb952+YpD1RHPf5jXi5/k0wvTSa3LBO1HXz+OYjKyY3gOz+6YLKiGttTWkDaLy+Q/ssL2AwFOAS2JuyJBfiPfqG8N8LFxYUv5i0lPk9ZNVCccLDCOaSz1zcmHyZn/RcA+N44FUP8XqwF6aj1Prh3H1fl9YOCgnjrrbc4cuQIU6dOrdX8LFmWydv8/bkfAPDsfQf525RJio79buN0wREAmh05BoB7t7H1MpdCqKhJBAO5ubnIsoy/v39DN+WycXZ2ZsGCBTz66KM89NBDTJ8+vdKM1/fffx+DwcDLL7/cQK0UhMYjb+tP2E0lOARE4tq2f6Xt5uxEcv9U1sj73TgNjZtv+bbD2cp6+sDkNLQWK4ET30HrGVzntpQcjyHh0wlKb4BKjffAhwmb/HOVKw1atGhBcFulkNLXH72DxWIp36bRK2/yWSv+D9lqwrlVb9y6jilfBeHZ545KvQKXovTktrOTL9Vgt+IQ1BZrcTbWomw07v4kBrpjl+0Eav3QHd0JKg2efe6ot+vXlVhNcI06V+zHxaVyqs/GRKVS8cUXX/DBBx/w7rvvcv/992Mymcq3h4SEMGPGDL766iv+/PPPBmypIFzbrMU55G+fD4D3kMcqTfaT7TbSl7yObDXj3KoXbtH/rocvMRdxPO9vAMISUvHse/cFsxZW246ibNJ+eYEzPz2FrTgHnW84zR79EZ8hj5d3+VfFN0hZkhd/6ji33347VquypFDfYUj5PlrPIAInvoMxdhfmrHhUDi549Kw6oVBdyHY7ORtmnf1J6THx7v9A+XCER797OJJ7dullolJvwa3TcLSeDT/3SwQD16hzwYCjo2MDt+TykySJ5557jp9++olffvmFPn36EBcXV7598uTJDBkyhDvvvJPMzMwaziQIQnVyNn6DbCnDMTSqyl6B/O0LKEs6hMrBhYCbX6sw0Wx/xl/YZRueOQUEOIXgO/TJi76+zVhEzp9fEf/RmPK5AZ597ybsyV9wCu1Q6/PcfdedLFmyhGeeeQa73Y5n70kE3PIO7j0m0OyxeWhcvcg7G/Qo3fMXTnZWW0WH1mBKO6HkNLBbcQxuh6Uk9+xwhC/5rdtTYinEUeWI554tIEl49X+g3q5/Kex2e0M3od41iWCgtLQUoFZZ+xqLu+66ix07dlBQUEDnzp35/ntlXE6tVjNv3jwAHn744YZsoiBck8zZiRTuXQaA74gplWaUm7OT/h1vH/lMhWyApZYiDmbGANAqLo2gW/8PSVP9G/z5rCV5FB9ZT/qiV4j7v6HkbvwG2WzAMTSKsMnz8Rs5FZW2di88dpPyndihS3c+//xzvvzySyZMmIDBYMC9600EjHsFjd4bc04ShtM7QJLwqGa1RF3YzUZy1n1+9gflweo9+DHytyjfU979H+Bo/tnekzwzaruMa/tBOPiF11sb6kNj6iFoEhkIy8rKgKbRM3C+rl27cuDAAaZOncqDDz7Ijh07+Pzzz/H392fWrFlMmDCBRYsWiboFgnARstd8AnYrLm1vwDk8usI2ZXjgNWW8vWVP3LtXnPUec+pXrJKMR24hUT0fQudbcwY9u9lI4b7lFO5fgSnteIVtDgGReA14AH2HIRedk8BanAuAxtWbyZMn0qxZMyZNmkTPnj355Zdf6NBB6V0o2LkQAJfIPui86m81Vl7MXKyFGUhaR2RLGS6RfTBnJ2AtykLjHoC28xDij78PgP8+ZX6Fd/+aUylfSed6BhpTAbgm0TNwLnJvTFFcbbm5uTF79mzmzJnDL7/8Qt++fTl16hQ333wzt956K/fffz9Hjhxp6GYKwjWhNG4PJce3gEqN7/Aplbbnb59/3vDA6xV6DVLzTnDMcBKA6FJ33KPH1nyt2N0kfDyWrJXvK4GAJKHzb4lnnztp9uhcwp5aiFvHYXVKTmTJVxIOaT0CABg1ahS7d+9GlmW6d+/Ol19+ic1iovBvpaSwR69JF32N6pjzUsvnBciWMpBUeA18iNyzqwp8Bj/KqeJj2GU7XiYVboXFuET2wTG4Xb214VKdy9fSmPIMNImegcaYIOJi3XvvvXTq1Ilbb721vGjJ999/T+/evbn55pvZt28f7u7uDd1MQbhqyTYrWSs/AJRUuP/tsjZnJ5KzXpkQ5ztyaoWJbhabiTUnvwetRGhaPlHDP67x+6jo8DrSF04HuxWtZxCefe9BHzWk2gyHF8NmKMR2Nr+A9rzc/h06dGDv3r08++yzTJ48mcTN83mgZSkad39cWvW65OuC8l2c9fv/IVvNSDonZLMRjx7jKT22BbuxEJ1fBG5dR3HshDKEEHhCyTzoPejRerl+fWmMz5Qm0TPQGP/i6qJLly7s3buXQYMGMW7cOL799luWLl1KVlYWDz30UJPsORGE2irYsxhzZiwqJ3d8Bj9WYZtst5G++LXy5Xju3W/+d5sss/bQLIq0Mg7GMga3fwC1c/WBtyF+X3kgoO80nObPLMWz1631EgiAkmIYQOsZXGlCoJOTE7NmzWLdunV01SspzledMrB23foKSxDrqvjwOkpPbQeVWkk/7OSOe/dx5O9QUqX7jphCvjmPTEMqkgxBKem4tL4ep2ZXV4G5xvhMET0DTYy7uzuLFy/mxRdfZOrUqSQlJfH9999zyy230KxZMz788MOGbqIgXHWspfnkbPgSAJ8hj6N28aiwPX/7fMqSD6NycK20emBf4ipO2dNAlulnCcOrRe/qr1OSR9ovLyiBQMfhBE58t15qFJyvLEUZFnSsYdXBgB4did+iZARcdaKY9SNH4ubmRo8ePfDw8ECv12O32ykuLsZms+Hj40OzZs3o0aMHw4cPr/beslYq8wAkSY2MDd9hT5AX86OyBLNFD1xa9+Wf9I0A+GTl4mCyXHW9AvDvM6UxvUA1iWCgKc8ZqIpKpeKDDz4gIiKCxx9/HKPRyCeffMKUKVNo3rw5TzzxREM3URCuKjnrv8BuLMIhMBKPnhWr5SmrB84OD9w4rXwcHuBU7t/E5GwGSSIqtZSo0c/UeJ2sPz7AVpKLzr8lAeNfr/dAAMCQoKRBdmrWsdp9ig6tUVIDh0ez9t3Z/P3336xatYqDBw9SWFhIamoqKpUKNzc3VCoVR44cYfny5eTl5bFy5UpuvLFi9UZZlsn8/V1spfmoHFywm0pxDOmAzr8FmctngCThO3IqkiSVZxwMTM1UegUuYqnklXIuL0NjWmLYJIIBrVZZulMf3VyNyaOPPoqjoyMPPPAAt956K1OmTOGpp57C29ub226rv2VEgnAtKztzvLxojt+oFyvUDpDtdjKWvH52eKAX7t3Glm+LLTjKqvj5IEmEJWfSv/97NRbXMSQcoPjQWpBUBN7y1iWlJq6O3WrGmHg2GIjoXu1+xYfWAuDWeSSSJNG1a1e6du1a87ntdsaOHcsdd9zB/v37adGiRfm2ooOrKfnnT5BUyrJGlRq/MdPJWq6UbHaPHotjUBuKTPlkGc6ALOOflo3PQzUUU2pAJSUlDd2Eetck5gzodEphDrPZ3MAtufrce++9LFy4kF9//RWLxcJdd93FPffcQ0xMTEM3TRAanCzLSte2LKPvNBzn8IoPxILdizAmHUTSORMw7tXyXsjjuQdYGTsXuwRByRkMaXkXOq/q0w3Lskz22k8AcO9+82WbOW9M/BvZUoZa74NDQKsq9zFlxWNKPwkqDa7tB9b63CqVinnz5uHu7s5TTz1V3hNrzksl6/f/A0A6mwfBq+89mNJPnC2E5ILPUKU3Mr5QqT/glVuAd8s+OIa0r/O9Xk6FhYUN3YR61ySCgXMFM85lIhQqmjBhAl9//TWzZs2iU6dO9OnTh0mTJlFUVNTQTROEBlV8aK3ysNc64juiYhe/pSCD7LWfAeA7/Cm0nkHIsszejM2sTliAHZmg5HRuULXBvePQGq9jOL2TsuTDSFpHfAY9ctnup/S4UgLYJbJPtXOoio9sUPZpdV15gaPacnd359NPP2X16tUsXLgQu9VM+i8vYDeVoHb2RDYb0PmG49F7EjnrlN+d96BH0Oi9AYjL3A+AX0YuPkMm1+ker4Tz07w3Fk0iGDhXk+BcJkKhsocffpgpU6bwwgsv8Nhjj1FYWMi7777b0M0ShAZjNxvL39a9+z+A1v3fQmeyLJO54v+UDIBhnfDoORGr3cq6xEXEpCpr8yNOJdEz2UTAjc9e8Frl+fh7jK9Q0Kg+ybJM8bHNALi261/tfiXHtij7tB9Up+uMHTuWSZMmce+997L3yycpSz2KpHPCZsgHlZqAW94id+O32Erz0flF4Hk2s6FdtpFqSAKguXvbansurgbn8gw0Jk1izsC5YKAxjvPUpw8++IB9+/Yxbdo0HnzwQT755BMeeeQRwsOvrhSggnAl5G2dh7UwE41HIJ5976qwreTYZuUtW60hYNyrGGylrIj9kbTSRCQZ2h4+SYvELIInz79giuCy9JMY4vcqFfmuv6vGfS9FWco/WAvSkXRO1eYNsOSfOZvgSIVr2xvqfK25c+fSTpeNR/pu5YOzQwbe/R8Au53CPYsBlLLOZwsqJZ5ci1UtoTVbaNlvSp2vfSWcm0DYmDSJngG9Xql9XVxc3MAtubpptVoWLFhAUVERBw8exGQysXjx4oZuliBccdaibPJilLd13xFTKjzQ7WZjefIhr773kOuiYd6x/5FWmohO0tFj5xEiYlPwHfkMDgEtL3itgl2/AaDvMKjCSoT6VnRoNQCubftXG6CUnNgGgFPzLpeU18CecZyJocq4enqRubyok1e/+8hY9hYAbtGjcY7oBigTMU8fXQ6Av90FB+/6S318OZwbJmhMK9SaRDDg4OCAg4ODGAOvhdDQUBYtWlQ+gbAx5d4WhNrK+fMrZLMRx9CO6KMqjvfnbvoOa2EGWs8g0jt1YeHJryi1FOHt6Ef/v1PwTc/EJbIPHtfdesHr2M3G8pn7Hj0mXGDvupNtlvNWCIyodj9D7C6AS8o4aM5O4sxPU8BmQesVQqCbjqIyG69vyiV13VeYM+NQu3jiN2Jq+TFFh9aQo1EesM1Dr6/zta+UxjhnoEkME4CSo78xzgC9HIYNG0Z8fDwpKSn061e3OuuCcK0yZcRSuG85oFQdPH+inTknmfxt87BLEieHjuBYqrJfK48oeqSUURh3BJWTm5IjoBZJzkpPbsNuKkHjEYjTf4oe1aeSE1uxleajdvXGpVXVSY9kmxVD3B4AnFteV6frWAoySPnhUWyGArRewVjylBoIxZ3v4vgfH1G8/QwalYTf6BfLEzcpFQw/I7+PMkcg2KtNna59Jbm4uFBQUNDQzahXTaJnAJRZrqJnoPbCw8NFICA0SdlrPwXZjmuHwTg371Jx2+qPMalk9g/pzzFrEiDRO2gYw9z6UbRxNgB+Nz2Pxs2vVtc6N6GvrgWHaqtwzxIA3LuOqjbXgSnjFHZTKSpHPY7BbS/6GpbCTFJmP4S1IB2NRwCWwiwAvAY8SP/bn+bnh69Do5JYf7KAxz/4qfz7OC9mLiVl+ZicHJGQ8HOufgnm1cLT8+JWWVwLmlQwIHoGBEGoiSF+H6UntypVCYc+WXFb3F4yk3ezY0B3MvVqtCodY1rey3WBg8n8fQayzYJLZB/cutxYzdkrM57NBuhcT4WAqmLOS6X09A4A3HuMr3a/stSjADiGRlVIrFTba6R8+wCW3BQ07v7YzUawWXBp0w+fwY+Rs+4z7HlJqF088Rn1EitX/kG3bt04vP1P8v6aS5GHMq/L09EXndqhjnd65Xh4eDR0E+pdkxkmEMGAIAg1kWWZnPVfAEriH53vvxX9ZLudU399zo4bumFyckCv82Bsy/vxcw6i6OBqjPH7kLSO+I99+aJqoFiLcwBQaR0xJh/GlBmHtSgLkHDwa45L5PWoHJwv6b4Kdi4EWca5VW903qHV7mfKjAfAIfDilvQZU45w5qcp2Epy0XgGgQx2QyEOgZEETfo/Sk9tJ3/7fAACJrzJbW360b3vIG655RZ2fPoIA1roMYYrEwl9nYNqutRVw8tLmVzZmCYQimBAEAQBMJzaoSQY0jjgM/ChCttOHV7EX229sGo1eDv4MqH1o7jq3JVcBGs+Ac7mIvC8uC5utZMeW2k+yV/fU+V2laMe3xFTcO9+c50KrdkMhRScXcbn2ef2Gvc9N75fU8DwX4X7V5C5fAay1YTOvwWy3Y4lOwGNRyDB93yOzVBI+qJXAfDofRuubZShx5YtW7JxzvtkL3wei01me4EJt2AnfJ0CL/oeG4JG0/genU1qmKCxTfgQBKF+yLJMzp9KVUKP6yZWGPNPKjjBGtMerFoN/lYnbmv7FK46pQRx3tZ5WIuy0HoG4dn37ou+bsDNr6P1UpbRqfU+OLfsiXv3m3HvNhatdyj2smIyl71N+q8vYreUXfT587bNQzYbcQiMxCWyT4372suUpddqZ48LntdmLCJ94XQyzpVtbnkdoMKSnYBa70PoA1+jdnYnbf6z2I2FOAa3q5DB0W4qJX/tRwAUhvSlRK3UjUmPy77oexTqR+MLb6ohggFBEKpjOLVDyZSndcSr373lnycVnWZZ7A/Y1Cr8sguZ2P8VdBolvbm1NJ+8mLkA+Ax7CpX24se6Xdv1x7Vdf2SbtdLEPtluJ3/bPLLXfU7x4XVYi7IJuvOjWqcIthbn8P/t3Xd4VNXWwOHfmZZJMum9EkIggST03rugiB0VC/beP7tiueq99t4rCKJgQxAFBKTXAKETSEhI73Um0+d8f0wyENIAQUKy3+fhUWfOnNkzxJx19l57rYr1cwEIGHdXqzMLCq0OcM4mNEd2OKhOXULJn+9g15eDpMBv2HXoD67FWnoUpS6AqNs+Rx0QTeGCZ529B9x9CL/uTRQqjes8JUvfw1ZVhNo/ksF3vs72vS9jlS3cfdP9rLl4Cy+//LKrWJzw7+gwMwMxMTFkZma2q5aTgiD8c7IsU7ryM8C517++Tn5uTSYL07/GjoPgghIu8BiMxt3X9brytbOQLbW4hXdvVIvgVDWV4S8pFPiPnEHUrZ+icPPEmLWD7I9vxFyUflKfqWjRq85iP5FJ6HqMafU1bqHdAKjesRjZ3rDCnsNsoCplIVnvXUnhjzOx68vRBHUm5PLnqdm9FGvpUVQ+oUTf8RVuwbGUr/ma6tQloFASft0bqP2O5QLUZmyjcvMCAEIufw6zwo5VtgAS/3fP43z22WckJSXxyy+/tNnf1+0pV6BehwkGunXrhslkIjc391wPRRCENqT2yDZMObuRVG74j7oJgJLaAhamf4XNYSWosJSBu7MJHHysrbfdUOlMzAMCJ9x9VrcFesT2J/qeOaj9IrCW53D0w+mUrfkGh635LqwV6751tgxWqAi57NmTyjfwHXI1klKN8WgqWe9dRdGiVyn67X/kfHE76S+PofDnF7AUH0Gh1RE46UH8R91C8aL/YasuQRPShei7ZqEJiqE69Q9Kl30AQPDFT+DZZaDrPRxmAwU/PQc4dzZ4dhlIhbkMAC+ND48+8hh79uwhPj6eK664gj59+vDxxx9TUVHxT77CM649BgMdZpmgWzdn1Hvo0CGio6PP8WgEQWgryv/+CgCfAZeh8gqk2lzBL4e/xGw3EVBlov+m3QSOv7tBVn/llh+RrSbcwuLxjB9x1sfoFhxL9D1zKPzpOQxp6yld+h6VG+fh0/8yPOOHowmORVJpsJYepWLDPKpSfgUgaNKDaMNProiP2ieEsKv/S+GvL2EpycRSktnw+cBO+A64DK/eUyj/+wtKl74HODsghl37KkqtF4a0DRT86LzY+w27Hr/B0xqco2jxa9gqC1D7RRB8obMCYaXJuaPC1805I9OlSxeWLl3K2rVrefPNN3nggQd47LHHGDduHKNGjaJbt26o1WrMZjN5eXkcOnSIHTt2UFhYSHV1NRqNhpiYGDp37oy3tzcOh4OuXbsSHx9Pz549iYg4c3UM2lNQ0GGCgZiYGDw8PEhNTWX8+PHnejiCILQBpvyD1GZsAYUS/xE3YrGb+DX9K/TWKvwUXvRbsxqVStugtLBss1Kx2Tkr4D/ixtPK8j8dKp0/ETM+oHrHYkqXf4CtuoSyVZ9TturzJo8PGH8P/iNOrfGRV/IEPLoMRH9gDZaSLJAk1P4RuEf3QhMci7kgjdyv78RSlAGA/+hbCZxwD5JCSW3GNvLmPgIOG169JhF04SMNzl29exnV2xeBpCD0qpdQuDlzAirrZgZ83QIbHD9y5EhGjhxJQUEBs2fPZsWKFcycObNBK3qVSkXnzp3p3bs3gwcPxsvLC5PJxF9//cWcOXOavFj36dOHu+66i2uuuQZvb+9T+n7qtacgoF6HCQZUKhUDBgxg8+bN53oogiC0EeVrZwPOi6DKN5SF6d9QaizEU+3NsF0FYLXhO+walO7HLho1+1ZirylF6RWEV89/litwqiRJwqffVLx6TUK/dyU1e5ZjPJqK3eCcRpc07nh07of/yBl4xA44rfdQevjg029qg8ccVhOlyz90fl8OG0qdP6FX/gddvLOPQO2RbeTOvh/ZZsaz+yjCrnqpwdKJpTyXol9fAsB/9C14dO7req7aUg6Aj1vTjZHCwsJ48sknefLJJ7FarZSXl2O1WlGpVAQFBTXqnzJ//nz++9//ctttt3H//feTk5PD6tWr+euvv9i9ezc7d+7kzjvv5J577mHcuHG8+OKLDBgw4JT6sIgWxue5AQMGsGDBgnM9DEEQ2gBrZSE1e5YD4D/yJjbmL+dI1QFUkooL/cZjPHAPSAp8h17b4HVV234BwHfAZa72u/82hUqDd+/JrqZDDosR2W5F4aY7o/kLsixjOLiW4t/fwFqei1HrRnW/0Vi7DyBHXUZQ6TbCy42Uzn0c2WrCo+tQwq99vcH34rCayZ/3OA6THm2nXgSOu6vBe1SZncGAt6b1LolqtZqQkJAWj1m7di1RUVF88cUXAPTs2ZOLLnJWhdTr9Wzbto0///yTH3/8keXLl7N8+XJ0Oh3XXHMN999/Pz179mx1HLW1ta0ec77pMAmEAH379iU7O7vNJaMIgvDvq9j0PTjsuMf2J9fDzuaCFQBMiLkKt51rAOfWP43/sTVma1URtUe2AeDT/5J/f9DNUGjcUbp7n9FAwFyUTu4395D37YOUWyvYPnwAKy8awbZQSK3Yxo7idSzLms+84p8o8vfEs9swIm54p8EWS1mWKV78Kub6LYbXvNZo50S1xfn72NvtzNT7j4yMpKysDIulcYKlTqdjzJgxvP7662RmZrJjxw569eqFXq/nu+++o1evXowcOZIFCxa0uJNBr9efkbG2JR0qGEhOTgZgz54953gkgiCcSw6LkaptCwFQD7mcpZnfA9AneDgJuu5U71wCgO+gqxq8rmb3cpBl3GP6nHK1wVMZmzFnD/qD66jN3I5NX35W3qc5dkMlRb/9l6z3plFzZAsHk7uxdsIQCkKchZbCPDvRL2QUSXIYHvpazFoNKcP64LjsAewoGlxEK7f8SNW2X0GSCL/2VdS+oQ3fy2FHb3HWNfA5iZmBk3HxxRdTW1vLH3/80eqxffr0YefOncyaNQulUklERARGo5Grr76aPn368PvvvzeZH9Aem951qGWC+Ph41Go1e/bsER35BKEDq971Jw5jFUr/cFYpDmO2mwjz7MSoyCnU7Pgdh1mPOiAKjy6DGrxOX9dl0Cv5gjM6HlmWqT28iYpNPzibCp2wz98tvDs+Ay7Dp/+lDYr3nOkxVO9YRMkf72CvraTKR0fqiEHUuDkTJLv4JOJRHMLuv/dhy/+MQdpcohQKliTEQ/cIvt7yLv+77CssRive3t6Mjg/kv2N0qBQSW6yxbNuSwWApiLi4ONd71lgrkZFRSSo81V5n5HMkJSWRnJzMr7/+yqWXXtrq8ZIkMWPGDAYNGsTll1/OwYMHefPNN1m8eDEXX3wxQ4YM4cUXX2T8+PFIkoTNZqOwsPCMjLUt6VDBgFqtplu3buzfv/9cD0UQhHNElmVX0Zus4aMorM3BTenOlNjrUCpUVG3/DQCf/pc1mHa3G6sxHk0FQNe95ZsJg7WajMr95NYcocxUhNFmQEJCp/Eh3DOGHgF9XU15TAWHKF70P4xZO12vV3oFovIKxGHSY63Iw5x/gOLfDlCxbg6hV77YIAHvTLDpyyn86XkMaeuQgYKevdnVNQQ7dtwVnlj3e/DM/97k0MH9vDKlM4N6OBMq05TxSMV9kGPK8Arw5J0FL6Mu8MNWnsOwyj9RYWVnlScvLN1J5pvOXIvevXtzwQUXMHXqVMJ6OLcTerv5n9FdGSNHjmTlypWn9JqEhAS2bt3K9OnTefzxx3n11Vd58sknmTlzJhMnTqR///7ceeedLFu2DKvVesbG2lZ0qGAAoHv37uzbt+9cD0MQhHPElLMHc/5BKoIC2K127nGf0OkKvN38sZRmOy/KkqJRK+LajK0gO9AExzaoqHe8nJoMUgpXk1l1EJkmppctFeTrs0gpWk28X0/6ZBvQr/wK7DYktRbfAZfjM+hK3IJjXa+x6cup2bWU8rXfYC3PIefL2wm76mVX8uA//j7yDpA35yFsVUXYlRq2DxtFcZAM2MlOLebLR3/EYrBx9eWXMO/mJLRlaSApCLn0aeIHXgnAgbKd/JH5HUQamDHmNnI/uQkrVrRRPZn2ny+4Ru1GZWUlK1asYNGiRXzzzTe89tprTLxpOBPvHYSl2o7FYkGjOTOzHhEREeTl5Z3y63Q6Hb/++ivPPPMMjz/+OM888wxbtmxhxYoVvPzyy9x+++2EhYXx8MMP884775yRsbYVHS4YGDx4MM8++yxmsxk3t7bfN1sQhDOratsv2JUKdg/ui4xMd/++xPv3BpzLBwAecYNQ+zTMWq+/c29qy16RIZc1uYvJqclwPRbqGUWMdwIhnpHo1F7IskyFuZT0yr0crthDWsVujipNDPJwIyx6JMEXP9HoPcFZX8Bv2HS8+02laOHL1OxaSsFPM+v2/7ee+d6S4tQVFP/wOGrJQZrBwdq+cYQFyTjsDrYuOIhfTSRfffoNowf1xvT7C5jzDyJp3Am/9jVXB0KAeP+erMldhMFaw85FT+Fblu3sXHjD266EQl9fX6688kquvPJK7HY7mzdvZsUR52zBHz8v57FJ/2P8+PH069ePxMREunbtSpcuXdBqtaf8udatW0e/fv1O6ztRKpW8+uqrBAYG8thjj2EymXj99deZOHEiFRUV+Pr6snDhQhEMnO/Gjh2LyWRiw4YNjB079lwPRxCEf5HdpKd69zLSenShRiOjU3szNvpSwLl8ULNrKQDevS9s9FpTrnNGUXvcBdhiN7MudwmpJZsAGYWkJDlwIH1DRuCvDW50jjBdJ2ItOiKWLWRb91AMXp5smTiSaxIfQu3e8pY5pVZH2LT/Ittt6PeuoGjhy3S674fT3kFQc2AdJd8/iloBh70iyJzakzC1FbWk4cKu1/HYW4nOz1iWQ+7X92Atz0Gp8yfixvdxj0pqcC6FpKSLTw92l24hV6rAX6sjcsb7qLwCm3prlEolw4YNozTkMOmVe7n9+rsY4HeYFStW8Oabb7qaymk0Gvr168ewYcMYOnQoQ4cObXVr4SeffMKff/7JRx99dFrfS71HH30UNzc3HnroIXJycpg9ezZ+fmdmx0Nb1OGCgd69exMeHs7ixYtFMCAIHUzN7qWUe6o50tVZknxCp6vQqpxlhi1F6VhKMpFUmkaNfWRZxlx4GABteDwABfqjLMmcR1VdBb3u/n0ZHjG5xS1y+oNryf/+CXQWI6MsMtvGDKHEWsLC9K+5rvuDrrE0R1IoCL1sJkcOb8ZccIjaw5vwjG+5NXFTajO3kzf3EVQKOBLXmyN9wrE5LPi5BXFp15tdgYy5KJ2cr+7GXlOC2i+CyFs/RRMQ1eQ5fQ8fAD8oCw4gfMCjuIV2bXUc9dUHe3TuyZRnr+bZZ591NlkqKiI9PZ1du3axfv16FixYwJtvvglA586d6d69O126dCEqKorg4GBqa2vJyclh8+bN/P333zz44IPcfffdp/y9nOj+++8nMjKSa6+9lgEDBvDBBx8wevTof3zetqjDBQOSJHHNNdfwySefcOutt5KUlNT6iwRBaBcqdixid78eIEn0COhHrG9313M1e50JZx5dh6Csa+dbz15TgsNsAEmB2j+ancUbWJ3zGw7ZgZfGlwtirqaTd8sXv8otP1H0239BduDRZSDh171JJ5XEdwfep9JcxrKsBUztMqPVRDqlhw/efS6icvN8qncvPeVgwFSQRt7sB8FhZUVQOKZeQeCwEOXVhYu7zMC9LiAxFaSR++Wd2Gsr0YR2JeqWT5q90y9fPwe3Db/DlJHUeHuijunV6jhk2UGl2Zmz4ac9dl5JkggNDSU0NJThw4dz7733ApCbm8vGjRvZsmULhw8fZuXKleTl5VFVVYVSqSQkJIR+/frxxRdfcOutt56xhMTLLruMzZs3c8899zB+/Hh+/vnnM3LetqbDBQMAL7/8MsuWLWPq1KmsX7+e8PCmk4EEQWg/LCVZHHCrosYnGHelO6MiG5bc1R9YDYBXE+1+rZXOrWQKn2BW5i9id4mzrHk3v55M7HQVbir3Zt9XlmXK/vqYsr+dFfG8+11C6GXPIinVeABTu8zg+4MfkF65l10lG+kd3PrFXZc4lsrN86lN34Isyyd94bNWFpD7zX1YrbWs75WIKS4MkOkVNJQxUZegVDhL8poLD7sCAW1kIpE3f4zSw6fJc9bs+YuSP97GTZbRykpMkp1yUzGhnk3PINTTW6uxOawoJMVJVR+MjIxk2rRpTJvWsPmRxWJBpVKhOIudI3v37s3atWuZPn0606ZNc81StCcdquhQPXd3d/744w+sVitDhw4lLS3tXA9JEISzrGDXbxzq7szSHxk1FQ+1p+s5a1UR5vyDIEl4JjTeNmg3VGBXKNjaN64uEJAYEXERU2JvaDkQsFsp/Pl5VyAQMO4uQq94oUG53hDPSEZGTgFgTc5iSo2t72F3j+4JChW26mJsVSe3591eW0XuN/eit1WzafxQauLCQIYxUZcyvtPlrkDAUnqUnK/ucgYCET2IvOWTZgMB49FUChY8C7KM7+Bp+OkigWNVBVtSZiwGwMctwPXep0Oj0ZzVQKCeSqVi9uzZxMTE8MEHzhbN7alhUYcMBgCio6PZuHEjnp6ejBo1ioMHD57rIQmCcJbIsswm817sKiUhki+JAf0bPF97eBMA2ohEVLrGd6kmi54tw/tQ6KdFJam4JO4mBoaNafGO3GE2kPftQ85OfQolIZc/R+D4u5p8TZ/g4cR4x2OTbSw5MhervXEp3eMpNO64hTgDG1PegVY/v8NcS+6s+8mVqlg3fgiVXloMlUb6aSbSN2S46zhbdYkzENCX4RbWjchbP23QpOl4lvI88uY87GpOFHzxE3hpfAGosVS2OqZyUxEAAdqWEwLbEnd3dx599FEOHz58rodyxnXYYAAgKiqK1atXExQUxNixY8nIyGj9RYIgnHeOpP9FXogPyDIT4qY3uiAb0rcA4NF1cKPXWu1mltlTKQ/yQ2VzcEW3O4jzTWzx/axVRWR/dguGQxuQ1Foirn8H3wGXN/8Ch40x7v1wl9woNRbyV9aPrd51aiN6AGDKa7mImsNiJHvOg+z0NrB1eB8sGhX2KgWzHvidkcnH2rk7zLXkzr4fW2UB6oAoIm9pPhBwmGvJ+/ZB7IYK3MK7E37Nq0gKJe4q52yLydZ6I5/6GZBA99BWjmxbYmJizvUQzooOmTNwvKCgIFasWMGIESOYMmUK27ZtQ6fTtf5CQRDOC7LsYG3pKlBDXLWSEJ/YE56XMWamAOB5Qvlhm8PGbxmzKXRUoLJYGb4rl8jBDV9/IlPeAfK+fRBbdTFKTz8iZnzQaCtePWtlIeVrZ1OdugSHsZpegX5sGdGHAxU7cd9tYEyvO5p9H21kElUpCzFm7mj2GLuphr0LHmFLjIIa384A9AoawitPfEDPbn3IzMxkzZo11FRX0bdyFcHmHJSefkTe/HGTMyT131fhLy9iKUpH6RVIxI3votA4l0q0Suc/zXZTi98RHAsGAlrZUtnWtNccsw49M1AvJCSERYsWkZ2dzQMPPHCuhyMIwhm0v3Q75WobKquNoWHjGz1vrcjDVl2CpFSjjU52PS7LDpZlzedo9SHUkppBG1LR5WRiN9U0+15VOxaT/elN2KqL0QTHEn3P3CYDAdlupWz1V2S+fSmVm77HYaxG4e5NhCaE5H1ZAOywHmLl7s+R5aa753l0HQKAMXsXtuqSRs9XF6bx+7JHWJngRY2vF1rJjYu73EhP9xGs+Xst7u7udO/enVtvvZWSP98h2JyDyerg0T9L+PrHJU12/QOo3Dyfmt3LQKEifPobDQolKRXO+0u7w9bka12fX5Ypcy0TnF8zA0FBQed6CGdFh58ZqJeQkMA777zDnXfeyV133cXAgQPP9ZAEQfiHbA4r63MWA9A1I5+Aa0Y3OsaUvRsAt/AEFOpj1e425C3jYPlOFJKCqXE3Ia85gEWuwpC2Ae9ekxqcw26spnjx6xQfWI7R2x1t9EDCLnwKjVfju0hrVRH53z+O6eguANxj+hAw5nY84gYhKZREW4woVj1PaqCDVMshSg5+zISYqxrdQWv8I9B26oXp6C7K/v6SkEueAsBgqmBz6lfslXOxRTgT/+K0nZkQfyMeai8+++wzAH744QceeughnrpiEBVLXgWgOP5K3Av28/nC99huWEXPwd3x9vXGzy2QeP/eRJk0lCx5C4CgyQ/hEdOnwZgUkjMR0EHz7X8BaiwVWOwmFJICP+35dXE9UyWT2xoRDBzn1ltv5aOPPuKOO+5g27ZtqNXq1l8kCEKbtat4E3pHLdpaE0nq2CY7/plynWvu2shjeQAHynaypdBZd2Bip6uI8YmnNHkiZas+p/Svj/DoMhCVzh+H1UTujh/ZkfMX+SFeGGOP7URYmfY2ge6h9AkeTlLgQBSSAmP2HvLmPIRdX4bCTUfw1Cfw7jOlQQ6DQuPOmHEvoZx7PakJEeQZspi9703ifJPo5t+TCF0sOrU3kiQRMPpWcmc/QO7exaRRRKGfljytBYdKAajwMdoYE3ctXcKOLX/Mnj0bSZJ4+OGHeen+68n58nYAdONvxz0+lmH9rfS3O3cFWDBQajRQaizgcOUegiqN9MOOb/fR+A27rtF3WT+LIdHyVsfi2nzAOSugUpxfl6H2el04v/4WzjKlUsk333zDgAEDeP/99/m///u/cz0kQRBOk8Vudl3Qux04gt+wR5o87lhlwQQASmrzWX7U2dVwQOhoEgOdvQj8RtxA1fbfsJblcOSNi3CEdWFPEGRHh0CMs2KfhOTKqK+2VDqTAY/+xN7SrYyTE6j64Tlkqwm30G6EX/9Ws9X8FGo3kqLH47PiG9KGDSXPW8Hhyj0crtwDgEqhRqv0QMZB7eXjkV3XXhugwLfKQF9dL3oNvQ2F8tiv+cLCQjZv3oyvry/PPXI3+d/cjmy3UTB8PPv8CzEXZgLgo/En3r83ZVnVzP32OwzKCsbfMIASX3d2DenLVSNnNrkrwi7bneOXWl6BLqrNBSDY4/xbfxfBQAfRt29f7rvvPmbOnMkll1zSoPe2IAjnj53F6zHaDHjoa4nKLcWzbo39RJaSIwBogrtgtptYnPEtNoeVGO94hkcc61Gg1HoRefNHFMx/mkxFJXuS/bG6OWcaIhze9I2dSoxfdzRKZ2Mek62WfaUpbCpYToEhm5+MhxmikQjuPIzw6W+gcGu59LBnt2F4rPiEfuu2Mfax+Rws30FWVRqlxkJsDit6R5XzQAmUKAmwawi1aunqm0R078lNzoJ8/PHHyLLMYw/dR/lPT1GpsLBn4gjKvQC7kUD3MIaGX0Ccbw8kSQGRcMmwq1m24Gt062azdUx/CkJ8+WXLEq4ae32j/f02hzPPQK1oeSq9yOAMBkI8I1s8ri0SwUAH8sorr7B48WJuu+02/v777zPaZ1sQhLPPYjeRUrgGgG77j+DZqQ8KN89GxzksRlfynTogimVHf6bCXIqXxpcLY6c3usNVBXUm45JrSC3ZCECgOoDxsdcQ4dW50bm1Kg/6hY4ktKSa3yuWoPf2ZNvYYdzQ79lWAwFw9kCQlGocphp8jXZGRk5hZOQUbA4bNZZKLHYTkiThrvLEU+3d6t04wFdffYVGpWBaSAEH1WYODhmEQ6FAo9QyImIyPYOGNDqPJEkkGlKorawmMruGnBgf1hxZwuO3zuTCCy9k5MiRDBkyhJiYGNcuAo2y+U6DsixTVOtsLxzicf4FA5IkoVarsVqt53ooZ5TYTdAEnU7H559/zpo1a5gzZ865Ho4gCKdoZ/EGTPZavEwOInIK8Ywf3uRxtipnFTxJ48EhUwYHy3cioWBK7PWuPfP1LHYTC9O/dgUCg0LHcX3y400GAvUMhzehn/8Cg9dtx9MqodfAn0d/bHaHwPEkpRpNsHMbo6XoWA0UlUKFnzaQEM9Igj0i8NL4nlQgkJGRQX5+Ph/eMYgNkTb29+yGQ6Ggs08CNyU+Ru/gYU2ex5C+2VmUSali3IiHAejSJ4pLp01l1apVTJ8+nc6dOzNhwgT2HHQmRaql5tvD661V1NpqkFAQ5BHR6rjbovokQlGBsAMYP34811xzDY8++iilpaXnejiCIJwkq93C9qK1AHTZfxgJml0isOmdXfOsgSGszP4VgCHh4wnXxTQ4zmQz8tOhz8mqTkOlUHNJl5sYHjm5xTK6ptx95M19BOw2AuNGcnnyg6gUarKq09hZvOGkPosm2BlomEsyT+r4lsydM4dn7uiD6dp+lIQEoELJ+OjLuSzuVrw0TZcblmWZ0uXOVsC+g64iIKQHge5hIMF9T99JWloaJSUlzJkzB5vNxtEC5zgfue9RPv744ya3JxbojwLOYkNqxfk55V4fDLSnWWMRDLTg7bffxm63c8cdd+BwtB7JC4Jw7u0p3YrRZsBboSM8Kxelpx+akC5NHusw1SADqd0jsNhNhHlGMyhsXINjLHYTvxz+ggJDNlqlB1fH302cX8vdTq0V+eTOfgDZYsQjbhBhV/+XYF0koyIvBmBt7hLKTqIHgSawk/N8pdkn8cmbZ3PY8Ajai99tY7Bo3fDHg+sTH6FX8NAWL2i1GVsx5exBUmsJGH0rAGGezvbPRbU5AAQGBnL99dfz999/k9zXWRWxR1wy9913H7GxsTz11FPs3LnTdc58gzMYCNd1+kef6Vxqj9sLRTDQgrCwML788ksWLlzIQw891K6mhE4kyzIZGRm88847XHjhhfTs2ZNXXnkFm63l4iGC0JbYHXZSilYD0KNWh0KWcY/p2+wFT7aZyYsKpdBXi1JSckHM1a698s7z2fgtfbYrELgq/i5C6y6GzY7BpCd39v2u+v4R17/tSubrFTSEzt4J2GUbf2b+gN1hb/FcmsAYACz/YGag0ljKvM0zUQyKAUki3h7I9X1nnlTlv8pN3wPg02+qq31xfbvhanPDZkQO2YHe5kxqfP2lt9izZw9Tp07ls88+o2/fvgwbNow5c+aQW+1M2Dxx9uV80h6TCEUw0IrLLruMjz/+mA8++IDPP//8XA/nH6uoqCAjI4OUlBQ+++wz7rjjDkaOHElQUBBxcXE89dRTWCwWevXqxfPPP8+FF16I2Ww+18MWhJNyqGIXNZZKPFQ6IjKdd67uMb2bPd7osLC/ZzcABodNaHCBlGWZv47+RHbNYdQKN67odnurW+Fkh4OCBc9gKcpA6RVExIwPGiQuSpLExJir0CrdKarNZWP+shbP5xbq3M1kLjyMfIqzk7Iss694C9/ufpUSjRWVxYr9zwymDHrypKbnbTWl6A+uA8B3yDWux3Vq55KC3lrV4Hi9tRqH7EAhKdCpvUlMTOTjjz+msLCQX375BXd3d2657WbyqpwzAwHqsFP6PG2JUnn6XRbbKhEMnIS77rqLe++9l/vuu4/ffvvtXA/nlG3atIknn3ySnj174u/vT1xcHAMGDOC+++5j69atREVFcf/997N48WKKiopYsWIFc+bMYfny5axZs4aHH374XH8EQWiVLMtsK1wNOLsA2nL2AeAe1bPZ16Q4jmDRavCutTEgdHSD57YXrWVfWQoSCi7ucgOhnk3XBDhe2cpPMRxYg6RyI+KGtxuU6q2n0/gwodOVAGwt/JuMyn3Nnk8T1BlJrcVhNri2QJ4Mg7WGRQc/Z2n2j1iV4FtWxcanf8Uv9MLWX1ynZvdycNjRRiXjFnysH0P91kmro2E+QKXJmVvlo/FvkIio0Wi47LLLWLFiBet3/Y1Ko6SmzMDYIRPYvHnzSY+nLWpPOQNia+FJevfddykqKmLatGn89ddfjBzZuOd5W2IymXjnnXf45ZdfSElJITQ0lDFjxvDkk08SFhaGt7c3Xbt2xdu76a5kAGPHjuW9997j7rvvZtKkSUydOvVf/ASCcGpyajIoMeajUqhJ8uxOXk0pSBJuYd2aPL6oNo8DdudafM9DhShHqhqca23uEgBGR02ls09Cq++vP7CWslXO2cOQy2biHpXc7LHd/HvRuyaD1JKNLDnyHVd0vb3JXQmSUoV7p17Upm9Bf3AdbiEt1z1xyA72lGxlXfZCzNiQHA7iD+ezZlk1C9bk8Nbcya1+jmOfx7k10yt5YoPHlVJ9/4GGSxwVZucWTV+3wGbPKXubQQ9xQT1wd9/GkCFDuPLKK3nxxRfp0aPHSY/tXGtPQUA9MTNwklQqFd999x1Dhw7l8ssvJz09/VwPqVnbt2+nT58+PP/888TGxjJr1ixyc3OZN28e06dPZ8yYMfTr16/FQKDenXfeyQUXXMDDDz8slguENm1HsXNKOzGgP1KJc4lA7R/p6qh3PFmW+Tt7IQDhOYX45WS7coJqrXqWHPkOGQc9AvrRJ3hYq+9tKc+lYMHTAPgOuRafvlNafc3oqEvo5N0Nq8PCz4e/IL1ib5PH1V+Mq7b9itxMjoEsy2RVpTF3zxusyP4JMza8K6oZu6+cCZPf4qf1B9FoNEREnNxWPofNgvFoKgCe8Q0/v6OZKoNlRmfjIf8WchFyapy/N5Mi+7Flyxa+/vprUlJSSE5O5rbbbsNkar3bYVtQHwy0p6BABAOnQKPR8PPPPxMQEMDYsWPJzPzn233OtFWrVjFixAg8PT1JTU1l/vz5zJgx47TXuCRJ4p133uHo0aO8++67Z3awgnCGVJnLyKh09hjoGzICS3EWQLN30umV+8jTZ6KS1HTfm45sqcVuqECWZZZlLcBgrcZfG8z46Cta/YXvsFnIn/c4DpMebXRPgi9suuzxiZQKJZd0uckVEPyWMYslR76jwtRwK7N3r0kotF5Yy7IpX/NNg+esdjP7SlOYs/t1fj78BSWWElRWG4l70rlE6kOvG79A5RtGTk4O0dHRJ33xshSlI9vMKNx90AQ1nLGwOax14284sVzWSktim8Pm2kkQ5RWLUqnk5ptvJi0tjffff5/vvvuOgQMHsndv00FRWySCgQ7M39+fVatW4ebmxvjx48nIyGj9Rf+SlJQULrnkEkaMGMH69evP2LRb9+7duffee3n55ZcpKCg4I+dsSmZmJps3byY3N/esvYfQPu0q2QTIdPLuhr82GEuZ86JTvzXveHaHnXV1SwD9Qkfi7eYPgKU4g31l2zhStR+lpGRK7PWola1vISv54x3MeftRuPsQfu3rSKqTzzRXKzVcFncr/UJGAhIHy3fy9d7XmH/wYzbnryCz6gAVjho8LrwXk1ZD5qav2b7wMdZv/4Qft7/KxzueZWnWD5RYS1DY7HQ+nM1F6XbGTnmX4PF3IynVHDp0CJvNRv/+/U96XJZi542OW2hcowueyW4EQKs8NuMiy7Kr+VCwe9NJloWGbGwOKx4qHf7aYwGDRqPh3nvvZcuWLciyTL9+/Xj66afFTOS/TAQDpyEiIoK//voLlUrFsGHD2kQkazAYuOKKK0hMTOSXX35Bq22+HOjpeOGFF9BqtTz99NNn9LwAVquVW265hdjYWIYMGUJ0dDQvv/yyqO0gnBSbw8be0m0A9A4a6nys0nmXqvJtnLG+ryyFCnMJ7ipPBoSOceUUlOfvYXXOIgCGhl9A0Ek00anZt8q1/S5s2suofUNPefxKhZLRUVO5rvsDdbkJMrn6I2zIX8ovh79i1r43+UFKYcVFI1kzcSirI2W2yBlky6XYJBkPfS3x+44wNVPB5GHPEnfDB2iCYlznX7bMuWNh0qRJTQ+gCdYq55S/2q/xd2C0GQAaVGistlRgsteikBTNzgwcrT4EQKRXlybvqHv27Mm2bdt48skneeuttxg8eDD79jWfXNkWtKft5iIYOE0xMTGsW7eO0NBQxo4dy6FDh87peF599VWKioqYN28enp6Na7D/U35+frz00kvMmjWLv//++4ydV5ZlbrnlFubOncsnn3zC7t27eeaZZ5g5cyZXXXUVtbW1Z+y9hPbpcMUejDYDOrUPsb7dAee2OACVd1CDY20OG5vylwPOcsJuSi3aCGfr4g22A5jtJkI9ouh/ws6Cplgr8ij86XkA/EbOQJcw4h99jlDPKC7vehu3Jz/N2OhLiffrTaB7KG5KdyQUSChwkzT4WJVEVFhIzqtlUr6WazzHMenyL+hy7Vu4RzfeObF8ufPzDh48+KTHYq+tBEDp6dfouRqLc0th/RZDONaFMNA9DFUz2xazqtMAiPGJb/Z9tVotL774Ips2bcJsNtOvXz/ef//9dnXRbavEboJ/IDg4mBUrVjBy5EjGjBnDypUrSUhoPev4TKuoqOCdd97hwQcfJDY2tvUXnKY77riD77//nptvvpldu3bh49N0CdOT5XA4uOeee5g7dy4//PADV199NQDJyckMGDCAa665httvv525c+e2q7U54czaU+rcnpYcONBVMMhuqAQaX8z2lm5Bb61Cp/ahV7CzRLE2uifFIQHk6mQkFEyMuarVWv+y3crRH5+mSu3AJySZoAn3nbHP4+3mT5/g4fQJbrqfwqlKTU1FqVTSpUvTVRib4jA7g/CmmjtVW8oB8HLzdT1WaHDuymiu8ZDJVuvqVBjj3fTujuP17duX7du38+STT/Lggw+yYsUK5s6de1JJz/+m9hSkiJmBfygwMJBVq1bh6+vL6NGjz8m+2S+//BKbzcYjj5xc4tLpUigUfPPNN1RWVjJt2rR/1LXLZrNx55138vnnn/P111+7AoF6U6dOZdasWcybN4/XX3/9nw5daKfKTSXk1GQgIZEUNMj1uMOsB5xth+vZHDa2FKwCYFDYWNcdrDqyB3t7O+9We3v3bnF5QJZlDlfsYe7W5/mtbxBrJg5hUf8QFqR/QX5dzf0zwWQynZELTXV1Nfn5+URERKBSNbz3s9rNFOiPklOT4Zr6rydbnVn9UhNtkCvNzn4Ox28hrP/sYc2UGM6uSUdGxl8bjJfG96TG7u7uznvvvcfixYtZu3YtvXv3ZsWKFSf12n+LCAaEBkJDQ1m9ejWxsbGMGDGCTz/99F/9Ifn222+59NJLCQlpvbzoPxUbG8svv/zCqlWruP3227HbWy6n2pTCwkImTZrEN998wzfffMPNN9/c5HHTpk3jmWee4amnnmLDhpNr7CJ0LPvqcgVifOLxPu4i46i/mGmO5c7sL0upmxXwJinwWOCwq3I7tToP3IxmkqqaT/6rsVTx06HPWZQxm2K1s+COum5yNVd/hPlpH7O/bPs/+jxFRUVccskl6HQ6goKCuO2221i6dOlpb7lbuXIlAAMGDHA9ll2dzsL0b/gw9TnmHfyABWmf8Enqi/yd/Ztrp4BscybvKdQNc4/sDhuVJmcw4K91LsHYHDYKDc6tnOGeMU2O40jlAQBivJtfImjOlClT2L59O506dWLChAm8+OKL5zyfqP73uwgGhEaCgoJYs2YNd955J3fffTczZszAaDSe9fc9cOAAe/fuZfr06Wf9veqNHTuW2bNnM2fOHG655ZZTmiHYsGEDffv2Ze/evSxfvpwZM2a0ePyLL77IwIEDufPOO0WfBKEBh+xgf1kKAEmBAxs+aXf+rEhKtevY+uqE/UNGo6rbFme0GdhS4LzbTNiXji09pcn3Kq7NY96B98iuOYzC7iDuQCaXFfnzQP9XuaPns3T1S8Yh21maOf+0Zwiys7MZOHAgW7du5c033+TOO+9kxYoVTJ48mcjISF5//fUmuwC2ZOHChUiSxNChQyk3lfDzoS/48dCnZFTuwyHb8VR7463xQ8bBjuJ1rM9b6vy+XMsEHg3OV24qQcaBRql15QwUGnKwyzbcVZ6uAOF4suwgs+ogALG+p7fDqUuXLqxatYqXX36ZF154gUsvvZT8/PzTOteZ1J6WL0UwcAap1Wo+/PBD5s2bx08//cTYsWPJzv5n3cZas2TJErRaLRMmTDir73Oi6dOnM3fuXObNm8cFF1zQaptnu93OW2+9xejRo+nSpQupqamMHTu21fdRKpV8/PHH7N+/n//85z9navhCO5BTk47eWo1W6U6sT8OLjEzDO7aMyn1UmkvRKt1JPm45YUvBKsx2EwFKXyKPFmA4tBHZ3jC4LTTksCDtU/TWarwMFkau2ExvvSedL3gMAC+NLxfH3kg3v17IOFia+QN2x6kFrna7nSuucNY02LZtGw899BCvvPIKmZmZ7Nmzh6uvvpqnn36ahIQEvvvuu5O6My4rK+OHH34ACUL6e/LtvrfIqk5DISnpFTSUGYmPcmfPmdze8xkmd74WgNTiDVRbKl0JhAr3hmv0xXWJgkHuYa4LYW6Nc3t1VDO7BIpr86m11aBWuBGpa1xl8WRJksQzzzzD4sWL2bJlCwkJCTz77LNUVlae9jmFY0QwcBZce+21rF69mry8PHr27Mmvv/561t5r8eLFjBkzBnf3xlXWzrZrr72WFStWsHv3bhITE5k9e3aj2RCj0cjvv//O4MGDefTRR3n44YdZtWoVoaEnvwWrb9++/Oc//+Gll15i6dKlZ/pjCOep+in5eP/erjv9elL9f9ddlFOKnKV1ewUNddXWr7FUkVrsXH4aGXMZKk8/HKYajFmprvNUmkr55fCXmO1GAgx2hq7YgI/kQfj0NxrUE5AkiQmdrsRD5UWFuYTdpVtO6bPMmTOHlJQUfvjhByIjjyXhSZJEUlISH330Ebt376ZXr15cf/319O/fnz/++KPFaeoFCxbg7qPhzo+upNDjMHbZRox3PDclPsb4TpcT6B7qunh39+9LhK4zdtnGgbLtx7YWegc3OGdRbR7QMFEwpy4YiPRqOnk5o8pZDKqTd9dGhYpOx5QpUzh48CAzZszg1Vdf5dFHH/3H5zxV7Wl5oJ4IBs6SgQMHsmvXLsaPH8/ll1/OzJkzT2t9vSW5ubmsXbuWadOmndHznopRo0axe/duRo8ezU033URgYCBDhgxh9OjR9O3bFx8fHy6++GJsNhvr16/n9ddfP632n08//TSTJk3ixhtvPKuFj4Tzg9Vu5nDFHgC6B/Rr9LxrecBqodCQQ74+C4WkpPdxpYW3FqzELtuI0HWms28PPBOc/Uaqdv4OgMVuZmH6NxhtBvxMMGDFWjSSmogb3m2yAZFW5c7g8PEAbCv821W292R89NFHTJkypcXtfz169ODXX39lzZo16HQ6LrroIvr06cOXX35JdXV1g2NtNht/blrI/30/g7j+0agVGi6ImcblXW9ztSBu8H1JErE+zm2ZJfoc7HVbM9UnFG0qqKsgWN+0yWq3kKd3NlCK9mp6l0B9meUuvomtfg8ny8/Pjw8++IAPP/yQr7766oxud+6oRDBwFvn5+bFgwQJeeeUV/vvf/zJhwgTy8vLO2Pnnz5+Pm5sbl1566Rk75+kIDw9n/vz5HDhwgOeee474+HgiIyPp27cvb7/9Nvv27WPHjh0MG9Z6jffmKBQKZs+ejUql4rrrrhP5Ax1cRtV+rA4LPm4BhHs2zmCX6hLfZJvZdfcf79cLncY57a23VLGn7u59aPhEJEnCd+AVAFTvXIKlLIcVR3+mzFSE1uqg38q1qGUF4de9iXtUUrPjSg4ciIdKR42l0lUeuTX79+8nJSWl2UTaE40cOZI1a9bw119/ERUVxR133EFwcDBXXHEFb731Fv/97yvcNPNKRtybiIePltpiC9f3eJikwIEtrnH71a33V+ida/Eq3zCUWp3reavD6qoyWL9rIFd/BLtsx0vj22S+QLW5ghJjPhJSo6WcM+GOO+5gwIAB//rsgJgZEE6ZQqHg6aefZuXKlaSlpZGcnMy8efP+8Q+TLMssWLCAcePG4evre2YG+w8lJCTwxBNPMGvWLObOncuXX37JfffdR48ePc5Iok1wcDDfffcda9euPevbKIW2La18F+C8wDf1s1WfBV9rquRgeSpAg1mBlKK12GU74boYoryc/Qvco3vi0WUQOGxsWvR/HCjfgeSQ6bthO+52BeHXv4UuvuW9/yqF2pXM6CyR3LpffvkFLy8vLrroopM6Hpx38uPHj2fx4sVkZ2fz8ssvk5uby8v/e4lDqm30uSIOhVLBgb+Pol+nbfJCfSK1wrmN0Fa3LdM9uleD5wv0R3HIdnRqb3w0zhLOWVXOQkKdvLs1+feQXteeOULXGQ/1mS+GVv/7dceOHW2iEuz5TAQD/5LRo0eze/duJk6cyHXXXceoUaPYs2fPaZ9v/vz5bN26lYceeujMDfI8MGbMGN5//30++OADvvrqq3M9HOEcMNtNruz0BP/eTR5T36nwoCENu2wjyD2cMM9oAEw2I7tLnPVABoWOa3ARC73yBRzB0ezq5sxp6XrwCKGqQKLvmoUu4eTaltcnKB6tPky1ubzV45cvX864ceNwc3M7qfOfKDIykkcffZTla//gvTXPkTw2DoWkZFz05Sx6Yw3eupMrDlafdOkwO2sOeMQNavB8fW5AhFes6zvLrHJuGexct2XQZrPx/vvvk5CQgK+vL9/++RkAf/2wlueff56//vqLmpqa0/qczenVyxm0FBUVndHzdjQiGPgXBQQE8MMPP7B06VJKSkro27cvDz/88Cn/EP/www/MmDGDK6644l/fRdAW3H333dxxxx3cfffdrF279lwPR/iXHancj1224acNItC9ce8BcC4TyMB+i3M9u3fwUNcFbHfJJqwOM4HuoXW9AI5R+4aROeUKrG4a/GxqRva9l5gHFqANP/nKor5uAUR7xQEye0u3UbV9EYW/vEjVjt8bHWs0Gtm8eTPjxo076fM3JavqEHP3v0eJMR8PlY6rut1F7+Ch+Pv7c/DgwZM6h8nmTP5VGmpAkhrNgmTXHAao+2zObYYV5lIUkpJOdSWG33zzTR566CH69+/PMy88RWSiM7eiOsPKhx9+yMSJE/Hx8SEhIYHp06fz5ZdfUlxc/I8++6ZNzhmYmJiYf3Sejk4EA+fABRdcQGpqKi+++CJffvklkZGRXH/99axdu7bF5QNZlnn99de57rrrmDZtGvPmzfsXR912SJLEhx9+yIgRI7jgggv48ccfz/WQhH9RfeJgN9+ezS4/KdRuVAT4UCUbUCs0rhkEh2xnZ10OQb+QUY1eX6A/yoGqPYDE5KS78Ukaj6Q49fbf9UsFu3NWUPDTc1Rt+5XCH5/FUtpwq/H27duxWq2nnU8jyw62FKzkl8NfYLLXEuoRxXU9HiLSy7mF77rrrmPhwoUn1ePDYHX2HHAzW3CP6dugr4PZZqRA7xx7J++ugHO7JkCkLhY3pXNZZuvWrQwaNIi5c+cycfoIJMm582DBnJ8pKSlh//79fPnll0yYMIHMzEzuuOMOwsLCGDVqFJ999lmjRMjW6PV63nrrLUaMGHFK5ZaFxkQwcI64ubnx9NNPk52dzRtvvMHGjRsZNWoUSUlJvPTSS6SlpTWocrVy5UrGjh3LE088wZNPPsmsWbPQaFpvr9peqdVqlixZwuWXX860adN47bXX2mVSj9CQ1W4ms9p5p9vVv3FTHhelipxOzrLCijIP1q3eQElJCemV+9Bbq3BXeTZaYpBlmdW5iwFIDOhHmC76tMcZ55eMm0OBQSVTGHlsG63hUMNKmlu2bMHd3Z2kpOaTEptTa63hl8NfsT7vT2RkkgIHcnXCPQ0qMU6fPh29Xs+ff/7Z6vkqTc4dBB4GIz79pjZ4zllO2IGfNggftwDgWDAQ53dsl0BNTQ0mkwmHw0FaRV1eh79zGl+hUNC9e3duueUWPvjgAzZt2kRhYSGff/45Hh4e3HPPPYSHhzNmzBgefPBB5syZw7p168jJyWlU2EyWZf7++28mT57MoUOHeOONN07x2/tn2uPvGhEMnGN+fn489NBDZGRksHLlSpKTk3n99ddJSEjAw8ODTp06ERgYyPjx46msrGTx4sW88sorKJWnfrfS3mi1WubOncuzzz7Lk08+yY033ojBYGj9hcJ562j1YWwOK94aP4LdG/cQOHz4ME888QQr162lINI5Rf32458yfvx4IiIi+H71lwD0DBzcqLteVvVB8vVZqCQVwyMm/6NxmvavJSrNucaePWgwPoOvAsCub5hDsHLlSoYPH37K223TK/cxe9/bZFWnoVKomdjpKi6ImdboM3Xp0oXY2FheeeWVVguDFZY7kwG9zA68kic2eK5+Z0Rnb+dyid5STZ4+y/kePseCgeeff57U1FS+mP0ZOTXOJZpufg0TEY8XHBzMrbfeyp9//klWVhbPPvssQUFBLFmyhBtvvJGRI0cSHR2NRqNBpVLh6+tLWFgYnp6ejB07ltLSUn766ScGDRrU7HsIJ0d0LWwjJEli7NixjB07FqPRyMqVK8nIyKCoqAidTsfgwYMZM2ZMuyp/eSZIksRLL71EYmIit956K6mpqSxYsIDu3buf66EJZ0F9AZsuvokN/l/IysriwQcfZNGiRfj5+fHpC2MoU6vwdGjYv+kwubl5/LbsZ4gqQXbIhDgaVsKTZZkNecsA564Dneb0O3JaSrMp/Ol5OmMmKz6WEoWeDK2WQBo2/rFYLKxZs4bnn3/+pM+tt1SxOmcxaRWpAARoQ7go9nqCPJrOnQDnboVx48YxceJEXn/9dXr16kVQUMPdBXaHnVJrGSgVRHUa7krABGcp5yOu7925PTC9ci8gE+oZhbfbsc6Qw4cPZ8aMGfz497dMTh5GmGc0Pm7+J/XZoqKiePLJJ13/bTAYOHr0KFlZWRQXF2MymaipqcFoNOLj40OvXr0YNarxUo9wekQw0Aa5u7szZcqUcz2M88o111xDcnIyV155JX379uXll1/mgQceOK0CR0LbJMsOjtTdodbvWbfZbLz33nvMnDmTgIAAZs2axbRp01i48SkA4hQhaLXuxMXFMVCbzNbCVRxNLeSiN6eyatUqV7W/7Jp0impzUSnUDAgdc9pjdFjN5M97DIdZj2+n3gyJnMS6/D9J8TUy2NeLEN2xC+OKFSuora1l0qRJrZ631lrD9qJ17Cxej9VhQUKiX8gohkZcgFrR8s94r169eOSRR/jPf/7jSjgODQ3Fz88PtVqNh4cHF4yIwGtaDCqrDXtAw/yFfH0mRpsBN6U7ETpnlcFDdUsA3fwaL9W89dZbvPz7QwDE+/Vu9bM1x9PTkx49etCjx5mvT/BPtcdlAhEMCO1GYmIiO3bs4KmnnuLxxx/ns88+4+233+aiiy4Sdw/tQKEhh1qbHo1SS5RXLAUFBVx66aVs27aNBx54gJdeegkvLy9MtloKvZzLaF2VzqWE45saTRt5E4teWc+oUaNYvXo1UVFRpNQ1MUoKHIiHWtfk+5+M4t9fx1yQhtLTj7BrXyPSO5CsmkPk1GSweWQ/lF52+jhsKBUqvvvuOxISEkhOTm7yXBa7mZyadNLKd3GoYjd22VloK8yzE+OiLyPEM7LJ1zXl6aef5oknniAjI4Pdu3ezc+dO9Ho9drudWoOe+M4V5AOGjGK63zCEpKQkLrnkEsaOHYu1k7NLYRffHigVSvSWatcSQHwTSwAqHUQmhuCwO7AXauDkK48L55Akt8cQR+jwdu/ezYMPPsjq1atJTk7m/vvv54YbbkCr1bb+YqFN2pi/nE35y+nm15PemjGMGTMGo9HIL7/80mDNeG/pNpZlzcerSs+1IVfhlTSOrKpD/Hz4c7RKD+7q9Ry5OXmMGjWKwMBAfl+5kO8OvwtI3Jr8JL51CXKnqnrnEgoWPAOSRORNH+HZbSgA+vJsftzyIuVBzul0rdKdYG0k33/9I4P6DmHcmHHIyFgdVky2WvSWKirMJZQZi5E51pAo1DOKQaHjGi2R/FOVW39mUfFiSkIDGeAznKqDSubPn8+yZcsoKyvl2d/vxCdYx975+US4xdJlVCjlflmEeXZievf7G51vc/4KNuQvJWd3MTlLDPz8889nbKxtRVRUFLm5uZSWlhIQcHo/L22NmBkQ2qWePXuyatUq1q5d62oH+9JLL/HSSy9x/fXXiwTM81B9tTt/KYxx48a5+l107txw/b9+CjsstwhFpDP4O1Be39SoF0qFik6dOvHLL78wdOhQPvr1DXyT1MT6JJx2IGAuTKfw15cACBhzuysQALAf2cHgdTvI7TeAjLhIDNZqsg2HGXZ1b8DImtzG9QfqeWv8iPXtQQ//foR6Rp3xGS67oZLCFR9RNs55h98jchCBXcO4+OKLcTgcrN+7im2WpTgsMoX7K1i282uu6jqGaL8wFny4mN9K19OvXz8GDBhATEwMoaGh7C3dBkB1upVff/0Vh8OBQtG+ctXr+8y0pxlHEQwI7ZYkSYwaNYpRo0aRlpbGM888w0033cTrr7/ObbfdxtVXX014eOOMdKHtMdoMFBic+9yfu+8Vampq2LBhQ6NAwGw3kV3tLI4TlleMpHHH5rC6muV09+/rOrZv3768+/67FEfuAdT0DBpyWmOzG6vJm/MwstWER9wgAsbd2eB5fdp6FLJMH+/ejOt5J6kZKTw8814uvupCkvsmYXfYkCQJtUKDm9IdT7U3vm4BBHmE4/UPEhlPRvGSNyn0UuJQKvHR+BOgPTanr1AoMHlXQCn0DB/EY0veosxYxKx9b4AMnXXdSdm9gyVLlrh28UQnhvLArOuwGK3Me+9nnn766XZ1waxnsVjO9RDOOBEMCB1CfHw8P/30E1u3buXVV1/lySef5PHHH3f1iW+LSUrCMc4LvIylwsH6lZtYt24dsbGNW+ZmVR3ELtvxNJjR1RhQaLRkVaVhcZjRqX0I1zVsajTuqmEsykinutSA1UsBvqc2LtluJX/eY1jLc1D5hhF2zasNihQ5rCZqDzsr5HnGj0AhKfnirVkcWJnNki8eR6c7/fyEf0p/YC3VO3+nYICzxsGJyw82h5VDFbsB6O7fBzjWNjrWtzv/99qtgPMuOS0tjby8PA7J2zBRTpi6M0cOZ523wXZFRQXPPvssJpOJJ554gm7dGnZkNJvN52hkZ0/7mrsRhFYMHDiQX375haKiIt58803Wrl1LUlIS1113HRkZGed6eEIzsmvSAdj0xw7ef/99Bg4c2ORx9Y1xQgvLkXCWJa6/oHXz64kkNfyVV9/wKGtrIddecy0mk+mkxyTLMkUL/0tt+hYkjTsRN7yDytOvwTGGtA04zAZUPqFoIxMpLS1l1qxZPPDAA60GAiaTibS0NPbvP7nuh6fCpi+n8JcXsSkVFEU5tyWeWIQpo3IfZrsRL40vUV5dGiRhJgYOcB2nVCrp0aMHo8eNxhHkrHQ4psdF520goNfrGTp0KHPnzmXx4sX06NGDL7/8ssEx9T8n7WnWQwQDQofk6+vLgw8+SHp6Oh999BFr1qwhISGBBx54gLKysnM9POEEGWXOC2KUVxfuuOOOJo9xyHZXA6PQAme9e4dSyZG6ZjpdT9gGZ3VYyahyBg+3XXw/Bw8e5L777jvpMZWt+ISqlF9BUhB+zatN9i+o2e2sXeDVcyKSQsGcOXNwOBzcddddzZ7XarXy8MMP4+3tTUJCAomJiSQlJfHuu++ekTtS2eGg8MeZ2PVllPRIxi7J+LoFEOrZsOLintKtAPQI6IckKciqSkNvrUar9GiyHXF6xR4sdhPeGj+ivc7f0sDr1q3j4MGDrFy5kuzsbG677TZuv/123nzzTWRZRq/Xt8sW6iIYEDo0jUbD3XffzaFDh3jppZeYPXs23bt3Z+HChed6aEKd8toSDI5qHHYH/3nktWbvxgr02ZjtRrRKd3xLK5yPmYsw2424qzwbLRFk11Uz9NL4Mrz3GD799FO++uor3nrrrVbHVLHxe8pWfQ5AyCVPo+s+qtExDrMB/UFnI636in4bNmxg2LBhBAYGNnnekpISJk2axIcffsjMmTP5+++/+fXXX+nZsyePPvoo/fr1+0fdTgHK/v4Cw6ENSCo3CpOdiYOJAQMafK/V5nKO1uVe1PdZ2FvmDA66B/RFpWi8wry3LnhIDBzQaAbmfPLXX38RFhZGv3790Gq1fPLJJzz99NM89thjDBo0iDFjTr8ORVt2/v6NCQ2sXbuWiy++mPDwcCRJEhezU+Th4cGTTz5JWloaQ4cO5bLLLvvX650LTfvshw8A8JYCCPBt+iIKkFXt3G3QyTue+staVq1zP3ysT3cUJ1yg6tvvxvr0QJIkZsyYwVNPPcWjjz7K3Llzm32fyq0/U7z4NQACxt+N76ArmzyuZt/fyFYT6sBOaCOdJXtTUlLo3bt3k8cXFxczevRo9uzZw4oVK5g5cyajR4/m0ksvZd68eezcuRNJkhgwYAAzZ86kqqqq2TE2R79/NWUrPwXA7ZKHyTPnIyHRI6Bfg+OcswIy0V5d8XULQG+pdvUiSA5svERTaSqtW8qRSArof8rjakt+//13pk6d6gqOJEnilVdeYcmSJSgUClJSUggNbX/FE0Qw0E4YDAZ69erFRx99dK6Hcl4LDQ3l119/5dlnn+Xxxx/nq6++OtdD6tB27NjBrqy6O9Lw5mvcA64lgs4+8Uh1d65ZhiN1jzUuT12/VfH4NsavvPIKt9xyCzfffDNLly5t9JqKzQsoqttC6Df8BgLGNr1kAVCz2/l6716TkSSJ2tpajh492mQwUFJSwvjx4ykvL2fdunWMGtV4piE5OZlt27bxyCOP8Oabb9KtWze++uorHA5Ho2ObYso7QP78p0CW8R08jYxg57bLWN8eDUoK2x129pRuAaBn0GAA9pVtwyE7CPPsRJBH41yA+u2EMd7d8D7J8sNtkcFgID09vcmclAsvvJDNmzdjMBh4//33AZEzILRBkydP5uWXX+ayyy476de88MIL9O7dm6+//pro6Gh0Oh333HMPdrud119/ndDQUIKDg3nllVcavE6SJD777DOmTJmCh4cH3bt3Z9OmTaSnpzN69Gg8PT0ZOnToeZuQV9/v4JZbbuGRRx4hPz//XA+pQzKbzcyYMYP4gc7tg/WlcJtitNVSVJsHQCfvbig07hjd3aiwliMhudru1qs2V1BlKUdCQdRx69uSJPHpp58yadIkLrvsMtauXet6rnzdtxT/9l8A/IZdT9CFjzR7MbAbKjEc3gyAdy9nuWGtVktQUBA7d+50HWez2fjmm2/o0aMHRUVFrFq1ivj4+GY/p1ar5b///S+HDx9mwoQJ3HbbbfTr14/Fixe3WCLXUppN7qx7kS1GPOIG4z3pPtcFvHfQ0AbHHq7cjcFag6faizjfJByynV0lzh0RveqCgwaf1WFz5Rc0NWtwPtm7dy+yLNOrV/OBp4eHhysAa0/1E9rPJxFOS0ZGBn/++SdLly7l+++/56uvvuKiiy4iNzeXNWvW8Nprr/Hss8+yZcuWBq976aWXuPHGG0lNTSUhIYHp06dz55138tRTT5GSkoIsy6eUjNUW1ScMidmBc+O5554jvzQX71BPQCJC17nZY3NrMgAZf20wOo0PSk8/SoOcd6ghnpFoVR4Njs83ZAEQ7BGORunW4Dm1Ws2PP/7IsGHDmDJlClu3bKb4j7cp+eNtAPxH3ULQRf/X4l1hzb6V4LDhFhaPJigGcF44pkyZwrvvvsuIESO44oorCAoK4pZbbuGCCy5g586dJ91gKzIykrlz57J+/Xq8vb2ZOnUqQ4YMITc3t9Gx1oo8cr66E7u+HLeweMKve4M95duxOswEaEPo5N1w29yOovWAs7OjUqEko/IANZZKtCoP4k/YcQDOHRy1tho81d508T31Vsxtya5du1AoFK1uNa4PvNrTzICoM9DBORwOvv76a7y8vOjRowdjxowhLS2NP/74A4VCQXx8PK+99hp///13g5KvN998M9OmTQPgiSeeYMiQIcycOZMLLrgAgAcffJCbb775nHymM8XPz4+kpCTS09PP9VA6nE2bNvHmm2/yvy+eB6oJdA9Fq3Jv9vicGucsVJRXHABq3zDKvJxJhNFeXRsdX2jIASDshAz6elqtloULFzJ18kR2vH0DPrGeAAROepCAUa3/XNfsXQmAV/KEBo9//vnndOvWjTVr1lBaWso999zDpZdeyoABA5o6TauGDRvG6tWrWblyJbfeeitjx45l165duLs7vytLaTY5X92JrbIATVAMkTd/jEOjZUexc8ajf2jDrn8F+qMUGI6ilJT0CnYWYUotPhYcnNgi2fn8BsA5K6BUnN+VPVNTU4mPj3d9f80RwYDQ7sTExODl5eX675CQEJRKZYPpr5CQEIqLixu8rmfPng2eBxo0XAkJCcFkMlFdXY23t/fZGv5ZFxERQUFBwbkeRodiMpm45ZZbnGVux/VmR8naRjsBTlQfDNRvadOExlHu4cyGj2pim1tx3ZJCS81+NMZSvrg0GFtpLRabg6zIC+k28qZWx2831VB7xDlt7pU0vsFzKpWKJ598skGr3n9KkiTGjx/P8uXLSU5O5tNPP+Xhhx/GlLef3Fn3YdeXow7sROStn6HyCmBn8XoM1hq8NL5092+YOJhS5AwSEvz74Kn2ptRYSHZNOhISvZqo0FhqLCBXfwQJhSu/4HyWmppKnz59Wj1OLBMI7c6JLX4lSWrysROTlI4/pj46buqxk01uaqvCw8PJy8s718PoUF544QWOHDnCN998Q7HROe0d5tl8MGCy1VJqLAQgwsuZVyBHJ1Dr6QGy3Gj/PECZsQiAQPewRs/JskxVykKyPrwWW2kWSq9AfqzpwdSHXmPatGlkZma2OP7a9C1gt6EO7ORaIvg3xMfHM3bsWFauXEnNnuVkf3aLa2kg+o6vUfuEYHVY2VKwCoCBoWMb3MlXmss4XFegqV/ISAB2FK0DIM43qUGSYb3U4k11zyfipfE9mx/vrJNlmT179jS40WnpWBDBgCB0GBERESIY+BelpKTwxhtv8Pzzz5PQPYHC2pan8wEKDEcBGV+3QDzVzlmuyuAgALyq9djStzU43mwzUmvTA+CvDWrwnLUin7xvH6Tw5xeQLUbcY/sTc/8P/OfTH5g/fz6rV68mLi6Oa665hqVLlzYZ7BoObQRA123Y6X0J/0BiQlfGeBwlf97jzl4JXYcSdcdXqLycDZh2Fq3HYK3GW+Pnqh9QL6VwNTIyMd7xBHmEU2utcZUf7lsXHBzPbDO6nu8VPLTR8+cbm82GXq8/qW2D7XFmQCwTtBN6vb7B2nZmZiapqan4+/sTHd38L1KhZaGhoVRVVWE2m3Fzc2v9BcJps9vt3HXXXSQnJ/PYY49RairE5rDiptQ2umgfL1/vbGB0/FJCkdl55+9XVkXJrrdxj+mLUuss/1tjde7P1yrd0Sid2+vsxmoq1s+lfN23yFYTKFUETrgX/xE3unoNTJs2jSlTpvDNN9/wwQcfMHnyZKKiohg8eDC9e/emT58+zhr26c5kW4+u/+60ufHoLq7x3IV3F+d4/UfeRODE+5CUzl/zRpuBrYXOXIah4RMbFA7SW6pduwsGhjqL6uws3oBdthHmGU2ELqbR++0rS3ElIUbX5Wqcz+qbD2k0miafz8zMZOzYsZSXl7taoYucAaHNSUlJaVAZ65FHHgFgxowZzJo16xyN6vzn4+PsGldVVUVwcPA5Hk379vnnn7N9+3Y2btyIWq2mqNI5KxDiEdViRTvnzEDDpYQig3N5wd8kYynJIvfrewi98kXcgjtTa60BwEPthSl3H1U7fqd6xyIcZmfnPffO/Qi55GncQhrnGnh4eHDvvfdyzz33sHXrVr7//ntSU1N57bXXqK6uJtBTxfr7E3HIMtc8+AIRMV3p2rUrCQkJ9OjRg5iYmDN+N2mtyKN0+cdUpy7BGyjRW0m49V0CezdMXtyYtwyz3USQezjdA07MFViNXbYR7hlDpFcXLHazKzGwf8ioRhc9h+xgZ11iYe/goe3ioljflri59uaPPPIIVquViy++mO+++w4QMwNCG+BwOBrU0E9MTGyU5FevpKSkycfvvfde7r333gbP11fdO/6xH3/8scFj9e9T/9+enp7Y7fYG/2OMHj26xX3P54v6ZjI1NTUiGDiLKisrmTlzJjfffDNDhjgT1YpqnRf0lpL8ZFlutDNAlmVKjM7aEF1H3os582lMObvJeucy3EK7URQZCp00yIVHOPrdda5zaULiCBx/F7rEca1e3CRJYtCgQa4dNg6Hg+zsbHI2LYLdX1OFDq2XP1u3buW7775ztfj19vamb9++DBgwgIEDBzJ8+PDTrmZnyj9IxYbvqE79ExzOWvmmqCFc/H9fsPaOUI6v1Vhcm++qFTA6amqDaowGa43rucHh45EkiT0lWzDZjfi5BRLnl8yJjlTup9JchpvSncTzvOLgiZr6vVVVVcWyZct44YUXePTRR13BQHsIguqJYOA8VVZW1qYuTsXFxQQFNT+Ve746PhgQzp7XXnsNo9HIyy+/7HqspNZ5QQ/2iGj2dVWWcsx2I0pJSaC786Jaa6vBaDMgIREePQTHfd9TsuQt9AdWYy48RK2yEjr1RLJakTTu6OKH49P/MjziBiOd5p2eQqFw7sw56kXpbojuPYKfXn0VcAYKubm57N+/n507d5KSksIPP/zgCrw7depE//796devH71796Z3796EhTVObATnckbN7mVUpfyGKXev63GPuMEETXqAanUglfd+Slpammt3j0N2sOLoz8jIdPPrSbR3wyn9rQWrsDmshHpGEeMdj81hJaVoNQD9Q0c3KuMMsL1u10HPoEGole1j+Uyn0yFJUpNlnv/44w+MRiPTp093NYtyc3MTMwOC0FHU/1IuKChotqa88M/Isszs2bO5/fbbXW1vHbKdEqNzS2dwE+Vv69VvEQx0D0NZtwZev1PA1y3AuS8+IIqIG9/FVlOKMWcPRkMGcBB1eDfiZn6CQtX0GvHpsJY7x6MJOJano1AoiI6OJjo6mkmTJrkez8vLY8OGDWzZsoUdO3bw6quvUl1d7fw8gYH06NGDxMREEnv0oF+4htCaA1jSNyDbLHUnVuGVNA6/YdfjHu288LvJMgkJCXz55ZdcfvnlKBQKUos3UmA4ikbhxuioSxqMt8ZS6ZoVGBY+CUmS2FeyDb21Gp3ahx5N3PUXGrLJ1R9BISnpEzzijH1355pCocDHx4fKyspGzy1ZsoSkpCQiIyNdz7e3HCIRDAhCC8LCwlAqlRw6dIjJkyef9ferra3FarUiyzJ2ux1JklCpVLi7uzfa8tle7Nq1i4KCAi688ELXYxWmEmwOK2qFBj+35psTldY6A4bjtwhWmJzLV34nJB2qvALx6jEG/+pIOHQQi5IzGggA2A3lACh1Aa0eGxERwbRp01zFu2RZJisri507d7J3717S9u/BPXs9Xex/45fnRn3z4nyjiqPqGCyRAwn36kFcrZpYiwWNRoMkSbzxxhtcfPHFvPDCCzz01P2sy1sCwIjIi/DS+DQYw8b85dhlG5G6WDp5d8PusLGl0Ln1cEDomCa7E24rXA1Agn/vRuc73/n6+jYKBmw2G0uWLOH+++8HcNUd8fT0/LeHd1aJYEAQWqBWq5k8eTJfffUV9957LyrVmftfpqKigi1btrB161b27NlDSkoKWVlZzR6vUqnw9fUlKCiIsLAwwsPDiY6OpmvXrvTo0YPk5ORWK6e1RZs3b0apVDJ69GjXY8XHXeRbSh6snz0I8jguGDA7c2lODAbqeWmc++VrLJXIsnxG131lq/OSrdBoT/m1kiTRuXNnYqIiGRNqoUy1DnuNAnBDVrtT6p3A5jIP1h7J5uDB3Rw9utiVAa9SqYiPjyc5OZnevXtzww038Mp/X8HcI4/gOD/C3GMa9RUoMxayr24HwfDIC5Ekib2l26ixVOKp9qZn0KATh0iFqZTDFc4Wyv1DRp/yZ2zr/Pz8qKioaPDY5s2bqaysdAWru3btApzLO+2JCAbOUwEBAc0mDJ4LAQGt3wmdr2bOnMngwYO5/PLLee+99+jcufka+S2RZZnU1FR++uknFi9e7OpL7+/vT3JyMldccYXrgl4/IyDLMjabDaPRiMFgoLKykuLiYgoKCsjMzGT16tWuevRKpZLu3bu71p7r16HbeoBw4MABunTp0mBLV2kTF/mmlNUVG6rPFwCotjjvzr01TXfP89b4olKosTmslBgLWlyGOFVS3UyDw2I65dfKsox+30pK/nwXa7nz71TlG4b/iBvx6XcJCW4eDAcerTve4XCQn59Peno6Bw8eZM+ePezevZvff/8dvV7P5HuGExznh1Fv5sHLnuPTzgu4++67ufTSS3F3d2dt7hJkZOJ8k4jQxWBz2NhS4Nx6ODB0TJOlh7cXrUFGprN3Qqt/N+ejxMRE1q1b1+CxefPmERUV5SoZvX37dlQqFUlJ53cfhhOJYOA8pVAo2mXCXls0cOBAFi1axM0330xsbCyJiYlceOGFjB49mmHDhrm2H55IlmWOHDnCunXrWLVqFStWrKCgoAA/Pz+mTp3Ko48+ypAhQ4iLi/tHd6e1tbXs27ePnTt3sn37dnbs2MH8+fMxmUyoVCr69OnD8OHDGTFiBCNGjCAwsPlp93Ph0KFDjTr1lZmc6/4B2uYz7W0OG5V1swDHH1djqQRotiKeUqEi2iuOI1UHSK/ce0aDAZWvcxz1F/OTZco/SPHvb2DMdBbxUXoFEjD2Dnz7X4akanp5SKFQEBkZSWRkZINZFYfDwbr9f5Fi+guALd8epKKgmnW561i3bh0qlYrRlw1h0uMDQZbooXXOAOwp3UyNpRKd2qfJ0sIGa41rJmFA2JhGz7cH06ZNY+7cuezdu5ekpCSsVis//vgjN998M0qlElmW+fnnn7HZbIwdO/ZcD/eMEsGAIJyEKVOmkJGRwfLly/n999+ZO3cub7zxBpIkkZycTPfu3YmJicHT0xOTycSePXvYtm0bhYWFSJJEr169mD59OpMmTWLUqFFndP3fw8ODAQMGNGh2Y7Va2bt3L5s2bWLjxo38/PPPvPPOOwCMGjWKW265hWuuuabZAiv/FqPRyLp163jmmWcaPF5udM56Bbg3v2OmylyGjIxG4eaqPAjOixaA7rjHThTv35sjVQfYVbyRfsEjcGuhCdKp0EY67xb1B9a02OK4nrUin9K/nDUCkGUklRv+I2fgP/ImFG4eLb62OeXmInZbnNn+fYKH839fv4n5EzPbt2/np59+YtHi3+h9pbNs89ofUnj07TeJ7hzFXd9cgcZTSScpEQWN99rvKFqHra4IUWQL7aTPZ+PHO3tJrFixgqSkJLZs2UJpaSlXXXUVABs2bCAzMxOdTtcgx6U9EMGAIJwkb29vrrzySq688kpkWSY9PZ3169ezceNG0tPT2bJlCyaTCY1GQ7du3bjlllsYPHgww4cPx8+vcV33s0mtVtOnTx/69OnDPffcA0BOTg4rVqxg7ty5zJgxg2eeeYZHH32UO+6445wtJXz++efU1ta6ftlC/R1/KQAB2pBmX1t/jI9bQIOLrtFWVzxIrWv2tfF+vdmU/xeV5lJ+PzKXKbHXtxgQyLKMxWHGYjehlJS4qzybzGXw6jGGIo0H1rJsKrf8iN/gaU2ez1ycScX6OVTtWAR2Z40Ar16TCZr0AGrf059+r7FU8evhr7E4zETqYhkVeTHgzHwfOnQoQ4cO5brHL2V17iKUDjWdpWTi4nLpNDIAjaeS0pwKLrrqKjRqDcnJyUyaNInRo0fTo2cCqSXOMssDw1qvw3C+SklJAXAF1qWlzp+x6OhoHA4H//d/ztbVjzzySLMzgucrSW4PlWEEQTgl+/fv57XXXuO7774jNDTUVfDn35wpyM3NpUePHlx//fV8/PHHrsdLagv4dv9buCm13Nv7pWYvPDuK1vN3zkK6+iYzNW4GAHaHnXd3PAHAvb3/g1bV/N11gf4oC9I+wSbb8FR70yOgH0F1WxTNNiPVlkoqzCWUG4upNJdhdZhdr1VJKsJ0nUjw70N3/76olce+t/K1syj5812QFPgMuAyv5AmodAHY9OWYcvehP7AaU/Zu1/EeXQYSeMH9uEc1Lu5zKmqtBhakfUyZqQg/t0Cu7X4/7qqGGe81liq+2fs6VoeZCZ2uomfQIGqtNXy5539YHRYqNsGiL5aTlpbmSk4EmHDbYC64cxiVeQZM6z2ZPPlC4uPjCQ0NbbZi3/mmvLyccePGYbFY2L17N0qlkvT0dLp168bIkSMpKytj7969hIWFkZ6ejofH6c3ctFUiGBCEDiw9PZ3nnnuOH374gejoaJ555hlmzJhx1oOClJQUpk+fjsFgYN++ffj6+rqeSyvfxe9H5hDm2Ynp3e9v9hyrcxazvWgN/UJGMjpqKuDsYPhR6nMAPNT3tQZd+ZqSrz/KH5nzqDKXtXhcPYWkwCHLwLFfm55qb4ZHTCYxoD+SJCHLMsWLXqVy8/zmTyQp0CWMxG/EjXh07ntS790Sg7Wanw59QamxAJ3am2sS7sPHrXEC5eKMbzlUsZswz05cm3AvkqRg5dFfSC3ZSIhHJNd1fwBJUmC329m9ezebNm1ic8omEm70x02nZs7Tv7Prr7QG51Sr1Wi1WnQ6Hb6+vgQEBBAcHExoaCj+/v74+vqi0+nw8PDAx8cHf39/PD090Wq1eHl5odPp0Ol0DXbqOBwOamtrqaqqorKyEoPBgCzLKJVK1Gq1658qlQqVSuUKSGRZRpZlHA4HDofDtT3X3d0djUaDxWJBlmUUCgUWi4Xs7GyOHDnCqlWr+Omnn7Db7WzatIm+fY/9nbzzzju8+eabmM1mamtrWbNmTYMlufZCLBMIQgcWFxfHvHnzeOaZZ/jPf/7DnXfeybPPPssVV1zBtGnTGDFixBm583M4HGRlZbF+/Xq+//57li5dSnJyMn/++WeDQACOTf/7aVtOdNRbnJXijk8UtMt21783VTnvROG6TtyU+BjplXs4Wn2YanM5dtmORuGGTuODr1sg/u7B+LkF4a3xQa10wyHbqTCVcaRqH6nFG6m2VLAsaz4HynYwIeZKfN0CCLnkKbx6TqRyy0+YcvfiMOlRuHvjFtIFj9iBeCWNReV9ZiqIlhmL+TX9K6rMZXiqvbkq/q4mA4H0ir0cqtiNhILxna5AkhSUGYvZVbIZgJGRF7mWPpRKpWuZqW9+NzbkL8VfG8zan7eyZ/ce1qxZw/79+8nKyqK0tJSqqiqqqqpce/BPV30w9W/z8PCgS5cu9OvXjz/++IOMjAwiIiLw8fEhIiICjUaD2Wzmjz/+aJeBAIhgQBAEnFuq5s+fz3PPPcesWbNYsGABn3zyCUFBQVx44YWMGjWKrl27Ehoaik6nw+FwYLPZsFqtmM1mzGYzJpOJyspKKioqqKioIC8vj/T0dA4dOkRaWhomk3O73eDBg5k9ezbTp09vsm5DhckZDPi2UGwIQF/XfVCn9nY9duxCIp30urZKoSLBvw8J/n1O6niFpCTAPZgA92D6BI9gR9E6NhUsJ7vmMLP2vkH/kFEMCB2NR+d+eHTu1/oJ/4FD5btYdvRHLHYTPm4BXNn1dnybCKJMtlpWZv8CwIDQ0a4dFGtyFiHjoItvItHeXRu9zmwzsr1oDQCDw8bj7eXNsGHDGDas6fbMFouFgoICysvLXX+qqqqora2lpqaGiooKqqurMZlM2O12rFar64/NZkOWZbRaLR4eHnh6err+aLVaJEnCbre7fvbsdjs2m831p3424PjZgfpjTCYTZrMZWZZdMwpKpdJVzKu2tpbi4mJ27tzJ77//3qDvC8DkyZP58MMPiY1tn4mTIIIBQRCOk5iYyBtvvMHrr7/O1q1bWbhwIUuWLGH27NmndB61Wk1YWBhxcXEMGjSIm266ie7du9OnT59We2rU1wnwdWu5dkV998HjdxIcWxaQcch2FNLZXc9WKVQMDBtDV78kVhz9heyaw2wpXMnOkg109+9DrE93Qj074aE+s9Xq9JYq1uT+zsHynQBE6DoztcuNeDSzg+LvnN/QW6vxcwticLizm+GRyv1kVh9EISkZGTmlydftKF6PyW7EXxtMvH/vVsel0Wjo1KnTeV+Qp6ysjIKCAqqrq/H29iYxMbHdJk3WE8GAIAiNHN+V73//+x8Gg4GsrCyKi4vR6/UolUpUKhVqtRo3NzfXH19fX/z8/PDw8DjtX55V5vqiQS3vwKit3zWgOrZrQKU4lutgtVvO2JbB1vhpg7iy2x2kV+5jQ96flJmK2FWyyVX3303pjk7tjVblgUbphkapRav0wEPliZfGF19tIAHa4GYv5vWc0/ob2VO6BZvDioTEgNAxDA2/oNn8iMMVe9hfth0JiUmdr0ZdV3Dp75xFAPQNHoF/E9UajbZaUupmBYaETzipZZf2IiAgoF0XUmuKCAYEQWiVp6ens2lOYuJZfR+7w05NXS6AdxPr3vVk2YHZ7lx20B53wVcr1K7qgkab4V8LBsAZQHX1SyLOtwdHqw9zqGI3uTUZVJhLMduNmO3GVs/hrvLEXxuMj5s/nmpvVAo1doeNaksFRYZcKszHWouHeXZibPQlhHpGN3u+GksVy486W5APCB1DuC4GcPYXqDSX4qn2ZnD4+CZfm1K4GovdRJB7GPF+vU7hmxDORyIYEAShzdBbK5FxoJRULRYNsjos1Gf0axQNu8fp1N5UmsuosVQ2uX5+tkmSghifeGJ8nFUVrXYzVZYKDNYazLZazA4zFpsJk70Wg7WGGkslFaYSqiwVGG0G8vSZ5Okzmzy3QlIQ451An+BhdPLu1uLsi0N28GfmPEy2WoI9IhgaPhFw5mTUlx0eFXkxbsrGfRT0lmp2FDvL8g6NmNRifwihfRDBgCAIbUZ1XSlhb41vixcgm8Pq+vcTa+j7ugVSaS6jwlxKFHFnZZynQq10I9A9tEH/hKZY7RbKTcWUm0qotpRTa9Vjk60oJRWeam8C3UOJ1HU+6dmOTfl/kVOTgVqh4aLY61EqnL0uVmb/gl22Ee3VlYRm8gA2F/yFzWElzLMTXXx6nOpHFs5DIhgQBKHNqO8roGulNW79FkKFpGwUNAS4h5JVnUZxbd5ZGePZolZqCPGMJMQz8h+f60jlATYXrABgQqcrXTkB+8u2c7T6EEpJxfhOlzc5s1BuKmF3yRYARtR1MxTaPzH3IwhCm9FU7YCmyLIDAAWNL1ThOmcme27NkTM7uPNEuamEPzK/A2R6BQ2he4CzgI7BWsPquqTBIeETmm3xvCHvT2QcdPZJIMqry781bOEcE8GAIAhthqGJ7YJNqZ8NkGlcoCbaKw6FpKTMVERpXYvjjsJoq2Xh4a8x202Ee8YwJuoSANfygMleS5B7OP1DRjf5+nx9Vl1hIokRERf9iyMXzjURDAiC0GYYbM5gwEPVcjCgrKsfYJftrlmCelqVB519EgDYW7r1LIyybbI5rCxKn0WFuQQvjS9T42agVDhXgg+W7+RwxR4UkoJJna9uchuiLMuszlkMQGLgAII8Tr9hknD+EcGAIAhthtHqrB3Q2syA+rgdBM6dBQ31DBwEwK7ijVSbK87gCNsmh2znjyPzyNUfQaPUcnnXW13fYbWlkpXZvwLOKoLBHhFNnuNQxS4KDEdRKdQMC7/gXxu70DaIYEAQhDajvv1wS90GwbmDoL66oMnWeP9+Z5/uROpisck2lmUtwO6wNzqmvXDIDpZlLeBw5R6UkpJLutxEoHuY67mlmd9jthsJ9YhiYOi4Js9hdVhZk/s74KxH0FoCp9D+iGBAEIQ2w2SvBUCrbDkYkCTJdedrsFY3+fz4TpejUqjJrjnMH5nzsB63HbG9cMh2lmXNr6swqGBK7A1Eex/bTrm1YBU5NRmoFGoujJ3ebJXC7YVrqLFUolP7MKCZfAKhfRPBgCAIbUZTVQWbo1M7717raxOcKMA9lKldbkQhKThUsYs5+98mvXJfoxyD85XNYeX3I3NdgcCFsdOJ80tyPZ9bc4SN+csAGB99ebO7B6otlWwpdBYhGhk5BbXy7LavFtomUWdAEIQ2wSE7sNQFA01VxTuRvzaIAsNRKkwlzR7T2ac7V3S9nSVH5lFhKuG39G/w1vgR55tEtHcc4boY3FVntonQv6HWamBRxizy9JkoJSUXxV5PV79k1/MGaw1LjsxFRqa7f18SA5tvu7s253dsDisRus7NFiES2j8RDAiC0CZY7WbXv2tOKhgIAaDY2HJxoWjvrtyc9DhbC1exu2QT1ZYKdhSvc5Xb9XULJMwzmkivWGK84/F2a7lB0rlWZMhlUcZsqi0VuCm1TO0yo0H7YbvDzpIjc9Fbq/HXBjO+0xXNnuto9WHSKlKRkBgbfakoMNSBiWBAEIQ2oX5XgIQCpdT6r6ZwnbNBT4H+KLIst3gh06rcGRl5EUPCJpBVnUZm1UFy9UeoMJVQaS6l0lzKgfIdAIR6RJEUNJAe/n1RK92aPee/TZYdbC9ax/q8P7DLdnzdArg07mYCTihzvCZ3cV0ZYjemdrkJTTOfwe6wsapul0Gv4KHN7jIQOgYRDAiC0CbUJ/ipFOqTukMN8YhCKanQW6spMxW6MuhbolZq6OqX7JpSN9lqKTTkkKfPJLs6nQLDUQprcyg8msP63D/pGzKCviEjTmrZ4mwqrs1j5dFfyTdkARDnm8QFMdMa7brYVbyRncXrAZjc+VoC3IObPWdK0RrKTcV4qHQMC5901sYunB9EMCAIQptgl20AzWa8n0it1NDJuytHqg5wuGLPSQUDJ9KqPFwdBodFQK21hv1lO0gt2UiVuYyN+cvYUbyOQaFj6RU8DPUJTZHOtnJTCVsKVrC/bAcgo1G4MSrqYpIDBzUKmLKq0liZvRCAYeGT6HpcMuGJKk2lbM7/C4BRURefVMKm0L6JYEAQhDbBUZflX19d8GTE+/fmSNUBdpdsYWDouJMOJJrjofaif+go+oaM4FDFLjbl/0W5qZg1ub+TUrSWfiEj6Rk46KQ7B54Oi93EkaqD7C9LIbMqjfpWzfF+vRkVNaXJvg1FhlwWZ3yLjIMeAf0YFNZ0PQFwVhr86+jP2Oo6F3b373uWPolwPhHBgCAIbUJ9nwGpieZDzenm14s1OYvRW6tIq0ilR0C/MzIWhaQgwb8P3fx6sr9sO5vy/6LaUsHa3N/ZmL+MON8k4nwTifSKxVPtfcrnl2UZq8OM0WagxlJNlbmMUmOhc5nCkO3qyggQ69OdIeETCPWMbvJc5aZifj78BRaHmSivLkzsdFWLyyz7yraRXXMYlaRifKcrRNKgAIhgQBCENqL+ktS49VDzVAoVfUNGsD7vT9bk/E6sT/dWqxeeCoWkJClwIN39+7K/fAfbC9dQZiriYPlODpbvBMBd5Ym3xg93lSdqhQZJkpCRsTts2Bw2rA4LNoe17p8WrA4LFru5ySZL9XzdAunm15OkwAHN1gcA53T/j2mfYbQZCPaI4JK4m139CJqit1S5+g8MCb8AP23gaX4zQnsjggFBENoERV0nQod8aqWD+4WMYn/ZdspNxfyZ+QOXxM1wlSo+U5QKFcmBA0kKGECBIZtDFbs5Wn2IUmMhRpvBVUb5VKkkFR5qL3zc/PHXhhDiEUGkVyy+boGt3rFXmkpZcOhT9NYq/LXBXNH19hYTHeuXB8x2IyEekfQPHXlaYxbaJxEMCILQJtRvJ7SfYjCgUqiYFHMN89M+5kjVfpZmzmdizDRULdwhny5JkgjXdSJc1wlw1kYoN5dSY6nEZKvF5rDgkGUUkoRSUqFSqFEp1KgVGlQKDWqlBrVCg0ahwU2pRVU3k3CqSmoL+PnwFxjqaglMi78LD7WuxdfsK0vhSNV+FJKSC2KuPuMBk3B+E8GAIAhtgqouU9/msLRaN+BEYbpoLoq9jsUZczhQvoMyUxETY6YRcpb3zquVboR4RJz19zlebk0GC9NnYbYbCXQP48pud7Ta5bHaXMHfOb8BMDT8AtGeWGhE9CYQBKFNqK866JAd2Oq2GZ6Krn7JXN71VrRKd4pr85i7/x0WZcwmpyYDWT6VTIS2a0/pVn489Dlmu5Fwzxiujr+71UBAlh0sy5qPxW4izLMTA0JH/zuDFc4rYmZAEIQ2QaPQIOFMvjPbalGfRhvdGJ94ZiQ+xurcRaSVp3K4Yg+HK/bgo/Gnm39P4nyTCfOMQpLOr/sgm8PK6pzF7CrZCEA3v55M6nztSdU92FG0nuyadFQKNZM7X+PKzRCE44lgQBCENkGSFLirPKm16am1GdCdRjAAoNN4MyX2egaHjWNH0XoOlqdSZSlnW+FqthWuRqf2Id6/F0mBA06rUNG/raS2gD8y51FqLABgaPhEBoeNP6mAprg2j3V5SwAYHXlxizsThI5NktvL/JkgCOe92fveotRYwOVdb6OzT8IZOafVbnFWKazcQ2blASyOYw2RInSd6RcykjjfxDY3W2BzWNla+DdbClbikO24qzyZ3Pnak/5eLHYz3x14j3JTMV18E7mky02ipoDQLDEzIAhCm+Gl8aHUWECNpfKMnVOt1BDv34t4/17YHDayqg6yv2w7GVX7yNNnkqfPxF8bzJDwicT79TznQYEsOzhYnsq6vD9c30MX30QmdLqy1fyAY+eQWXH0Z8pNxejU3lwQM00EAkKLRDAgCEKb4a3xB6DSXHZWzq9SqIjzSyLOLwm9pYrUko2kFm+k3FTMkiNz2eoeztCIC+ji0+Nfv3ha7CYOlO9ke9FaKkwlAOjUPoyOmko3v56nNJ49pVs4UL4DCQUXxV6Pu8rzbA1baCdEMCAIQpvhr3V22Ss3FZ/199JpfBgeMZkBoWPYUbSWlKK1lBjz+S39G4I9IugfMppufsktVvT7p0y2WrKrD3O4ci/plXux1XVudFO6MyB0NH2DR6BWak7pnEWGXFbVNSwaHjGJSK/YMz1soR0SwYAgCG1GoHsoACW1+f/ae7optQwJn0jv4GGkFK5hZ/EGimvz+CPzO1bn6Ojq15Muvt0J13U+rVbGNoeVWmsNemsNNZZKKs1llJuKKDLkUmYq5vgCzH7aIHoFDSE5cKBrq+WpMNoMLMqYjV22EevTQ2wjFE6aCAYEQWgzQjwjAai2VFBrrcHjJNfIzwR3lScjIi+kf+goUos3sKtkMwZrNbtKNtZt6ZPwcfPHR+OPh1qHRunmrOIny9hlO9a6vgNmmxGz3YjJbsRkq8XqsLT4vv7aYDr7JNDNrxdhntGnvTxhd9hZnPEt1ZYKfNwCmNz52nOe/yCcP0QwIAhCm+Gm1BLoHkqpsZDcmiN08+/1r4/BXeXJkPCJDAwdR3bNYQ5X7CG7+jBVlnKqzGVUnUY+g1JS4qH2wkvji4/GHz9tEEEe4YR5Rp1W18MTybLM3zkLyanJQK3QcGnczWjPYptlof0RwYAgCG1KlFccpcZCsqoPnZNgoJ5SoaSzT4JrK1+tVU+ZsZBqSwVGmwGLw4JDtiNxrA+BRumGRqnFTalFq/RAq/LAXeWJm1J7VhMSdxavZ1fJJkDiws7TXcstgnCyRDAgCEKbEuvTnZ3F68mo3IdDvqLNVMzzUOvwUMed62E0kl65j9U5iwAYGXkhcX5J53hEwvmobfxfJgiCUCfKKw6t0p1am57s6sPnejhtWr7+KEuOzEVGJilwIP1DRp/rIQnnKREMCILQpigVSroH9AMgta4Wv9BYSW0Bvx7+EpvDSmfvBCZ0ukIUFhJOmwgGBEFoc3oFDQEgo3I/ZcbCczyatqfSVMrPh7/AZDcS5tmJi7vc4NzZIAinSQQDgiC0OQHuIcT5JgEya3OXnOvhtCmVplLmp32CwVpNoHsol3e9FbXS7VwPSzjPiWBAEIQ2aUTkRSgkBUeqDnCgbMe5Hk6bUGkqZcGhT9Fbq/DXBnNltzvRqjzO9bCEdkAEA4IgtEn+2iAGhY0H4K+jP7ta+HZUpcYCfkj7iBpLJX7aIKbF33XSjYsEoTUiGBAEoc0aHDaeKK8uWB1mfj70hauBT0eTp89i/sFPMFhrCHQPY1q3u89IsSJBqCfJsiy3fpggCMK5YbTVMv/gR5SZinBXeTIl9nqivbue62H9a9LKU/kz8wfsso0wz05c1vVW3MXSgHCGiWBAEIQ2z2Ct4dfDX1FUm4uERJ/g4QwNn4hbOy65K8sONhWsYFP+cgC6+CZyUefpIllQOCtEMCAIwnnBarewKmche0u3As4eAgNDx9IraHC7u0CabLX8kTmPzKqDAPQNHsGoqIvbTDVGof0RwYAgCOeVrKo0/s75jXJTMQBapQfJQYPoHTQUbze/czy6fy6nOp0/s36gxlKJSlIxvtOVJAb2P9fDEto5EQwIgnDesTvs7C/fztaClVTWdRGUUNDNvycDQka7WiGfT6wOKxvylrK9aC0g4+sWwJQuNxLiEXGuhyZ0ACIYEAThvOWQHWRU7mdn8TpyajJcj0d5dWFQ2Diivbq2+RK9siyTXrmX1TmLqLZUAJAcOIjRURejUWrP8eiEjkIEA4IgtAtFtXlsL1xDWkUqDtkBQKQuluERk4nw6nyOR9e0Av1R1uX94QpkvDS+jI++nFjfHud4ZEJHI4IBQRDalWpLJSmFq9ldshm7bAOgs3cCwyInt4kpd1l2cKTqINuL1riCAKWkYkDoaAaGjml3yZDC+UEEA4IgtEvVlko25//F3tJtyDhnCrr6JTMobPy/HhTIskyZqZBD5bvZX7adKks5AApJQXf/fgwNn4C3m/+/OiZBOJ4IBgRBaNcqTaVsyF/GwfJUwPnrLlIXS8+gIcT5JqJWas74ezpkBxWmUgoNR8mpOUJ2zWFqLJWu592U7iQHDqRP8PB2sQNCOP+JYEAQhA6hpLaArYWrSCvf5ZopUCnUdPLuRqSuM8EekfhpA/FUeze7n1+WHVgcFsw2IyZ7LUZbLbXWGgzWGvTWKqotFVSayqgwl2BzWBu8Vimp6OTdlXj/3nT1TT4rQYggnC4RDAiC0KHUWCrZXbKF/WUpruz9hiTclFrUCjUKSYlDduCQ7dgcViwOC/WzC61RKdQEu0cQrosh2juOSF1nkQ8gtFkiGBAEoUOSZZni2jyOVh+iwJBNqbGQKnO5a9agJQpJiVbpgbvKAw+1Dg+1Fzq1N94aP3zc/PHXBuPjFiAqBgrnDREMCIIg1HHIDow2AyabEZvDgkN2IEkSSkmJSqFGo3RDo9CiUqjbfP0CQTgVIhgQBEEQhA5OzGEJgiAIQgcnggFBEARB6OBEMCAIgiAIHZwIBgRBEAShgxPBgCAIgiB0cCIYEARBEIQOTgQDgiAIgtDBiWBAEARBEDo4EQwIgiAIQgcnggFBEARB6OBEMCAIgiAIHZwIBgRBEAShgxPBgCAIgiB0cCIYEARBEIQOTgQDgiAIgtDBiWBAEARBEDo4EQwIgiAIQgcnggFBEARB6OBEMCAIgiAIHZwIBgRBEAShgxPBgCAIgiB0cCIYEARBEIQOTgQDgiAIgtDBiWBAEARBEDo4EQwIgiAIQgcnggFBEARB6OBEMCAIgiAIHZwIBgRBEAShgxPBgCAIgiB0cCIYEARBEIQOTgQDgiAIgtDBiWBAEARBEDo4EQwIgiAIQgcnggFBEARB6OBEMCAIgiAIHdz/A18eUnpHPnvpAAAAAElFTkSuQmCC",
+      "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": 9,
+   "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": 9,
+     "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..bf5757d
--- /dev/null
+++ b/demo_notebooks/fibers_coverage.html
@@ -0,0 +1,2250 @@
+
+
+
+  
+    
+      
+      
+      
+        
+      
+      
+        
+      
+      
+      
+        
+      
+      
+        
+      
+      
+      
+      
+    
+    
+      
+        Fibers coverage - cuisto
+      
+    
+    
+      
+      
+        
+        
+      
+      
+
+
+    
+    
+      
+        
+      
+    
+    
+      
+        
+        
+        
+        
+        
+      
+    
+    
+      
+    
+      
+    
+      
+    
+    
+    
+      
+
+    
+    
+    
+  
+  
+  
+    
+    
+      
+    
+    
+    
+    
+    
+  
+    
+    
+    
+    
+    
+ +
+
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + + + + + + + + +

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..6f79fc9 --- /dev/null +++ b/demo_notebooks/fibers_coverage.ipynb @@ -0,0 +1,505 @@ +{ + "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", + "`cuisto` 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 cuisto" + ] + }, + { + "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 = cuisto.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", + "
NamehemisphereArea µm^2Area mm^2area µm^2density µm^-2density mm^-2coverage indexrelative countrelative densitychannelanimal
010SpContra.1749462.181.74946253117.37013.03621130362.1139731612.7556450.0365350.033062Negativeanimalid1-SC
010SpContra.1749462.181.7494625257.10250.3004983004.9820815.7974990.0307660.02085Positiveanimalid1-SC
110SpIpsi.1439105.931.43910664182.98234.45992144599.2063282862.510070.0235240.023265Negativeanimalid1-SC
110SpIpsi.1439105.931.4391068046.33750.5591215591.20585444.9887290.0289110.022984Positiveanimalid1-SC
210Spboth3188568.113.188568117300.35243.67877836787.7832164315.2199350.0280470.025734Negativeanimalid1-SC
\n", + "
" + ], + "text/plain": [ + " Name hemisphere Area µm^2 Area mm^2 area µm^2 density µm^-2 \\\n", + "0 10Sp Contra. 1749462.18 1.749462 53117.3701 3.036211 \n", + "0 10Sp Contra. 1749462.18 1.749462 5257.1025 0.300498 \n", + "1 10Sp Ipsi. 1439105.93 1.439106 64182.9823 4.459921 \n", + "1 10Sp Ipsi. 1439105.93 1.439106 8046.3375 0.559121 \n", + "2 10Sp both 3188568.11 3.188568 117300.3524 3.678778 \n", + "\n", + " density mm^-2 coverage index relative count relative density channel \\\n", + "0 30362.113973 1612.755645 0.036535 0.033062 Negative \n", + "0 3004.98208 15.797499 0.030766 0.02085 Positive \n", + "1 44599.206328 2862.51007 0.023524 0.023265 Negative \n", + "1 5591.205854 44.988729 0.028911 0.022984 Positive \n", + "2 36787.783216 4315.219935 0.028047 0.025734 Negative \n", + "\n", + " animal \n", + "0 animalid1-SC \n", + "0 animalid1-SC \n", + "1 animalid1-SC \n", + "1 animalid1-SC \n", + "2 animalid1-SC " + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# get distributions per regions, spatial distributions and coordinates\n", + "df_regions, dfs_distributions, df_coordinates = cuisto.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": "iVBORw0KGgoAAAANSUhEUgAAAooAAAH0CAYAAAC6tAygAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAsABJREFUeJzs3XlYVPX+wPH3MLKODjJB4gKCDCh63WoK0YrMBdxKbikmmEvLtR/erpRWtLmWqRVWkraiJilm5dXcIkvbEJtKKzEFEkcMTQOZGmIb5vcHOdcJ3GBgWD6v5+F5ON8553s+5yDHD9/tKCwWiwUhhBBCCCH+xsnRAQghhBBCiKZJEkUhhBBCCFErSRSFEEIIIUStJFEUQgghhBC1kkRRCCGEEELUShJFIYQQQghRK0kUhRBCCCFErSRRFEIIIYQQtZJEUQghhBBC1EoSxfPMnTsXhULBmTNnHB2K1apVq1AoFOTl5TVI/VOmTKFt27YNUrcQQtibPKdFbQICApgyZYqjw2iRJFEULUJpaSlJSUmEhYXh6emJm5sbISEhzJgxgyNHjjTouZ955hk2bdrUoOcQQojmTKFQMGPGDEeHIepAEsUmbtKkSfz555907drV0aE0WWfOnOGGG27gwQcf5Oqrr2b+/PkkJyczduxYNm/ezD/+8Y8GPb8kikK0bvKcdrzDhw/z+uuvOzqMFqmNowMQF6dUKlEqlY4Oo14sFgulpaW4u7s3SP1Tpkzhu+++Y+PGjdx+++02ny1YsIDHH3+8Qc5bFyaTCZVK5egwhBB2JM9px3N1dXV0CC2WtCjW4uzZs0yZMoX27dvj6enJ1KlTKSkpqbHf2rVrufbaa3F3d0ej0TBhwgSOHz9us8/NN9/MP/7xD77//nsiIiLw8PBAq9WyceNGAPbs2UNYWBju7u50796djz/+2Ob42sa+6PV6IiMj8fb2xt3dncDAQKZNm2b9PC8vD4VCwXPPPUdSUhJdu3bF3d2diIgIfvzxx1qv+cSJE4wdO5a2bdvi4+PDrFmzMJvNNvtUVVWxbNkyevXqhZubGx06dOBf//oXRUVFNvsFBAQwevRodu7ciU6nw93dnVdffdV6b2fOnImfnx+urq5otVoWL15MVVWVTR0FBQX89NNPVFRU1BrvOZmZmWzdupW77767RpII1Q+P5557zqbsk08+4cYbb0SlUtG+fXtuu+02Dh06ZLPPuXFQOTk5F/23oFAoMJlMrF69GoVCgUKhsI6TOVdHVlYWEydOxMvLixtuuAGA77//nilTptCtWzfc3Nzw9fVl2rRp/Pbbbxe9XiFENXlON5/ndG12796NQqEgLS2Nxx57DF9fX1QqFbfeemuNn092dja33347vr6+uLm50aVLFyZMmEBxcbHN9cgYxQZiEVZz5syxAJb+/ftb/vnPf1peeeUVyz333GMBLA8//LDNvgsXLrQoFApLTEyM5ZVXXrHMmzfP4u3tbQkICLAUFRVZ94uIiLB06tTJ4ufnZ5k9e7bl5ZdftvTs2dOiVCot69evt/j6+lrmzp1rWbZsmaVz584WT09Pi9FotB6fkpJiASxHjx61WCwWy6lTpyxeXl6WkJAQy9KlSy2vv/665fHHH7eEhoZajzl69KgFsPTu3dsSEBBgWbx4sWXevHkWjUZj8fHxsZw8edK67+TJky1ubm6WXr16WaZNm2ZZsWKF5fbbb7cAlldeecXmmu+55x5LmzZtLPfee69l5cqVlkceecSiUqks1113naW8vNy6X9euXS1ardbi5eVlefTRRy0rV660fPrppxaTyWTp06eP5aqrrrI89thjlpUrV1ruuusui0KhsPznP/+xOdfkyZNtrvtCHnvsMQtg+eyzzy663znp6emWNm3aWEJCQixLliyx/ty8vLxsznW5/xbefvtti6urq+XGG2+0vP3225a3337b8tVXX9nU0bNnT8ttt91meeWVVyzJyckWi8Viee655yw33nijZf78+ZbXXnvN8p///Mfi7u5uuf766y1VVVWXdS1CtEbynG5+z2mLxWIBLPHx8dbtTz/91Hr9ffr0sbzwwguWRx991OLm5mYJCQmxlJSUWCwWi6WsrMwSGBho6dSpk2XhwoWWN954wzJv3jzLddddZ8nLy7O5nsmTJ18yDnHlJFE8z7kH0LRp02zKo6OjLVdddZV1Oy8vz6JUKi1PP/20zX4//PCDpU2bNjblERERFsDyzjvvWMt++uknC2BxcnKy7N2711q+c+dOC2BJSUmxlv39AfTBBx9YAMvXX399wes49wByd3e35OfnW8szMzMtgCUhIcFadu4Xff78+TZ19O/f33Lttddatz///HMLYElNTbXZb8eOHTXKu3btagEsO3bssNl3wYIFFpVKZTly5IhN+aOPPmpRKpUWg8FQI65LPYCio6MtgM1D/2L69etnufrqqy2//fabtezAgQMWJycny1133WUtu9x/CxaLxaJSqWp9QJ2r484776zx2bmH4PnWrVt3RUmvEK2RPKf/p7k8py2WCyeKnTt3tkm6N2zYYAEsL774osVisVi+++47C2B59913L1q/JIoNR7qeazF9+nSb7RtvvJHffvsNo9EIwPvvv09VVRXjx4/nzJkz1i9fX1+Cg4P59NNPbY5v27YtEyZMsG53796d9u3bExoaSlhYmLX83Pc///zzBWNr3749AB9++OElm/vHjh1L586drdvXX389YWFhbNu27bKu+fw43n33XTw9PRk2bJjNNV977bW0bdu2xjUHBgYSGRlpU/buu+9y44034uXlZVPH0KFDMZvNfPbZZ9Z9V61ahcViISAg4KLXeO5n0q5du4vuB9XdJPv372fKlCloNBpreZ8+fRg2bNhl35fz/y1cjr/XAdiMAyotLeXMmTMMGDAAgG+//fay6xaitZLndPN5Tl/MXXfdZfP8vuOOO+jYsaP1+j09PQHYuXNnrUMLRMOTySy18Pf3t9n28vICoKioCLVaTXZ2NhaLheDg4FqPd3Z2ttnu0qULCoXCpszT0xM/P78aZefOcyERERHcfvvtzJs3j6SkJG6++WbGjh3LxIkTawzmrS2+kJAQNmzYYFPm5uaGj4+PTZmXl5dNHNnZ2RQXF3P11VfXGtevv/5qsx0YGFhjn+zsbL7//vsa57pQHZdDrVYD8Pvvv1sfzhdy7NgxoPo/gL8LDQ1l586dNSabXOrfwuWo7V4UFhYyb9481q9fX+O6zx93I4SonTynm89z+mL+fv0KhQKtVmsd7xkYGMiDDz7ICy+8QGpqKjfeeCO33norcXFx1p+FaFiSKNbiQrPXLBYLUD1YWKFQsH379lr3/fvCqBeq71LnqY1CoWDjxo3s3buXLVu2sHPnTqZNm8bzzz/P3r1767Qo6+XM1quqquLqq68mNTW11s///lCpbeZcVVUVw4YN4+GHH661jpCQkMuI1laPHj0A+OGHH7jxxhuv+PhLqcvP6O9quxfjx4/nq6++Yvbs2fTr14+2bdtSVVVFVFRUjQHjQoia5DldU1N9TtfX888/z5QpU/jvf//LRx99xAMPPMCiRYvYu3cvXbp0afR4WhtJFOsgKCgIi8VCYGCgQ35pAAYMGMCAAQN4+umneeedd4iNjWX9+vXcc8891n2ys7NrHHfkyJE6dRMEBQXx8ccfM2jQoDovnxAUFMQff/zB0KFD63R8bcaMGcOiRYtYu3btJRPFc2ucHT58uMZnP/30E97e3nVauubvrRCXUlRUxK5du5g3bx5PPfWUtby2n5cQom7kOd10ntMX8/frt1gs5OTk0KdPH5vy3r1707t3b5544gm++uorBg0axMqVK1m4cGGjxNmayRjFOvjnP/+JUqlk3rx5Nf6qtFgsDbrESVFRUY1z9uvXD4CysjKb8k2bNnHixAnr9r59+8jMzGTEiBFXfN7x48djNptZsGBBjc8qKys5e/bsZdWRkZHBzp07a3x29uxZKisrrduXu+xCeHg4UVFRvPHGG7Uuel1eXs6sWbMA6NixI/369WP16tU28f7444989NFHjBw58pLXUBuVSnVZ13/OuZaBv/8cly1bVmPfkpISfvrppyb1ujIhmgN5Ttty5HP6YtasWcPvv/9u3d64cSMFBQXW6zcajTbnhOqk0cnJqca9PF9FRQU//fQTBQUFdY5NVJMWxToICgpi4cKFJCYmkpeXx9ixY2nXrh1Hjx7lgw8+4L777rMmJ/a2evVqXnnlFaKjowkKCuL333/n9ddfR61W10h0tFotN9xwA/fffz9lZWUsW7aMq6666oJdChcTERHBv/71LxYtWsT+/fsZPnw4zs7OZGdn8+677/Liiy9yxx13XLSO2bNns3nzZkaPHs2UKVO49tprMZlM/PDDD2zcuJG8vDy8vb0BSExMZPXq1Rw9evSSf1mvWbOG4cOH889//pMxY8YwZMgQVCoV2dnZrF+/noKCAutaikuXLmXEiBGEh4dz99138+eff/Lyyy/j6enJ3Llzr/i+AFx77bV8/PHHvPDCC3Tq1InAwECbwe9/p1aruemmm1iyZAkVFRV07tyZjz76iKNHj9bYd9++fQwePJg5c+bUOT4hWiN5Tjet5/SFaDQabrjhBqZOncqpU6dYtmwZWq2We++9F6he93bGjBmMGzeOkJAQKisrefvtt1EqlbWunXvOiRMnCA0NZfLkyaxatapOsYlqkijW0aOPPkpISAhJSUnMmzcPAD8/P4YPH86tt97aYOeNiIhg3759rF+/nlOnTuHp6cn1119PampqjYHJd911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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# plot distributions per regions\n", + "fig_regions = cuisto.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": "cuisto-env", + "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.8" + } + }, + "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..ccdc413 --- /dev/null +++ b/demo_notebooks/fibers_length_multi.html @@ -0,0 +1,2122 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + Fibers length in multi animals - cuisto + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + \ 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..942f39c --- /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 `cuisto` 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 cuisto" + ] + }, + { + "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 = cuisto.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.66it/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, _, _ = cuisto.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": "iVBORw0KGgoAAAANSUhEUgAAApQAAAH0CAYAAACD0737AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAAEAAElEQVR4nOzdd3wT9f/A8ddlNOlM9y5toS177z1ki4jyFQVRpigKisgWWTIUVHAByhZEBBVQEUERBNnI3qtQRvdKZ9ok9/ujP4KhLaNNaaGf5+PRB9zl7nPvS9vrO58pybIsIwiCIAiCIAhFpCjtAARBEARBEIRHm0goBUEQBEEQhGIRCaUgCIIgCIJQLCKhFARBEARBEIpFJJSCIAiCIAhCsYiEUhAEQRAEQSgWkVAKgiAIgiAIxSISSkEQBEEQBKFYREIpCIIgCIIgFItIKO9iypQpSJJEQkJCaYdisXz5ciRJ4sqVKyVSfv/+/XFyciqRsgVBEEqCeFYLBQkJCaF///6lHUa5IRJK4bGUnZ3N3Llzady4MTqdDq1WS0REBMOGDeP8+fMleu2ZM2eyYcOGEr2GIAjCo06SJIYNG1baYQg2IhLKR8xLL71EVlYWwcHBpR1KmZWQkECLFi0YOXIk3t7eTJs2jS+//JIePXrw888/U6NGjRK9vkgoBUEQz+rSd+7cORYtWlTaYZQbqtIOQHgwSqUSpVJZ2mEUiyzLZGdnY29vXyLl9+/fnyNHjvDDDz/Qs2dPq9fef/993n333RK5blFkZGTg6OhY2mEIgmBj4lld+jQaTWmHUK6IGsr7kJKSQv/+/XF1dUWn0zFgwAAyMzPzHbdq1Srq16+Pvb097u7uvPDCC1y7ds3qmDZt2lCjRg2OHz9O69atcXBwICwsjB9++AGAv//+m8aNG2Nvb0/lypX5888/rc4vqF/OoUOH6NSpE56entjb2xMaGsrAgQMtr1+5cgVJkvjoo4+YO3cuwcHB2Nvb07p1a06ePFngPd+4cYMePXrg5OSEl5cXo0aNwmQyWR1jNpuZN28e1atXR6vV4uPjw6uvvkpycrLVcSEhIXTr1o0tW7bQoEED7O3t+eqrryzv7YgRIwgKCkKj0RAWFsaHH36I2Wy2KiM6OpqzZ8+Sm5tbYLy37N+/n02bNjFo0KB8ySTkPWA++ugjq31//fUXLVu2xNHREVdXV55++mnOnDljdcytPloXL16868+CJElkZGSwYsUKJElCkiRLH55bZZw+fZo+ffrg5uZGixYtADh+/Dj9+/enYsWKaLVafH19GThwIImJiXe9X0EQbhPP6kfnWV2QHTt2IEkS33//PRMmTMDX1xdHR0e6d++e7/tz4cIFevbsia+vL1qtlsDAQF544QVSU1Ot7kf0oXyIZKFQkydPlgG5bt268rPPPivPnz9fHjx4sAzIY8aMsTp2+vTpsiRJ8vPPPy/Pnz9fnjp1quzp6SmHhITIycnJluNat24t+/v7y0FBQfLo0aPlzz//XK5WrZqsVCrlNWvWyL6+vvKUKVPkefPmyQEBAbJOp5P1er3l/GXLlsmAHBkZKcuyLMfGxspubm5yRESEPGfOHHnRokXyu+++K1etWtVyTmRkpAzINWvWlENCQuQPP/xQnjp1quzu7i57eXnJMTExlmP79esna7VauXr16vLAgQPlBQsWyD179pQBef78+Vb3PHjwYFmlUsmvvPKKvHDhQnns2LGyo6Oj3LBhQzknJ8dyXHBwsBwWFia7ubnJ48aNkxcuXChv375dzsjIkGvVqiV7eHjIEyZMkBcuXCi//PLLsiRJ8ltvvWV1rX79+lndd2EmTJggA/LOnTvvetwtf/zxh6xSqeSIiAh59uzZlu+bm5ub1bXu92dh5cqVskajkVu2bCmvXLlSXrlypbxnzx6rMqpVqyY//fTT8vz58+Uvv/xSlmVZ/uijj+SWLVvK06ZNk7/++mv5rbfeku3t7eVGjRrJZrP5vu5FEMor8ax+9J7VsizLgPzGG29Ytrdv3265/1q1asmffPKJPG7cOFmr1coRERFyZmamLMuybDAY5NDQUNnf31+ePn26vHjxYnnq1Klyw4YN5StXrljdT79+/e4Zh2AbIqG8i1sPqYEDB1rtf+aZZ2QPDw/L9pUrV2SlUinPmDHD6rgTJ07IKpXKan/r1q1lQF69erVl39mzZ2VAVigU8r59+yz7t2zZIgPysmXLLPvufEitX79eBuSDBw8Weh+3HlL29vby9evXLfv3798vA/Lbb79t2XfrYTBt2jSrMurWrSvXr1/fsr1r1y4ZkL/99lur437//fd8+4ODg2VA/v33362Off/992VHR0f5/PnzVvvHjRsnK5VKOSoqKl9c93pIPfPMMzJg9YfhburUqSN7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3qyqau4HmkajUS9evOg6Z8aMGaqvr69qsVhKPfaykJiYqALq+vXrVVVV5bnlw9//8XM6nWp4eLj67rvvuo6lpqaqRqNR/fbbb1VVVdVDhw6pgLp9+3bXOb/88ouqKIqakJBQarGXN61bt1aff/5512uHw6FWrVpVjYuLK8OoSkZluteCkt+pwpHP78KRPKFgKkWX9185HA7mz59PZmYm7dq1Y+fOndhsNu666y7XOXXr1iUqKorNmzcDsHnzZho1akRYWJjrnB49emA2mzl48GCp30NZuLqX+9U9huW5FdypU6e4ePGi2zPz8/OjTZs2bs/M39+fli1bus6566670Gg0bN26tdRjLg+sVis7d+50e24ajYa77rrL9dwqisp0r8VBfqfyRz6/C0byhMLJ117eFcH+/ftp164dOTk5mEwmFi1aRP369dmzZw8GgwF/f3+388PCwrh48SIAFy9edPshufr+1fcqOqfTyejRo7njjjto2LAhkHvf8twK5uo95/VM/vrMQkND3d7X6XQEBgZWymcGcPnyZRwOR57P7fDhw2UUVcmoTPdaHOR36tbk8zv/JE8omkqTUNapU4c9e/aQlpbG999/z5NPPsn69evLOqzbwvPPP8+BAwf4448/yjoUIYQQBSCf3/kneULRVJoub4PBQM2aNWnRogVxcXE0adKE//znP4SHh2O1WklNTXU7/9KlS4SHhwMQHh5+3Wyuq6+vnlNRjRw5kqVLl7J27VoiIiJcx+W5FdzVe87rmfz1mSUmJrq9b7fbuXLlSqV8ZgDBwcFotdqbPreKojLda3GQ36mbk8/vgpE8oWgqTUL5d06nE4vFQosWLdDr9axevdr13pEjR4iPj6ddu3YAtGvXjv3797t9KK1atQpfX1/q169f6rGXBlVVGTlyJIsWLWLNmjXExsa6vS/PreBiY2MJDw93e2Zms5mtW7e6PbPU1FR27tzpOmfNmjU4nU7atGlT6jGXBwaDgRYtWrg9N6fTyerVq13PraKoTPdaHOR3Km/y+V08JE8ooLKeFVQaXn75ZXX9+vXqqVOn1H379qkvv/yyqiiKunLlSlVVc5cDiIqKUtesWaPu2LFDbdeundquXTvX9VeXA+jevbu6Z88e9ddff1VDQkIq9HIAw4cPV/38/NR169apFy5ccH1lZWW5zpHndr309HR19+7d6u7d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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAApMAAAH0CAYAAABhD6aCAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAAC7bklEQVR4nOzdd3hURdvA4d+WZFM2jSSQQhqE0LtIkaoIUboIiKI0G9hQAQ1SpEYRBAvFQrVTpBhAioAiHSEU6TUhJLRAlrRNsnu+P/Kxuia0ZJNd3jz3dZ3rdc/OmXkm0fM+mXNmRqUoioIQQgghhBBFoLZ3AEIIIYQQ4v4lyaQQQgghhCgySSaFEEIIIUSRSTIphBBCCCGKTJJJIYQQQghRZJJMCiGEEEKIIpNkUgghhBBCFJkkk0IIIYQQosgkmRRCCCGEEEUmyeRtvP/++6hUKq5cuWLvUCzmz5+PSqXi7NmzJVJ/v3790Ov1JVK3EEKUBLlXi8KEh4fTr18/e4dRJkgyKf4nZWdnM23aNBo3boyXlxcuLi5ERUXx6quvcvz48RJte9KkSSxfvrxE2xBCiPudSqXi1VdftXcYwgYkmbzPPPvss2RlZREWFmbvUBzWlStXaN68OW+99Rbly5dn3LhxzJgxg65du7Jy5Upq1apVou1LMimEkHu1/R07doyvvvrK3mGUCVp7ByDujUajQaPR2DuMYlEUhezsbFxdXUuk/n79+rFv3z6WLFlC9+7drb4bP3487733Xom0WxQZGRm4u7vbOwwhhI3Jvdr+dDqdvUMoM2Rk8i5cv36dfv364e3tjZeXF/379yczM7NAuW+//ZaGDRvi6upKuXLleOqpp0hMTLQq07p1a2rVqsWBAwdo1aoVbm5uREZGsmTJEgB+//13GjdujKurK1WrVmXDhg1W1xf2Hs6ePXto3749fn5+uLq6EhERwYABAyzfnz17FpVKxZQpU5g2bRphYWG4urrSqlUrDh06VGifk5KS6Nq1K3q9Hn9/f4YOHYrJZLIqYzabmT59OjVr1sTFxYUKFSrw0ksvce3aNaty4eHhdOzYkbVr1/LAAw/g6urKF198YfnZDhkyhJCQEHQ6HZGRkXz44YeYzWarOpKTkzl69Ci5ubmFxnvTzp07WbVqFQMHDiyQSEL+zWXKlClW5zZu3EiLFi1wd3fH29ubLl26cOTIEasyN9/JOnny5G3/XVCpVGRkZLBgwQJUKhUqlcryzs7NOg4fPszTTz+Nj48PzZs3B+DAgQP069ePSpUq4eLiQkBAAAMGDODq1au37a8Q4h9yr75/7tWF2bx5MyqVip9++okRI0YQEBCAu7s7nTt3LvD7OXHiBN27dycgIAAXFxcqVqzIU089RVpamlV/5J3JUqKIWxozZowCKPXr11eeeOIJZebMmcrzzz+vAMrw4cOtyk6YMEFRqVRKr169lJkzZypjx45V/Pz8lPDwcOXatWuWcq1atVKCgoKUkJAQZdiwYcpnn32m1KhRQ9FoNMqPP/6oBAQEKO+//74yffp0JTg4WPHy8lIMBoPl+nnz5imAcubMGUVRFOXixYuKj4+PEhUVpXz00UfKV199pbz33ntK9erVLdecOXNGAZTatWsr4eHhyocffqiMHTtWKVeunOLv76+kpKRYyvbt21dxcXFRatasqQwYMECZNWuW0r17dwVQZs6cadXn559/XtFqtcoLL7ygzJ49W3nnnXcUd3d3pVGjRkpOTo6lXFhYmBIZGan4+Pgo7777rjJ79mxl06ZNSkZGhlKnTh3F19dXGTFihDJ79mzlueeeU1QqlfLGG29YtdW3b1+rft/KiBEjFED5448/blvupvXr1ytarVaJiopSJk+ebPm9+fj4WLV1t/8ufPPNN4pOp1NatGihfPPNN8o333yjbNu2zaqOGjVqKF26dFFmzpypzJgxQ1EURZkyZYrSokULZdy4ccqXX36pvPHGG4qrq6vy4IMPKmaz+a76IkRZJffq++9erSiKAiivvPKK5fOmTZss/a9Tp47y8ccfK++++67i4uKiREVFKZmZmYqiKIrRaFQiIiKUoKAgZcKECcrXX3+tjB07VmnUqJFy9uxZq/707dv3jnGI4pNk8jZu3qAGDBhgdb5bt26Kr6+v5fPZs2cVjUajTJw40arcwYMHFa1Wa3W+VatWCqB8//33lnNHjx5VAEWtVis7duywnF+7dq0CKPPmzbOc++8NatmyZQqg7N69+5b9uHmDcnV1Vc6fP285v3PnTgVQ3nzzTcu5mzeCcePGWdVRv359pWHDhpbPW7ZsUQDlu+++syr366+/FjgfFhamAMqvv/5qVXb8+PGKu7u7cvz4cavz7777rqLRaJSEhIQCcd3pBtWtWzcFsPo/hdupV6+eUr58eeXq1auWc/v371fUarXy3HPPWc7d7b8LiqIo7u7uhd7AbtbRu3fvAt/dvEn+2w8//HBPibEQZZXcq/9xv9yrFeXWyWRwcLBVYr5o0SIFUD755BNFURRl3759CqAsXrz4tvVLMll65DH3XXj55ZetPrdo0YKrV69iMBgA+PnnnzGbzfTs2ZMrV65YjoCAAKpUqcKmTZusrtfr9Tz11FOWz1WrVsXb25vq1avTuHFjy/mb/3z69Olbxubt7Q1AXFzcHR8rdO3aleDgYMvnBx98kMaNG7N69eq76vO/41i8eDFeXl48+uijVn1u2LAher2+QJ8jIiJo37691bnFixfTokULfHx8rOpo27YtJpOJP/74w1J2/vz5KIpCeHj4bft483fi4eFx23KQ/zgmPj6efv36Ua5cOcv5OnXq8Oijj971z+Xf/y7cjf/WAVi9k5Sdnc2VK1do0qQJAHv37r3ruoUoy+Reff/cq2/nueees7qHP/nkkwQGBlr67+XlBcDatWsLfY1BlD6ZgHMXQkNDrT77+PgAcO3aNTw9PTlx4gSKolClSpVCr3dycrL6XLFiRVQqldU5Ly8vQkJCCpy72c6ttGrViu7duzN27FimTZtG69at6dq1K08//XSBl48Liy8qKopFixZZnXNxccHf39/qnI+Pj1UcJ06cIC0tjfLlyxca16VLl6w+R0REFChz4sQJDhw4UKCtW9VxNzw9PQG4ceOG5eZ9K+fOnQPy/w/iv6pXr87atWsLTJC5078Ld6Own0Vqaipjx47lxx9/LNDvf78DJIS4NblX3z/36tv5b/9VKhWRkZGW908jIiJ46623+Pjjj/nuu+9o0aIFnTt3pk+fPpbfhShdkkzehVvNyFMUBch/uVmlUrFmzZpCy/53Ydlb1XendgqjUqlYsmQJO3bs4JdffmHt2rUMGDCAqVOnsmPHjiItans3MxDNZjPly5fnu+++K/T7/950CpsNaDabefTRRxk+fHihdURFRd1FtNaqVasGwMGDB2nRosU9X38nRfkd/VdhP4uePXuybds2hg0bRr169dDr9ZjNZqKjowu84C6EKJzcqwty1Ht1cU2dOpV+/fqxYsUK1q1bx+uvv05sbCw7duygYsWKpR5PWSfJpA1UrlwZRVGIiIiwy39UAE2aNKFJkyZMnDiR77//nmeeeYYff/yR559/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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "figs_regions = cuisto.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..4e765f9 --- /dev/null +++ b/guide-create-pyramids.html @@ -0,0 +1,1395 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + Create pyramidal OME-TIFF - cuisto + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + + + + +

Create pyramidal OME-TIFF#

+

This page will guide you to use the pyramid-creator package, 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

+

pyramid-creator can also pyramidalize images using Python only with the --no-use-qupath option.

+
+

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 cuisto 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).

+

pyramid-creator moved to a standalone package that you can find here with installation and usage instructions.

+

Installation#

+

You will find instructions on the dedicated project page over at Github.

+

For reference :

+

You will need conda, follow those instructions to install it.

+

Then, create a virtual environment if you didn't already (pyramid-creator can be installed in the environment for cuisto) and install the pyramid-creator package. +

conda create -c conda-forge -n cuisto-env python=3.12  # not required if you already create an environment
+conda activate cuisto-env
+pip install pyramid-creator
+
+To use the Python backend (with tifffile), replace the last line with : +
pip install pyramid-creator[python-backend]
+
+To use the QuPath backend, a working QuPath installation is required, and the pyramid-creator command needs to be aware of its location.

+

To do so, first, install QuPath. By default, it will install in ~\AppData\QuPath-0.X.Y. In any case, note down the installation location.

+

Then, you have several options : +- Create a file in your user directory called "QUPATH_PATH" (without extension), containing the full path to the QuPath console executable. In my case, it reads : C:\Users\glegoc\AppData\Local\QuPath-0.5.1\QuPath-0.5.1 (console).exe. Then, the pyramid-creator script will read this file to find the QuPath executable. +- Specify the QuPath path as an option when calling the command line interface (see the Usage section) : +

pyramid-creator /path/to/your/images --qupath-path "C:\Users\glegoc\AppData\Local\QuPath-0.5.1\QuPath-0.5.1 (console).exe"
+
+- Specify the QuPath path as an option when using the package in a Python script (see the Usage section) : +
from pyramid_creator import pyramidalize_directory
+pyramidalize_directory("/path/to/your/images/", qupath_path="C:\Users\glegoc\AppData\Local\QuPath-0.5.1\QuPath-0.5.1 (console).exe")
+
+- If you're using Windows, using QuPath v0.6.0, v0.5.1 or v0.5.0 and chose the default installation location, pyramid-creator should find it automatically and write it down in the "QUPATH_PATH" file by itself.

+

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#

+

See the instructions on the dedicated project page over at Github.

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

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 an opiniated guide 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 conda.

+

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..5041d76 --- /dev/null +++ b/guide-pipeline.html @@ -0,0 +1,1497 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + Pipeline - cuisto + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + + + + +

Pipeline#

+

While you can use QuPath and cuisto 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.

+

In the event you can't or don't want to follow the pipeline depicted below, but still want to be able to batch-process animals, check the last section.

+

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 punctual 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 cuisto 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 cuisto.

+
+
    +
  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 cuisto
+
+# 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 = cuisto.Config(config_file)
+df_regions, dfs_distributions, df_coordinates = cuisto.process.process_animals(
+    wdir, animals, cfg, out_fmt=output_format
+)
+
+# Display
+cuisto.display.plot_regions(df_regions, cfg)
+cuisto.display.plot_1D_distributions(dfs_distributions, cfg, df_coordinates=df_coordinates)
+cuisto.display.plot_2D_distributions(df_coordinates, cfg)
+
+
+

Tip

+

You can see a live example in this demo notebook.

+
+

Batch-process animals#

+

It is still possible to process several subjects at once without using the directory structure specified above. The cuisto.process.process_animals() (plural) method is merely a wrapper around cuisto.process.process_animal() (singular). The former fetch the data from the expected locations, the latter is where the analysis actually happens. Therefore, it is possible to fetch your data yourself and feed it to process_animal().

+

For example, say you used the QuPath Measure > Export measurements for each of your animals. For each individual, this builds a single file with all your images. Let's collect those individual files in a single directory called "results", and name the files in a consistent manner that allows you to identify "Annotations" and "Detections", as well as the animal identifier, for instance "animal0_annotations.tsv".

+
+

Important

+

The configuration file is mandatory, even for single-animal analysis.

+
+

The script batch_process_animals.py located in examples will mimick process_animals() functionnality.

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

Prepare QuPath data#

+

QuPath basics#

+

cuisto 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 classified as First: second is of classification First and of derived classification second.

+

In a nutshell, QuPath has two main objects type, Annotations and Detections. The former are flexible, editable and can be easily moved around but are memory-intensive so they are not made to handle thousands of them. They are used to define regions of interest such as brain regions - ABBA imports registered brain regions as Annotations. On the other hand, Detections objects are optimized so that a single image can contain thousands of them without any problem, at the expense of being harder to modify (they can't be moved nor removed from the GUI). Those are used for objects of interest (the things you want to count, cells, fibers...).

+

Both types have an Object ID (an unique identifier), a Name, a Classification and a Parent. Those are strings, eg. letters and words. Then comes any number of numeric measurements that can have arbitrary names (that could be the area, length, count...).

+
+

Info

+

QuPath Annotations include dynamic measurements, eg. measurement that are updated live, such as "Num Detections" and so on. Those can be handy but are not used downstream with cuisto - you will need to add your own count with specific measurement names so that it can work with cuisto, see below.

+
+

QuPath requirements#

+

cuisto 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.

+

Annotations#

+

Annotations correspond to the regions of interest, typically the brain regions. They are used to count objects of interest (Detections) within each of them in QuPath, then with cuisto to compute and display the measurement (or a derived metric such as the density) per region. +They usually are created importing the registration with the ABBA plugin from the QuPath "Extension" menu or with the importAbba.groovy script located in scripts/qupath-utils/atlas, but can also be drawn manually, imported from ImageJ ROIs (see the importImageJRois.groovy script in scripts/qupath-utils/tools) or any other methods, as long as the following requirements are met (note that the Name and Classification are already correctly set when using the ABBA plugin) :

+
    +
  • The Name should be the atlas acronym, unless you are not using any atlas. In any case, regions are pooled across images and animals based on their Name (eg. all Annotations, from all images and all subjects, with the same Name are pooled together).
  • +
  • The Classification must be in the form Hemisphere: Name, where Hemisphere must be either "Left" or "Right". Even in the case where "Left" and "Right" do not make sense for you, "Left" and "Right" are used internally by cuisto to be able to distinguish the two hemispheres. Note that those can be renamed in the display parameters of the configuration file. Name must correspond to the actual Annotation Name.
  • +
+
+

Tip

+

There are some Groovy scripts in scripts/qupath-utils/tools showing how to manipulate Annotations' Name and Classification to make them suitable for cuisto when using custom Annotations (eg. not from ABBA).

+
+
    +
  • Measurements names should be formatted as :
    +object type: marker measurement name. measurement name is the bit you will report in the configuration file as base_measurement under the [regions] section. +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 is supported but only one object type.
    • +
    +
  • +
+

Detections#

+

Detections are the objects of interest. They are used in QuPath to count them in each regions, and can be used with cuisto to compute and display the spatial distrubutions based on the atlas coordinates.

+

The measurement you're interested in (count, cumulated fiber length...) will be added to the Annotations objects (brain regions). In order to get the measurement properly formatted (eg. with the correct measurement name so that it is compatible with cuisto, see above), Detections objects need to respect the following :

+
    +
  • The Classification must be a derived classification formatted like so : object type: marker. It can't have column other than the one separating the primary classification (object type) and the secondary classification (marker). object type corresponds to the type of objects of interested that are counted (eg. "Cells", "Fibers", ...), marker corresponds to a biological marker or a detection channel (eg. "EGFP", "positive", "marker1+", ...).
  • +
  • Only one primary classification can be analyzed at once with cuisto, eg. only objects classified as object type: ... will be taken into account. Examples : Cells: marker 1 and Cells: marker 2, or Fibers: EGFP and Fibers: DsRed.
  • +
+

Those information are used to perform the quantification in each Annotation within QuPath. cuisto can use only the Annotations data afterwards if you're only interested in the quantification in each regions. However, if you also want the spatial distributions of the objects in the atlas space, Detections objects will also need :

+
    +
  • The atlas coordinates, stored as Atlas_X, Atlas_Y and Atlas_Z, expressed in millimetres (mm). They correspond for the Allen Brain atlas, respectively, to the anterio-posterior (rostro-caudal) axis, the inferio-superior (dorso-ventral) axis and the left-right (medio-lateral) axis. You can add those coordinates to the Detections as a measurement with the addAtlasCoordinates.groovy script located in scripts/qupath-utils/atlas.
  • +
+

Measurements#

+

Metrics supported by cuisto#

+

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

+
    +
  • the base measurement itself
      +
    • if the measurement name finishes with "µm", 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 punctual 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 cuisto 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 (see here). 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 cuisto 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)
  • +
  • Choose either Detections or Annoations in Export type
  • +
  • Click Export
  • +
+

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

+

Alternatively, if using QuPath as intended for the pipeline, the final script pipelineImportExport.groovy will automatically export the data, following the file structure expected by cuisto used in "pipeline mode", eg. to easily analyse several animals at once (to do so without using the pipeline, check this section).

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

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#

+

To be able to use cuisto directly after exporting QuPath data, there is a number of requirements and limitations regarding the QuPath Annotations and Detections names and classifications. However, the guides below should create objects with properly formatted data. See more about the requirements on this page.

+

Built-in cell detection#

+

QuPath has a built-in cell detection feature, available in Analyze > Cell detection. You have 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 intensity in several channels and cell compartments.

+
+

Pixel classifier#

+

Another very powerful and versatile way to segment cells is 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 do 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. Even better, the pixels are classified in arbitrary classes you define : it supports any number of classes. In other word, one can train a model to classify pixels in "background", "marker1", "marker2", "marker3"... classes, depending on their fluorescence color and intensity.

+

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, full resolution will be needed, for big objects decreasing the resolution (bigger pixel size) 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 make 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. +
+

To import the classifier in the actual QuPath project, head to the Classify > Pixel classification > Load pixel classifier menu, three-dotted menu and Import from file. Upon import, several actions are available : create objects, measure or classify. Alternatively, the prediction image (where each pixel is the probability for that pixel to belong to each of the classifications) can be segmented externally.

+

Built-in create objects#

+

The Create objects action will ask what where the objects should be created. If ABBA is being used, selecting "All annotations" will create objects in each annotation, which is not advised : because of the hierarchy, some annotations are Parent annotations, thus objects will be created multiple times (eg. detections will be created in "RN", "MBMot", "MB", "grey", "root" and "Root"). When using regions organized in a hierarchy, use "Full image" instead. Then some options are to be selected, including :

+
    +
  • New object type : typically detections
  • +
  • Minimum object size : objects smaller than this will be discarded,
  • +
  • Minimum hole size : holes within a single object smaller than this will be filled,
  • +
  • Split objects : multiple detections will be split into multiple objects, otherwise all detections will be a single object (checking this is recommended),
  • +
  • Delete existing objects : this will delete everything, including annotations.
  • +
+
+

Tip

+

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 cuisto 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 punctual objects as polygons (with a shape) or points (punctual) that 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.

+

Other use of the pixel classifier#

+

As you might have noticed, when loading a pixel classifier in your project, 3 actions are available. "Create objects" is described above, which leaves the other two.

+
Measure#
+

This adds a measurement to existing annotations, counting the total area covered by pixels of each class. You can choose the measurement name, the name of the classes (without the Ignore* class) the classifier is trained on followed by "area µm^2" will be appended. For instance, say I have a pixel classifier trained to find objects classified as "Fibers: marker1", "Fibers: marker2" and "Ignore*". Clicking the "Measure" button and leaving the Measurement name box empty will add, for each annotation, measurements called "Fibers: marker1 area µm^2" and "Fibers: marker2 area µm^2".

+

Those measurements can then be used in cuisto, using "area µm^2" as the "base_measurement" in the configuration file. This use case is showcased in an example.

+
Classify#
+

This classifies existing detections based on the prediction at their centroid. A pixel classifier classifies every single pixel in your image into the classes it was trained on. Any object has a centroid, eg. a center of mass, which corresponds to a given pixel. The "Classify" button will classify a detection as the classification based on the classification predicted by the classifier of the pixel located at the detection centroid.

+

A typical use-case would be to create detections, for examples "cells stained in the DsRed channel", with a first pixel classifier (or any other means). Then, the detected cells need to be classified : I want to classify them as "positive" if they have a staining revealed in the EGFP channel, and as "negative" otherwise. To do this, I would train a second pixel classifier that simply classifies pixels to "Cells: positive" if they have a significant amount of green fluorescence, and "Cells: negative" otherwise. Note that in this case, it does not matter if the pixels do not actually belong to a cell, as it will only be used to classify existing detections - we do not use the Ignore* class. Subsequently, I would import the second pixel classifier and use the "Classify" button.

+
+

Info

+

Similar results could be achieved with an object classifier instead of a pixel classifier but will not be covered here. You can check the QuPath tutorial to see how to procede.

+
+

Existing detections, created before, will thus be classified in either "Cells: positive", or "Cells: negative", given the classification of the pixel, underlying their centroid, according to the second pixel classifier : cells with a significant amount of green fluorescence will be classified as "Cells: positive", the other as "Cells: negative".

+

One could then count the cells of each classifications in each regions (using the addRegionsCount.groovy script in scripts/qupath-utils/measurements). After export, this data can be used with cuisto. The data used in the Cells distributions example was generated using this method.

+
+

Tip

+

The function classifyDetectionsByCentroid("pixel_classifier_name") can be used in a Groovy script to batch-process the project.

+
+

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 cuisto 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..f925351 --- /dev/null +++ b/guide-register-abba.html @@ -0,0 +1,1740 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + Registration with ABBA - cuisto + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + + + + + +
+
+ + + + + + + + + + +

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 deformations.
  • +
  • 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/anaconda-licences.png b/images/anaconda-licences.png new file mode 100644 index 0000000000000000000000000000000000000000..3ce4a2352cb0a7403b56b7e90e9371a404408840 GIT binary patch literal 143832 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

-)Vr>-slND!z!dpF5Iq?;dC0mJ?( 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 literal 0 HcmV?d00001 diff --git a/images/cuisto-pipeline.svg b/images/cuisto-pipeline.svg new file mode 100644 index 0000000..ea07169 --- /dev/null +++ b/images/cuisto-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
cuisto
cuisto
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..59024bc --- /dev/null +++ b/index.html @@ -0,0 +1,1351 @@ + + + + + + + + + + + + + + + + + + + + + + + + + cuisto + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

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

Introduction#

+
+

Info

+

The documentation is under construction.

+
+

cuisto is a Python package aiming at quantifying histological data.

+

After ABBA registration of 2D histological slices and QuPath objects' detection, cuisto 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 cuisto 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, cuisto 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#

+

cuisto has been primarly developed by Guillaume Le Goc in Julien Bouvier's lab at NeuroPSI. The clever name was found by Aurélie Bodeau.

+

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..07b72fc --- /dev/null +++ b/main-citing.html @@ -0,0 +1,1243 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Citing - cuisto + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + + + + +

Citing#

+

While cuisto 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..e9f7181 --- /dev/null +++ b/main-configuration-files.html @@ -0,0 +1,1666 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + The configuration files - cuisto + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + + + + +

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 cuisto 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 each blocks.
+# The new "name" and "acronym" can be existing Allen Brain regions or a new (meaningful) one.
+# Notes :
+# - It is case sensitive.
+# - If a Brainglobe atlas is specified in the configuration file, by default, cuisto will remove any
+# non-leaf regions (eg. any regions that have child region in the atlas ontology) *before* the merging
+# defined here. This means that if members are non-leaf regions, they will be discarded before the merge
+# and NOT be included in the new custom region.
+
+[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 cuisto 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 cuisto 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 cuisto 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 cuisto 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..6814c99 --- /dev/null +++ b/main-getting-help.html @@ -0,0 +1,1248 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + Getting help - cuisto + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + + + + +

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 cuisto 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..ac77a32 --- /dev/null +++ b/main-getting-started.html @@ -0,0 +1,1486 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + Getting started - cuisto + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + + + + +

Getting started#

+

Quick start#

+
    +
  1. Install QuPath, ABBA and conda.
  2. +
  3. Create an environment : +
    conda create -c conda-forge -n cuisto-env python=3.12
    +
  4. +
  5. Activate it : +
    conda activate cuisto-env
    +
  6. +
  7. Install cuisto +
    pip install cuisto
    +
    +If you want to build the doc locally : +
    pip install cuisto[doc]
    +
  8. +
  9. Check the Examples section !
  10. +
+

Slow start#

+
+

Tip

+

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

+
+
+

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 cuisto.

+

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 cuisto 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 cuisto. To make sure those versions do not conflict with other Python tools you might be using (deeplabcut, abba_python, ...), we will install cuisto 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, project-specific environments. It is also used to download and install python in each of those environments, as well as third-party libraries. conda in itself is free and open-source and can be used freely by anyone.

+

It is included with the Anaconda distribution, which is subject to specific terms of service, which state that unless you're an individual, a member of a company with less than 200 employees or a member of an university (but not a national research lab) it's free to use, otherwise, you need to pay a licence. conda, while being free, is by default configured to use the "defaults" channel to fetch the packages (including Python itself), a repository operated by Anaconda, which is, itself, subject to the Anaconda terms of service.

+

In contrast, conda-forge is a community-run repository that contains more numerous and more update-to-date packages. This is free to use for anyone. The idea is to use conda directly (instead of Anaconda graphical interface) and download packages from conda-forge (instead of the Anaconda-run defaults). To try to decipher this mess, Anaconda provides this figure :

+

Anaconda terms of service

+

Furthermore, the "base" conda environment installed with the Anaconda distribution is bloated and 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 Miniconda instead, a minimal installer for conda, and configure it to use the free, community-run channel conda-forge, or, even better, use Miniforge which is basically the same but pre-configured to use conda-forge. The only downside is that will not get the Anaconda graphical user interface and you'll need to use the terminal instead, but worry not ! We got you covered.

+
+
    +
  1. Download and install Miniforge (choose the latest release 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. +
+
+
+

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. Open a regular PowerShell window and run conda config --add channels conda-forge, so that subsequent installations and environments creation will fetch required dependencies from conda-forge.

+
+

Installation#

+

This section explains how to actually install the cuisto package. +The following commands should be run from a terminal (PowerShell). Remember that the -c conda-forge bits are not necessary if you installed conda with the miniforge distribution.

+
+
    +
  1. Create a virtual environment with python 3.12 : +
    conda create -c conda-forge -n cuisto-env python=3.12
    +
  2. +
  3. We need to install it inside the cuisto-env environment we just created. First, you need to activate the cuisto-env environment : +
    conda activate cuisto-env
    +
    +Now, the prompt should look like this : +
    (cuisto-env) PS C:\Users\myname>
    +
    +This means that Python packages will now be installed in the cuisto-env environment and won't conflict with other toolboxes you might be using.
  4. +
  5. Then, we use pip to install cuisto. pip was installed with Python, and will fetch the latest release from PyPI. +
    pip install cuisto
    +
  6. +
  7. Get a copy of the cuisto Source code .zip package, from the Releases page, to have access to all the utility scripts in the scripts/ folder.
  8. +
+
+

cuisto is now installed inside the cuisto-env environment and will be available in Python from that environment !

+
+

Tip

+

You can run pip install cuisto --upgrade from the cuisto-env environment 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. Otherwise, check out the Guides section on the left panel.

+ + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/main-using-notebooks.html b/main-using-notebooks.html new file mode 100644 index 0000000..af5b2dd --- /dev/null +++ b/main-using-notebooks.html @@ -0,0 +1,1280 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + Using notebooks - cuisto + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + + + + +

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 "cuisto-env".
  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 cuisto-env
    +
  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..28e2e83 --- /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.

cuisto is a Python package aiming at quantifying histological data.

After ABBA registration of 2D histological slices and QuPath objects' detection, cuisto 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 cuisto 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, cuisto 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/cuisto
  • 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":"

cuisto has been primarly developed by Guillaume Le Goc in Julien Bouvier's lab at NeuroPSI. The clever name was found by Aur\u00e9lie Bodeau.

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

"},{"location":"api-compute.html","title":"cuisto.compute","text":"

compute module, part of cuisto.

Contains actual computation functions.

"},{"location":"api-compute.html#cuisto.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 cuisto/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#cuisto.compute.get_regions_metrics","title":"get_regions_metrics(df_annotations, object_type, channel_names, meas_base_name, metrics_names)","text":"

Derive metrics from meas_base_name.

The measurements columns of df_annotations must be properly formatted, eg : object_type: channel meas_base_name

Derived metrics include : - raw measurement - areal density - relative raw measurement - relative density

Supports objects that are counted (polygons or points) and objects whose length is measured (fibers-like).

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

Base measurement name in the input DataFrame used to derive metrics.

required metrics_names dict

Maps hardcoded measurement names to display names.

required

Returns:

Name Type Description df_regions DataFrame

DataFrame with brain regions name, area and metrics.

Source code in cuisto/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    Derive metrics from `meas_base_name`.\n\n    The measurements columns of `df_annotations` must be properly formatted, eg :\n    object_type: channel meas_base_name\n\n    Derived metrics include :\n    - raw measurement\n    - areal density\n    - relative raw measurement\n    - relative density\n\n    Supports objects that are counted (polygons or points) and objects whose length is\n    measured (fibers-like).\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        Base measurement name in the input DataFrame used to derive metrics.\n    metrics_names : dict\n        Maps hardcoded measurement names to display names.\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 meas_base_name.endswith(\"\u00b5m\"):\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#cuisto.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 cuisto/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 cuisto 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":"cuisto.config","text":"

config module, part of cuisto.

Contains the Config class.

"},{"location":"api-config.html#cuisto.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 cuisto/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    if self.atlas[\"name\"]:\n        self.bg_atlas = BrainGlobeAtlas(self.atlas[\"name\"], check_latest=False)\n    else:\n        self.bg_atlas = None\n\n    self.get_blacklist()\n    self.get_leaves_list()\n
"},{"location":"api-config.html#cuisto.config.Config.get_blacklist","title":"get_blacklist()","text":"

Wraps cuisto.utils.get_blacklist.

Source code in cuisto/config.py
def get_blacklist(self):\n    \"\"\"Wraps cuisto.utils.get_blacklist.\"\"\"\n\n    self.atlas[\"blacklist\"] = utils.get_blacklist(\n        self.files[\"blacklist\"], self.bg_atlas\n    )\n
"},{"location":"api-config.html#cuisto.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 cuisto/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#cuisto.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 cuisto/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#cuisto.config.Config.get_leaves_list","title":"get_leaves_list()","text":"

Wraps utils.get_leaves_list.

Source code in cuisto/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":"cuisto.display","text":"

display module, part of cuisto.

Contains display functions, essentially wrapping matplotlib and seaborn functions.

"},{"location":"api-display.html#cuisto.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 cuisto/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#cuisto.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 cuisto/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#cuisto.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 cuisto/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#cuisto.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 cuisto/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#cuisto.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 cuisto/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#cuisto.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 cuisto/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#cuisto.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 cuisto/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#cuisto.display.plot_1D_distributions","title":"plot_1D_distributions(dfs_distributions, cfg, df_coordinates=None)","text":"

Wraps nice_distribution_plot().

Source code in cuisto/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#cuisto.display.plot_2D_distributions","title":"plot_2D_distributions(df, cfg)","text":"

Wraps nice_joint_plot().

Source code in cuisto/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#cuisto.display.plot_regions","title":"plot_regions(df, cfg, **kwargs)","text":"

Wraps nice_bar_plot().

Source code in cuisto/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":"cuisto.io","text":"

io module, part of cuisto.

Contains loading and saving functions.

"},{"location":"api-io.html#cuisto.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 cuisto/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#cuisto.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 cuisto/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#cuisto.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 'pipelineImportExport.groovy\" or 'exportFibersAtlasCoordinates.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 cuisto/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 'pipelineImportExport.groovy\" or \n    'exportFibersAtlasCoordinates.groovy' from a QuPath 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#cuisto.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 cuisto/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#cuisto.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 cuisto/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#cuisto.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 cuisto.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 cuisto/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        cuisto.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#cuisto.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 cuisto/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, mode=\"w\")\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":"cuisto.process","text":"

process module, part of cuisto.

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

"},{"location":"api-process.html#cuisto.process.process_animal","title":"process_animal(animal, df_annotations, df_detections, cfg, compute_distributions=True, leaf_regions_only=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 leaf_regions_only bool

If True and a Brainglobe atlas is specified, bar plot per regions will keep only leaf regions, eg. regions with no child -- if there are any. 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 cuisto/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    leaf_regions_only: 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 : cuisto.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    leaf_regions_only : bool, optional\n        If True and a Brainglobe atlas is specified, bar plot per regions will keep only\n        leaf regions, eg. regions with no child -- if there are any. Default 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 if any\n    if leaf_regions_only & (len(cfg.atlas[\"leaveslist\"]) > 0):\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\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#cuisto.process.process_animals","title":"process_animals(wdir, animals, cfg, out_fmt=None, compute_distributions=True, **kwargs)","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 kwargs passed to cuisto.process.process_animal(). {}

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 cuisto/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    **kwargs,\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: cuisto.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    kwargs : passed to cuisto.process.process_animal().\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            **kwargs,\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-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 cuisto.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 = cuisto.seg.get_pixelsize(images_list[0])  # get pixel size\n    edge_dist = int(edge_dist / pixelsize)\n    filters = cuisto.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 = cuisto.seg.pad_image(mask, img.shape)  # resize mask\n            # apply mask, eroding from the edges\n            img = img * cuisto.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 = cuisto.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 = cuisto.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 = cuisto.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":"cuisto.seg","text":"

seg module, part of cuisto.

Functions for segmentating probability map stored as an image.

"},{"location":"api-seg.html#cuisto.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 cuisto/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#cuisto.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 cuisto/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#cuisto.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 cuisto/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#cuisto.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 cuisto/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#cuisto.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 cuisto/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#cuisto.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 cuisto/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#cuisto.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 cuisto/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#cuisto.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 cuisto/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#cuisto.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 cuisto/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#cuisto.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 cuisto/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#cuisto.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 cuisto/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":"cuisto.utils","text":"

utils module, part of cuisto.

Contains utilities functions.

"},{"location":"api-utils.html#cuisto.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. If no altas is provided (None), the col column is set to an empty string.

Parameters:

Name Type Description Default df DataFrame

DataFrame with atlas coordinates in microns.

required atlas BrainGlobeAtlas or None 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 cuisto/utils.py
def add_brain_region(\n    df: pd.DataFrame, atlas: BrainGlobeAtlas | None, 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    If no altas is provided (None), the `col` column is set to an empty string.\n\n    Parameters\n    ----------\n    df : pd.DataFrame\n        DataFrame with atlas coordinates in microns.\n    atlas : BrainGlobeAtlas or None\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    if atlas is None:\n        # no atlas provided set required col as empty string\n        df[col] = \"\"\n        return df\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#cuisto.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 cuisto/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#cuisto.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 cuisto/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#cuisto.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 cuisto/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#cuisto.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 cuisto/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#cuisto.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 cuisto/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#cuisto.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. If atlas is None, return an empty list.

Parameters:

Name Type Description Default file str

Full path the atlas_blacklist.toml file.

required atlas BrainGlobeAtlas or None

Atlas to extract regions from.

required

Returns:

Name Type Description black_list list

Full list of acronyms to discard.

Source code in cuisto/utils.py
def get_blacklist(file: str, atlas: BrainGlobeAtlas | None) -> 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. If `atlas` is None,\n    return an empty list.\n\n    Parameters\n    ----------\n    file : str\n        Full path the atlas_blacklist.toml file.\n    atlas : BrainGlobeAtlas or None\n        Atlas to extract regions from.\n\n    Returns\n    -------\n    black_list : list\n        Full list of acronyms to discard.\n\n    \"\"\"\n    # if no atlas provided, return empty list\n    if atlas is None:\n        return []\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(get_child_regions(atlas, region))\n\n    # add regions specified exactly (no descendants)\n    blacklist.extend(content[\"EXACT\"][\"members\"])\n\n    return blacklist\n
"},{"location":"api-utils.html#cuisto.utils.get_child_regions","title":"get_child_regions(atlas, parent_region)","text":"

Get list of regions that are child of parent_region.

If no atlas is provided, returns an empty list.

Parameters:

Name Type Description Default atlas BrainGlobeAtlas or None

Atlas to extract regions from.

required

Returns:

Name Type Description child_list list

List of regions.

Source code in cuisto/utils.py
def get_child_regions(atlas: BrainGlobeAtlas | None, parent_region: str) -> list:\n    \"\"\"\n    Get list of regions that are child of `parent_region`.\n\n    If no atlas is provided, returns an empty list.\n\n    Parameters\n    ----------\n    atlas : BrainGlobeAtlas or None\n        Atlas to extract regions from.\n\n    Returns\n    -------\n    child_list : list\n        List of regions.\n\n    \"\"\"\n    if atlas is None:\n        return []\n\n    return [\n        atlas.structures[id][\"acronym\"]\n        for id in atlas.structures.tree.expand_tree(\n            atlas.structures[parent_region][\"id\"]\n        )\n    ]\n
"},{"location":"api-utils.html#cuisto.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 cuisto/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#cuisto.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 cuisto/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#cuisto.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 cuisto/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#cuisto.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. If no atlas is provided, returns an empty list.

Parameters:

Name Type Description Default atlas BrainGlobeAtlas or None

Atlas to extract regions from.

required

Returns:

Name Type Description leaves_list list

Acronyms of leaf brain regions.

Source code in cuisto/utils.py
def get_leaves_list(atlas: BrainGlobeAtlas | None) -> 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. If no atlas is provided, returns an empty list.\n\n    Parameters\n    ----------\n    atlas : BrainGlobeAtlas or None\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\n    if atlas is None:\n        return leaves_list\n\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#cuisto.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 cuisto/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#cuisto.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 cuisto/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#cuisto.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 cuisto/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#cuisto.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 cuisto/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#cuisto.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 cuisto/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 pyramid-creator package, 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

pyramid-creator can also pyramidalize images using Python only with the --no-use-qupath option.

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 cuisto 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).

pyramid-creator moved to a standalone package that you can find here with installation and usage instructions.

"},{"location":"guide-create-pyramids.html#installation","title":"Installation","text":"

You will find instructions on the dedicated project page over at Github.

For reference :

You will need conda, follow those instructions to install it.

Then, create a virtual environment if you didn't already (pyramid-creator can be installed in the environment for cuisto) and install the pyramid-creator package.

conda create -c conda-forge -n cuisto-env python=3.12  # not required if you already create an environment\nconda activate cuisto-env\npip install pyramid-creator\n
To use the Python backend (with tifffile), replace the last line with :
pip install pyramid-creator[python-backend]\n
To use the QuPath backend, a working QuPath installation is required, and the pyramid-creator command needs to be aware of its location.

To do so, first, install QuPath. By default, it will install in ~\\AppData\\QuPath-0.X.Y. In any case, note down the installation location.

Then, you have several options : - Create a file in your user directory called \"QUPATH_PATH\" (without extension), containing the full path to the QuPath console executable. In my case, it reads : C:\\Users\\glegoc\\AppData\\Local\\QuPath-0.5.1\\QuPath-0.5.1 (console).exe. Then, the pyramid-creator script will read this file to find the QuPath executable. - Specify the QuPath path as an option when calling the command line interface (see the Usage section) :

pyramid-creator /path/to/your/images --qupath-path \"C:\\Users\\glegoc\\AppData\\Local\\QuPath-0.5.1\\QuPath-0.5.1 (console).exe\"\n
- Specify the QuPath path as an option when using the package in a Python script (see the Usage section) :
from pyramid_creator import pyramidalize_directory\npyramidalize_directory(\"/path/to/your/images/\", qupath_path=\"C:\\Users\\glegoc\\AppData\\Local\\QuPath-0.5.1\\QuPath-0.5.1 (console).exe\")\n
- If you're using Windows, using QuPath v0.6.0, v0.5.1 or v0.5.0 and chose the default installation location, pyramid-creator should find it automatically and write it down in the \"QUPATH_PATH\" file by itself.

"},{"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":"

See the instructions on the dedicated project page over at Github.

"},{"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 an opiniated guide 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 conda.

"},{"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 cuisto 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.

In the event you can't or don't want to follow the pipeline depicted below, but still want to be able to batch-process animals, check the last section.

"},{"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 punctual 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 cuisto 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 cuisto.

  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 cuisto\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 = cuisto.Config(config_file)\ndf_regions, dfs_distributions, df_coordinates = cuisto.process.process_animals(\n    wdir, animals, cfg, out_fmt=output_format\n)\n\n# Display\ncuisto.display.plot_regions(df_regions, cfg)\ncuisto.display.plot_1D_distributions(dfs_distributions, cfg, df_coordinates=df_coordinates)\ncuisto.display.plot_2D_distributions(df_coordinates, cfg)\n

Tip

You can see a live example in this demo notebook.

"},{"location":"guide-pipeline.html#batch-process-animals","title":"Batch-process animals","text":"

It is still possible to process several subjects at once without using the directory structure specified above. The cuisto.process.process_animals() (plural) method is merely a wrapper around cuisto.process.process_animal() (singular). The former fetch the data from the expected locations, the latter is where the analysis actually happens. Therefore, it is possible to fetch your data yourself and feed it to process_animal().

For example, say you used the QuPath Measure > Export measurements for each of your animals. For each individual, this builds a single file with all your images. Let's collect those individual files in a single directory called \"results\", and name the files in a consistent manner that allows you to identify \"Annotations\" and \"Detections\", as well as the animal identifier, for instance \"animal0_annotations.tsv\".

Important

The configuration file is mandatory, even for single-animal analysis.

The script batch_process_animals.py located in examples will mimick process_animals() functionnality.

"},{"location":"guide-prepare-qupath.html","title":"Prepare QuPath data","text":""},{"location":"guide-prepare-qupath.html#qupath-basics","title":"QuPath basics","text":"

cuisto 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 classified as First: second is of classification First and of derived classification second.

In a nutshell, QuPath has two main objects type, Annotations and Detections. The former are flexible, editable and can be easily moved around but are memory-intensive so they are not made to handle thousands of them. They are used to define regions of interest such as brain regions - ABBA imports registered brain regions as Annotations. On the other hand, Detections objects are optimized so that a single image can contain thousands of them without any problem, at the expense of being harder to modify (they can't be moved nor removed from the GUI). Those are used for objects of interest (the things you want to count, cells, fibers...).

Both types have an Object ID (an unique identifier), a Name, a Classification and a Parent. Those are strings, eg. letters and words. Then comes any number of numeric measurements that can have arbitrary names (that could be the area, length, count...).

Info

QuPath Annotations include dynamic measurements, eg. measurement that are updated live, such as \"Num Detections\" and so on. Those can be handy but are not used downstream with cuisto - you will need to add your own count with specific measurement names so that it can work with cuisto, see below.

"},{"location":"guide-prepare-qupath.html#qupath-requirements","title":"QuPath requirements","text":"

cuisto 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#annotations","title":"Annotations","text":"

Annotations correspond to the regions of interest, typically the brain regions. They are used to count objects of interest (Detections) within each of them in QuPath, then with cuisto to compute and display the measurement (or a derived metric such as the density) per region. They usually are created importing the registration with the ABBA plugin from the QuPath \"Extension\" menu or with the importAbba.groovy script located in scripts/qupath-utils/atlas, but can also be drawn manually, imported from ImageJ ROIs (see the importImageJRois.groovy script in scripts/qupath-utils/tools) or any other methods, as long as the following requirements are met (note that the Name and Classification are already correctly set when using the ABBA plugin) :

  • The Name should be the atlas acronym, unless you are not using any atlas. In any case, regions are pooled across images and animals based on their Name (eg. all Annotations, from all images and all subjects, with the same Name are pooled together).
  • The Classification must be in the form Hemisphere: Name, where Hemisphere must be either \"Left\" or \"Right\". Even in the case where \"Left\" and \"Right\" do not make sense for you, \"Left\" and \"Right\" are used internally by cuisto to be able to distinguish the two hemispheres. Note that those can be renamed in the display parameters of the configuration file. Name must correspond to the actual Annotation Name.

Tip

There are some Groovy scripts in scripts/qupath-utils/tools showing how to manipulate Annotations' Name and Classification to make them suitable for cuisto when using custom Annotations (eg. not from ABBA).

  • Measurements names should be formatted as : object type: marker measurement name. measurement name is the bit you will report in the configuration file as base_measurement under the [regions] section. 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 is supported but only one object type.
"},{"location":"guide-prepare-qupath.html#detections","title":"Detections","text":"

Detections are the objects of interest. They are used in QuPath to count them in each regions, and can be used with cuisto to compute and display the spatial distrubutions based on the atlas coordinates.

The measurement you're interested in (count, cumulated fiber length...) will be added to the Annotations objects (brain regions). In order to get the measurement properly formatted (eg. with the correct measurement name so that it is compatible with cuisto, see above), Detections objects need to respect the following :

  • The Classification must be a derived classification formatted like so : object type: marker. It can't have column other than the one separating the primary classification (object type) and the secondary classification (marker). object type corresponds to the type of objects of interested that are counted (eg. \"Cells\", \"Fibers\", ...), marker corresponds to a biological marker or a detection channel (eg. \"EGFP\", \"positive\", \"marker1+\", ...).
  • Only one primary classification can be analyzed at once with cuisto, eg. only objects classified as object type: ... will be taken into account. Examples : Cells: marker 1 and Cells: marker 2, or Fibers: EGFP and Fibers: DsRed.

Those information are used to perform the quantification in each Annotation within QuPath. cuisto can use only the Annotations data afterwards if you're only interested in the quantification in each regions. However, if you also want the spatial distributions of the objects in the atlas space, Detections objects will also need :

  • The atlas coordinates, stored as Atlas_X, Atlas_Y and Atlas_Z, expressed in millimetres (mm). They correspond for the Allen Brain atlas, respectively, to the anterio-posterior (rostro-caudal) axis, the inferio-superior (dorso-ventral) axis and the left-right (medio-lateral) axis. You can add those coordinates to the Detections as a measurement with the addAtlasCoordinates.groovy script located in scripts/qupath-utils/atlas.
"},{"location":"guide-prepare-qupath.html#measurements","title":"Measurements","text":""},{"location":"guide-prepare-qupath.html#metrics-supported-by-cuisto","title":"Metrics supported by cuisto","text":"

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

  • the base measurement itself
    • if the measurement name finishes with \"\u00b5m\", 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 punctual 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 cuisto 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 (see here). 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 cuisto 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)
  • Choose either Detections or Annoations in Export type
  • Click Export

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

Alternatively, if using QuPath as intended for the pipeline, the final script pipelineImportExport.groovy will automatically export the data, following the file structure expected by cuisto used in \"pipeline mode\", eg. to easily analyse several animals at once (to do so without using the pipeline, check this section).

"},{"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":"

To be able to use cuisto directly after exporting QuPath data, there is a number of requirements and limitations regarding the QuPath Annotations and Detections names and classifications. However, the guides below should create objects with properly formatted data. See more about the requirements on this page.

"},{"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 have 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 intensity 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 is 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 do 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. Even better, the pixels are classified in arbitrary classes you define : it supports any number of classes. In other word, one can train a model to classify pixels in \"background\", \"marker1\", \"marker2\", \"marker3\"... classes, depending on their fluorescence color and intensity.

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, full resolution will be needed, for big objects decreasing the resolution (bigger pixel size) 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 make 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.

To import the classifier in the actual QuPath project, head to the Classify > Pixel classification > Load pixel classifier menu, three-dotted menu and Import from file. Upon import, several actions are available : create objects, measure or classify. Alternatively, the prediction image (where each pixel is the probability for that pixel to belong to each of the classifications) can be segmented externally.

"},{"location":"guide-qupath-objects.html#built-in-create-objects","title":"Built-in create objects","text":"

The Create objects action will ask what where the objects should be created. If ABBA is being used, selecting \"All annotations\" will create objects in each annotation, which is not advised : because of the hierarchy, some annotations are Parent annotations, thus objects will be created multiple times (eg. detections will be created in \"RN\", \"MBMot\", \"MB\", \"grey\", \"root\" and \"Root\"). When using regions organized in a hierarchy, use \"Full image\" instead. Then some options are to be selected, including :

  • New object type : typically detections
  • Minimum object size : objects smaller than this will be discarded,
  • Minimum hole size : holes within a single object smaller than this will be filled,
  • Split objects : multiple detections will be split into multiple objects, otherwise all detections will be a single object (checking this is recommended),
  • Delete existing objects : this will delete everything, including annotations.

Tip

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 cuisto 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 punctual objects as polygons (with a shape) or points (punctual) that 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#other-use-of-the-pixel-classifier","title":"Other use of the pixel classifier","text":"

As you might have noticed, when loading a pixel classifier in your project, 3 actions are available. \"Create objects\" is described above, which leaves the other two.

"},{"location":"guide-qupath-objects.html#measure","title":"Measure","text":"

This adds a measurement to existing annotations, counting the total area covered by pixels of each class. You can choose the measurement name, the name of the classes (without the Ignore* class) the classifier is trained on followed by \"area \u00b5m^2\" will be appended. For instance, say I have a pixel classifier trained to find objects classified as \"Fibers: marker1\", \"Fibers: marker2\" and \"Ignore*\". Clicking the \"Measure\" button and leaving the Measurement name box empty will add, for each annotation, measurements called \"Fibers: marker1 area \u00b5m^2\" and \"Fibers: marker2 area \u00b5m^2\".

Those measurements can then be used in cuisto, using \"area \u00b5m^2\" as the \"base_measurement\" in the configuration file. This use case is showcased in an example.

"},{"location":"guide-qupath-objects.html#classify","title":"Classify","text":"

This classifies existing detections based on the prediction at their centroid. A pixel classifier classifies every single pixel in your image into the classes it was trained on. Any object has a centroid, eg. a center of mass, which corresponds to a given pixel. The \"Classify\" button will classify a detection as the classification based on the classification predicted by the classifier of the pixel located at the detection centroid.

A typical use-case would be to create detections, for examples \"cells stained in the DsRed channel\", with a first pixel classifier (or any other means). Then, the detected cells need to be classified : I want to classify them as \"positive\" if they have a staining revealed in the EGFP channel, and as \"negative\" otherwise. To do this, I would train a second pixel classifier that simply classifies pixels to \"Cells: positive\" if they have a significant amount of green fluorescence, and \"Cells: negative\" otherwise. Note that in this case, it does not matter if the pixels do not actually belong to a cell, as it will only be used to classify existing detections - we do not use the Ignore* class. Subsequently, I would import the second pixel classifier and use the \"Classify\" button.

Info

Similar results could be achieved with an object classifier instead of a pixel classifier but will not be covered here. You can check the QuPath tutorial to see how to procede.

Existing detections, created before, will thus be classified in either \"Cells: positive\", or \"Cells: negative\", given the classification of the pixel, underlying their centroid, according to the second pixel classifier : cells with a significant amount of green fluorescence will be classified as \"Cells: positive\", the other as \"Cells: negative\".

One could then count the cells of each classifications in each regions (using the addRegionsCount.groovy script in scripts/qupath-utils/measurements). After export, this data can be used with cuisto. The data used in the Cells distributions example was generated using this method.

Tip

The function classifyDetectionsByCentroid(\"pixel_classifier_name\") can be used in a Groovy script to batch-process the project.

"},{"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 cuisto 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 deformations.
  • 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 cuisto 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 cuisto 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 each blocks.\n# The new \"name\" and \"acronym\" can be existing Allen Brain regions or a new (meaningful) one.\n# Notes :\n# - It is case sensitive.\n# - If a Brainglobe atlas is specified in the configuration file, by default, cuisto will remove any\n# non-leaf regions (eg. any regions that have child region in the atlas ontology) *before* the merging\n# defined here. This means that if members are non-leaf regions, they will be discarded before the merge\n# and NOT be included in the new custom region.\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 cuisto 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 cuisto 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 cuisto 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 cuisto 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 cuisto 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 conda.
  2. Create an environment :
    conda create -c conda-forge -n cuisto-env python=3.12\n
  3. Activate it :
    conda activate cuisto-env\n
  4. Install cuisto
    pip install cuisto\n
    If you want to build the doc locally :
    pip install cuisto[doc]\n
  5. Check the Examples section !
"},{"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 cuisto.

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 cuisto.

"},{"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 cuisto 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 cuisto. To make sure those versions do not conflict with other Python tools you might be using (deeplabcut, abba_python, ...), we will install cuisto 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, project-specific environments. It is also used to download and install python in each of those environments, as well as third-party libraries. conda in itself is free and open-source and can be used freely by anyone.

It is included with the Anaconda distribution, which is subject to specific terms of service, which state that unless you're an individual, a member of a company with less than 200 employees or a member of an university (but not a national research lab) it's free to use, otherwise, you need to pay a licence. conda, while being free, is by default configured to use the \"defaults\" channel to fetch the packages (including Python itself), a repository operated by Anaconda, which is, itself, subject to the Anaconda terms of service.

In contrast, conda-forge is a community-run repository that contains more numerous and more update-to-date packages. This is free to use for anyone. The idea is to use conda directly (instead of Anaconda graphical interface) and download packages from conda-forge (instead of the Anaconda-run defaults). To try to decipher this mess, Anaconda provides this figure :

Furthermore, the \"base\" conda environment installed with the Anaconda distribution is bloated and 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 Miniconda instead, a minimal installer for conda, and configure it to use the free, community-run channel conda-forge, or, even better, use Miniforge which is basically the same but pre-configured to use conda-forge. The only downside is that will not get the Anaconda graphical user interface and you'll need to use the terminal instead, but worry not ! We got you covered.

  1. Download and install Miniforge (choose the latest release 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

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. Open a regular PowerShell window and run conda config --add channels conda-forge, so that subsequent installations and environments creation will fetch required dependencies from conda-forge.

"},{"location":"main-getting-started.html#installation","title":"Installation","text":"

This section explains how to actually install the cuisto package. The following commands should be run from a terminal (PowerShell). Remember that the -c conda-forge bits are not necessary if you installed conda with the miniforge distribution.

  1. Create a virtual environment with python 3.12 :
    conda create -c conda-forge -n cuisto-env python=3.12\n
  2. We need to install it inside the cuisto-env environment we just created. First, you need to activate the cuisto-env environment :
    conda activate cuisto-env\n
    Now, the prompt should look like this :
    (cuisto-env) PS C:\\Users\\myname>\n
    This means that Python packages will now be installed in the cuisto-env environment and won't conflict with other toolboxes you might be using.
  3. Then, we use pip to install cuisto. pip was installed with Python, and will fetch the latest release from PyPI.
    pip install cuisto\n
  4. Get a copy of the cuisto Source code .zip package, from the Releases page, to have access to all the utility scripts in the scripts/ folder.

cuisto is now installed inside the cuisto-env environment and will be available in Python from that environment !

Tip

You can run pip install cuisto --upgrade from the cuisto-env environment 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. Otherwise, check out the Guides section on the left panel.

"},{"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 \"cuisto-env\".
  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 cuisto-env\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-brain-contours.html","title":"Brain contours","text":"

With cuisto, 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 cuisto.display module can use.

Alternatively it is possible to directly plot density maps without cuisto, 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 pyramid-creator package that you can find here.

"},{"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 cuisto (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 cuisto 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 cuisto:

  • 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 followed by a pixel classifier \"Classify\" function on toy data.

In\u00a0[1]: Copied!
import pandas as pd\n\nimport cuisto\n
import pandas as pd import cuisto 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 = cuisto.config.Config(config_file)\n
# get configuration cfg = cuisto.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 = cuisto.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 = cuisto.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 = cuisto.display.plot_regions(df_regions, cfg)\n# specify which regions to plot\n# figs_regions = cuisto.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 = cuisto.display.plot_regions(df_regions, cfg) # specify which regions to plot # figs_regions = cuisto.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 = cuisto.display.plot_1D_distributions(\n    dfs_distributions, cfg, df_coordinates=df_coordinates\n)\n
# plot 1D distributions fig_distrib = cuisto.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 = cuisto.display.plot_2D_distributions(df_coordinates, cfg)\n
# plot heatmap (all types of cells pooled) fig_heatmap = cuisto.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 cuisto 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[1]: 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[2]: 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[3]: 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[4]: 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[5]: Copied!
# select objects\n# df = df[df[\"Classification\"] == \"example: classification\"]\n
# select objects # df = df[df[\"Classification\"] == \"example: classification\"] In\u00a0[6]: 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[7]: 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[7]: 
Text(2, 7.9, '1 mm')
 In\u00a0[8]: 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[8]: 
Text(2, 7, '1 mm')
 In\u00a0[9]: 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[9]: 
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. cuisto 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 cuisto\n
import pandas as pd import cuisto 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 = cuisto.config.Config(config_file)\n
# get configuration cfg = cuisto.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 = cuisto.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 = cuisto.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 density \u00b5m^-2 density mm^-2 coverage index relative count relative density channel animal 0 10Sp Contra. 1749462.18 1.749462 53117.3701 3.036211 30362.113973 1612.755645 0.036535 0.033062 Negative animalid1-SC 0 10Sp Contra. 1749462.18 1.749462 5257.1025 0.300498 3004.98208 15.797499 0.030766 0.02085 Positive animalid1-SC 1 10Sp Ipsi. 1439105.93 1.439106 64182.9823 4.459921 44599.206328 2862.51007 0.023524 0.023265 Negative animalid1-SC 1 10Sp Ipsi. 1439105.93 1.439106 8046.3375 0.559121 5591.205854 44.988729 0.028911 0.022984 Positive animalid1-SC 2 10Sp both 3188568.11 3.188568 117300.3524 3.678778 36787.783216 4315.219935 0.028047 0.025734 Negative animalid1-SC In\u00a0[7]: Copied!
# plot distributions per regions\nfig_regions = cuisto.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 = cuisto.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 cuisto\n
import cuisto 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 = cuisto.Config(config_file)\n
# get configuration cfg = cuisto.Config(config_file) In\u00a0[5]: Copied!
# get distributions per regions\ndf_regions, _, _ = cuisto.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, _, _ = cuisto.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.66it/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 = cuisto.display.plot_regions(df_regions, cfg)\n
figs_regions = cuisto.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 cuisto 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..524da9f --- /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.

cuisto is a Python package aiming at quantifying histological data.

After ABBA registration of 2D histological slices and QuPath objects' detection, cuisto 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 cuisto 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, cuisto 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/cuisto
  • 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":"

cuisto has been primarly developed by Guillaume Le Goc in Julien Bouvier's lab at NeuroPSI. The clever name was found by Aur\u00e9lie Bodeau.

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

"},{"location":"api-compute.html","title":"cuisto.compute","text":"

compute module, part of cuisto.

Contains actual computation functions.

"},{"location":"api-compute.html#cuisto.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 cuisto/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#cuisto.compute.get_regions_metrics","title":"get_regions_metrics(df_annotations, object_type, channel_names, meas_base_name, metrics_names)","text":"

Derive metrics from meas_base_name.

The measurements columns of df_annotations must be properly formatted, eg : object_type: channel meas_base_name

Derived metrics include : - raw measurement - areal density - relative raw measurement - relative density

Supports objects that are counted (polygons or points) and objects whose length is measured (fibers-like).

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

Base measurement name in the input DataFrame used to derive metrics.

required metrics_names dict

Maps hardcoded measurement names to display names.

required

Returns:

Name Type Description df_regions DataFrame

DataFrame with brain regions name, area and metrics.

Source code in cuisto/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    Derive metrics from `meas_base_name`.\n\n    The measurements columns of `df_annotations` must be properly formatted, eg :\n    object_type: channel meas_base_name\n\n    Derived metrics include :\n    - raw measurement\n    - areal density\n    - relative raw measurement\n    - relative density\n\n    Supports objects that are counted (polygons or points) and objects whose length is\n    measured (fibers-like).\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        Base measurement name in the input DataFrame used to derive metrics.\n    metrics_names : dict\n        Maps hardcoded measurement names to display names.\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 meas_base_name.endswith(\"\u00b5m\"):\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#cuisto.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 cuisto/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 cuisto 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":"cuisto.config","text":"

config module, part of cuisto.

Contains the Config class.

"},{"location":"api-config.html#cuisto.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 cuisto/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    if self.atlas[\"name\"]:\n        self.bg_atlas = BrainGlobeAtlas(self.atlas[\"name\"], check_latest=False)\n    else:\n        self.bg_atlas = None\n\n    self.get_blacklist()\n    self.get_leaves_list()\n
"},{"location":"api-config.html#cuisto.config.Config.get_blacklist","title":"get_blacklist()","text":"

Wraps cuisto.utils.get_blacklist.

Source code in cuisto/config.py
def get_blacklist(self):\n    \"\"\"Wraps cuisto.utils.get_blacklist.\"\"\"\n\n    self.atlas[\"blacklist\"] = utils.get_blacklist(\n        self.files[\"blacklist\"], self.bg_atlas\n    )\n
"},{"location":"api-config.html#cuisto.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 cuisto/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#cuisto.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 cuisto/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#cuisto.config.Config.get_leaves_list","title":"get_leaves_list()","text":"

Wraps utils.get_leaves_list.

Source code in cuisto/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":"cuisto.display","text":"

display module, part of cuisto.

Contains display functions, essentially wrapping matplotlib and seaborn functions.

"},{"location":"api-display.html#cuisto.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 cuisto/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#cuisto.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 cuisto/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#cuisto.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 cuisto/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#cuisto.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 cuisto/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#cuisto.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 cuisto/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#cuisto.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 cuisto/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#cuisto.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 cuisto/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#cuisto.display.plot_1D_distributions","title":"plot_1D_distributions(dfs_distributions, cfg, df_coordinates=None)","text":"

Wraps nice_distribution_plot().

Source code in cuisto/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#cuisto.display.plot_2D_distributions","title":"plot_2D_distributions(df, cfg)","text":"

Wraps nice_joint_plot().

Source code in cuisto/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#cuisto.display.plot_regions","title":"plot_regions(df, cfg, **kwargs)","text":"

Wraps nice_bar_plot().

Source code in cuisto/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":"cuisto.io","text":"

io module, part of cuisto.

Contains loading and saving functions.

"},{"location":"api-io.html#cuisto.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 cuisto/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#cuisto.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 cuisto/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#cuisto.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 'pipelineImportExport.groovy\" or 'exportFibersAtlasCoordinates.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 cuisto/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 'pipelineImportExport.groovy\" or \n    'exportFibersAtlasCoordinates.groovy' from a QuPath 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#cuisto.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 cuisto/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#cuisto.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 cuisto/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#cuisto.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 cuisto.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 cuisto/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        cuisto.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#cuisto.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 cuisto/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, mode=\"w\")\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":"cuisto.process","text":"

process module, part of cuisto.

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

"},{"location":"api-process.html#cuisto.process.process_animal","title":"process_animal(animal, df_annotations, df_detections, cfg, compute_distributions=True, leaf_regions_only=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 leaf_regions_only bool

If True and a Brainglobe atlas is specified, bar plot per regions will keep only leaf regions, eg. regions with no child -- if there are any. 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 cuisto/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    leaf_regions_only: 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 : cuisto.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    leaf_regions_only : bool, optional\n        If True and a Brainglobe atlas is specified, bar plot per regions will keep only\n        leaf regions, eg. regions with no child -- if there are any. Default 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 if any\n    if leaf_regions_only & (len(cfg.atlas[\"leaveslist\"]) > 0):\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\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#cuisto.process.process_animals","title":"process_animals(wdir, animals, cfg, out_fmt=None, compute_distributions=True, **kwargs)","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 kwargs passed to cuisto.process.process_animal(). {}

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 cuisto/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    **kwargs,\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: cuisto.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    kwargs : passed to cuisto.process.process_animal().\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            **kwargs,\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-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 cuisto.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 = cuisto.seg.get_pixelsize(images_list[0])  # get pixel size\n    edge_dist = int(edge_dist / pixelsize)\n    filters = cuisto.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 = cuisto.seg.pad_image(mask, img.shape)  # resize mask\n            # apply mask, eroding from the edges\n            img = img * cuisto.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 = cuisto.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 = cuisto.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 = cuisto.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":"cuisto.seg","text":"

seg module, part of cuisto.

Functions for segmentating probability map stored as an image.

"},{"location":"api-seg.html#cuisto.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 cuisto/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#cuisto.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 cuisto/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#cuisto.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 cuisto/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#cuisto.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 cuisto/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#cuisto.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 cuisto/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#cuisto.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 cuisto/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#cuisto.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 cuisto/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#cuisto.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 cuisto/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#cuisto.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 cuisto/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#cuisto.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 cuisto/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#cuisto.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 cuisto/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":"cuisto.utils","text":"

utils module, part of cuisto.

Contains utilities functions.

"},{"location":"api-utils.html#cuisto.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. If no altas is provided (None), the col column is set to an empty string.

Parameters:

Name Type Description Default df DataFrame

DataFrame with atlas coordinates in microns.

required atlas BrainGlobeAtlas or None 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 cuisto/utils.py
def add_brain_region(\n    df: pd.DataFrame, atlas: BrainGlobeAtlas | None, 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    If no altas is provided (None), the `col` column is set to an empty string.\n\n    Parameters\n    ----------\n    df : pd.DataFrame\n        DataFrame with atlas coordinates in microns.\n    atlas : BrainGlobeAtlas or None\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    if atlas is None:\n        # no atlas provided set required col as empty string\n        df[col] = \"\"\n        return df\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#cuisto.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 cuisto/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#cuisto.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 cuisto/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#cuisto.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 cuisto/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#cuisto.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 cuisto/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#cuisto.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 cuisto/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#cuisto.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. If atlas is None, return an empty list.

Parameters:

Name Type Description Default file str

Full path the atlas_blacklist.toml file.

required atlas BrainGlobeAtlas or None

Atlas to extract regions from.

required

Returns:

Name Type Description black_list list

Full list of acronyms to discard.

Source code in cuisto/utils.py
def get_blacklist(file: str, atlas: BrainGlobeAtlas | None) -> 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. If `atlas` is None,\n    return an empty list.\n\n    Parameters\n    ----------\n    file : str\n        Full path the atlas_blacklist.toml file.\n    atlas : BrainGlobeAtlas or None\n        Atlas to extract regions from.\n\n    Returns\n    -------\n    black_list : list\n        Full list of acronyms to discard.\n\n    \"\"\"\n    # if no atlas provided, return empty list\n    if atlas is None:\n        return []\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(get_child_regions(atlas, region))\n\n    # add regions specified exactly (no descendants)\n    blacklist.extend(content[\"EXACT\"][\"members\"])\n\n    return blacklist\n
"},{"location":"api-utils.html#cuisto.utils.get_child_regions","title":"get_child_regions(atlas, parent_region)","text":"

Get list of regions that are child of parent_region.

If no atlas is provided, returns an empty list.

Parameters:

Name Type Description Default atlas BrainGlobeAtlas or None

Atlas to extract regions from.

required

Returns:

Name Type Description child_list list

List of regions.

Source code in cuisto/utils.py
def get_child_regions(atlas: BrainGlobeAtlas | None, parent_region: str) -> list:\n    \"\"\"\n    Get list of regions that are child of `parent_region`.\n\n    If no atlas is provided, returns an empty list.\n\n    Parameters\n    ----------\n    atlas : BrainGlobeAtlas or None\n        Atlas to extract regions from.\n\n    Returns\n    -------\n    child_list : list\n        List of regions.\n\n    \"\"\"\n    if atlas is None:\n        return []\n\n    return [\n        atlas.structures[id][\"acronym\"]\n        for id in atlas.structures.tree.expand_tree(\n            atlas.structures[parent_region][\"id\"]\n        )\n    ]\n
"},{"location":"api-utils.html#cuisto.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 cuisto/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#cuisto.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 cuisto/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#cuisto.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 cuisto/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#cuisto.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. If no atlas is provided, returns an empty list.

Parameters:

Name Type Description Default atlas BrainGlobeAtlas or None

Atlas to extract regions from.

required

Returns:

Name Type Description leaves_list list

Acronyms of leaf brain regions.

Source code in cuisto/utils.py
def get_leaves_list(atlas: BrainGlobeAtlas | None) -> 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. If no atlas is provided, returns an empty list.\n\n    Parameters\n    ----------\n    atlas : BrainGlobeAtlas or None\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\n    if atlas is None:\n        return leaves_list\n\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#cuisto.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 cuisto/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#cuisto.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 cuisto/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#cuisto.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 cuisto/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#cuisto.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 cuisto/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#cuisto.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 cuisto/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 pyramid-creator package, 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

pyramid-creator can also pyramidalize images using Python only with the --no-use-qupath option.

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 cuisto 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).

pyramid-creator moved to a standalone package that you can find here with installation and usage instructions.

"},{"location":"guide-create-pyramids.html#installation","title":"Installation","text":"

You will find instructions on the dedicated project page over at Github.

For reference :

You will need conda, follow those instructions to install it.

Then, create a virtual environment if you didn't already (pyramid-creator can be installed in the environment for cuisto) and install the pyramid-creator package.

conda create -c conda-forge -n cuisto-env python=3.12  # not required if you already create an environment\nconda activate cuisto-env\npip install pyramid-creator\n
To use the Python backend (with tifffile), replace the last line with :
pip install pyramid-creator[python-backend]\n
To use the QuPath backend, a working QuPath installation is required, and the pyramid-creator command needs to be aware of its location.

To do so, first, install QuPath. By default, it will install in ~\\AppData\\QuPath-0.X.Y. In any case, note down the installation location.

Then, you have several options : - Create a file in your user directory called \"QUPATH_PATH\" (without extension), containing the full path to the QuPath console executable. In my case, it reads : C:\\Users\\glegoc\\AppData\\Local\\QuPath-0.5.1\\QuPath-0.5.1 (console).exe. Then, the pyramid-creator script will read this file to find the QuPath executable. - Specify the QuPath path as an option when calling the command line interface (see the Usage section) :

pyramid-creator /path/to/your/images --qupath-path \"C:\\Users\\glegoc\\AppData\\Local\\QuPath-0.5.1\\QuPath-0.5.1 (console).exe\"\n
- Specify the QuPath path as an option when using the package in a Python script (see the Usage section) :
from pyramid_creator import pyramidalize_directory\npyramidalize_directory(\"/path/to/your/images/\", qupath_path=\"C:\\Users\\glegoc\\AppData\\Local\\QuPath-0.5.1\\QuPath-0.5.1 (console).exe\")\n
- If you're using Windows, using QuPath v0.6.0, v0.5.1 or v0.5.0 and chose the default installation location, pyramid-creator should find it automatically and write it down in the \"QUPATH_PATH\" file by itself.

"},{"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":"

See the instructions on the dedicated project page over at Github.

"},{"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 an opiniated guide 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 conda.

"},{"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 cuisto 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.

In the event you can't or don't want to follow the pipeline depicted below, but still want to be able to batch-process animals, check the last section.

"},{"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 punctual 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 cuisto 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 cuisto.

  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 cuisto\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 = cuisto.Config(config_file)\ndf_regions, dfs_distributions, df_coordinates = cuisto.process.process_animals(\n    wdir, animals, cfg, out_fmt=output_format\n)\n\n# Display\ncuisto.display.plot_regions(df_regions, cfg)\ncuisto.display.plot_1D_distributions(dfs_distributions, cfg, df_coordinates=df_coordinates)\ncuisto.display.plot_2D_distributions(df_coordinates, cfg)\n

Tip

You can see a live example in this demo notebook.

"},{"location":"guide-pipeline.html#batch-process-animals","title":"Batch-process animals","text":"

It is still possible to process several subjects at once without using the directory structure specified above. The cuisto.process.process_animals() (plural) method is merely a wrapper around cuisto.process.process_animal() (singular). The former fetch the data from the expected locations, the latter is where the analysis actually happens. Therefore, it is possible to fetch your data yourself and feed it to process_animal().

For example, say you used the QuPath Measure > Export measurements for each of your animals. For each individual, this builds a single file with all your images. Let's collect those individual files in a single directory called \"results\", and name the files in a consistent manner that allows you to identify \"Annotations\" and \"Detections\", as well as the animal identifier, for instance \"animal0_annotations.tsv\".

Important

The configuration file is mandatory, even for single-animal analysis.

The script batch_process_animals.py located in examples will mimick process_animals() functionnality.

"},{"location":"guide-prepare-qupath.html","title":"Prepare QuPath data","text":""},{"location":"guide-prepare-qupath.html#qupath-basics","title":"QuPath basics","text":"

cuisto 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 classified as First: second is of classification First and of derived classification second.

In a nutshell, QuPath has two main objects type, Annotations and Detections. The former are flexible, editable and can be easily moved around but are memory-intensive so they are not made to handle thousands of them. They are used to define regions of interest such as brain regions - ABBA imports registered brain regions as Annotations. On the other hand, Detections objects are optimized so that a single image can contain thousands of them without any problem, at the expense of being harder to modify (they can't be moved nor removed from the GUI). Those are used for objects of interest (the things you want to count, cells, fibers...).

Both types have an Object ID (an unique identifier), a Name, a Classification and a Parent. Those are strings, eg. letters and words. Then comes any number of numeric measurements that can have arbitrary names (that could be the area, length, count...).

Info

QuPath Annotations include dynamic measurements, eg. measurement that are updated live, such as \"Num Detections\" and so on. Those can be handy but are not used downstream with cuisto - you will need to add your own count with specific measurement names so that it can work with cuisto, see below.

"},{"location":"guide-prepare-qupath.html#qupath-requirements","title":"QuPath requirements","text":"

cuisto 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#annotations","title":"Annotations","text":"

Annotations correspond to the regions of interest, typically the brain regions. They are used to count objects of interest (Detections) within each of them in QuPath, then with cuisto to compute and display the measurement (or a derived metric such as the density) per region. They usually are created importing the registration with the ABBA plugin from the QuPath \"Extension\" menu or with the importAbba.groovy script located in scripts/qupath-utils/atlas, but can also be drawn manually, imported from ImageJ ROIs (see the importImageJRois.groovy script in scripts/qupath-utils/tools) or any other methods, as long as the following requirements are met (note that the Name and Classification are already correctly set when using the ABBA plugin) :

  • The Name should be the atlas acronym, unless you are not using any atlas. In any case, regions are pooled across images and animals based on their Name (eg. all Annotations, from all images and all subjects, with the same Name are pooled together).
  • The Classification must be in the form Hemisphere: Name, where Hemisphere must be either \"Left\" or \"Right\". Even in the case where \"Left\" and \"Right\" do not make sense for you, \"Left\" and \"Right\" are used internally by cuisto to be able to distinguish the two hemispheres. Note that those can be renamed in the display parameters of the configuration file. Name must correspond to the actual Annotation Name.

Tip

There are some Groovy scripts in scripts/qupath-utils/tools showing how to manipulate Annotations' Name and Classification to make them suitable for cuisto when using custom Annotations (eg. not from ABBA).

  • Measurements names should be formatted as : object type: marker measurement name. measurement name is the bit you will report in the configuration file as base_measurement under the [regions] section. 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 is supported but only one object type.
"},{"location":"guide-prepare-qupath.html#detections","title":"Detections","text":"

Detections are the objects of interest. They are used in QuPath to count them in each regions, and can be used with cuisto to compute and display the spatial distrubutions based on the atlas coordinates.

The measurement you're interested in (count, cumulated fiber length...) will be added to the Annotations objects (brain regions). In order to get the measurement properly formatted (eg. with the correct measurement name so that it is compatible with cuisto, see above), Detections objects need to respect the following :

  • The Classification must be a derived classification formatted like so : object type: marker. It can't have column other than the one separating the primary classification (object type) and the secondary classification (marker). object type corresponds to the type of objects of interested that are counted (eg. \"Cells\", \"Fibers\", ...), marker corresponds to a biological marker or a detection channel (eg. \"EGFP\", \"positive\", \"marker1+\", ...).
  • Only one primary classification can be analyzed at once with cuisto, eg. only objects classified as object type: ... will be taken into account. Examples : Cells: marker 1 and Cells: marker 2, or Fibers: EGFP and Fibers: DsRed.

Those information are used to perform the quantification in each Annotation within QuPath. cuisto can use only the Annotations data afterwards if you're only interested in the quantification in each regions. However, if you also want the spatial distributions of the objects in the atlas space, Detections objects will also need :

  • The atlas coordinates, stored as Atlas_X, Atlas_Y and Atlas_Z, expressed in millimetres (mm). They correspond for the Allen Brain atlas, respectively, to the anterio-posterior (rostro-caudal) axis, the inferio-superior (dorso-ventral) axis and the left-right (medio-lateral) axis. You can add those coordinates to the Detections as a measurement with the addAtlasCoordinates.groovy script located in scripts/qupath-utils/atlas.
"},{"location":"guide-prepare-qupath.html#measurements","title":"Measurements","text":""},{"location":"guide-prepare-qupath.html#metrics-supported-by-cuisto","title":"Metrics supported by cuisto","text":"

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

  • the base measurement itself
    • if the measurement name finishes with \"\u00b5m\", 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 punctual 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 cuisto 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 (see here). 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 cuisto 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)
  • Choose either Detections or Annoations in Export type
  • Click Export

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

Alternatively, if using QuPath as intended for the pipeline, the final script pipelineImportExport.groovy will automatically export the data, following the file structure expected by cuisto used in \"pipeline mode\", eg. to easily analyse several animals at once (to do so without using the pipeline, check this section).

"},{"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":"

To be able to use cuisto directly after exporting QuPath data, there is a number of requirements and limitations regarding the QuPath Annotations and Detections names and classifications. However, the guides below should create objects with properly formatted data. See more about the requirements on this page.

"},{"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 have 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 intensity 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 is 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 do 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. Even better, the pixels are classified in arbitrary classes you define : it supports any number of classes. In other word, one can train a model to classify pixels in \"background\", \"marker1\", \"marker2\", \"marker3\"... classes, depending on their fluorescence color and intensity.

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, full resolution will be needed, for big objects decreasing the resolution (bigger pixel size) 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 make 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.

To import the classifier in the actual QuPath project, head to the Classify > Pixel classification > Load pixel classifier menu, three-dotted menu and Import from file. Upon import, several actions are available : create objects, measure or classify. Alternatively, the prediction image (where each pixel is the probability for that pixel to belong to each of the classifications) can be segmented externally.

"},{"location":"guide-qupath-objects.html#built-in-create-objects","title":"Built-in create objects","text":"

The Create objects action will ask what where the objects should be created. If ABBA is being used, selecting \"All annotations\" will create objects in each annotation, which is not advised : because of the hierarchy, some annotations are Parent annotations, thus objects will be created multiple times (eg. detections will be created in \"RN\", \"MBMot\", \"MB\", \"grey\", \"root\" and \"Root\"). When using regions organized in a hierarchy, use \"Full image\" instead. Then some options are to be selected, including :

  • New object type : typically detections
  • Minimum object size : objects smaller than this will be discarded,
  • Minimum hole size : holes within a single object smaller than this will be filled,
  • Split objects : multiple detections will be split into multiple objects, otherwise all detections will be a single object (checking this is recommended),
  • Delete existing objects : this will delete everything, including annotations.

Tip

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 cuisto 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 punctual objects as polygons (with a shape) or points (punctual) that 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#other-use-of-the-pixel-classifier","title":"Other use of the pixel classifier","text":"

As you might have noticed, when loading a pixel classifier in your project, 3 actions are available. \"Create objects\" is described above, which leaves the other two.

"},{"location":"guide-qupath-objects.html#measure","title":"Measure","text":"

This adds a measurement to existing annotations, counting the total area covered by pixels of each class. You can choose the measurement name, the name of the classes (without the Ignore* class) the classifier is trained on followed by \"area \u00b5m^2\" will be appended. For instance, say I have a pixel classifier trained to find objects classified as \"Fibers: marker1\", \"Fibers: marker2\" and \"Ignore*\". Clicking the \"Measure\" button and leaving the Measurement name box empty will add, for each annotation, measurements called \"Fibers: marker1 area \u00b5m^2\" and \"Fibers: marker2 area \u00b5m^2\".

Those measurements can then be used in cuisto, using \"area \u00b5m^2\" as the \"base_measurement\" in the configuration file. This use case is showcased in an example.

"},{"location":"guide-qupath-objects.html#classify","title":"Classify","text":"

This classifies existing detections based on the prediction at their centroid. A pixel classifier classifies every single pixel in your image into the classes it was trained on. Any object has a centroid, eg. a center of mass, which corresponds to a given pixel. The \"Classify\" button will classify a detection as the classification based on the classification predicted by the classifier of the pixel located at the detection centroid.

A typical use-case would be to create detections, for examples \"cells stained in the DsRed channel\", with a first pixel classifier (or any other means). Then, the detected cells need to be classified : I want to classify them as \"positive\" if they have a staining revealed in the EGFP channel, and as \"negative\" otherwise. To do this, I would train a second pixel classifier that simply classifies pixels to \"Cells: positive\" if they have a significant amount of green fluorescence, and \"Cells: negative\" otherwise. Note that in this case, it does not matter if the pixels do not actually belong to a cell, as it will only be used to classify existing detections - we do not use the Ignore* class. Subsequently, I would import the second pixel classifier and use the \"Classify\" button.

Info

Similar results could be achieved with an object classifier instead of a pixel classifier but will not be covered here. You can check the QuPath tutorial to see how to procede.

Existing detections, created before, will thus be classified in either \"Cells: positive\", or \"Cells: negative\", given the classification of the pixel, underlying their centroid, according to the second pixel classifier : cells with a significant amount of green fluorescence will be classified as \"Cells: positive\", the other as \"Cells: negative\".

One could then count the cells of each classifications in each regions (using the addRegionsCount.groovy script in scripts/qupath-utils/measurements). After export, this data can be used with cuisto. The data used in the Cells distributions example was generated using this method.

Tip

The function classifyDetectionsByCentroid(\"pixel_classifier_name\") can be used in a Groovy script to batch-process the project.

"},{"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 cuisto 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 deformations.
  • 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 cuisto 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 cuisto 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 each blocks.\n# The new \"name\" and \"acronym\" can be existing Allen Brain regions or a new (meaningful) one.\n# Notes :\n# - It is case sensitive.\n# - If a Brainglobe atlas is specified in the configuration file, by default, cuisto will remove any\n# non-leaf regions (eg. any regions that have child region in the atlas ontology) *before* the merging\n# defined here. This means that if members are non-leaf regions, they will be discarded before the merge\n# and NOT be included in the new custom region.\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 cuisto 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 cuisto 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 cuisto 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 cuisto 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 cuisto 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 conda.
  2. Create an environment :
    conda create -c conda-forge -n cuisto-env python=3.12\n
  3. Activate it :
    conda activate cuisto-env\n
  4. Install cuisto
    pip install cuisto\n
    If you want to build the doc locally :
    pip install cuisto[doc]\n
  5. Check the Examples section !
"},{"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 cuisto.

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 cuisto.

"},{"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 cuisto 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 cuisto. To make sure those versions do not conflict with other Python tools you might be using (deeplabcut, abba_python, ...), we will install cuisto 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, project-specific environments. It is also used to download and install python in each of those environments, as well as third-party libraries. conda in itself is free and open-source and can be used freely by anyone.

It is included with the Anaconda distribution, which is subject to specific terms of service, which state that unless you're an individual, a member of a company with less than 200 employees or a member of an university (but not a national research lab) it's free to use, otherwise, you need to pay a licence. conda, while being free, is by default configured to use the \"defaults\" channel to fetch the packages (including Python itself), a repository operated by Anaconda, which is, itself, subject to the Anaconda terms of service.

In contrast, conda-forge is a community-run repository that contains more numerous and more update-to-date packages. This is free to use for anyone. The idea is to use conda directly (instead of Anaconda graphical interface) and download packages from conda-forge (instead of the Anaconda-run defaults). To try to decipher this mess, Anaconda provides this figure :

Furthermore, the \"base\" conda environment installed with the Anaconda distribution is bloated and 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 Miniconda instead, a minimal installer for conda, and configure it to use the free, community-run channel conda-forge, or, even better, use Miniforge which is basically the same but pre-configured to use conda-forge. The only downside is that will not get the Anaconda graphical user interface and you'll need to use the terminal instead, but worry not ! We got you covered.

  1. Download and install Miniforge (choose the latest release 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

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. Open a regular PowerShell window and run conda config --add channels conda-forge, so that subsequent installations and environments creation will fetch required dependencies from conda-forge.

"},{"location":"main-getting-started.html#installation","title":"Installation","text":"

This section explains how to actually install the cuisto package. The following commands should be run from a terminal (PowerShell). Remember that the -c conda-forge bits are not necessary if you installed conda with the miniforge distribution.

  1. Create a virtual environment with python 3.12 :
    conda create -c conda-forge -n cuisto-env python=3.12\n
  2. We need to install it inside the cuisto-env environment we just created. First, you need to activate the cuisto-env environment :
    conda activate cuisto-env\n
    Now, the prompt should look like this :
    (cuisto-env) PS C:\\Users\\myname>\n
    This means that Python packages will now be installed in the cuisto-env environment and won't conflict with other toolboxes you might be using.
  3. Then, we use pip to install cuisto. pip was installed with Python, and will fetch the latest release from PyPI.
    pip install cuisto\n
  4. Get a copy of the cuisto Source code .zip package, from the Releases page, to have access to all the utility scripts in the scripts/ folder.

cuisto is now installed inside the cuisto-env environment and will be available in Python from that environment !

Tip

You can run pip install cuisto --upgrade from the cuisto-env environment 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. Otherwise, check out the Guides section on the left panel.

"},{"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 \"cuisto-env\".
  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 cuisto-env\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-brain-contours.html","title":"Brain contours","text":"

With cuisto, 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 cuisto.display module can use.

Alternatively it is possible to directly plot density maps without cuisto, 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 pyramid-creator package that you can find here.

"},{"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 cuisto (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 cuisto 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 cuisto:

  • 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 followed by a pixel classifier \"Classify\" function on toy data.

In\u00a0[1]: Copied!
import pandas as pd\n\nimport cuisto\n
import pandas as pd import cuisto 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 = cuisto.config.Config(config_file)\n
# get configuration cfg = cuisto.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 = cuisto.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 = cuisto.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 = cuisto.display.plot_regions(df_regions, cfg)\n# specify which regions to plot\n# figs_regions = cuisto.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 = cuisto.display.plot_regions(df_regions, cfg) # specify which regions to plot # figs_regions = cuisto.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 = cuisto.display.plot_1D_distributions(\n    dfs_distributions, cfg, df_coordinates=df_coordinates\n)\n
# plot 1D distributions fig_distrib = cuisto.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 = cuisto.display.plot_2D_distributions(df_coordinates, cfg)\n
# plot heatmap (all types of cells pooled) fig_heatmap = cuisto.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 cuisto 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[1]: 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[2]: 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[3]: 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[4]: 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[5]: Copied!
# select objects\n# df = df[df[\"Classification\"] == \"example: classification\"]\n
# select objects # df = df[df[\"Classification\"] == \"example: classification\"] In\u00a0[6]: 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[7]: 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[7]: 
Text(2, 7.9, '1 mm')
 In\u00a0[8]: 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[8]: 
Text(2, 7, '1 mm')
 In\u00a0[9]: 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[9]: 
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. cuisto 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 cuisto\n
import pandas as pd import cuisto 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 = cuisto.config.Config(config_file)\n
# get configuration cfg = cuisto.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 = cuisto.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 = cuisto.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 density \u00b5m^-2 density mm^-2 coverage index relative count relative density channel animal 0 10Sp Contra. 1749462.18 1.749462 53117.3701 3.036211 30362.113973 1612.755645 0.036535 0.033062 Negative animalid1-SC 0 10Sp Contra. 1749462.18 1.749462 5257.1025 0.300498 3004.98208 15.797499 0.030766 0.02085 Positive animalid1-SC 1 10Sp Ipsi. 1439105.93 1.439106 64182.9823 4.459921 44599.206328 2862.51007 0.023524 0.023265 Negative animalid1-SC 1 10Sp Ipsi. 1439105.93 1.439106 8046.3375 0.559121 5591.205854 44.988729 0.028911 0.022984 Positive animalid1-SC 2 10Sp both 3188568.11 3.188568 117300.3524 3.678778 36787.783216 4315.219935 0.028047 0.025734 Negative animalid1-SC In\u00a0[7]: Copied!
# plot distributions per regions\nfig_regions = cuisto.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 = cuisto.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 cuisto\n
import cuisto 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 = cuisto.Config(config_file)\n
# get configuration cfg = cuisto.Config(config_file) In\u00a0[5]: Copied!
# get distributions per regions\ndf_regions, _, _ = cuisto.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, _, _ = cuisto.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.66it/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 = cuisto.display.plot_regions(df_regions, cfg)\n
figs_regions = cuisto.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 cuisto 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..47748ab935115775faa62533c2844e98f10ea029 GIT binary patch literal 127 zcmV-_0D%7=iwFpSSA=H*|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-brain-contours.html b/tips-brain-contours.html new file mode 100644 index 0000000..1ec5695 --- /dev/null +++ b/tips-brain-contours.html @@ -0,0 +1,1252 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + Brain contours - cuisto + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + + + + +

Brain contours#

+

With cuisto, 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 cuisto.display module can use.

+

Alternatively it is possible to directly plot density maps without cuisto, 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..2e10bc8 --- /dev/null +++ b/tips-formats.html @@ -0,0 +1,1524 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + Data format - cuisto + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+ +
+
+ + + +
+
+ + + + + + + + + + +

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 pyramid-creator package that you can find here.

+

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 cuisto (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 cuisto 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..9e8ef75 --- /dev/null +++ b/tips-qupath.html @@ -0,0 +1,1316 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + QuPath - cuisto + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + + + + +

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