From c202afb0e88256c49bf805f331d40637c26746a4 Mon Sep 17 00:00:00 2001 From: FreddieAkeroyd Date: Tue, 3 Dec 2024 17:35:16 +0000 Subject: [PATCH] deploy: 004832cc9c246318d0645dbd259108909b9cf0b0 --- .buildinfo | 4 + .doctrees/environment.pickle | Bin 0 -> 96257 bytes .doctrees/genie_python.doctree | Bin 0 -> 790059 bytes .nojekyll | 0 _sources/genie_python.rst.txt | 22 + _static/basic.css | 914 +++++++++++++ _static/contents.png | Bin 0 -> 107 bytes _static/doctools.js | 149 ++ _static/documentation_options.js | 13 + _static/file.png | Bin 0 -> 286 bytes _static/language_data.js | 192 +++ _static/minus.png | Bin 0 -> 90 bytes _static/navigation.png | Bin 0 -> 120 bytes _static/plus.png | Bin 0 -> 90 bytes _static/pygments.css | 75 ++ _static/searchtools.js | 632 +++++++++ _static/sphinx_highlight.js | 154 +++ _static/sphinxdoc.css | 349 +++++ genie_python.html | 2171 ++++++++++++++++++++++++++++++ genindex.html | 474 +++++++ objects.inv | Bin 0 -> 1123 bytes search.html | 86 ++ searchindex.js | 1 + 23 files changed, 5236 insertions(+) create mode 100644 .buildinfo create mode 100644 .doctrees/environment.pickle create mode 100644 .doctrees/genie_python.doctree create mode 100644 .nojekyll create mode 100644 _sources/genie_python.rst.txt create mode 100644 _static/basic.css create mode 100644 _static/contents.png create mode 100644 _static/doctools.js create mode 100644 _static/documentation_options.js create mode 100644 _static/file.png create mode 100644 _static/language_data.js create mode 100644 _static/minus.png create mode 100644 _static/navigation.png create mode 100644 _static/plus.png create mode 100644 _static/pygments.css create mode 100644 _static/searchtools.js create mode 100644 _static/sphinx_highlight.js create mode 100644 _static/sphinxdoc.css create mode 100644 genie_python.html create mode 100644 genindex.html create mode 100644 objects.inv create mode 100644 search.html create mode 100644 searchindex.js diff --git a/.buildinfo b/.buildinfo new file mode 100644 index 00000000..c7b8afc7 --- /dev/null +++ b/.buildinfo @@ -0,0 +1,4 @@ +# Sphinx build info version 1 +# This file records the configuration used when building these files. When it is not found, a full rebuild will be done. +config: da56674fd7e25fac7d893de7b7bf0253 +tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/.doctrees/environment.pickle b/.doctrees/environment.pickle new file mode 100644 index 0000000000000000000000000000000000000000..37b7c661d4e8393e11b5ca689dac9e4c6f280bf1 GIT binary patch literal 96257 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 Wi%XPEN`%FgJaj`4E|%#|P5xir!mOMC literal 0 HcmV?d00001 diff --git a/.doctrees/genie_python.doctree b/.doctrees/genie_python.doctree new file mode 100644 index 0000000000000000000000000000000000000000..0b6c62db17a322e6040fc325e6c091318bde6634 GIT binary patch literal 790059 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 LB3|J5Uf2HyZ*P2S literal 0 HcmV?d00001 diff --git a/.nojekyll b/.nojekyll new file mode 100644 index 00000000..e69de29b diff --git a/_sources/genie_python.rst.txt b/_sources/genie_python.rst.txt new file mode 100644 index 00000000..c31df563 --- /dev/null +++ b/_sources/genie_python.rst.txt @@ -0,0 +1,22 @@ +.. genie_python documentation master file, created by + sphinx-quickstart on Tue Aug 19 09:26:50 2014. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + +Welcome to genie_python's documentation! +======================================== + +Commands +-------- + +.. toctree:: + :maxdepth: 2 + +.. automodule:: genie + :members: + +.. automodule:: genie_advanced + :members: + +.. automodule:: genie_alerts + :members: diff --git a/_static/basic.css b/_static/basic.css new file mode 100644 index 00000000..7ebbd6d0 --- /dev/null +++ b/_static/basic.css @@ -0,0 +1,914 @@ +/* + * Sphinx stylesheet -- basic theme. + */ + +/* -- main layout ----------------------------------------------------------- */ + +div.clearer { + clear: both; +} + +div.section::after { + display: block; + content: ''; + clear: left; +} + +/* -- relbar ---------------------------------------------------------------- */ + +div.related { + width: 100%; + font-size: 90%; +} + +div.related h3 { + display: none; +} + +div.related ul { + margin: 0; + padding: 0 0 0 10px; + list-style: none; +} + +div.related li { + display: inline; +} + +div.related li.right { + float: right; + margin-right: 5px; +} + +/* -- sidebar --------------------------------------------------------------- */ + +div.sphinxsidebarwrapper { + padding: 10px 5px 0 10px; +} + +div.sphinxsidebar { + float: left; + width: 230px; + margin-left: -100%; + font-size: 90%; + word-wrap: break-word; + overflow-wrap : break-word; +} + +div.sphinxsidebar ul { + list-style: none; +} + +div.sphinxsidebar ul ul, +div.sphinxsidebar ul.want-points { + margin-left: 20px; + list-style: square; +} + +div.sphinxsidebar ul ul { + margin-top: 0; + margin-bottom: 0; +} + +div.sphinxsidebar form { + margin-top: 10px; +} + +div.sphinxsidebar input { + border: 1px solid #98dbcc; + font-family: sans-serif; + font-size: 1em; +} + +div.sphinxsidebar #searchbox form.search { + overflow: hidden; +} + +div.sphinxsidebar #searchbox input[type="text"] { + float: left; + width: 80%; + padding: 0.25em; + box-sizing: border-box; +} + +div.sphinxsidebar #searchbox input[type="submit"] { + float: left; + width: 20%; + border-left: none; + padding: 0.25em; + box-sizing: border-box; +} + + +img { + border: 0; + max-width: 100%; +} + +/* -- search page ----------------------------------------------------------- */ + +ul.search { + margin-top: 10px; +} + +ul.search li { + padding: 5px 0; +} + +ul.search li a { + font-weight: bold; +} + +ul.search li p.context { + color: #888; + margin: 2px 0 0 30px; + text-align: left; +} + +ul.keywordmatches li.goodmatch a { + font-weight: bold; +} + +/* -- index page ------------------------------------------------------------ */ + +table.contentstable { + width: 90%; + margin-left: auto; + margin-right: auto; +} + +table.contentstable p.biglink { + line-height: 150%; +} + +a.biglink { + font-size: 1.3em; +} + +span.linkdescr { + font-style: italic; + padding-top: 5px; + font-size: 90%; +} + +/* -- general index --------------------------------------------------------- */ + +table.indextable { + width: 100%; +} + +table.indextable td { + text-align: left; + vertical-align: top; +} + +table.indextable ul { + margin-top: 0; + margin-bottom: 0; + list-style-type: none; +} + +table.indextable > tbody > tr > td > ul { + padding-left: 0em; +} + +table.indextable tr.pcap { + height: 10px; +} + +table.indextable tr.cap { + margin-top: 10px; + background-color: #f2f2f2; +} + +img.toggler { + margin-right: 3px; + margin-top: 3px; + cursor: pointer; +} + +div.modindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +div.genindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +/* -- domain module index --------------------------------------------------- */ + +table.modindextable td { + padding: 2px; + border-collapse: collapse; +} + +/* -- general body styles --------------------------------------------------- */ + +div.body { + min-width: 360px; + max-width: 800px; +} + +div.body p, div.body dd, div.body li, div.body blockquote { + -moz-hyphens: auto; + -ms-hyphens: auto; + -webkit-hyphens: auto; + hyphens: auto; +} + +a.headerlink { + visibility: hidden; +} + +a:visited { + color: #551A8B; +} + +h1:hover > a.headerlink, +h2:hover > a.headerlink, +h3:hover > a.headerlink, +h4:hover > a.headerlink, +h5:hover > a.headerlink, +h6:hover > a.headerlink, +dt:hover > a.headerlink, +caption:hover > a.headerlink, +p.caption:hover > a.headerlink, +div.code-block-caption:hover > a.headerlink { + visibility: visible; +} + +div.body p.caption { + text-align: inherit; +} + +div.body td { + text-align: left; +} + +.first { + margin-top: 0 !important; +} + +p.rubric { + margin-top: 30px; + font-weight: bold; +} + +img.align-left, figure.align-left, .figure.align-left, object.align-left { + clear: left; + float: left; + margin-right: 1em; +} + +img.align-right, figure.align-right, .figure.align-right, object.align-right { + clear: right; + float: right; + margin-left: 1em; +} + +img.align-center, figure.align-center, .figure.align-center, object.align-center { + display: block; + margin-left: auto; + margin-right: auto; +} + +img.align-default, figure.align-default, .figure.align-default { + display: block; + margin-left: auto; + margin-right: auto; +} + +.align-left { + text-align: left; +} + +.align-center { + text-align: center; +} + +.align-default { + text-align: center; +} + +.align-right { + text-align: right; +} + +/* -- sidebars -------------------------------------------------------------- */ + +div.sidebar, +aside.sidebar { + margin: 0 0 0.5em 1em; + border: 1px solid #ddb; + padding: 7px; + background-color: #ffe; + width: 40%; + float: right; + clear: right; + overflow-x: auto; +} + +p.sidebar-title { + font-weight: bold; +} + +nav.contents, +aside.topic, +div.admonition, div.topic, blockquote { + clear: left; +} + +/* -- topics ---------------------------------------------------------------- */ + +nav.contents, +aside.topic, +div.topic { + border: 1px solid #ccc; + padding: 7px; + margin: 10px 0 10px 0; +} + +p.topic-title { + font-size: 1.1em; + font-weight: bold; + margin-top: 10px; +} + +/* -- admonitions ----------------------------------------------------------- */ + +div.admonition { + margin-top: 10px; + margin-bottom: 10px; + padding: 7px; +} + +div.admonition dt { + font-weight: bold; +} + +p.admonition-title { + margin: 0px 10px 5px 0px; + font-weight: bold; +} + +div.body p.centered { + text-align: center; + margin-top: 25px; +} + +/* -- content of sidebars/topics/admonitions -------------------------------- */ + +div.sidebar > :last-child, +aside.sidebar > :last-child, +nav.contents > :last-child, +aside.topic > :last-child, +div.topic > :last-child, +div.admonition > :last-child { + margin-bottom: 0; +} + +div.sidebar::after, +aside.sidebar::after, +nav.contents::after, +aside.topic::after, +div.topic::after, +div.admonition::after, +blockquote::after { + display: block; + content: ''; + clear: both; +} + +/* -- tables ---------------------------------------------------------------- */ + +table.docutils { + margin-top: 10px; + margin-bottom: 10px; + border: 0; + border-collapse: collapse; +} + +table.align-center { + margin-left: auto; + margin-right: auto; +} + +table.align-default { + margin-left: auto; + margin-right: auto; +} + +table caption span.caption-number { + font-style: italic; +} + +table caption span.caption-text { +} + +table.docutils td, table.docutils th { + padding: 1px 8px 1px 5px; + border-top: 0; + border-left: 0; + border-right: 0; + border-bottom: 1px solid #aaa; +} + +th { + text-align: left; + padding-right: 5px; +} + +table.citation { + border-left: solid 1px gray; + margin-left: 1px; +} + +table.citation td { + border-bottom: none; +} + +th > :first-child, +td > :first-child { + margin-top: 0px; +} + +th > :last-child, +td > :last-child { + margin-bottom: 0px; +} + +/* -- figures --------------------------------------------------------------- */ + +div.figure, figure { + margin: 0.5em; + padding: 0.5em; +} + +div.figure p.caption, figcaption { + padding: 0.3em; +} + +div.figure p.caption span.caption-number, +figcaption span.caption-number { + font-style: italic; +} + +div.figure p.caption span.caption-text, +figcaption span.caption-text { +} + +/* -- field list styles ----------------------------------------------------- */ + +table.field-list td, table.field-list th { + border: 0 !important; +} + +.field-list ul { + margin: 0; + padding-left: 1em; +} + +.field-list p { + margin: 0; +} + +.field-name { + -moz-hyphens: manual; + -ms-hyphens: manual; + -webkit-hyphens: manual; + hyphens: manual; +} + +/* -- hlist styles ---------------------------------------------------------- */ + +table.hlist { + margin: 1em 0; +} + +table.hlist td { + vertical-align: top; +} + +/* -- object description styles --------------------------------------------- */ + +.sig { + font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; +} + +.sig-name, code.descname { + background-color: transparent; + font-weight: bold; +} + +.sig-name { + font-size: 1.1em; +} + +code.descname { + font-size: 1.2em; +} + +.sig-prename, code.descclassname { + background-color: transparent; +} + +.optional { + font-size: 1.3em; +} + +.sig-paren { + font-size: larger; +} + +.sig-param.n { + font-style: italic; +} + +/* C++ specific styling */ + +.sig-inline.c-texpr, +.sig-inline.cpp-texpr { + font-family: unset; +} + +.sig.c .k, .sig.c .kt, +.sig.cpp .k, .sig.cpp .kt { + color: #0033B3; +} + +.sig.c .m, +.sig.cpp .m { + color: #1750EB; +} + +.sig.c .s, .sig.c .sc, +.sig.cpp .s, .sig.cpp .sc { + color: #067D17; +} + + +/* -- other body styles ----------------------------------------------------- */ + +ol.arabic { + list-style: decimal; +} + +ol.loweralpha { + list-style: lower-alpha; +} + +ol.upperalpha { + list-style: upper-alpha; +} + +ol.lowerroman { + list-style: lower-roman; +} + +ol.upperroman { + list-style: upper-roman; +} + +:not(li) > ol > li:first-child > :first-child, +:not(li) > ul > li:first-child > :first-child { + margin-top: 0px; +} + +:not(li) > ol > li:last-child > :last-child, +:not(li) > ul > li:last-child > :last-child { + margin-bottom: 0px; +} + +ol.simple ol p, +ol.simple ul p, +ul.simple ol p, +ul.simple ul p { + margin-top: 0; +} + +ol.simple > li:not(:first-child) > p, +ul.simple > li:not(:first-child) > p { + margin-top: 0; +} + +ol.simple p, +ul.simple p { + margin-bottom: 0; +} + +aside.footnote > span, +div.citation > span { + float: left; +} +aside.footnote > span:last-of-type, +div.citation > span:last-of-type { + padding-right: 0.5em; +} +aside.footnote > p { + margin-left: 2em; +} +div.citation > p { + margin-left: 4em; +} +aside.footnote > p:last-of-type, +div.citation > p:last-of-type { + margin-bottom: 0em; +} +aside.footnote > p:last-of-type:after, +div.citation > p:last-of-type:after { + content: ""; + clear: both; +} + +dl.field-list { + display: grid; + grid-template-columns: fit-content(30%) auto; +} + +dl.field-list > dt { + font-weight: bold; + word-break: break-word; + padding-left: 0.5em; + padding-right: 5px; +} + +dl.field-list > dd { + padding-left: 0.5em; + margin-top: 0em; + margin-left: 0em; + margin-bottom: 0em; +} + +dl { + margin-bottom: 15px; +} + +dd > :first-child { + margin-top: 0px; +} + +dd ul, dd table { + margin-bottom: 10px; +} + +dd { + margin-top: 3px; + margin-bottom: 10px; + margin-left: 30px; +} + +.sig dd { + margin-top: 0px; + margin-bottom: 0px; +} + +.sig dl { + margin-top: 0px; + margin-bottom: 0px; +} + +dl > dd:last-child, +dl > dd:last-child > :last-child { + margin-bottom: 0; +} + +dt:target, span.highlighted { + background-color: #fbe54e; +} + +rect.highlighted { + fill: #fbe54e; +} + +dl.glossary dt { + font-weight: bold; + font-size: 1.1em; +} + +.versionmodified { + font-style: italic; +} + +.system-message { + background-color: #fda; + padding: 5px; + border: 3px solid red; +} + +.footnote:target { + background-color: #ffa; +} + +.line-block { + display: block; + margin-top: 1em; + margin-bottom: 1em; +} + +.line-block .line-block { + margin-top: 0; + margin-bottom: 0; + margin-left: 1.5em; +} + +.guilabel, .menuselection { + font-family: sans-serif; +} + +.accelerator { + text-decoration: underline; +} + +.classifier { + font-style: oblique; +} + +.classifier:before { + font-style: normal; + margin: 0 0.5em; + content: ":"; + display: inline-block; +} + +abbr, acronym { + border-bottom: dotted 1px; + cursor: help; +} + +.translated { + background-color: rgba(207, 255, 207, 0.2) +} + +.untranslated { + background-color: rgba(255, 207, 207, 0.2) +} + +/* -- code displays --------------------------------------------------------- */ + +pre { + overflow: auto; + overflow-y: hidden; /* fixes display issues on Chrome browsers */ +} + +pre, div[class*="highlight-"] { + clear: both; +} + +span.pre { + -moz-hyphens: none; + -ms-hyphens: none; + -webkit-hyphens: none; + hyphens: none; + white-space: nowrap; +} + +div[class*="highlight-"] { + margin: 1em 0; +} + +td.linenos pre { + border: 0; + background-color: transparent; + color: #aaa; +} + +table.highlighttable { + display: block; +} + +table.highlighttable tbody { + display: block; +} + +table.highlighttable tr { + display: flex; +} + +table.highlighttable td { + margin: 0; + padding: 0; +} + +table.highlighttable td.linenos { + padding-right: 0.5em; +} + +table.highlighttable td.code { + flex: 1; + overflow: hidden; +} + +.highlight .hll { + display: block; +} + +div.highlight pre, +table.highlighttable pre { + margin: 0; +} + +div.code-block-caption + div { + margin-top: 0; +} + +div.code-block-caption { + margin-top: 1em; + padding: 2px 5px; + font-size: small; +} + +div.code-block-caption code { + background-color: transparent; +} + +table.highlighttable td.linenos, +span.linenos, +div.highlight span.gp { /* gp: Generic.Prompt */ + user-select: none; + -webkit-user-select: text; /* Safari fallback only */ + -webkit-user-select: none; /* Chrome/Safari */ + -moz-user-select: none; /* Firefox */ + -ms-user-select: none; /* IE10+ */ +} + +div.code-block-caption span.caption-number { + padding: 0.1em 0.3em; + font-style: italic; +} + +div.code-block-caption span.caption-text { +} + +div.literal-block-wrapper { + margin: 1em 0; +} + +code.xref, a code { + background-color: transparent; + font-weight: bold; +} + +h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { + background-color: transparent; +} + +.viewcode-link { + float: right; +} + +.viewcode-back { + float: right; + font-family: sans-serif; +} + +div.viewcode-block:target { + margin: -1px -10px; + padding: 0 10px; +} + +/* -- math display ---------------------------------------------------------- */ + +img.math { + vertical-align: middle; +} + +div.body div.math p { + text-align: center; +} + +span.eqno { + float: right; +} + +span.eqno a.headerlink { + position: absolute; + z-index: 1; +} + +div.math:hover a.headerlink { + visibility: visible; +} + +/* -- printout stylesheet --------------------------------------------------- */ + +@media print { + div.document, + div.documentwrapper, + div.bodywrapper { + margin: 0 !important; + width: 100%; + } + + div.sphinxsidebar, + div.related, + div.footer, + #top-link { + display: none; + } +} \ No newline at end of file diff --git a/_static/contents.png b/_static/contents.png new file mode 100644 index 0000000000000000000000000000000000000000..6c59aa1f9c8c3b754b258b8ab4f6b95971c99109 GIT binary patch literal 107 zcmeAS@N?(olHy`uVBq!ia0vp^j6kfx!2~2XTwzxLQbwLGjv*C{Q@c%>8XN?UO#1VG zcLb|!+10i0Jzf{Gv>fyFaQYL)bKk!I{mJd!3^2Uu$-u=wds-dX_E&EV { + if (document.readyState !== "loading") { + callback(); + } else { + document.addEventListener("DOMContentLoaded", callback); + } +}; + +/** + * Small JavaScript module for the documentation. + */ +const Documentation = { + init: () => { + Documentation.initDomainIndexTable(); + Documentation.initOnKeyListeners(); + }, + + /** + * i18n support + */ + TRANSLATIONS: {}, + PLURAL_EXPR: (n) => (n === 1 ? 0 : 1), + LOCALE: "unknown", + + // gettext and ngettext don't access this so that the functions + // can safely bound to a different name (_ = Documentation.gettext) + gettext: (string) => { + const translated = Documentation.TRANSLATIONS[string]; + switch (typeof translated) { + case "undefined": + return string; // no translation + case "string": + return translated; // translation exists + default: + return translated[0]; // (singular, plural) translation tuple exists + } + }, + + ngettext: (singular, plural, n) => { + const translated = Documentation.TRANSLATIONS[singular]; + if (typeof translated !== "undefined") + return translated[Documentation.PLURAL_EXPR(n)]; + return n === 1 ? singular : plural; + }, + + addTranslations: (catalog) => { + Object.assign(Documentation.TRANSLATIONS, catalog.messages); + Documentation.PLURAL_EXPR = new Function( + "n", + `return (${catalog.plural_expr})` + ); + Documentation.LOCALE = catalog.locale; + }, + + /** + * helper function to focus on search bar + */ + focusSearchBar: () => { + document.querySelectorAll("input[name=q]")[0]?.focus(); + }, + + /** + * Initialise the domain index toggle buttons + */ + initDomainIndexTable: () => { + const toggler = (el) => { + const idNumber = el.id.substr(7); + const toggledRows = document.querySelectorAll(`tr.cg-${idNumber}`); + if (el.src.substr(-9) === "minus.png") { + el.src = `${el.src.substr(0, el.src.length - 9)}plus.png`; + toggledRows.forEach((el) => (el.style.display = "none")); + } else { + el.src = `${el.src.substr(0, el.src.length - 8)}minus.png`; + toggledRows.forEach((el) => (el.style.display = "")); + } + }; + + const togglerElements = document.querySelectorAll("img.toggler"); + togglerElements.forEach((el) => + el.addEventListener("click", (event) => toggler(event.currentTarget)) + ); + togglerElements.forEach((el) => (el.style.display = "")); + if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) togglerElements.forEach(toggler); + }, + + initOnKeyListeners: () => { + // only install a listener if it is really needed + if ( + !DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS && + !DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS + ) + return; + + document.addEventListener("keydown", (event) => { + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.altKey || event.ctrlKey || event.metaKey) return; + + if (!event.shiftKey) { + switch (event.key) { + case "ArrowLeft": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const prevLink = document.querySelector('link[rel="prev"]'); + if (prevLink && prevLink.href) { + window.location.href = prevLink.href; + event.preventDefault(); + } + break; + case "ArrowRight": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const nextLink = document.querySelector('link[rel="next"]'); + if (nextLink && nextLink.href) { + window.location.href = nextLink.href; + event.preventDefault(); + } + break; + } + } + + // some keyboard layouts may need Shift to get / + switch (event.key) { + case "/": + if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) break; + Documentation.focusSearchBar(); + event.preventDefault(); + } + }); + }, +}; + +// quick alias for translations +const _ = Documentation.gettext; + +_ready(Documentation.init); diff --git a/_static/documentation_options.js b/_static/documentation_options.js new file mode 100644 index 00000000..e21c068c --- /dev/null +++ b/_static/documentation_options.js @@ -0,0 +1,13 @@ +const DOCUMENTATION_OPTIONS = { + VERSION: '0.1', + LANGUAGE: 'en', + COLLAPSE_INDEX: false, + BUILDER: 'html', + FILE_SUFFIX: '.html', + LINK_SUFFIX: '.html', + HAS_SOURCE: true, + SOURCELINK_SUFFIX: '.txt', + NAVIGATION_WITH_KEYS: false, + SHOW_SEARCH_SUMMARY: true, + ENABLE_SEARCH_SHORTCUTS: true, +}; \ No newline at end of file diff --git a/_static/file.png b/_static/file.png new file mode 100644 index 0000000000000000000000000000000000000000..a858a410e4faa62ce324d814e4b816fff83a6fb3 GIT binary patch literal 286 zcmV+(0pb3MP)s`hMrGg#P~ix$^RISR_I47Y|r1 z_CyJOe}D1){SET-^Amu_i71Lt6eYfZjRyw@I6OQAIXXHDfiX^GbOlHe=Ae4>0m)d(f|Me07*qoM6N<$f}vM^LjV8( literal 0 HcmV?d00001 diff --git a/_static/language_data.js b/_static/language_data.js new file mode 100644 index 00000000..c7fe6c6f --- /dev/null +++ b/_static/language_data.js @@ -0,0 +1,192 @@ +/* + * This script contains the language-specific data used by searchtools.js, + * namely the list of stopwords, stemmer, scorer and splitter. + */ + +var stopwords = ["a", "and", "are", "as", "at", "be", "but", "by", "for", "if", "in", "into", "is", "it", "near", "no", "not", "of", "on", "or", "such", "that", "the", "their", "then", "there", "these", "they", "this", "to", "was", "will", "with"]; + + +/* Non-minified version is copied as a separate JS file, if available */ + +/** + * Porter Stemmer + */ +var Stemmer = function() { + + var step2list = { + ational: 'ate', + tional: 'tion', + enci: 'ence', + anci: 'ance', + izer: 'ize', + bli: 'ble', + alli: 'al', + entli: 'ent', + eli: 'e', + ousli: 'ous', + ization: 'ize', + ation: 'ate', + ator: 'ate', + alism: 'al', + iveness: 'ive', + fulness: 'ful', + ousness: 'ous', + aliti: 'al', + iviti: 'ive', + biliti: 'ble', + logi: 'log' + }; + + var step3list = { + icate: 'ic', + ative: '', + alize: 'al', + iciti: 'ic', + ical: 'ic', + ful: '', + ness: '' + }; + + var c = "[^aeiou]"; // consonant + var v = "[aeiouy]"; // vowel + var C = c + "[^aeiouy]*"; // consonant sequence + var V = v + "[aeiou]*"; // vowel sequence + + var mgr0 = "^(" + C + ")?" + V + C; // [C]VC... is m>0 + var meq1 = "^(" + C + ")?" + V + C + "(" + V + ")?$"; // [C]VC[V] is m=1 + var mgr1 = "^(" + C + ")?" + V + C + V + C; // [C]VCVC... is m>1 + var s_v = "^(" + C + ")?" + v; // vowel in stem + + this.stemWord = function (w) { + var stem; + var suffix; + var firstch; + var origword = w; + + if (w.length < 3) + return w; + + var re; + var re2; + var re3; + var re4; + + firstch = w.substr(0,1); + if (firstch == "y") + w = firstch.toUpperCase() + w.substr(1); + + // Step 1a + re = /^(.+?)(ss|i)es$/; + re2 = /^(.+?)([^s])s$/; + + if (re.test(w)) + w = w.replace(re,"$1$2"); + else if (re2.test(w)) + w = w.replace(re2,"$1$2"); + + // Step 1b + re = /^(.+?)eed$/; + re2 = /^(.+?)(ed|ing)$/; + if (re.test(w)) { + var fp = re.exec(w); + re = new RegExp(mgr0); + if (re.test(fp[1])) { + re = /.$/; + w = w.replace(re,""); + } + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1]; + re2 = new RegExp(s_v); + if (re2.test(stem)) { + w = stem; + re2 = /(at|bl|iz)$/; + re3 = new RegExp("([^aeiouylsz])\\1$"); + re4 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re2.test(w)) + w = w + "e"; + else if (re3.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + else if (re4.test(w)) + w = w + "e"; + } + } + + // Step 1c + re = /^(.+?)y$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(s_v); + if (re.test(stem)) + w = stem + "i"; + } + + // Step 2 + re = /^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step2list[suffix]; + } + + // Step 3 + re = /^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step3list[suffix]; + } + + // Step 4 + re = /^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/; + re2 = /^(.+?)(s|t)(ion)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + if (re.test(stem)) + w = stem; + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1] + fp[2]; + re2 = new RegExp(mgr1); + if (re2.test(stem)) + w = stem; + } + + // Step 5 + re = /^(.+?)e$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + re2 = new RegExp(meq1); + re3 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re.test(stem) || (re2.test(stem) && !(re3.test(stem)))) + w = stem; + } + re = /ll$/; + re2 = new RegExp(mgr1); + if (re.test(w) && re2.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + + // and turn initial Y back to y + if (firstch == "y") + w = firstch.toLowerCase() + w.substr(1); + return w; + } +} + diff --git a/_static/minus.png b/_static/minus.png new file mode 100644 index 0000000000000000000000000000000000000000..d96755fdaf8bb2214971e0db9c1fd3077d7c419d GIT binary patch literal 90 zcmeAS@N?(olHy`uVBq!ia0vp^+#t*WBp7;*Yy1LIik>cxAr*|t7R?Mi>2?kWtu=nj kDsEF_5m^0CR;1wuP-*O&G^0G}KYk!hp00i_>zopr08q^qX#fBK literal 0 HcmV?d00001 diff --git a/_static/navigation.png b/_static/navigation.png new file mode 100644 index 0000000000000000000000000000000000000000..fda6cd29ede1be6168ce8b5e02d099ea9055ccfb GIT binary patch literal 120 zcmeAS@N?(olHy`uVBq!ia0vp^j6iI|!2~2VCcCc%QudxMjv*C{TfG{24>0g7{2zat zIm@i@&@2&y-PR1xY$qjFM{J&XU;25XW1{_&{(Ldr+IaofPcAOcp2zd*+4*{gj8%&M U)(>{V3jhEB literal 0 HcmV?d00001 diff --git a/_static/plus.png b/_static/plus.png new file mode 100644 index 0000000000000000000000000000000000000000..7107cec93a979b9a5f64843235a16651d563ce2d GIT binary patch literal 90 zcmeAS@N?(olHy`uVBq!ia0vp^+#t*WBp7;*Yy1LIik>cxAr*|t7R?Mi>2?kWtu>-2 m3q%Vub%g%s<8sJhVPMczOq}xhg9DJoz~JfX=d#Wzp$Pyb1r*Kz literal 0 HcmV?d00001 diff --git a/_static/pygments.css b/_static/pygments.css new file mode 100644 index 00000000..0d49244e --- /dev/null +++ b/_static/pygments.css @@ -0,0 +1,75 @@ +pre { line-height: 125%; } +td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +.highlight .hll { background-color: #ffffcc } +.highlight { background: #eeffcc; } +.highlight .c { color: #408090; font-style: italic } /* Comment */ +.highlight .err { border: 1px solid #FF0000 } /* Error */ +.highlight .k { color: #007020; font-weight: bold } /* Keyword */ +.highlight .o { color: #666666 } /* Operator */ +.highlight .ch { color: #408090; font-style: italic } /* Comment.Hashbang */ +.highlight .cm { color: #408090; font-style: italic } /* Comment.Multiline */ +.highlight .cp { color: #007020 } /* Comment.Preproc */ +.highlight .cpf { color: #408090; font-style: italic } /* Comment.PreprocFile */ +.highlight .c1 { color: #408090; font-style: italic } /* Comment.Single */ +.highlight .cs { color: #408090; background-color: #fff0f0 } /* Comment.Special */ +.highlight .gd { color: #A00000 } /* Generic.Deleted */ +.highlight .ge { font-style: italic } /* Generic.Emph */ +.highlight .ges { font-weight: bold; font-style: italic } /* Generic.EmphStrong */ +.highlight .gr { color: #FF0000 } /* Generic.Error */ +.highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */ +.highlight .gi { color: #00A000 } /* Generic.Inserted */ +.highlight .go { color: #333333 } /* Generic.Output */ +.highlight .gp { color: #c65d09; font-weight: bold } /* Generic.Prompt */ +.highlight .gs { font-weight: bold } /* Generic.Strong */ +.highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */ +.highlight .gt { color: #0044DD } /* Generic.Traceback */ +.highlight .kc { color: #007020; font-weight: bold } /* Keyword.Constant */ +.highlight .kd { color: #007020; font-weight: bold } /* Keyword.Declaration */ +.highlight .kn { color: #007020; font-weight: bold } /* Keyword.Namespace */ +.highlight .kp { color: #007020 } /* Keyword.Pseudo */ +.highlight .kr { color: #007020; font-weight: bold } /* Keyword.Reserved */ +.highlight .kt { color: #902000 } /* Keyword.Type */ +.highlight .m { color: #208050 } /* Literal.Number */ +.highlight .s { color: #4070a0 } /* Literal.String */ +.highlight .na { color: #4070a0 } /* Name.Attribute */ +.highlight .nb { color: #007020 } /* Name.Builtin */ +.highlight .nc { color: #0e84b5; font-weight: bold } /* Name.Class */ +.highlight .no { color: #60add5 } /* Name.Constant */ +.highlight .nd { color: #555555; font-weight: bold } /* Name.Decorator */ +.highlight .ni { color: #d55537; font-weight: bold } /* Name.Entity */ +.highlight .ne { color: #007020 } /* Name.Exception */ +.highlight .nf { color: #06287e } /* Name.Function */ +.highlight .nl { color: #002070; font-weight: bold } /* Name.Label */ +.highlight .nn { color: #0e84b5; font-weight: bold } /* Name.Namespace */ +.highlight .nt { color: #062873; font-weight: bold } /* Name.Tag */ +.highlight .nv { color: #bb60d5 } /* Name.Variable */ +.highlight .ow { color: #007020; font-weight: bold } /* Operator.Word */ +.highlight .w { color: #bbbbbb } /* Text.Whitespace */ +.highlight .mb { color: #208050 } /* Literal.Number.Bin */ +.highlight .mf { color: #208050 } /* Literal.Number.Float */ +.highlight .mh { color: #208050 } /* Literal.Number.Hex */ +.highlight .mi { color: #208050 } /* Literal.Number.Integer */ +.highlight .mo { color: #208050 } /* Literal.Number.Oct */ +.highlight .sa { color: #4070a0 } /* Literal.String.Affix */ +.highlight .sb { color: #4070a0 } /* Literal.String.Backtick */ +.highlight .sc { color: #4070a0 } /* Literal.String.Char */ +.highlight .dl { color: #4070a0 } /* Literal.String.Delimiter */ +.highlight .sd { color: #4070a0; font-style: italic } /* Literal.String.Doc */ +.highlight .s2 { color: #4070a0 } /* Literal.String.Double */ +.highlight .se { color: #4070a0; font-weight: bold } /* Literal.String.Escape */ +.highlight .sh { color: #4070a0 } /* Literal.String.Heredoc */ +.highlight .si { color: #70a0d0; font-style: italic } /* Literal.String.Interpol */ +.highlight .sx { color: #c65d09 } /* Literal.String.Other */ +.highlight .sr { color: #235388 } /* Literal.String.Regex */ +.highlight .s1 { color: #4070a0 } /* Literal.String.Single */ +.highlight .ss { color: #517918 } /* Literal.String.Symbol */ +.highlight .bp { color: #007020 } /* Name.Builtin.Pseudo */ +.highlight .fm { color: #06287e } /* Name.Function.Magic */ +.highlight .vc { color: #bb60d5 } /* Name.Variable.Class */ +.highlight .vg { color: #bb60d5 } /* Name.Variable.Global */ +.highlight .vi { color: #bb60d5 } /* Name.Variable.Instance */ +.highlight .vm { color: #bb60d5 } /* Name.Variable.Magic */ +.highlight .il { color: #208050 } /* Literal.Number.Integer.Long */ \ No newline at end of file diff --git a/_static/searchtools.js b/_static/searchtools.js new file mode 100644 index 00000000..2c774d17 --- /dev/null +++ b/_static/searchtools.js @@ -0,0 +1,632 @@ +/* + * Sphinx JavaScript utilities for the full-text search. + */ +"use strict"; + +/** + * Simple result scoring code. + */ +if (typeof Scorer === "undefined") { + var Scorer = { + // Implement the following function to further tweak the score for each result + // The function takes a result array [docname, title, anchor, descr, score, filename] + // and returns the new score. + /* + score: result => { + const [docname, title, anchor, descr, score, filename, kind] = result + return score + }, + */ + + // query matches the full name of an object + objNameMatch: 11, + // or matches in the last dotted part of the object name + objPartialMatch: 6, + // Additive scores depending on the priority of the object + objPrio: { + 0: 15, // used to be importantResults + 1: 5, // used to be objectResults + 2: -5, // used to be unimportantResults + }, + // Used when the priority is not in the mapping. + objPrioDefault: 0, + + // query found in title + title: 15, + partialTitle: 7, + // query found in terms + term: 5, + partialTerm: 2, + }; +} + +// Global search result kind enum, used by themes to style search results. +class SearchResultKind { + static get index() { return "index"; } + static get object() { return "object"; } + static get text() { return "text"; } + static get title() { return "title"; } +} + +const _removeChildren = (element) => { + while (element && element.lastChild) element.removeChild(element.lastChild); +}; + +/** + * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions#escaping + */ +const _escapeRegExp = (string) => + string.replace(/[.*+\-?^${}()|[\]\\]/g, "\\$&"); // $& means the whole matched string + +const _displayItem = (item, searchTerms, highlightTerms) => { + const docBuilder = DOCUMENTATION_OPTIONS.BUILDER; + const docFileSuffix = DOCUMENTATION_OPTIONS.FILE_SUFFIX; + const docLinkSuffix = DOCUMENTATION_OPTIONS.LINK_SUFFIX; + const showSearchSummary = DOCUMENTATION_OPTIONS.SHOW_SEARCH_SUMMARY; + const contentRoot = document.documentElement.dataset.content_root; + + const [docName, title, anchor, descr, score, _filename, kind] = item; + + let listItem = document.createElement("li"); + // Add a class representing the item's type: + // can be used by a theme's CSS selector for styling + // See SearchResultKind for the class names. + listItem.classList.add(`kind-${kind}`); + let requestUrl; + let linkUrl; + if (docBuilder === "dirhtml") { + // dirhtml builder + let dirname = docName + "/"; + if (dirname.match(/\/index\/$/)) + dirname = dirname.substring(0, dirname.length - 6); + else if (dirname === "index/") dirname = ""; + requestUrl = contentRoot + dirname; + linkUrl = requestUrl; + } else { + // normal html builders + requestUrl = contentRoot + docName + docFileSuffix; + linkUrl = docName + docLinkSuffix; + } + let linkEl = listItem.appendChild(document.createElement("a")); + linkEl.href = linkUrl + anchor; + linkEl.dataset.score = score; + linkEl.innerHTML = title; + if (descr) { + listItem.appendChild(document.createElement("span")).innerHTML = + " (" + descr + ")"; + // highlight search terms in the description + if (SPHINX_HIGHLIGHT_ENABLED) // set in sphinx_highlight.js + highlightTerms.forEach((term) => _highlightText(listItem, term, "highlighted")); + } + else if (showSearchSummary) + fetch(requestUrl) + .then((responseData) => responseData.text()) + .then((data) => { + if (data) + listItem.appendChild( + Search.makeSearchSummary(data, searchTerms, anchor) + ); + // highlight search terms in the summary + if (SPHINX_HIGHLIGHT_ENABLED) // set in sphinx_highlight.js + highlightTerms.forEach((term) => _highlightText(listItem, term, "highlighted")); + }); + Search.output.appendChild(listItem); +}; +const _finishSearch = (resultCount) => { + Search.stopPulse(); + Search.title.innerText = _("Search Results"); + if (!resultCount) + Search.status.innerText = Documentation.gettext( + "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories." + ); + else + Search.status.innerText = Documentation.ngettext( + "Search finished, found one page matching the search query.", + "Search finished, found ${resultCount} pages matching the search query.", + resultCount, + ).replace('${resultCount}', resultCount); +}; +const _displayNextItem = ( + results, + resultCount, + searchTerms, + highlightTerms, +) => { + // results left, load the summary and display it + // this is intended to be dynamic (don't sub resultsCount) + if (results.length) { + _displayItem(results.pop(), searchTerms, highlightTerms); + setTimeout( + () => _displayNextItem(results, resultCount, searchTerms, highlightTerms), + 5 + ); + } + // search finished, update title and status message + else _finishSearch(resultCount); +}; +// Helper function used by query() to order search results. +// Each input is an array of [docname, title, anchor, descr, score, filename, kind]. +// Order the results by score (in opposite order of appearance, since the +// `_displayNextItem` function uses pop() to retrieve items) and then alphabetically. +const _orderResultsByScoreThenName = (a, b) => { + const leftScore = a[4]; + const rightScore = b[4]; + if (leftScore === rightScore) { + // same score: sort alphabetically + const leftTitle = a[1].toLowerCase(); + const rightTitle = b[1].toLowerCase(); + if (leftTitle === rightTitle) return 0; + return leftTitle > rightTitle ? -1 : 1; // inverted is intentional + } + return leftScore > rightScore ? 1 : -1; +}; + +/** + * Default splitQuery function. Can be overridden in ``sphinx.search`` with a + * custom function per language. + * + * The regular expression works by splitting the string on consecutive characters + * that are not Unicode letters, numbers, underscores, or emoji characters. + * This is the same as ``\W+`` in Python, preserving the surrogate pair area. + */ +if (typeof splitQuery === "undefined") { + var splitQuery = (query) => query + .split(/[^\p{Letter}\p{Number}_\p{Emoji_Presentation}]+/gu) + .filter(term => term) // remove remaining empty strings +} + +/** + * Search Module + */ +const Search = { + _index: null, + _queued_query: null, + _pulse_status: -1, + + htmlToText: (htmlString, anchor) => { + const htmlElement = new DOMParser().parseFromString(htmlString, 'text/html'); + for (const removalQuery of [".headerlink", "script", "style"]) { + htmlElement.querySelectorAll(removalQuery).forEach((el) => { el.remove() }); + } + if (anchor) { + const anchorContent = htmlElement.querySelector(`[role="main"] ${anchor}`); + if (anchorContent) return anchorContent.textContent; + + console.warn( + `Anchored content block not found. Sphinx search tries to obtain it via DOM query '[role=main] ${anchor}'. Check your theme or template.` + ); + } + + // if anchor not specified or not found, fall back to main content + const docContent = htmlElement.querySelector('[role="main"]'); + if (docContent) return docContent.textContent; + + console.warn( + "Content block not found. Sphinx search tries to obtain it via DOM query '[role=main]'. Check your theme or template." + ); + return ""; + }, + + init: () => { + const query = new URLSearchParams(window.location.search).get("q"); + document + .querySelectorAll('input[name="q"]') + .forEach((el) => (el.value = query)); + if (query) Search.performSearch(query); + }, + + loadIndex: (url) => + (document.body.appendChild(document.createElement("script")).src = url), + + setIndex: (index) => { + Search._index = index; + if (Search._queued_query !== null) { + const query = Search._queued_query; + Search._queued_query = null; + Search.query(query); + } + }, + + hasIndex: () => Search._index !== null, + + deferQuery: (query) => (Search._queued_query = query), + + stopPulse: () => (Search._pulse_status = -1), + + startPulse: () => { + if (Search._pulse_status >= 0) return; + + const pulse = () => { + Search._pulse_status = (Search._pulse_status + 1) % 4; + Search.dots.innerText = ".".repeat(Search._pulse_status); + if (Search._pulse_status >= 0) window.setTimeout(pulse, 500); + }; + pulse(); + }, + + /** + * perform a search for something (or wait until index is loaded) + */ + performSearch: (query) => { + // create the required interface elements + const searchText = document.createElement("h2"); + searchText.textContent = _("Searching"); + const searchSummary = document.createElement("p"); + searchSummary.classList.add("search-summary"); + searchSummary.innerText = ""; + const searchList = document.createElement("ul"); + searchList.setAttribute("role", "list"); + searchList.classList.add("search"); + + const out = document.getElementById("search-results"); + Search.title = out.appendChild(searchText); + Search.dots = Search.title.appendChild(document.createElement("span")); + Search.status = out.appendChild(searchSummary); + Search.output = out.appendChild(searchList); + + const searchProgress = document.getElementById("search-progress"); + // Some themes don't use the search progress node + if (searchProgress) { + searchProgress.innerText = _("Preparing search..."); + } + Search.startPulse(); + + // index already loaded, the browser was quick! + if (Search.hasIndex()) Search.query(query); + else Search.deferQuery(query); + }, + + _parseQuery: (query) => { + // stem the search terms and add them to the correct list + const stemmer = new Stemmer(); + const searchTerms = new Set(); + const excludedTerms = new Set(); + const highlightTerms = new Set(); + const objectTerms = new Set(splitQuery(query.toLowerCase().trim())); + splitQuery(query.trim()).forEach((queryTerm) => { + const queryTermLower = queryTerm.toLowerCase(); + + // maybe skip this "word" + // stopwords array is from language_data.js + if ( + stopwords.indexOf(queryTermLower) !== -1 || + queryTerm.match(/^\d+$/) + ) + return; + + // stem the word + let word = stemmer.stemWord(queryTermLower); + // select the correct list + if (word[0] === "-") excludedTerms.add(word.substr(1)); + else { + searchTerms.add(word); + highlightTerms.add(queryTermLower); + } + }); + + if (SPHINX_HIGHLIGHT_ENABLED) { // set in sphinx_highlight.js + localStorage.setItem("sphinx_highlight_terms", [...highlightTerms].join(" ")) + } + + // console.debug("SEARCH: searching for:"); + // console.info("required: ", [...searchTerms]); + // console.info("excluded: ", [...excludedTerms]); + + return [query, searchTerms, excludedTerms, highlightTerms, objectTerms]; + }, + + /** + * execute search (requires search index to be loaded) + */ + _performSearch: (query, searchTerms, excludedTerms, highlightTerms, objectTerms) => { + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const titles = Search._index.titles; + const allTitles = Search._index.alltitles; + const indexEntries = Search._index.indexentries; + + // Collect multiple result groups to be sorted separately and then ordered. + // Each is an array of [docname, title, anchor, descr, score, filename, kind]. + const normalResults = []; + const nonMainIndexResults = []; + + _removeChildren(document.getElementById("search-progress")); + + const queryLower = query.toLowerCase().trim(); + for (const [title, foundTitles] of Object.entries(allTitles)) { + if (title.toLowerCase().trim().includes(queryLower) && (queryLower.length >= title.length/2)) { + for (const [file, id] of foundTitles) { + const score = Math.round(Scorer.title * queryLower.length / title.length); + const boost = titles[file] === title ? 1 : 0; // add a boost for document titles + normalResults.push([ + docNames[file], + titles[file] !== title ? `${titles[file]} > ${title}` : title, + id !== null ? "#" + id : "", + null, + score + boost, + filenames[file], + SearchResultKind.title, + ]); + } + } + } + + // search for explicit entries in index directives + for (const [entry, foundEntries] of Object.entries(indexEntries)) { + if (entry.includes(queryLower) && (queryLower.length >= entry.length/2)) { + for (const [file, id, isMain] of foundEntries) { + const score = Math.round(100 * queryLower.length / entry.length); + const result = [ + docNames[file], + titles[file], + id ? "#" + id : "", + null, + score, + filenames[file], + SearchResultKind.index, + ]; + if (isMain) { + normalResults.push(result); + } else { + nonMainIndexResults.push(result); + } + } + } + } + + // lookup as object + objectTerms.forEach((term) => + normalResults.push(...Search.performObjectSearch(term, objectTerms)) + ); + + // lookup as search terms in fulltext + normalResults.push(...Search.performTermsSearch(searchTerms, excludedTerms)); + + // let the scorer override scores with a custom scoring function + if (Scorer.score) { + normalResults.forEach((item) => (item[4] = Scorer.score(item))); + nonMainIndexResults.forEach((item) => (item[4] = Scorer.score(item))); + } + + // Sort each group of results by score and then alphabetically by name. + normalResults.sort(_orderResultsByScoreThenName); + nonMainIndexResults.sort(_orderResultsByScoreThenName); + + // Combine the result groups in (reverse) order. + // Non-main index entries are typically arbitrary cross-references, + // so display them after other results. + let results = [...nonMainIndexResults, ...normalResults]; + + // remove duplicate search results + // note the reversing of results, so that in the case of duplicates, the highest-scoring entry is kept + let seen = new Set(); + results = results.reverse().reduce((acc, result) => { + let resultStr = result.slice(0, 4).concat([result[5]]).map(v => String(v)).join(','); + if (!seen.has(resultStr)) { + acc.push(result); + seen.add(resultStr); + } + return acc; + }, []); + + return results.reverse(); + }, + + query: (query) => { + const [searchQuery, searchTerms, excludedTerms, highlightTerms, objectTerms] = Search._parseQuery(query); + const results = Search._performSearch(searchQuery, searchTerms, excludedTerms, highlightTerms, objectTerms); + + // for debugging + //Search.lastresults = results.slice(); // a copy + // console.info("search results:", Search.lastresults); + + // print the results + _displayNextItem(results, results.length, searchTerms, highlightTerms); + }, + + /** + * search for object names + */ + performObjectSearch: (object, objectTerms) => { + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const objects = Search._index.objects; + const objNames = Search._index.objnames; + const titles = Search._index.titles; + + const results = []; + + const objectSearchCallback = (prefix, match) => { + const name = match[4] + const fullname = (prefix ? prefix + "." : "") + name; + const fullnameLower = fullname.toLowerCase(); + if (fullnameLower.indexOf(object) < 0) return; + + let score = 0; + const parts = fullnameLower.split("."); + + // check for different match types: exact matches of full name or + // "last name" (i.e. last dotted part) + if (fullnameLower === object || parts.slice(-1)[0] === object) + score += Scorer.objNameMatch; + else if (parts.slice(-1)[0].indexOf(object) > -1) + score += Scorer.objPartialMatch; // matches in last name + + const objName = objNames[match[1]][2]; + const title = titles[match[0]]; + + // If more than one term searched for, we require other words to be + // found in the name/title/description + const otherTerms = new Set(objectTerms); + otherTerms.delete(object); + if (otherTerms.size > 0) { + const haystack = `${prefix} ${name} ${objName} ${title}`.toLowerCase(); + if ( + [...otherTerms].some((otherTerm) => haystack.indexOf(otherTerm) < 0) + ) + return; + } + + let anchor = match[3]; + if (anchor === "") anchor = fullname; + else if (anchor === "-") anchor = objNames[match[1]][1] + "-" + fullname; + + const descr = objName + _(", in ") + title; + + // add custom score for some objects according to scorer + if (Scorer.objPrio.hasOwnProperty(match[2])) + score += Scorer.objPrio[match[2]]; + else score += Scorer.objPrioDefault; + + results.push([ + docNames[match[0]], + fullname, + "#" + anchor, + descr, + score, + filenames[match[0]], + SearchResultKind.object, + ]); + }; + Object.keys(objects).forEach((prefix) => + objects[prefix].forEach((array) => + objectSearchCallback(prefix, array) + ) + ); + return results; + }, + + /** + * search for full-text terms in the index + */ + performTermsSearch: (searchTerms, excludedTerms) => { + // prepare search + const terms = Search._index.terms; + const titleTerms = Search._index.titleterms; + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const titles = Search._index.titles; + + const scoreMap = new Map(); + const fileMap = new Map(); + + // perform the search on the required terms + searchTerms.forEach((word) => { + const files = []; + const arr = [ + { files: terms[word], score: Scorer.term }, + { files: titleTerms[word], score: Scorer.title }, + ]; + // add support for partial matches + if (word.length > 2) { + const escapedWord = _escapeRegExp(word); + if (!terms.hasOwnProperty(word)) { + Object.keys(terms).forEach((term) => { + if (term.match(escapedWord)) + arr.push({ files: terms[term], score: Scorer.partialTerm }); + }); + } + if (!titleTerms.hasOwnProperty(word)) { + Object.keys(titleTerms).forEach((term) => { + if (term.match(escapedWord)) + arr.push({ files: titleTerms[term], score: Scorer.partialTitle }); + }); + } + } + + // no match but word was a required one + if (arr.every((record) => record.files === undefined)) return; + + // found search word in contents + arr.forEach((record) => { + if (record.files === undefined) return; + + let recordFiles = record.files; + if (recordFiles.length === undefined) recordFiles = [recordFiles]; + files.push(...recordFiles); + + // set score for the word in each file + recordFiles.forEach((file) => { + if (!scoreMap.has(file)) scoreMap.set(file, {}); + scoreMap.get(file)[word] = record.score; + }); + }); + + // create the mapping + files.forEach((file) => { + if (!fileMap.has(file)) fileMap.set(file, [word]); + else if (fileMap.get(file).indexOf(word) === -1) fileMap.get(file).push(word); + }); + }); + + // now check if the files don't contain excluded terms + const results = []; + for (const [file, wordList] of fileMap) { + // check if all requirements are matched + + // as search terms with length < 3 are discarded + const filteredTermCount = [...searchTerms].filter( + (term) => term.length > 2 + ).length; + if ( + wordList.length !== searchTerms.size && + wordList.length !== filteredTermCount + ) + continue; + + // ensure that none of the excluded terms is in the search result + if ( + [...excludedTerms].some( + (term) => + terms[term] === file || + titleTerms[term] === file || + (terms[term] || []).includes(file) || + (titleTerms[term] || []).includes(file) + ) + ) + break; + + // select one (max) score for the file. + const score = Math.max(...wordList.map((w) => scoreMap.get(file)[w])); + // add result to the result list + results.push([ + docNames[file], + titles[file], + "", + null, + score, + filenames[file], + SearchResultKind.text, + ]); + } + return results; + }, + + /** + * helper function to return a node containing the + * search summary for a given text. keywords is a list + * of stemmed words. + */ + makeSearchSummary: (htmlText, keywords, anchor) => { + const text = Search.htmlToText(htmlText, anchor); + if (text === "") return null; + + const textLower = text.toLowerCase(); + const actualStartPosition = [...keywords] + .map((k) => textLower.indexOf(k.toLowerCase())) + .filter((i) => i > -1) + .slice(-1)[0]; + const startWithContext = Math.max(actualStartPosition - 120, 0); + + const top = startWithContext === 0 ? "" : "..."; + const tail = startWithContext + 240 < text.length ? "..." : ""; + + let summary = document.createElement("p"); + summary.classList.add("context"); + summary.textContent = top + text.substr(startWithContext, 240).trim() + tail; + + return summary; + }, +}; + +_ready(Search.init); diff --git a/_static/sphinx_highlight.js b/_static/sphinx_highlight.js new file mode 100644 index 00000000..8a96c69a --- /dev/null +++ b/_static/sphinx_highlight.js @@ -0,0 +1,154 @@ +/* Highlighting utilities for Sphinx HTML documentation. */ +"use strict"; + +const SPHINX_HIGHLIGHT_ENABLED = true + +/** + * highlight a given string on a node by wrapping it in + * span elements with the given class name. + */ +const _highlight = (node, addItems, text, className) => { + if (node.nodeType === Node.TEXT_NODE) { + const val = node.nodeValue; + const parent = node.parentNode; + const pos = val.toLowerCase().indexOf(text); + if ( + pos >= 0 && + !parent.classList.contains(className) && + !parent.classList.contains("nohighlight") + ) { + let span; + + const closestNode = parent.closest("body, svg, foreignObject"); + const isInSVG = closestNode && closestNode.matches("svg"); + if (isInSVG) { + span = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); + } else { + span = document.createElement("span"); + span.classList.add(className); + } + + span.appendChild(document.createTextNode(val.substr(pos, text.length))); + const rest = document.createTextNode(val.substr(pos + text.length)); + parent.insertBefore( + span, + parent.insertBefore( + rest, + node.nextSibling + ) + ); + node.nodeValue = val.substr(0, pos); + /* There may be more occurrences of search term in this node. So call this + * function recursively on the remaining fragment. + */ + _highlight(rest, addItems, text, className); + + if (isInSVG) { + const rect = document.createElementNS( + "http://www.w3.org/2000/svg", + "rect" + ); + const bbox = parent.getBBox(); + rect.x.baseVal.value = bbox.x; + rect.y.baseVal.value = bbox.y; + rect.width.baseVal.value = bbox.width; + rect.height.baseVal.value = bbox.height; + rect.setAttribute("class", className); + addItems.push({ parent: parent, target: rect }); + } + } + } else if (node.matches && !node.matches("button, select, textarea")) { + node.childNodes.forEach((el) => _highlight(el, addItems, text, className)); + } +}; +const _highlightText = (thisNode, text, className) => { + let addItems = []; + _highlight(thisNode, addItems, text, className); + addItems.forEach((obj) => + obj.parent.insertAdjacentElement("beforebegin", obj.target) + ); +}; + +/** + * Small JavaScript module for the documentation. + */ +const SphinxHighlight = { + + /** + * highlight the search words provided in localstorage in the text + */ + highlightSearchWords: () => { + if (!SPHINX_HIGHLIGHT_ENABLED) return; // bail if no highlight + + // get and clear terms from localstorage + const url = new URL(window.location); + const highlight = + localStorage.getItem("sphinx_highlight_terms") + || url.searchParams.get("highlight") + || ""; + localStorage.removeItem("sphinx_highlight_terms") + url.searchParams.delete("highlight"); + window.history.replaceState({}, "", url); + + // get individual terms from highlight string + const terms = highlight.toLowerCase().split(/\s+/).filter(x => x); + if (terms.length === 0) return; // nothing to do + + // There should never be more than one element matching "div.body" + const divBody = document.querySelectorAll("div.body"); + const body = divBody.length ? divBody[0] : document.querySelector("body"); + window.setTimeout(() => { + terms.forEach((term) => _highlightText(body, term, "highlighted")); + }, 10); + + const searchBox = document.getElementById("searchbox"); + if (searchBox === null) return; + searchBox.appendChild( + document + .createRange() + .createContextualFragment( + '" + ) + ); + }, + + /** + * helper function to hide the search marks again + */ + hideSearchWords: () => { + document + .querySelectorAll("#searchbox .highlight-link") + .forEach((el) => el.remove()); + document + .querySelectorAll("span.highlighted") + .forEach((el) => el.classList.remove("highlighted")); + localStorage.removeItem("sphinx_highlight_terms") + }, + + initEscapeListener: () => { + // only install a listener if it is really needed + if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) return; + + document.addEventListener("keydown", (event) => { + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.shiftKey || event.altKey || event.ctrlKey || event.metaKey) return; + if (DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS && (event.key === "Escape")) { + SphinxHighlight.hideSearchWords(); + event.preventDefault(); + } + }); + }, +}; + +_ready(() => { + /* Do not call highlightSearchWords() when we are on the search page. + * It will highlight words from the *previous* search query. + */ + if (typeof Search === "undefined") SphinxHighlight.highlightSearchWords(); + SphinxHighlight.initEscapeListener(); +}); diff --git a/_static/sphinxdoc.css b/_static/sphinxdoc.css new file mode 100644 index 00000000..ae94dcc7 --- /dev/null +++ b/_static/sphinxdoc.css @@ -0,0 +1,349 @@ +/* + * Sphinx stylesheet -- sphinxdoc theme. + * + * Originally created by Armin Ronacher for Werkzeug. + * + */ + +@import url("basic.css"); + +/* -- page layout ----------------------------------------------------------- */ + +body { + font-family: 'Lucida Grande', 'Lucida Sans Unicode', 'Geneva', + 'Verdana', sans-serif; + font-size: 14px; + letter-spacing: -0.01em; + line-height: 150%; + text-align: center; + background-color: #BFD1D4; + color: black; + padding: 0; + border: 1px solid #aaa; + + margin: 0px 80px 0px 80px; + min-width: 740px; +} + +div.document { + background-color: white; + text-align: left; + background-image: url(contents.png); + background-repeat: repeat-x; +} + +div.documentwrapper { + float: left; + width: 100%; +} + +div.bodywrapper { + margin: 0 calc(230px + 10px) 0 0; + border-right: 1px solid #ccc; +} + +div.body { + margin: 0; + padding: 0.5em 20px 20px 20px; +} + +div.related { + font-size: 1em; +} + +div.related ul { + background-image: url(navigation.png); + height: 2em; + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; +} + +div.related ul li { + margin: 0; + padding: 0; + height: 2em; + float: left; +} + +div.related ul li.right { + float: right; + margin-right: 5px; +} + +div.related ul li a { + margin: 0; + padding: 0 5px 0 5px; + line-height: 1.75em; + color: #EE9816; +} + +div.related ul li a:hover { + color: #3CA8E7; +} + +div.sphinxsidebarwrapper { + padding: 0; +} + +div.sphinxsidebar { + padding: 0.5em 15px 15px 0; + width: calc(230px - 20px); + float: right; + font-size: 1em; + text-align: left; +} + +div.sphinxsidebar h3, div.sphinxsidebar h4 { + margin: 1em 0 0.5em 0; + font-size: 1em; + padding: 0.1em 0 0.1em 0.5em; + color: white; + border: 1px solid #86989B; + background-color: #AFC1C4; +} + +div.sphinxsidebar h3 a { + color: white; +} + +div.sphinxsidebar ul { + padding-left: 1.5em; + margin-top: 7px; + padding: 0; + line-height: 130%; +} + +div.sphinxsidebar ul ul { + margin-left: 20px; +} + +div.footer { + background-color: #E3EFF1; + color: #86989B; + padding: 3px 8px 3px 0; + clear: both; + font-size: 0.8em; + text-align: right; +} + +div.footer a { + color: #86989B; + text-decoration: underline; +} + +/* -- body styles ----------------------------------------------------------- */ + +p { + margin: 0.8em 0 0.5em 0; +} + +a { + color: #CA7900; + text-decoration: none; +} + +a:hover { + color: #2491CF; +} + +a:visited { + color: #551A8B; +} + +div.body a { + text-decoration: underline; +} + +h1 { + margin: 0; + padding: 0.7em 0 0.3em 0; + font-size: 1.5em; + color: #11557C; +} + +h2 { + margin: 1.3em 0 0.2em 0; + font-size: 1.35em; + padding: 0; +} + +h3 { + margin: 1em 0 -0.3em 0; + font-size: 1.2em; +} + +div.body h1 a, div.body h2 a, div.body h3 a, div.body h4 a, div.body h5 a, div.body h6 a { + color: black!important; +} + +h1 a.anchor, h2 a.anchor, h3 a.anchor, h4 a.anchor, h5 a.anchor, h6 a.anchor { + display: none; + margin: 0 0 0 0.3em; + padding: 0 0.2em 0 0.2em; + color: #aaa!important; +} + +h1:hover a.anchor, h2:hover a.anchor, h3:hover a.anchor, h4:hover a.anchor, +h5:hover a.anchor, h6:hover a.anchor { + display: inline; +} + +h1 a.anchor:hover, h2 a.anchor:hover, h3 a.anchor:hover, h4 a.anchor:hover, +h5 a.anchor:hover, h6 a.anchor:hover { + color: #777; + background-color: #eee; +} + +a.headerlink { + color: #c60f0f!important; + font-size: 1em; + margin-left: 6px; + padding: 0 4px 0 4px; + text-decoration: none!important; +} + +a.headerlink:hover { + background-color: #ccc; + color: white!important; +} + +cite, code, code { + font-family: 'Consolas', 'Deja Vu Sans Mono', + 'Bitstream Vera Sans Mono', monospace; + font-size: 0.95em; + letter-spacing: 0.01em; +} + +code { + background-color: #f2f2f2; + border-bottom: 1px solid #ddd; + color: #333; +} + +code.descname, code.descclassname, code.xref { + border: 0; +} + +hr { + border: 1px solid #abc; + margin: 2em; +} + +a code { + border: 0; + color: #CA7900; +} + +a code:hover { + color: #2491CF; +} + +pre { + font-family: 'Consolas', 'Deja Vu Sans Mono', + 'Bitstream Vera Sans Mono', monospace; + font-size: 0.95em; + letter-spacing: 0.015em; + line-height: 120%; + padding: 0.5em; + border: 1px solid #ccc; +} + +pre a { + color: inherit; + text-decoration: underline; +} + +td.linenos pre { + padding: 0.5em 0; +} + +div.quotebar { + background-color: #f8f8f8; + max-width: 250px; + float: right; + padding: 2px 7px; + border: 1px solid #ccc; +} + +nav.contents, +aside.topic, +div.topic { + background-color: #f8f8f8; +} + +table { + border-collapse: collapse; + margin: 0 -0.5em 0 -0.5em; +} + +table td, table th { + padding: 0.2em 0.5em 0.2em 0.5em; +} + +div.admonition, div.warning { + font-size: 0.9em; + margin: 1em 0 1em 0; + border: 1px solid #86989B; + background-color: #f7f7f7; + padding: 0; +} + +div.admonition p, div.warning p { + margin: 0.5em 1em 0.5em 1em; + padding: 0; +} + +div.admonition pre, div.warning pre { + margin: 0.4em 1em 0.4em 1em; +} + +div.admonition p.admonition-title, +div.warning p.admonition-title { + margin: 0; + padding: 0.1em 0 0.1em 0.5em; + color: white; + border-bottom: 1px solid #86989B; + font-weight: bold; + background-color: #AFC1C4; +} + +div.warning { + border: 1px solid #940000; +} + +div.warning p.admonition-title { + background-color: #CF0000; + border-bottom-color: #940000; +} + +div.admonition ul, div.admonition ol, +div.warning ul, div.warning ol { + margin: 0.1em 0.5em 0.5em 3em; + padding: 0; +} + +div.versioninfo { + margin: 1em 0 0 0; + border: 1px solid #ccc; + background-color: #DDEAF0; + padding: 8px; + line-height: 1.3em; + font-size: 0.9em; +} + +.viewcode-back { + font-family: 'Lucida Grande', 'Lucida Sans Unicode', 'Geneva', + 'Verdana', sans-serif; +} + +div.viewcode-block:target { + background-color: #f4debf; + border-top: 1px solid #ac9; + border-bottom: 1px solid #ac9; +} + +div.code-block-caption { + background-color: #ddd; + color: #222; + border: 1px solid #ccc; +} \ No newline at end of file diff --git a/genie_python.html b/genie_python.html new file mode 100644 index 00000000..c1e387a3 --- /dev/null +++ b/genie_python.html @@ -0,0 +1,2171 @@ + + + + + + + + Welcome to genie_python’s documentation! — genie_python documentation + + + + + + + + + + +
+
+
+ +
+

Welcome to genie_python’s documentation!

+
+

Commands

+
+
+
+
+class genie.GetSampleParsReturnMEAS
+
+ +
+
+class genie.GetSampleParsReturnSCRIPT
+
+ +
+
+genie.abort(verbose: bool = False, prepost: bool = True) None
+

Abort the current run.

+
+
Parameters:
+
    +
  • verbose (bool, optional) – show the messages from the DAE

  • +
  • prepost (bool, optional) – run pre and post commands (default: True)

  • +
+
+
+
+ +
+
+genie.begin(period: int = 1, meas_id: str | None = None, meas_type: str = '', meas_subid: str = '', sample_id: str = '', delayed: bool = False, quiet: bool = False, paused: bool = False, verbose: bool = False, prepost: bool = True) None
+

Starts a data collection run.

+
+
Parameters:
+
    +
  • period (int, optional) – the period to begin data collection in

  • +
  • meas_id (string, optional) – the measurement id

  • +
  • meas_type (string, optional) – the type of measurement

  • +
  • meas_subid (string, optional) – the measurement sub-id

  • +
  • sample_id (string, optional) – the sample id

  • +
  • delayed (bool, optional) – puts the period card to into delayed start mode

  • +
  • quiet (bool, optional) – suppress the output to the screen

  • +
  • paused (bool, optional) – begin in the paused state

  • +
  • verbose (bool, optional) – show the messages from the DAE

  • +
  • prepost (bool, optional) – run pre and post commands (default: True)

  • +
+
+
Returns:
+

return what the begin_postcmd method returns

+
+
Return type:
+

Any

+
+
+
+ +
+
+genie.cget(block: str) _CgetReturn
+

Gets the useful values associated with a block.

+

The value will be None if the block is not “connected”.

+
+
Parameters:
+

block (string) – the name of the block

+
+
+
+
Returns
+
dict: details about about the block. Contains:

name - name of the block +value - value of the block +unit - physical units of the block +connected - True if connected; False otherwise +runcontrol - NO not in runcontrol, YES otherwise +lowlimit - run control low limit set +highlimit - run control high limit set +alarm - the alarm status of the block

+
+
+
+
+
+ +
+
+genie.change(**params: str | int) None
+

Change experiment parameters.

+

Note: it is possible to change more than one item at a time.

+
+
Parameters:
+
    +
  • title (string, optional) – the new title

  • +
  • period (int, optional) – the new period (must be in a non-running state)

  • +
  • nperiods (int, optional) – the new number of software periods +(must be in a non-running state)

  • +
  • user (string, optional) – the new user(s) as a comma-separated list

  • +
  • rb (int, optional) – the new RB number

  • +
+
+
+

Examples

+

Change the title:

+
>>> change(title="The new title")
+
+
+

Change the user:

+
>>> change(user="Instrument Team")
+
+
+

Set multiple users:

+
>>> change(user="Thouless, Haldane, Kosterlitz")
+
+
+

Change the RB number and the users:

+
>>> change(rb=123456, user="Smith, Jones")
+
+
+
+ +
+
+genie.change_beamline_par(name: str, value: bool | int | float | str | None) None
+

Set a new value for a beamline parameter

+
+
Parameters:
+
    +
  • name (string) – the name of the parameter to change

  • +
  • value – the new value

  • +
+
+
+
+ +
+
+genie.change_fermi_veto(enable: bool | None = None, delay: float = 1.0, width: float = 1.0) None
+

Configure the fermi chopper veto.

+
+
Parameters:
+
    +
  • enable (bool, optional) – enable the fermi veto

  • +
  • delay (float, optional) – the veto delay

  • +
  • width (float, optional) – the veto width

  • +
+
+
+
+ +
+
+genie.change_finish() None
+

End a change operation.

+

The operation is begun when change_start is called.

+

Between these two calls a sequence of other change commands can be called. +For example: change_tables, change_tcb etc.

+
+ +
+
+genie.change_monitor(spec: int, low: float, high: float) None
+

Change the monitor to a specified spectrum and range.

+
+
Parameters:
+
    +
  • spec (int) – the spectrum number

  • +
  • low (float) – the low end of the integral

  • +
  • high (float) – the high end of the integral

  • +
+
+
+
+ +
+
+genie.change_number_soft_periods(number: int, enable: bool = False) None
+

Sets the number of software periods for the DAE.

+
+
Parameters:
+
    +
  • number (int) – the number of periods to create

  • +
  • enable (bool, optional) – switch to soft period mode

  • +
+
+
+
+ +
+
+genie.change_period(period: int) None
+

Changes the current period number.

+
+
Parameters:
+

period (int) – the period to switch to

+
+
+
+ +
+
+genie.change_rb(rb: int | str) None
+

Changes the RB number.

+
+
Parameters:
+

rb (int or string) – the new RB number

+
+
+
+ +
+
+genie.change_sample_par(name: str, value: bool | int | float | str | None) None
+

Set a new value for a sample parameter.

+
+
Parameters:
+
    +
  • name (string) – the name of the parameter to change

  • +
  • value – the new value

  • +
+
+
+
+ +
+
+genie.change_script_dir(*directory: str) None
+

Set the directory for loading user scripts from.

+
+
Parameters:
+

directory (string|List(string)) – the directory to load user scripts from, +either as a single entry or as multiple arguments

+
+
+

Example

+

g.change_script_dir(r”c/scrips/mydir”) +g.change_script_dir(r”c/scrips”, “mydir”)

+
+ +
+
+genie.change_start() None
+

Start a change operation.

+

The operation is finished when change_finish is called.

+

Between these two calls a sequence of other change commands can be called. +For example: change_tables, change_tcb etc.

+
+ +
+
+genie.change_sync(source: str) None
+

Change the source the DAE using for synchronisation.

+
+
Parameters:
+

source (string) – the source to use ( +‘isis’, +‘internal’, +‘smp’, +‘muon cerenkov’, +‘muon ms’, +‘isis (first ts1)’

+
+
+

)

+
+ +
+
+genie.change_tables(wiring: str | None = None, detector: str | None = None, spectra: str | None = None) None
+

Load the wiring, detector and/or spectra tables. +Checks that the file paths are valid, throws exception if not. +:param wiring: the filename of the wiring table file +:type wiring: string, optional +:param detector: the filename of the detector table file +:type detector: string, optional +:param spectra: the filename of the spectra table file +:type spectra: string, optional

+
+ +
+
+genie.change_tcb(low: float | None = None, high: float | None = None, step: float | None = None, trange: int = 1, log: bool = False, regime: int = 1) None
+

Change the time channel boundaries. +If None is specified for low, high or step then the values are left unchanged.

+
+
Args

low (float, optional): the lower limit. Default is no change from the current value. +high (float, optional): the upper limit. Default is no change from the current value. +step (float,optional): the step size. Default is no change from the current value. +trange (int, optional): the time range (1 to 5). Default is 1. +log (bool, optional): whether to use LOG binning. Default is no. +regime (int, optional): the time regime to set (1 to 6). Default is 1.

+
+
+

Examples

+

Changes the from, to and step of the 1st range to 0, 10 and 5 respectively.

+
>>> change_tcb(0, 10, 5)
+
+
+

Changes the step size of the 2nd range to 2, leaving other parameters unchanged.

+
>>> change_tcb(step=2, trange=2)
+
+
+
+ +
+
+genie.change_tcb_file(tcbfile: str | None = None, default: bool = False) None
+

Change the time channel boundaries.

+
+
Parameters:
+
    +
  • tcbfile (string, optional) – the file to load

  • +
  • default (bool, optional) – load the default file

  • +
+
+
+
+ +
+
+genie.change_title(title: str) None
+

Sets the current title.

+
+
Parameters:
+

title – the new title

+
+
+
+ +
+
+genie.change_users(users: str) None
+

Changes the users.

+
+
Parameters:
+

users – a string containing the user name(s)

+
+
+

Example

+
>>> change_users("Emerson, Lake, Palmer")
+
+
+
+ +
+
+genie.change_vetos(**params: bool | None) None
+

Change the DAE veto settings.

+
+
Parameters:
+
    +
  • clearall (bool, optional) – remove all vetos

  • +
  • smp (bool, optional) – set SMP veto

  • +
  • ts2 (bool, optional) – set TS2 veto

  • +
  • hz50 (bool, optional) – set 50 hz veto

  • +
  • ext0 (bool, optional) – set external veto 0

  • +
  • ext1 (bool, optional) – set external veto 1

  • +
  • ext2 (bool, optional) – set external veto 2

  • +
  • ext3 (bool, optional) – set external veto 3

  • +
  • fifo (bool, optional) – set FIFO veto

  • +
+
+
+

Note: If clearall is specified then all vetos (excluding the FIFO veto) are turned off, +but it is possible to turn other vetoes back on at the same time.

+

Note: FIFO veto is automatically enabled on run begin, but can be changed whilst running.

+

Examples

+

Turns all vetoes off then turns the SMP veto back on:

+
>>> change_vetos(clearall=True, smp=True)
+
+
+

Turn off FIFO:

+
>>> change_vetos(fifo=False)
+
+
+
+ +
+
+genie.check_alarms(*blocks: str) tuple[list[str], list[str], list[str]]
+

Checks whether the specified blocks are in alarm.

+
+
Parameters:
+

blocks (string, multiple) – the block(s) to check

+
+
Returns:
+

the blocks in minor alarm and major alarm respectively

+
+
Return type:
+

list, list

+
+
+

Example

+

Check alarm state for block1 and block2:

+
>>> check_alarms("block1", "block2")
+
+
+
+ +
+
+genie.check_limit_violations(*blocks: str) list[str]
+

Checks whether the specified blocks have soft limit violations.

+
+
Parameters:
+

blocks (string, multiple) – the block(s) to check

+
+
Returns:
+

the blocks that have soft limit violations

+
+
Return type:
+

list

+
+
+

Example

+

Check soft limit violations for block1 and block2:

+
>>> check_limit_violations("block1", "block2")
+
+
+
+ +
+
+genie.configure_internal_periods(sequences: int | None = None, output_delay: int | None = None, period: int | None = None, daq: bool = False, dwell: bool = False, unused: bool = False, frames: int | None = None, output: int | None = None, label: str | None = None) None
+

Configure the internal periods without switching to internal period mode.

+
+
Parameters:
+
    +
  • sequences (int, optional) – the number of times to repeat the period loop (0 = infinite loop)

  • +
  • output_delay (int, optional) – the output delay in microseconds

  • +
  • period (int, optional) – the number of the period to set the following parameters for

  • +
  • daq (bool, optional) – the specified period is a acquisition period

  • +
  • dwell (bool, optional) – the specified period is a dwell period

  • +
  • unused (bool, optional) – the specified period is a unused period

  • +
  • frames (int, optional) – the number of frames to count for the specified period

  • +
  • output (int, optional) – the binary output the specified period

  • +
  • label (string, optional) – the label for the period the specified period

  • +
+
+
+

Note: if the period number is unspecified then the settings will be applied to all periods

+
+ +
+
+genie.connected_pvs_in_list(pv_list: list[str], is_local: bool = False) list[str]
+

Check if the specified PVs are connected.

+
+
Parameters:
+
    +
  • pv_list (list) – the PV names

  • +
  • is_local (bool, optional) – whether to automatically prepend the +local inst prefix to the PV names

  • +
+
+
Returns:
+

the PV names that are connected

+
+
Return type:
+

list

+
+
+
+ +
+
+genie.cset(*args: str, runcontrol: bool | None = None, lowlimit: float | None = None, highlimit: float | None = None, wait: bool | None = None, verbose: bool | None = None, **kwargs: bool | int | float | str | None) None
+

Sets the setpoint and runcontrol settings for blocks.

+
+
Parameters:
+
    +
  • runcontrol (bool, optional) – whether to set runcontrol for this block

  • +
  • wait (bool, optional) – pause execution until setpoint is reached (one block only)

  • +
  • lowlimit (float, optional) – the lower limit for runcontrol or waiting

  • +
  • highlimit (float, optional) – the upper limit for runcontrol or waiting

  • +
  • verbose (bool, optional) – report what the new block state is as a result of the command

  • +
+
+
+

Note: cannot use wait and runcontrol in the same command

+

Examples

+

Setting a value for a block:

+
>>> cset(block1=100)
+
+
+

Or:

+
>>> cset("block1", 100)
+
+
+

Setting values for more than one block:

+
>>> cset(block1=100, block2=200, block3=300)
+
+
+

NOTE: the order in which the values are set is random, +e.g. block1 may or may not be set before block2 and block3

+

Setting runcontrol values for a block:

+
>>> cset(block1=100, runcontrol=True, lowlimit=99, highlimit=101)
+
+
+

Changing runcontrol settings for a block without changing the setpoint:

+
>>> cset("block1", runcontrol=False)
+>>> cset(block1=None, runcontrol=False)
+
+
+

Wait for setpoint to be reached (one block only):

+
>>> cset(block1=100, wait=True)
+
+
+

Wait for limits to be reached - this does NOT change the runcontrol limits:

+
>>> cset(block1=100, wait=True, lowlimit=99, highlimit=101)
+
+
+
+ +
+
+genie.cshow(block: str | None = None) None
+

Show the current settings for one block or for all blocks.

+
+
Parameters:
+

block (string, optional) – the name of the block

+
+
+

Examples

+

Showing all block values:

+
>>> cshow()
+
+
+

Showing values for one block only (name must be quoted):

+
>>> cshow("block1")
+
+
+
+ +
+
+genie.define_hard_period(period: int | None = None, daq: bool = False, dwell: bool = False, unused: bool = False, frames: int | None = None, output: int | None = None, label: str | None = None) None
+

Define the internal hardware periods.

+
+
Parameters:
+
    +
  • period (int, optional) – the number of the period to set the following parameters for

  • +
  • daq (bool, optional) – the specified period is a acquisition period

  • +
  • dwell (bool, optional) – the specified period is a dwell period

  • +
  • unused (bool, optional) – the specified period is a unused period

  • +
  • frames (int, optional) – the number of frames to count for the specified period

  • +
  • output (int, optional) – the binary output the specified period

  • +
  • label (string, optional) – the label for the period the specified period

  • +
+
+
+

Note: if the period number is unspecified then the settings will be applied to all periods

+
+ +
+
+genie.enable_hard_periods(mode: str, period_file: str | None = None, sequences: int | None = None, output_delay: int | None = None, period: int | None = None, daq: bool = False, dwell: bool = False, unused: bool = False, frames: int | None = None, output: int | None = None, label: str | None = None) None
+

Sets the DAE to use hardware periods.

+
+
Parameters:
+
    +
  • mode (string) – set the mode to internal (‘int’) or external (‘ext’)

  • +
  • period_file (string, optional) – the file containing the internal period settings +(ignores any other settings)

  • +
  • sequences (int, optional) – the number of times to repeat the period loop (0 = infinite loop)

  • +
  • output_delay (int, optional) – the output delay in microseconds

  • +
  • period (int, optional) – the number of the period to set the following parameters for

  • +
  • daq (bool, optional) – the specified period is a acquisition period

  • +
  • dwell (bool, optional) – the specified period is a dwell period

  • +
  • unused (bool, optional) – the specified period is a unused period

  • +
  • frames (int, optional) – the number of frames to count for the specified period

  • +
  • output (int, optional) – the binary output the specified period

  • +
  • label (string, optional) – the label for the period the specified period

  • +
+
+
+

Note: if the period number is unspecified then the settings will be applied to all periods

+

Examples

+

Setting external periods:

+
>>> enable_hard_periods("ext")
+
+
+

Setting internal periods from a file:

+
>>> enable_hard_periods("int", "c:\myperiods.txt")
+
+
+
+ +
+
+genie.enable_soft_periods(nperiods: int | None = None) None
+

Switch the DAE to software periods mode.

+
+
Parameters:
+

nperiods (int, optional) – the number of software periods

+
+
+
+ +
+
+genie.end(verbose: bool = False, quiet: bool = False, immediate: bool = False, prepost: bool = False) None
+

End the current run.

+
+
Parameters:
+
    +
  • verbose (bool, optional) – show the messages from the DAE

  • +
  • quiet (bool, optional) – suppress the end_precmd output to the screen

  • +
  • immediate (bool, optional) – end immediately, without waiting for +a period sequence to complete

  • +
  • prepost (bool, optional) – run pre and post commands (default: True)

  • +
+
+
+
+ +
+
+genie.get_beamline_pars() _GetbeamlineparsReturn
+

Get the current beamline parameter values.

+
+
Returns:
+

the beamline parameters

+
+
Return type:
+

dict

+
+
+
+ +
+
+genie.get_block_units(block_name: str) str | dict | None
+

Get the physical measurement units associated with a block name.

+
+
Parameters:
+

block_name – name of the block

+
+
+
+
Returns

string: units of the block

+
+
+
+ +
+
+genie.get_blocks() list[str]
+

Get the names of the blocks.

+
+
Returns:
+

the blocknames

+
+
Return type:
+

list

+
+
+
+ +
+
+genie.get_dae_simulation_mode() bool
+

Gets the DAE simulation mode. +:returns: True if the DAE is in simulation mode, False otherwise.

+
+ +
+
+genie.get_dashboard() _GetdashboardReturn
+

Get the current experiment values.

+
+
Returns:
+

the experiment values

+
+
Return type:
+

dict

+
+
+
+ +
+
+genie.get_detector_table() str | None
+

Gets the current detector table path”

+
+
Returns:
+

The file path of the current detector table.

+
+
+
+ +
+
+genie.get_detector_tables() list[str]
+

Gets a list of possible detector table choices.

+
+
Returns:
+

the files

+
+
Return type:
+

list

+
+
+
+ +
+
+genie.get_display_title() bool
+

Returns the current display title status.

+
+
Returns:
+

the display title status

+
+
Return type:
+

boolean

+
+
+
+ +
+
+genie.get_events() int
+

Gets the total events for all the detectors.

+
+
Returns:
+

the number of events

+
+
Return type:
+

int

+
+
+
+ +
+
+genie.get_frames(period: bool = False) int
+

Gets the current number of good frames.

+
+
Parameters:
+

period (bool, optional) – whether to return the value for the current period only

+
+
Returns:
+

the number of frames

+
+
Return type:
+

int

+
+
+
+ +
+
+genie.get_mevents() float
+

Gets the total millions of events for all the detectors.

+
+
Returns:
+

the number of millions of events

+
+
Return type:
+

float

+
+
+
+ +
+
+genie.get_number_periods() int
+

Get the number of software periods.

+
+
Returns:
+

the number of periods

+
+
Return type:
+

int

+
+
+
+ +
+
+genie.get_number_spectra() int
+

Get the number of spectra. The diagnostic spectrum zero +is not included in the count, so valid spectrum numbers +are 0 to get_number_spectra()

+
+
Returns:
+

the number of spectra

+
+
Return type:
+

int

+
+
+
+ +
+
+genie.get_number_timechannels() int
+

Get the number of time channels. This is the number of bins used +to map the time region of interest, it does not include the +special diagnostic “bin zero” in this count but this fact is not +normally of interest to most users.

+
+
Returns:
+

the number of time channels

+
+
Return type:
+

int

+
+
+
+ +
+
+genie.get_period() int
+

Gets the current period number.

+
+
Returns:
+

the current period

+
+
Return type:
+

int

+
+
+
+ +
+
+genie.get_period_files() list[str]
+

Gets a list of possible period file choices.

+
+
Returns:
+

the files

+
+
Return type:
+

list

+
+
+
+ +
+
+genie.get_pv(name: str, to_string: bool = False, is_local: bool = False, use_numpy: bool = False) bool | int | float | str | list[bool | int | float | str] | ndarray[Any, dtype[_ScalarType_co]] | None
+

Get the value for the specified PV.

+
+
Parameters:
+
    +
  • name (string) – the name of the PV to get the value for

  • +
  • to_string (bool, optional) – whether to get the value as a string

  • +
  • is_local (bool, optional) – whether to automatically prepend the +local inst prefix to the PV name

  • +
  • use_numpy (bool, optional) – True use numpy to return arrays, +False return a list; None for use the default

  • +
+
+
Returns:
+

the current PV value

+
+
+
+ +
+
+genie.get_raw_frames(period: bool = False) int
+

Gets the current number of raw frames.

+
+
Parameters:
+

period (bool, optional) – whether to return the value for the current period only

+
+
Returns:
+

the number of raw frames

+
+
Return type:
+

int

+
+
+
+ +
+
+genie.get_rb() str
+

Returns the current RB number.

+
+
Returns:
+

the RB number

+
+
Return type:
+

string

+
+
+
+ +
+
+genie.get_runnumber() str
+

Get the current run-number.

+
+
Returns:
+

the run-number

+
+
Return type:
+

string

+
+
+
+ +
+
+genie.get_runstate() str
+

Get the current status of the instrument as a string.

+

Note: this value can take a few seconds to update after a change of state.

+
+
Returns:
+

the current run state

+
+
Return type:
+

string

+
+
+
+ +
+
+genie.get_sample_pars() _GetSampleParsReturn
+

Get the current sample parameter values.

+
+
Returns:
+

the sample parameters

+
+
Return type:
+

dict

+
+
+
+ +
+
+genie.get_script_dir() str
+

Get the current script directory.

+
+
Returns:
+

the directory

+
+
Return type:
+

string

+
+
+
+ +
+
+genie.get_spectra_table() str | None
+

Gets the current spectra table path”

+
+
Returns:
+

The file path of the current spectra table.

+
+
+
+ +
+
+genie.get_spectra_tables() list[str]
+

Gets a list of possible spectra table choices.

+
+
Returns:
+

the files

+
+
Return type:
+

list

+
+
+
+ +
+
+genie.get_spectrum(spectrum: int, period: int = 1, dist: bool = True) _GetspectrumReturn
+

Get the specified spectrum from the DAE.

+
+
Parameters:
+
    +
  • spectrum (int) – the spectrum number

  • +
  • period (int, optional) – the period

  • +
  • dist (bool, optional) – whether to get the spectrum as a distribution. Default is True.

  • +
+
+
Returns:
+

dictionary of values

+
+
Return type:
+

dict

+
+
+
+ +
+
+genie.get_spectrum_data(with_spec_zero: bool = True) ndarray[Any, dtype[_ScalarType_co]]
+

Get the event mode spectrum data as numpy ND array.

+
+
Parameters:
+

with_spec_zero (bool, optional) – Include or exclude diagnostic spectrum 0 +if you have 10 spectra and include spectrum zero, you array will be +of size 11 and spectrum 5 will be at array[5]. If you exclude spectrum zero +then spectrum 5 would be at array[4]

+
+
Returns:
+

+
spectrum data ND array

this is of dimensions [periods, spectra, time_bins]

+
+
+

+
+
Return type:
+

numpy int array

+
+
+
+ +
+
+genie.get_spectrum_integrals(with_spec_zero: bool = True) ndarray[Any, dtype[_ScalarType_co]]
+

Get the event mode spectrum integrals as numpy ND array.

+
+
Parameters:
+

with_spec_zero (bool, optional) – Include or exclude diagnostic spectrum 0 +if you have 10 spectra and include spectrum zero, your array will be +of size 11 and spectrum 5 will be at array[5]. If you exclude spectrum zero +then spectrum 5 would be at array[4]

+
+
Returns:
+

+
spectrum integrals numpy ND array

this is of dimensions [periods, spectra]

+
+
+

+
+
Return type:
+

numpy int array

+
+
+
+ +
+
+genie.get_tcb_settings(trange: int, regime: int = 1) dict[str, int]
+

Gets a dictionary of the time channel settings.

+
+
Parameters:
+
    +
  • trange (int) – the time range to read (1 to 5)

  • +
  • regime (int, optional) – the regime to read (1 to 6). Default is 1.

  • +
+
+
Returns:
+

the low, high and step for the supplied range and regime

+
+
Return type:
+

dict

+
+
+

Examples

+

Get the step size for the 2nd range in the 3rd regime:

+
>>> get_tcb_settings(2, 3)["Steps"]
+
+
+

Get the step size for the 2nd range in the 3rd regime:

+
>>> get_tcb_settings(2, 3)["Steps"]
+
+
+
+ +
+
+genie.get_time_since_begin(get_timedelta: bool = False) float | timedelta
+

Gets the time since start of the current run in seconds or in datetime

+
+
Parameters:
+

get_timedelta (bool) – If true return the value as a datetime object, +otherwise return seconds (defaults to false)

+
+
+
+
Returns
+
integer: the time since start in seconds if get_datetime is False,

or timedelta, the time since begin as a datetime.timedelta object +(Year-Month-Day Hour:Minute:Second) if get_datetime is True

+
+
+
+
+
+ +
+
+genie.get_title() str
+

Returns the current title.

+
+
Returns:
+

the title

+
+
Return type:
+

string

+
+
+
+ +
+
+genie.get_totalcounts() int
+

Get the total counts for the current run.

+
+
Returns:
+

the total counts

+
+
Return type:
+

int

+
+
+
+ +
+
+genie.get_uamps(period: bool = False) float
+

Get the current number of micro-amp hours.

+
+
Parameters:
+

period (bool, optional) – whether to return the value for the current period only

+
+
Returns:
+

the number of uamps

+
+
Return type:
+

float

+
+
+
+ +
+
+genie.get_users() str
+

Get the users.

+
+
Returns:
+

the users.

+
+
Return type:
+

str

+
+
+
+ +
+
+genie.get_version() str
+

Tells you the version of genie_python that is used.

+
+
Returns:
+

The current version number of genie python

+
+
Return type:
+

string

+
+
+
+ +
+
+genie.get_wiring_table() str | None
+

Gets the current wiring table path”

+
+
Returns:
+

The file path of the current wiring table.

+
+
+
+ +
+
+genie.get_wiring_tables() list[str]
+

Gets a list of possible wiring table choices.

+
+
Returns:
+

the files

+
+
Return type:
+

list

+
+
+
+ +
+
+genie.integrate_spectrum(spectrum: int, period: int = 1, t_min: float | None = None, t_max: float | None = None) float | None
+

Integrates the spectrum within the time period and returns neutron counts.

+

The underlying algorithm sums the counts from each bin, if a bin is split by +the time region then a proportional fraction of the count for that bin is used.

+
+
Parameters:
+
    +
  • spectrum (int) – the spectrum number

  • +
  • period (int, optional) – the period

  • +
  • t_min (float, optional) – time of flight to start from

  • +
  • t_max (float, optional) – time of flight to finish at

  • +
+
+
Returns:
+

integral of the spectrum (neutron counts); None spectrum can not be read

+
+
Return type:
+

float

+
+
+
+ +
+
+genie.load(name: str) None
+

Informs the user that load may not be the function they want. +Prints a message telling the user about g.loadscript and numpy.load.

+
+
Parameters:
+

name (string) – The script the user is trying to load.

+
+
+
+ +
+
+genie.load_script(name: str, check_script: bool = True, warnings_as_error: bool = False) None
+

Loads a user script.

+
+
Parameters:
+
    +
  • name (string) – the name of the file to load. If this is not a +full path the file is assumed to be in C:scripts

  • +
  • check_script – When True run the script checker on the script; +False otherwise (default True)

  • +
  • warnings_as_error – When true throw an exception on a warning; +False otherwise (default False)

  • +
+
+
+
+ +
+
+genie.pause(verbose: bool = False, immediate: bool = False, prepost: bool = True) None
+

Pause the current run.

+
+
Parameters:
+
    +
  • verbose (bool, optional) – show the messages from the DAE

  • +
  • immediate (bool, optional) – pause immediately, +without waiting for a period sequence to complete

  • +
  • prepost (bool, optional) – run pre and post commands (default: True)

  • +
+
+
+
+ +
+
+genie.plot_spectrum(spectrum: int, period: int = 1, dist: bool = True) object
+

Get the specified spectrum from the DAE and plot it. Returns the plot that was created.

+

Note: this will replace any other plots which are open.

+
+
Parameters:
+
    +
  • spectrum (int) – the spectrum number

  • +
  • period (int, optional) – the period. Default is 1

  • +
  • dist (bool, optional) – whether to get the spectrum as a distribution. Default is True

  • +
+
+
Returns:
+

The created plot

+
+
+
+ +
+
+genie.prefix_pv_name(name: str) str
+

Prepends the instrument PV prefix on to the supplied PV name

+
+
Parameters:
+

name (string) – The PV without the prefix.

+
+
Returns:
+

The PV with the instrument prefix prepended

+
+
Return type:
+

string

+
+
+
+ +
+
+genie.recover(verbose: bool = False) None
+

Recovers the run if it has been aborted. +The command should be run before the next run is started.

+

Note: the run will be recovered in the paused state.

+
+
Parameters:
+

verbose (bool, optional) – show the messages from the DAE

+
+
+
+ +
+
+genie.reload_current_config() None
+

Reload the current configuration.

+
+ +
+
+genie.resume(verbose: bool = False, prepost: bool = False) None
+

Resume the current run after it has been paused.

+
+
Parameters:
+
    +
  • verbose (bool, optional) – show the messages from the DAE

  • +
  • prepost (bool, optional) – run pre and post commands (default: True)

  • +
+
+
+
+ +
+
+genie.send_alert(message: str, inst: str | None = None) None
+

Sends an alert message for the specified instrument.

+
+
Parameters:
+
    +
  • message (string) – the message to send

  • +
  • inst (string, optional) – the instrument to generate the alert for. +Defaults to current instrument.

  • +
+
+
+
+ +
+
+genie.send_email(address: str, message: str) None
+

Sends a message to an email address.

+
+
Parameters:
+
    +
  • address (string) – the email address to use

  • +
  • message (string) – the message to send

  • +
+
+
+
+ +
+
+genie.send_sms(phone_num: str, message: str) None
+

Sends an SMS message to a phone number. +If you are sending to messages to the same number often consider using g.alerts.send()

+
+
Parameters:
+
    +
  • phone_num (string) – the phone number to send the SMS to

  • +
  • message (string) – the message to send

  • +
+
+
+
+ +
+
+genie.set_dae_simulation_mode(mode: bool, skip_required_runstates: bool = False) None
+

Sets the DAE into simulation mode.

+
+
Parameters:
+
    +
  • mode – True to set the DAE into simulated mode, False to set the DAE into +non-simulated (hardware) mode

  • +
  • skip_required_runstates – Ignore all checks, use with caution

  • +
+
+
+
+ +
+
+genie.set_display_title(display_title: bool) None
+

Sets the current display title status.

+
+
Parameters:
+

display_title – the new display title status

+
+
+
+ +
+
+genie.set_instrument(pv_prefix: str, import_instrument_init: bool = True) None
+

Sets the instrument this session is communicating with. +Used for remote access - do not delete.

+
+
Parameters:
+
    +
  • pv_prefix (string) – the PV prefix

  • +
  • import_instrument_init (bool) – if True import the instrument init

  • +
  • don't (from the config area; otherwise)

  • +
+
+
+
+ +
+
+genie.set_pv(name: str, value: bool | int | float | str | list[bool | int | float | str] | ndarray[Any, dtype[_ScalarType_co]] | None, wait: bool = False, is_local: bool = False) None
+

Set the value for the specified PV.

+
+
Parameters:
+
    +
  • name (string) – the PV name

  • +
  • value – the new value to set

  • +
  • wait (bool, optional) – whether to wait until the value +has been received by the hardware

  • +
  • is_local (bool, optional) – whether to automatically +prepend the local inst prefix to the PV name

  • +
+
+
+
+ +
+
+genie.snapshot_crpt(filename: str = 'c:\\Data\\snapshot_crpt.tmp', verbose: bool = False) None
+

Create a snapshot of the current data.

+
+
Parameters:
+
    +
  • filename (string, optional) – where to write the data file(s)

  • +
  • verbose (bool, optional) – show the messages from the DAE

  • +
+
+
+

Examples

+

Snapshot to a file called my_snapshot:

+
>>> snapshot_crpt("c:\Data\my_snapshot")
+
+
+
+ +
+
+genie.store(verbose: bool = False) None
+

Data loaded into memory by a previous update command is now written to disk.

+
+
Parameters:
+

verbose (bool, optional) – show the messages from the DAE

+
+
+
+ +
+
+genie.update(pause_run: bool = True, verbose: bool = False) None
+

Data is loaded from the DAE into the computer memory, but is not written to disk.

+
+
Parameters:
+
    +
  • pause_run (bool, optional) – whether to pause data collection first [optional]

  • +
  • verbose (bool, optional) – show the messages from the DAE

  • +
+
+
+
+ +
+
+genie.updatestore(verbose: bool = False) None
+

Performs an update and a store operation in a combined operation. +This is more efficient than doing the commands separately.

+
+
Parameters:
+

verbose (bool, optional) – show the messages from the DAE

+
+
+
+ +
+
+genie.waitfor(block: str | None = None, value: float | None = None, lowlimit: float | None = None, highlimit: float | None = None, maxwait: float | None = None, wait_all: bool = False, seconds: float | None = None, minutes: float | None = None, hours: float | None = None, time: str | None = None, frames: int | None = None, raw_frames: int | None = None, uamps: float | None = None, mevents: float | None = None, early_exit: ~typing.Callable[[], bool] = <function <lambda>>, quiet: bool = False, **pars: bool | int | float | str | ~typing.Callable[[None], bool] | None) None
+

Interrupts execution until certain conditions are met.

+
+
Parameters:
+
    +
  • block (string, optional) – the name of the block to wait for

  • +
  • value (float, optional) – the block value to wait for

  • +
  • lowlimit (float, optional) – wait for the block to be >= this value (numeric only)

  • +
  • highlimit (float, optional) – wait for the block to be <= this value (numeric only)

  • +
  • maxwait (float, optional) – wait no longer that the specified number of seconds

  • +
  • wait_all (bool, optional) – wait for all conditions to be met +(e.g. a number of frames and an amount of uamps)

  • +
  • seconds (float, optional) – wait for a specified number of seconds

  • +
  • minutes (float, optional) – wait for a specified number of minutes

  • +
  • hours (float, optional) – wait for a specified number of hours

  • +
  • time (string, optional) – a quicker way of setting hours, minutes and seconds +(must be of format “HH:MM:SS”)

  • +
  • frames (int, optional) – wait for a total number of good frames to be collected

  • +
  • raw_frames (int, optional) – wait for a total number of raw frames to be collected

  • +
  • uamps (float, optional) – wait for a total number of uamps to be received

  • +
  • mevents (float, optional) – wait for a total number of millions of events to be collected

  • +
  • early_exit (lambda, optional) – stop waiting if the function evaluates to True

  • +
  • quiet (bool, optional) – suppress normal output messages to the console

  • +
+
+
+

Examples

+

Wait for a block to reach a specific value:

+
>>> waitfor(myblock=123)
+>>> waitfor("myblock", 123)
+>>> waitfor("myblock", True)
+>>> waitfor("myblock", "OPEN")
+
+
+

Wait for a block to be between limits:

+
>>> waitfor("myblock", lowlimit=100, highlimit=110)
+
+
+

Wait for a block to reach a specific value, but no longer than 60 seconds:

+
>>> waitfor(myblock=123, maxwait=60)
+
+
+

Wait for a specified time interval:

+
>>> waitfor(seconds=10)
+>>> waitfor(hours=1, minutes=30, seconds=15)
+>>> waitfor(time="1:30:15")
+
+
+

Wait for a data collection condition:

+
>>> waitfor(frames=5000)
+>>> waitfor(uamps=200)
+
+
+

Wait for either a number of frames OR a time interval to occur:

+
>>> waitfor(frames=5000, hours=2)
+
+
+

Wait for a number of frames AND a time interval to occur:

+
>>> waitfor(frames=5000, hours=2, wait_all=True)
+
+
+

Wait for either the block to reach a value or a condition to be met:

+
>>> waitfor(myblock=123, early_exit=lambda:
+    some_function(cget("another_block")["value"]) > 123)
+
+
+
+ +
+
+genie.waitfor_block(block: str, value: bool | int | float | str | None = None, lowlimit: float | None = None, highlimit: float | None = None, maxwait: float | None = None, early_exit: ~typing.Callable[[], bool] = <function <lambda>>, quiet: bool = False) None
+

Interrupts execution until block reaches specific value

+
+
Parameters:
+
    +
  • block – the name of the block to wait for

  • +
  • value – the target block value

  • +
  • lowlimit – waits for the block to be >= this value (numeric only)

  • +
  • highlimit – waits for the block to be <= this value (numeric only)

  • +
  • maxwait – wait no longer that the specified number of seconds

  • +
  • early_exit – stop waiting if the exception evaluates to True

  • +
  • quiet (bool, optional) – suppress normal output messages to the console

  • +
+
+
+

Examples

+
>>> waitfor_block("myblock", value=123)
+>>> waitfor_block("myblock", value=True, maxwait=15)
+>>> waitfor_block("myblock", lowlimit=100, highlimit=110)
+>>> waitfor_block("myblock", highlimit=1.0, maxwait=60)
+>>> waitfor_block(
+...     "myblock", value=123, early_exit=lambda: cget("myblock_limit_reached")["value"] != 0
+... )
+
+
+
+ +
+
+genie.waitfor_frames(frames: int, quiet: bool = False) None
+

Interrupts execution to wait for number of total good frames to reach parameter value

+
+
Parameters:
+
    +
  • frames (int) – the number of frames to wait for

  • +
  • quiet (bool, optional) – suppress normal output messages to the console

  • +
+
+
+

Example

+
>>> waitfor_frames(4000)
+
+
+
+ +
+
+genie.waitfor_mevents(mevents: float, quiet: bool = False) None
+

Interrupts execution to wait for number of millions of events to reach parameter value

+
+
Parameters:
+
    +
  • mevents (float) – the number of millions of events to wait for

  • +
  • quiet (bool, optional) – suppress normal output messages to the console

  • +
+
+
+

Example

+
>>> waitfor_mevents(0.0004)
+
+
+
+ +
+
+genie.waitfor_move(*blocks: str | None, **kwargs: int | None) None
+

Wait for all motion or specific motion to complete.

+

If block names are supplied then it will only wait for those to stop moving. +Otherwise, it will wait for all motion +to stop.

+
+
Parameters:
+
    +
  • blocks (string, multiple, optional) – the names of specific blocks to wait for

  • +
  • start_timeout (int, optional) – the number of seconds to wait for the +movement to begin (default = 2 seconds)

  • +
  • move_timeout (int, optional) – the maximum number of seconds to wait for motion to stop

  • +
+
+
+

Examples

+

Wait for all motors to stop moving:

+
>>> waitfor_move()
+
+
+

Wait for all motors to stop moving with a timeout of 30 seconds:

+
>>> waitfor_move(move_timeout=30)
+
+
+

Wait for only slit1 and slit2 motors to stop moving:

+
>>> waitfor_move("slit1", "slit2")
+
+
+
+ +
+
+genie.waitfor_raw_frames(raw_frames: int, quiet: bool = False) None
+

Interrupts execution to wait for number of total raw frames to reach parameter value

+
+
Parameters:
+
    +
  • frames (raw) – the number of raw frames to wait for

  • +
  • quiet (bool, optional) – suppress normal output messages to the console

  • +
+
+
+

Example

+
>>> waitfor_raw_frames(4000)
+
+
+
+ +
+
+genie.waitfor_runstate(state: str, maxwaitsecs: int = 3600, onexit: bool = False, quiet: bool = False) None
+

Wait for a particular instrument run state.

+
+
Parameters:
+
    +
  • state (string) – the state to wait for (e.g. “paused”)

  • +
  • maxwaitsecs (int, optional) – the maximum time to wait for the state before carrying on

  • +
  • onexit (bool, optional) – wait for runstate to change from the specified state

  • +
  • quiet (bool, optional) – suppress normal output messages to the console

  • +
+
+
+

Examples

+

Wait for a run to enter the paused state:

+
>>> waitfor_runstate("paused")
+
+
+

Wait for a run to exit the paused state:

+
>>> waitfor_runstate("paused", onexit=True)
+
+
+
+ +
+
+genie.waitfor_time(seconds: float | None = None, minutes: float | None = None, hours: float | None = None, time: str | None = None, quiet: bool = False) None
+

Interrupts execution for a specified amount of time

+
+
Parameters:
+
    +
  • seconds (float, optional) – wait for a specified number of seconds

  • +
  • minutes (float, optional) – wait for a specified number of minutes

  • +
  • hours (float, optional) – wait for a specified number of hours

  • +
  • time (string, optional) – a quicker way of setting hours, +minutes and seconds (must be of format “HH:MM:SS”)

  • +
  • quiet (bool, optional) – suppress normal output messages to the console

  • +
+
+
+

Examples

+
>>> waitfor_time(seconds=10)
+>>> waitfor_time(hours=1, minutes=30, seconds=15)
+>>> waitfor_time(time="1:30:15")
+
+
+
+ +
+
+genie.waitfor_uamps(uamps: float, quiet: bool = False) None
+

Interrupts execution to wait for a specific total charge

+
+
Parameters:
+
    +
  • uamps – the charge to wait for

  • +
  • quiet (bool, optional) – suppress normal output messages to the console

  • +
+
+
+

Example

+
>>> waitfor_uamps(115.5)
+
+
+
+ +

Genie Advanced module:

+

This module is used for advanced commands that are for expert users.

+
+
+genie_advanced.assert_in_manager_mode() None
+

Checks that the user is in manager mode so can use advanced functions.

+

Args:

+

Returns:

+
+ +
+
+genie_advanced.get_exp_data(rb: int | str = '%', user: str = '%', role: str = '%', verbose: bool = False) list[_GetExpDataReturn]
+

Returns the data of experiments that match the given criteria, +or all if none is given, from the exp_data +database. If verbose is enabled, only pretty-print the data.

+
+
Parameters:
+
    +
  • rb (int, optional) – The RB number of the experiment to look for, Defaults to Any.

  • +
  • user (str, optional) – The name of the user who is running/has +run the experiment, Defaults to Any.

  • +
  • role (str, optional) – The user role, Defaults to Any.

  • +
  • verbose (bool, optional) – Pretty-print the data, Defaults to False.

  • +
+
+
Returns:
+

The experiment(s) data as a list of dicts.

+
+
Return type:
+

exp_data (list)

+
+
Raises:
+

NotFoundError – Thrown if a parameter’s value was not found in the database.

+
+
+
+ +
+
+genie_advanced.get_instrument() str | None
+

Gets the name of the local instrument (e.g. NDW1234, DEMO, EMMA-A)

+
+
Returns:
+

the name of the local instrument

+
+
+
+ +
+
+genie_advanced.get_manager_mode() bool
+

Returns whether you are in manager mode or not.

+
+
Returns:
+

Manager mode on or off.

+
+
Return type:
+

manager_mode (Bool)

+
+
+
+ +
+
+genie_advanced.get_pv_from_block(block: str) str
+

Get the full PV name for a given block. +This is an advanced function because of the need to use the pv name correctly.

+
+
Parameters:
+

block (str) – A block object

+
+
Returns:
+

The pv name as a string

+
+
Return type:
+

pv_name (Str)

+
+
+
+ +
+
+genie_advanced.get_spectrum_data(with_spec_zero: bool = True, with_time_bin_zero: bool = False) ndarray[Any, dtype[_ScalarType_co]]
+

Get the event mode spectrum data as ND array.

+
+
Parameters:
+
    +
  • with_spec_zero (bool, optional) – Include or exclude diagnostic spectrum 0 +if you have 10 spectra and include spectrum zero, your array will be +of size 11 and spectrum 5 will be at array[5]. If you exclude spectrum zero +then spectrum 5 would be at array[4]

  • +
  • with_time_bin_zero (bool, optional) – Include or exclude diagnostic bin 0 +if you have 1000 time channels and include time bin 0, your array will be +of size 1001 and data for your defined time bins will start at array[1] +rather than array[0]. This bin contents is only of use for diagnostic +issues, it contains data that does not fit into the defined time range

  • +
+
+
Returns:
+

+
spectrum data ND array

this is of dimensions [periods, spectra, time_bins]

+
+
+

+
+
Return type:
+

numpy int array

+
+
+
+ +
+
+genie_advanced.motor_in_set_mode(pv_name: str) Iterator
+

Uses a context to place motor into set mode and ensure that it leaves +set mode after context has ended. If it can not set the mode correctly +will not run the yield.

+
+
Parameters:
+

pv_name – pv of motor on which to set the mode

+
+
+

Returns:

+
+ +
+
+genie_advanced.open_plot_window(is_primary: bool = True, host: str | int | None = None, figures: list[int] | None = None) None
+

Open the plot window in a locally running client +(even if this is called in a standalone genie_python) +:param is_primary: True to open primary plotting window; False open secondaty window +:param host: host to open plot from; Default None is localhost +:param figures: List of figures to open; Default opens all figures

+
+ +
+
+genie_advanced.pv_exists(pv: str, is_local: bool = False) None
+

Check if PV exists.

+
+
Params:

pv (str): The address of the PV +is_local (bool, optional): is it a local PV i.e. needs prefix adding

+
+
+
+ +
+
+genie_advanced.redefine_motor_position(name: str, value: float | int) None
+

Change the motor Move Abs value.

+
+
Parameters:
+
    +
  • name – Name of the motor. e.g MTR0101

  • +
  • value – The new value of Move Abs.

  • +
+
+
+

Returns:

+
+ +
+
+genie_advanced.set_abort_postcmd(abort_postcmd: Callable[[Any], str | None]) None
+

Set the function to call after the abort command.

+
+
Parameters:
+

abort_postcmd (function) – The function to call.

+
+
+
+ +
+
+genie_advanced.set_abort_precmd(abort_precmd: Callable[[Any], str | None]) None
+

Set the function to call before the abort command.

+
+
Parameters:
+

abort_precmd (function) – The function to call.

+
+
+
+ +
+
+genie_advanced.set_begin_postcmd(begin_postcmd: Callable[[Any], str | None]) None
+

Set the function to call after the begin command.

+
+
Parameters:
+

begin_postcmd (function) – The function to call.

+
+
+
+ +
+
+genie_advanced.set_begin_precmd(begin_precmd: Callable[[Any], str | None]) None
+

Set the function to call before the begin command.

+
+
Parameters:
+
    +
  • begin_precmd (function) – The function to call (which should return

  • +
  • start (None if it wants the run to)

  • +
  • run). (or a string with the reason why not to start)

  • +
+
+
+
+ +
+
+genie_advanced.set_dae_message_verbosity(verbose: bool) None
+

Set the verbosity of messages coming from the DAE.

+
+
Parameters:
+

verbose (bool) – set the verbosity, True to be more verbose

+
+
+
+ +
+
+genie_advanced.set_end_postcmd(end_postcmd: Callable[[Any], str | None]) None
+

Set the function to call after the end command.

+
+
Parameters:
+

end_postcmd (function) – The function to call.

+
+
+
+ +
+
+genie_advanced.set_end_precmd(end_precmd: Callable[[Any], str | None]) None
+

Set the function to call before the end command.

+
+
Parameters:
+

end_precmd (function) – The function to call.

+
+
+
+ +
+
+genie_advanced.set_pause_postcmd(pause_postcmd: Callable[[Any], str | None]) None
+

Set the function to call after the pause command.

+
+
Parameters:
+

pause_postcmd (function) – The function to call.

+
+
+
+ +
+
+genie_advanced.set_pause_precmd(pause_precmd: Callable[[Any], str | None]) None
+

Set the function to call before the pause command.

+
+
Parameters:
+

pause_precmd (function) – The function to call.

+
+
+
+ +
+
+genie_advanced.set_resume_postcmd(resume_postcmd: Callable[[Any], str | None]) None
+

Set the function to call after the resume command.

+
+
Parameters:
+

resume_postcmd (function) – The function to call.

+
+
+
+ +
+
+genie_advanced.set_resume_precmd(resume_precmd: Callable[[Any], str | None]) None
+

Set the function to call before the resume command.

+
+
Parameters:
+

resume_precmd (function) – The function to call.

+
+
+
+ +
+
+genie_advanced.wait_for_pv(pv: str, value: bool | int | float | str | None, maxwait: int | None = None) None
+

Wait until a PV has reached a given value.

+
+
Params:

pv (str): The address of the PV +value: The value to wait for +maxwait (int, optional): The maximum time to wait for in seconds

+
+
+
+ +

Genie Alerts module:

+

This module is used for setting alerts on blocks.

+
+
+genie_alerts.enable(block, set_enabled=True)
+

Enable alerts on a block.

+
+
Parameters:
+
    +
  • block (str) – Block name

  • +
  • set_enabled (bool) – whether to enable

  • +
+
+
+
+ +
+
+genie_alerts.send(message)
+

Send a message to all alert recipients.

+
+
Parameters:
+

message (str) – message to send

+
+
+
+ +
+
+genie_alerts.set_email(emails)
+

Set email addresses for alerts on blocks.

+
+
Parameters:
+

emails (list) – list of strings giving email addresses

+
+
+
+ +
+
+genie_alerts.set_range(block, lowlimit, highlimit, set_enable=True, delay_in=None, delay_out=None)
+

Sets alert range on block.

+
+
Parameters:
+
    +
  • block (str) – Block name

  • +
  • lowlimit (float) – low limit

  • +
  • highlimit (float) – high limit

  • +
  • set_enable (bool) – (optional setting True will enable alerts on the block. Defaults to True.

  • +
  • delay_in (float) – (optional) delay /s before triggering in range. If not specified the delay remains unchanged.

  • +
  • delay_out (float) – (optional) delay /s before triggering out of range. If not specified the delay remains unchanged.

  • +
+
+
+
+ +
+
+genie_alerts.set_sms(numbers)
+

Set SMS text numbers for alerts on blocks.

+
+
Parameters:
+

numbers (list) – list of strings giving phone numbers

+
+
+
+ +
+
+genie_alerts.status(block=None, all=False)
+

Prints the emails and mobiles used for alerts and the current status of specified block. +:param block: The block to print information about +:type block: string +:param all: If True information about all the blocks is printed +:type all: bool

+
+ +
+
+ + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/genindex.html b/genindex.html new file mode 100644 index 00000000..5215a5ae --- /dev/null +++ b/genindex.html @@ -0,0 +1,474 @@ + + + + + + + Index — genie_python documentation + + + + + + + + + + +
+
+
+ + +

Index

+ +
+ A + | B + | C + | D + | E + | G + | I + | L + | M + | O + | P + | R + | S + | U + | W + +
+

A

+ + + +
+ +

B

+ + +
+ +

C

+ + + +
+ +

D

+ + +
+ +

E

+ + + +
+ +

G

+ + + +
+ +

I

+ + +
+ +

L

+ + + +
+ +

M

+ + + +
+ +

O

+ + +
+ +

P

+ + + +
+ +

R

+ + + +
+ +

S

+ + + +
+ +

U

+ + + +
+ +

W

+ + + +
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/objects.inv b/objects.inv new file mode 100644 index 0000000000000000000000000000000000000000..73ce48a9da1f706f56e75661076af5fd9939f667 GIT binary patch literal 1123 zcmV-p1f2ULAX9K?X>NERX>N99Zgg*Qc_4OWa&u{KZXhxWBOp+6Z)#;@bUGksWo~I@ zUvPPJXm4%`BOq2~a&u{KZaN?^E-?xtAXI2&AaZ4GVQFq;WpW^IW*~HEX>%ZEX>4U6 zX>%ZBZ*6dLWpi_7WFU2OX>MmAdTeQ8E(&Sr+s$z$9C)Sr|$8g-hBFl^9#Af@-xNsne!U`r{8~lDKev_l)7KuQTbQ= z<+sltpTGQ90UAQgW$ZEmXZ*mk@xb_TW<-A6lb;y|`hm$=<7E^@oZfMCray2F z3f6d&_BiK)H#sOK>sL2$>{Hm~e&J}slyH#-;#?eXCe;Ad?Mxb@S#m!a4Vx)u1$Ocy zPGuS_D>fpJg9?(kvx+>)CTp-Yaa1g>WE6(+_^l^P(czdi&gA}Jf~CSh0>SUhyhiSg z&m28jO=bn}dCWZZ%OQ!7OejI&m#|8i_TdPOpLkd55<_`yt52pd4q3)(~6e+62RkHfgbRf{RgM z`M@6Dnq4FZ&(f(Lb?(l1nBTx@k(V1u2WR8BlwZ#leLP$iu25}9@beBJ5b3DfOUSlV zVD;^N;+)uyj7IgXeuiyi8iQwD&m@oEgP%Nqf%5&oC*`QdSzou zdDAW@EbRN*hmXcj$XA@JhP)1bH7RT2QX1s>YfxLx5|YV~9lJ`E_fY>sC@Oh$(?$_- z3wn)eu(wX+EV5}LrC&>ROH@CC#-Y66lUA%)hK*~g5}Q_3ZRXZ#oJBTGq?x;|Gr6d! zr&4-DUz!8rahk_Wa9^m@`70NN308z_SG$y_4^tSs z$9G0|Us;aPVi|I{yZQH@f2B^K+7qiI|DlTdiC?RrrGf25vRrL)AIr}N+1__XE~m%K pjW+mG3y{X#-2D#r+?I7mC#E>=@4 + + + + + + Search — genie_python documentation + + + + + + + + + + + + + + + + + +
+
+
+ +

Search

+ + + + +

+ Searching for multiple words only shows matches that contain + all words. +

+ + +
+ + + +
+ + +
+ + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/searchindex.js b/searchindex.js new file mode 100644 index 00000000..c7455ca3 --- /dev/null +++ b/searchindex.js @@ -0,0 +1 @@ +Search.setIndex({"alltitles": {"Commands": [[0, "commands"]], "Welcome to genie_python\u2019s documentation!": [[0, null]]}, "docnames": ["genie_python"], "envversion": {"sphinx": 64, "sphinx.domains.c": 3, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 9, "sphinx.domains.index": 1, "sphinx.domains.javascript": 3, "sphinx.domains.math": 2, "sphinx.domains.python": 4, "sphinx.domains.rst": 2, "sphinx.domains.std": 2}, "filenames": ["genie_python.rst"], "indexentries": {"abort() (in module genie)": [[0, "genie.abort", false]], "assert_in_manager_mode() (in module genie_advanced)": [[0, "genie_advanced.assert_in_manager_mode", false]], "begin() (in module genie)": [[0, "genie.begin", false]], "cget() (in module genie)": [[0, "genie.cget", false]], "change() (in module genie)": [[0, "genie.change", false]], "change_beamline_par() (in module genie)": [[0, "genie.change_beamline_par", false]], "change_fermi_veto() (in module genie)": [[0, "genie.change_fermi_veto", false]], "change_finish() (in module genie)": [[0, "genie.change_finish", false]], "change_monitor() (in module genie)": [[0, "genie.change_monitor", false]], "change_number_soft_periods() (in module genie)": [[0, "genie.change_number_soft_periods", false]], "change_period() (in module genie)": [[0, "genie.change_period", false]], "change_rb() (in module genie)": [[0, "genie.change_rb", false]], "change_sample_par() (in module genie)": [[0, "genie.change_sample_par", false]], "change_script_dir() (in module genie)": [[0, "genie.change_script_dir", false]], "change_start() (in module genie)": [[0, "genie.change_start", false]], "change_sync() (in module genie)": [[0, "genie.change_sync", false]], "change_tables() (in module genie)": [[0, "genie.change_tables", false]], "change_tcb() (in module genie)": [[0, "genie.change_tcb", false]], "change_tcb_file() (in module genie)": [[0, "genie.change_tcb_file", false]], "change_title() (in module genie)": [[0, "genie.change_title", false]], "change_users() (in module genie)": [[0, "genie.change_users", false]], "change_vetos() (in module genie)": [[0, "genie.change_vetos", false]], "check_alarms() (in module genie)": [[0, "genie.check_alarms", false]], "check_limit_violations() (in module genie)": [[0, "genie.check_limit_violations", false]], "configure_internal_periods() (in module genie)": [[0, "genie.configure_internal_periods", false]], "connected_pvs_in_list() (in module genie)": [[0, "genie.connected_pvs_in_list", false]], "cset() (in module genie)": [[0, "genie.cset", false]], "cshow() (in module genie)": [[0, "genie.cshow", false]], "define_hard_period() (in module genie)": [[0, "genie.define_hard_period", false]], "enable() (in module genie_alerts)": [[0, "genie_alerts.enable", false]], "enable_hard_periods() (in module genie)": [[0, "genie.enable_hard_periods", false]], "enable_soft_periods() (in module genie)": [[0, "genie.enable_soft_periods", false]], "end() (in module genie)": [[0, "genie.end", false]], "genie": [[0, "module-genie", false]], "genie_advanced": [[0, "module-genie_advanced", false]], "genie_alerts": [[0, "module-genie_alerts", false]], "get_beamline_pars() (in module genie)": [[0, "genie.get_beamline_pars", false]], "get_block_units() (in module genie)": [[0, "genie.get_block_units", false]], "get_blocks() (in module genie)": [[0, "genie.get_blocks", false]], "get_dae_simulation_mode() (in module genie)": [[0, "genie.get_dae_simulation_mode", false]], "get_dashboard() (in module genie)": [[0, "genie.get_dashboard", false]], "get_detector_table() (in module genie)": [[0, "genie.get_detector_table", false]], "get_detector_tables() (in module genie)": [[0, "genie.get_detector_tables", false]], "get_display_title() (in module genie)": [[0, "genie.get_display_title", false]], "get_events() (in module genie)": [[0, "genie.get_events", false]], "get_exp_data() (in module genie_advanced)": [[0, "genie_advanced.get_exp_data", false]], "get_frames() (in module genie)": [[0, "genie.get_frames", false]], "get_instrument() (in module genie_advanced)": [[0, "genie_advanced.get_instrument", false]], "get_manager_mode() (in module genie_advanced)": [[0, "genie_advanced.get_manager_mode", false]], "get_mevents() (in module genie)": [[0, "genie.get_mevents", false]], "get_number_periods() (in module genie)": [[0, "genie.get_number_periods", false]], "get_number_spectra() (in module genie)": [[0, "genie.get_number_spectra", false]], "get_number_timechannels() (in module genie)": [[0, "genie.get_number_timechannels", false]], "get_period() (in module genie)": [[0, "genie.get_period", false]], "get_period_files() (in module genie)": [[0, "genie.get_period_files", false]], "get_pv() (in module genie)": [[0, "genie.get_pv", false]], "get_pv_from_block() (in module genie_advanced)": [[0, "genie_advanced.get_pv_from_block", false]], "get_raw_frames() (in module genie)": [[0, "genie.get_raw_frames", false]], "get_rb() (in module genie)": [[0, "genie.get_rb", false]], "get_runnumber() (in module genie)": [[0, "genie.get_runnumber", false]], "get_runstate() (in module genie)": [[0, "genie.get_runstate", false]], "get_sample_pars() (in module genie)": [[0, "genie.get_sample_pars", false]], "get_script_dir() (in module genie)": [[0, "genie.get_script_dir", false]], "get_spectra_table() (in module genie)": [[0, "genie.get_spectra_table", false]], "get_spectra_tables() (in module genie)": [[0, "genie.get_spectra_tables", false]], "get_spectrum() (in module genie)": [[0, "genie.get_spectrum", false]], "get_spectrum_data() (in module genie)": [[0, "genie.get_spectrum_data", false]], "get_spectrum_data() (in module genie_advanced)": [[0, "genie_advanced.get_spectrum_data", false]], "get_spectrum_integrals() (in module genie)": [[0, "genie.get_spectrum_integrals", false]], "get_tcb_settings() (in module genie)": [[0, "genie.get_tcb_settings", false]], "get_time_since_begin() (in module genie)": [[0, "genie.get_time_since_begin", false]], "get_title() (in module genie)": [[0, "genie.get_title", false]], "get_totalcounts() (in module genie)": [[0, "genie.get_totalcounts", false]], "get_uamps() (in module genie)": [[0, "genie.get_uamps", false]], "get_users() (in module genie)": [[0, "genie.get_users", false]], "get_version() (in module genie)": [[0, "genie.get_version", false]], "get_wiring_table() (in module genie)": [[0, "genie.get_wiring_table", false]], "get_wiring_tables() (in module genie)": [[0, "genie.get_wiring_tables", false]], "getsampleparsreturnmeas (class in genie)": [[0, "genie.GetSampleParsReturnMEAS", false]], "getsampleparsreturnscript (class in genie)": [[0, "genie.GetSampleParsReturnSCRIPT", false]], "integrate_spectrum() (in module genie)": [[0, "genie.integrate_spectrum", false]], "load() (in module genie)": [[0, "genie.load", false]], "load_script() (in module genie)": [[0, "genie.load_script", false]], "module": [[0, "module-genie", false], [0, "module-genie_advanced", false], [0, "module-genie_alerts", false]], "motor_in_set_mode() (in module genie_advanced)": [[0, "genie_advanced.motor_in_set_mode", false]], "open_plot_window() (in module genie_advanced)": [[0, "genie_advanced.open_plot_window", false]], "pause() (in module genie)": [[0, "genie.pause", false]], "plot_spectrum() (in module genie)": [[0, "genie.plot_spectrum", false]], "prefix_pv_name() (in module genie)": [[0, "genie.prefix_pv_name", false]], "pv_exists() (in module genie_advanced)": [[0, "genie_advanced.pv_exists", false]], "recover() (in module genie)": [[0, "genie.recover", false]], "redefine_motor_position() (in module genie_advanced)": [[0, "genie_advanced.redefine_motor_position", false]], "reload_current_config() (in module genie)": [[0, "genie.reload_current_config", false]], "resume() (in module genie)": [[0, "genie.resume", false]], "send() (in module genie_alerts)": [[0, "genie_alerts.send", false]], "send_alert() (in module genie)": [[0, "genie.send_alert", false]], "send_email() (in module genie)": [[0, "genie.send_email", false]], "send_sms() (in module genie)": [[0, "genie.send_sms", false]], "set_abort_postcmd() (in module genie_advanced)": [[0, "genie_advanced.set_abort_postcmd", false]], "set_abort_precmd() (in module genie_advanced)": [[0, "genie_advanced.set_abort_precmd", false]], "set_begin_postcmd() (in module genie_advanced)": [[0, "genie_advanced.set_begin_postcmd", false]], "set_begin_precmd() (in module genie_advanced)": [[0, "genie_advanced.set_begin_precmd", false]], "set_dae_message_verbosity() (in module genie_advanced)": [[0, "genie_advanced.set_dae_message_verbosity", false]], "set_dae_simulation_mode() (in module genie)": [[0, "genie.set_dae_simulation_mode", false]], "set_display_title() (in module genie)": [[0, "genie.set_display_title", false]], "set_email() (in module genie_alerts)": [[0, "genie_alerts.set_email", false]], "set_end_postcmd() (in module genie_advanced)": [[0, "genie_advanced.set_end_postcmd", false]], "set_end_precmd() (in module genie_advanced)": [[0, "genie_advanced.set_end_precmd", false]], "set_instrument() (in module genie)": [[0, "genie.set_instrument", false]], "set_pause_postcmd() (in module genie_advanced)": [[0, "genie_advanced.set_pause_postcmd", false]], "set_pause_precmd() (in module genie_advanced)": [[0, "genie_advanced.set_pause_precmd", false]], "set_pv() (in module genie)": [[0, "genie.set_pv", false]], "set_range() (in module genie_alerts)": [[0, "genie_alerts.set_range", false]], "set_resume_postcmd() (in module genie_advanced)": [[0, "genie_advanced.set_resume_postcmd", false]], "set_resume_precmd() (in module genie_advanced)": [[0, "genie_advanced.set_resume_precmd", false]], "set_sms() (in module genie_alerts)": [[0, "genie_alerts.set_sms", false]], "snapshot_crpt() (in module genie)": [[0, "genie.snapshot_crpt", false]], "status() (in module genie_alerts)": [[0, "genie_alerts.status", false]], "store() (in module genie)": [[0, "genie.store", false]], "update() (in module genie)": [[0, "genie.update", false]], "updatestore() (in module genie)": [[0, "genie.updatestore", false]], "wait_for_pv() (in module genie_advanced)": [[0, "genie_advanced.wait_for_pv", false]], "waitfor() (in module genie)": [[0, "genie.waitfor", false]], "waitfor_block() (in module genie)": [[0, "genie.waitfor_block", false]], "waitfor_frames() (in module genie)": [[0, "genie.waitfor_frames", false]], "waitfor_mevents() (in module genie)": [[0, "genie.waitfor_mevents", false]], "waitfor_move() (in module genie)": [[0, "genie.waitfor_move", false]], "waitfor_raw_frames() (in module genie)": [[0, "genie.waitfor_raw_frames", false]], "waitfor_runstate() (in module genie)": [[0, "genie.waitfor_runstate", false]], "waitfor_time() (in module genie)": [[0, "genie.waitfor_time", false]], "waitfor_uamps() (in module genie)": [[0, "genie.waitfor_uamps", false]]}, "objects": {"": [[0, 0, 0, "-", "genie"], [0, 0, 0, "-", "genie_advanced"], [0, 0, 0, "-", "genie_alerts"]], "genie": [[0, 1, 1, "", "GetSampleParsReturnMEAS"], [0, 1, 1, "", "GetSampleParsReturnSCRIPT"], [0, 2, 1, "", "abort"], [0, 2, 1, "", "begin"], [0, 2, 1, "", "cget"], [0, 2, 1, "", "change"], [0, 2, 1, "", "change_beamline_par"], [0, 2, 1, "", "change_fermi_veto"], [0, 2, 1, "", "change_finish"], [0, 2, 1, "", "change_monitor"], [0, 2, 1, "", "change_number_soft_periods"], [0, 2, 1, "", "change_period"], [0, 2, 1, "", "change_rb"], [0, 2, 1, "", "change_sample_par"], [0, 2, 1, "", "change_script_dir"], [0, 2, 1, "", "change_start"], [0, 2, 1, "", "change_sync"], [0, 2, 1, "", "change_tables"], [0, 2, 1, "", "change_tcb"], [0, 2, 1, "", "change_tcb_file"], [0, 2, 1, "", "change_title"], [0, 2, 1, "", "change_users"], [0, 2, 1, "", "change_vetos"], [0, 2, 1, "", "check_alarms"], [0, 2, 1, "", "check_limit_violations"], [0, 2, 1, "", "configure_internal_periods"], [0, 2, 1, "", "connected_pvs_in_list"], [0, 2, 1, "", "cset"], [0, 2, 1, "", "cshow"], [0, 2, 1, "", "define_hard_period"], [0, 2, 1, "", "enable_hard_periods"], [0, 2, 1, "", "enable_soft_periods"], [0, 2, 1, "", "end"], [0, 2, 1, "", "get_beamline_pars"], [0, 2, 1, "", "get_block_units"], [0, 2, 1, "", "get_blocks"], [0, 2, 1, "", "get_dae_simulation_mode"], [0, 2, 1, "", "get_dashboard"], [0, 2, 1, "", "get_detector_table"], [0, 2, 1, "", "get_detector_tables"], [0, 2, 1, "", "get_display_title"], [0, 2, 1, "", "get_events"], [0, 2, 1, "", "get_frames"], [0, 2, 1, "", "get_mevents"], [0, 2, 1, "", "get_number_periods"], [0, 2, 1, "", "get_number_spectra"], [0, 2, 1, "", "get_number_timechannels"], [0, 2, 1, "", "get_period"], [0, 2, 1, "", "get_period_files"], [0, 2, 1, "", "get_pv"], [0, 2, 1, "", "get_raw_frames"], [0, 2, 1, "", "get_rb"], [0, 2, 1, "", "get_runnumber"], [0, 2, 1, "", "get_runstate"], [0, 2, 1, "", "get_sample_pars"], [0, 2, 1, "", "get_script_dir"], [0, 2, 1, "", "get_spectra_table"], [0, 2, 1, "", "get_spectra_tables"], [0, 2, 1, "", "get_spectrum"], [0, 2, 1, "", "get_spectrum_data"], [0, 2, 1, "", "get_spectrum_integrals"], [0, 2, 1, "", "get_tcb_settings"], [0, 2, 1, "", "get_time_since_begin"], [0, 2, 1, "", "get_title"], [0, 2, 1, "", "get_totalcounts"], [0, 2, 1, "", "get_uamps"], [0, 2, 1, "", "get_users"], [0, 2, 1, "", "get_version"], [0, 2, 1, "", "get_wiring_table"], [0, 2, 1, "", "get_wiring_tables"], [0, 2, 1, "", "integrate_spectrum"], [0, 2, 1, "", "load"], [0, 2, 1, "", "load_script"], [0, 2, 1, "", "pause"], [0, 2, 1, "", "plot_spectrum"], [0, 2, 1, "", "prefix_pv_name"], [0, 2, 1, "", "recover"], [0, 2, 1, "", "reload_current_config"], [0, 2, 1, "", "resume"], [0, 2, 1, "", "send_alert"], [0, 2, 1, "", "send_email"], [0, 2, 1, "", "send_sms"], [0, 2, 1, "", "set_dae_simulation_mode"], [0, 2, 1, "", "set_display_title"], [0, 2, 1, "", "set_instrument"], [0, 2, 1, "", "set_pv"], [0, 2, 1, "", "snapshot_crpt"], [0, 2, 1, "", "store"], [0, 2, 1, "", "update"], [0, 2, 1, "", "updatestore"], [0, 2, 1, "", "waitfor"], [0, 2, 1, "", "waitfor_block"], [0, 2, 1, "", "waitfor_frames"], [0, 2, 1, "", "waitfor_mevents"], [0, 2, 1, "", "waitfor_move"], [0, 2, 1, "", "waitfor_raw_frames"], [0, 2, 1, "", "waitfor_runstate"], [0, 2, 1, "", "waitfor_time"], [0, 2, 1, "", "waitfor_uamps"]], "genie_advanced": [[0, 2, 1, "", "assert_in_manager_mode"], [0, 2, 1, "", "get_exp_data"], [0, 2, 1, "", "get_instrument"], [0, 2, 1, "", "get_manager_mode"], [0, 2, 1, "", "get_pv_from_block"], [0, 2, 1, "", "get_spectrum_data"], [0, 2, 1, "", "motor_in_set_mode"], [0, 2, 1, "", "open_plot_window"], [0, 2, 1, "", "pv_exists"], [0, 2, 1, "", "redefine_motor_position"], [0, 2, 1, "", "set_abort_postcmd"], [0, 2, 1, "", "set_abort_precmd"], [0, 2, 1, "", "set_begin_postcmd"], [0, 2, 1, "", "set_begin_precmd"], [0, 2, 1, "", "set_dae_message_verbosity"], [0, 2, 1, "", "set_end_postcmd"], [0, 2, 1, "", "set_end_precmd"], [0, 2, 1, "", "set_pause_postcmd"], [0, 2, 1, "", "set_pause_precmd"], [0, 2, 1, "", "set_resume_postcmd"], [0, 2, 1, "", "set_resume_precmd"], [0, 2, 1, "", "wait_for_pv"]], "genie_alerts": [[0, 2, 1, "", "enable"], [0, 2, 1, "", "send"], [0, 2, 1, "", "set_email"], [0, 2, 1, "", "set_range"], [0, 2, 1, "", "set_sms"], [0, 2, 1, "", "status"]]}, "objnames": {"0": ["py", "module", "Python module"], "1": ["py", "class", "Python class"], "2": ["py", "function", "Python function"]}, "objtypes": {"0": "py:module", "1": "py:class", "2": "py:function"}, "terms": {"0": 0, "0004": 0, "1": 0, "10": 0, "100": 0, "1000": 0, "1001": 0, "101": 0, "11": 0, "110": 0, "115": 0, "123": 0, "123456": 0, "15": 0, "1st": 0, "2": 0, "200": 0, "2nd": 0, "3": 0, "30": 0, "300": 0, "3600": 0, "3rd": 0, "4": 0, "4000": 0, "5": 0, "50": 0, "5000": 0, "6": 0, "60": 0, "99": 0, "A": 0, "AND": 0, "For": 0, "If": 0, "NO": 0, "NOT": 0, "OR": 0, "Or": 0, "The": 0, "_cgetreturn": 0, "_getbeamlineparsreturn": 0, "_getdashboardreturn": 0, "_getexpdatareturn": 0, "_getsampleparsreturn": 0, "_getspectrumreturn": 0, "_scalartype_co": 0, "ab": 0, "abort": 0, "abort_postcmd": 0, "abort_precmd": 0, "about": 0, "access": 0, "acquisit": 0, "ad": 0, "address": 0, "advanc": 0, "after": 0, "alarm": 0, "alert": 0, "algorithm": 0, "all": 0, "amount": 0, "amp": 0, "an": 0, "ani": 0, "another_block": 0, "appli": 0, "ar": 0, "area": 0, "arg": 0, "argument": 0, "arrai": 0, "assert_in_manager_mod": 0, "associ": 0, "assum": 0, "automat": 0, "back": 0, "beamlin": 0, "becaus": 0, "been": 0, "befor": 0, "begin": 0, "begin_postcmd": 0, "begin_precmd": 0, "begun": 0, "between": 0, "bin": 0, "binari": 0, "block": 0, "block1": 0, "block2": 0, "block3": 0, "block_nam": 0, "blocknam": 0, "bool": 0, "boolean": 0, "boundari": 0, "c": 0, "call": 0, "callabl": 0, "can": 0, "cannot": 0, "card": 0, "carri": 0, "caution": 0, "cerenkov": 0, "certain": 0, "cget": 0, "chang": 0, "change_beamline_par": 0, "change_fermi_veto": 0, "change_finish": 0, "change_monitor": 0, "change_number_soft_period": 0, "change_period": 0, "change_rb": 0, "change_sample_par": 0, "change_script_dir": 0, "change_start": 0, "change_sync": 0, "change_t": 0, "change_tcb": 0, "change_tcb_fil": 0, "change_titl": 0, "change_us": 0, "change_veto": 0, "channel": 0, "charg": 0, "check": 0, "check_alarm": 0, "check_limit_viol": 0, "check_script": 0, "checker": 0, "choic": 0, "chopper": 0, "class": 0, "clearal": 0, "client": 0, "collect": 0, "combin": 0, "come": 0, "comma": 0, "commun": 0, "complet": 0, "comput": 0, "condit": 0, "config": 0, "configur": 0, "configure_internal_period": 0, "connect": 0, "connected_pvs_in_list": 0, "consid": 0, "consol": 0, "contain": 0, "content": 0, "context": 0, "control": 0, "correctli": 0, "count": 0, "creat": 0, "criteria": 0, "cset": 0, "cshow": 0, "current": 0, "dae": 0, "dai": 0, "daq": 0, "data": 0, "databas": 0, "datetim": 0, "default": 0, "defin": 0, "define_hard_period": 0, "delai": 0, "delay_in": 0, "delay_out": 0, "delet": 0, "demo": 0, "detail": 0, "detector": 0, "diagnost": 0, "dict": 0, "dictionari": 0, "dimens": 0, "directori": 0, "disk": 0, "displai": 0, "display_titl": 0, "dist": 0, "distribut": 0, "do": 0, "doe": 0, "don": 0, "dtype": 0, "dwell": 0, "e": 0, "each": 0, "early_exit": 0, "effici": 0, "either": 0, "email": 0, "emerson": 0, "emma": 0, "enabl": 0, "enable_hard_period": 0, "enable_soft_period": 0, "end": 0, "end_postcmd": 0, "end_precmd": 0, "ensur": 0, "enter": 0, "entri": 0, "etc": 0, "evalu": 0, "even": 0, "event": 0, "exampl": 0, "except": 0, "exclud": 0, "execut": 0, "exist": 0, "exit": 0, "exp_data": 0, "experi": 0, "expert": 0, "ext": 0, "ext0": 0, "ext1": 0, "ext2": 0, "ext3": 0, "extern": 0, "fact": 0, "fals": 0, "fermi": 0, "few": 0, "fifo": 0, "figur": 0, "file": 0, "filenam": 0, "finish": 0, "first": 0, "fit": 0, "flight": 0, "float": 0, "follow": 0, "format": 0, "found": 0, "fraction": 0, "frame": 0, "from": 0, "full": 0, "function": 0, "g": 0, "gener": 0, "geni": 0, "genie_advanc": 0, "genie_alert": 0, "get": 0, "get_beamline_par": 0, "get_block": 0, "get_block_unit": 0, "get_dae_simulation_mod": 0, "get_dashboard": 0, "get_datetim": 0, "get_detector_t": 0, "get_display_titl": 0, "get_ev": 0, "get_exp_data": 0, "get_fram": 0, "get_instru": 0, "get_manager_mod": 0, "get_mev": 0, "get_number_period": 0, "get_number_spectra": 0, "get_number_timechannel": 0, "get_period": 0, "get_period_fil": 0, "get_pv": 0, "get_pv_from_block": 0, "get_raw_fram": 0, "get_rb": 0, "get_runnumb": 0, "get_runst": 0, "get_sample_par": 0, "get_script_dir": 0, "get_spectra_t": 0, "get_spectrum": 0, "get_spectrum_data": 0, "get_spectrum_integr": 0, "get_tcb_set": 0, "get_time_since_begin": 0, "get_timedelta": 0, "get_titl": 0, "get_totalcount": 0, "get_uamp": 0, "get_us": 0, "get_vers": 0, "get_wiring_t": 0, "getsampleparsreturnmea": 0, "getsampleparsreturnscript": 0, "give": 0, "given": 0, "good": 0, "ha": 0, "haldan": 0, "hardwar": 0, "have": 0, "hh": 0, "high": 0, "highlimit": 0, "host": 0, "hour": 0, "hz": 0, "hz50": 0, "i": 0, "id": 0, "ignor": 0, "immedi": 0, "import": 0, "import_instrument_init": 0, "includ": 0, "infinit": 0, "inform": 0, "init": 0, "inst": 0, "instrument": 0, "int": 0, "integ": 0, "integr": 0, "integrate_spectrum": 0, "interest": 0, "intern": 0, "interrupt": 0, "interv": 0, "is_loc": 0, "is_primari": 0, "isi": 0, "issu": 0, "item": 0, "iter": 0, "jone": 0, "kosterlitz": 0, "kwarg": 0, "label": 0, "lake": 0, "lambda": 0, "leav": 0, "left": 0, "limit": 0, "list": 0, "load": 0, "load_script": 0, "loadscript": 0, "local": 0, "localhost": 0, "log": 0, "longer": 0, "look": 0, "loop": 0, "low": 0, "lower": 0, "lowlimit": 0, "m": 0, "mai": 0, "major": 0, "manag": 0, "manager_mod": 0, "map": 0, "match": 0, "maximum": 0, "maxwait": 0, "maxwaitsec": 0, "meas_id": 0, "meas_subid": 0, "meas_typ": 0, "measur": 0, "memori": 0, "messag": 0, "met": 0, "method": 0, "mevent": 0, "micro": 0, "microsecond": 0, "million": 0, "minor": 0, "minut": 0, "mm": 0, "mobil": 0, "mode": 0, "modul": 0, "monitor": 0, "month": 0, "more": 0, "most": 0, "motion": 0, "motor": 0, "motor_in_set_mod": 0, "move": 0, "move_timeout": 0, "movement": 0, "mtr0101": 0, "multipl": 0, "muon": 0, "must": 0, "my_snapshot": 0, "myblock": 0, "myblock_limit_reach": 0, "mydir": 0, "myperiod": 0, "name": 0, "nd": 0, "ndarrai": 0, "ndw1234": 0, "need": 0, "neutron": 0, "new": 0, "next": 0, "non": 0, "none": 0, "normal": 0, "note": 0, "notfounderror": 0, "now": 0, "nperiod": 0, "number": 0, "numer": 0, "numpi": 0, "object": 0, "occur": 0, "off": 0, "often": 0, "one": 0, "onexit": 0, "onli": 0, "open": 0, "open_plot_window": 0, "oper": 0, "option": 0, "order": 0, "other": 0, "otherwis": 0, "out": 0, "output": 0, "output_delai": 0, "palmer": 0, "par": 0, "param": 0, "paramet": 0, "particular": 0, "path": 0, "paus": 0, "pause_postcmd": 0, "pause_precmd": 0, "pause_run": 0, "perform": 0, "period": 0, "period_fil": 0, "phone": 0, "phone_num": 0, "physic": 0, "place": 0, "plot": 0, "plot_spectrum": 0, "possibl": 0, "post": 0, "pre": 0, "prefix": 0, "prefix_pv_nam": 0, "prepend": 0, "prepost": 0, "pretti": 0, "previou": 0, "primari": 0, "print": 0, "proport": 0, "put": 0, "pv": 0, "pv_exist": 0, "pv_list": 0, "pv_name": 0, "pv_prefix": 0, "python": 0, "quicker": 0, "quiet": 0, "quot": 0, "r": 0, "rais": 0, "random": 0, "rang": 0, "rather": 0, "raw": 0, "raw_fram": 0, "rb": 0, "reach": 0, "read": 0, "reason": 0, "receiv": 0, "recipi": 0, "recov": 0, "redefine_motor_posit": 0, "regim": 0, "region": 0, "reload": 0, "reload_current_config": 0, "remain": 0, "remot": 0, "remov": 0, "repeat": 0, "replac": 0, "report": 0, "respect": 0, "result": 0, "resum": 0, "resume_postcmd": 0, "resume_precmd": 0, "return": 0, "role": 0, "run": 0, "runcontrol": 0, "runstat": 0, "same": 0, "sampl": 0, "sample_id": 0, "screen": 0, "scrip": 0, "script": 0, "second": 0, "secondati": 0, "send": 0, "send_alert": 0, "send_email": 0, "send_sm": 0, "separ": 0, "sequenc": 0, "session": 0, "set": 0, "set_abort_postcmd": 0, "set_abort_precmd": 0, "set_begin_postcmd": 0, "set_begin_precmd": 0, "set_dae_message_verbos": 0, "set_dae_simulation_mod": 0, "set_display_titl": 0, "set_email": 0, "set_en": 0, "set_end_postcmd": 0, "set_end_precmd": 0, "set_instru": 0, "set_pause_postcmd": 0, "set_pause_precmd": 0, "set_pv": 0, "set_rang": 0, "set_resume_postcmd": 0, "set_resume_precmd": 0, "set_sm": 0, "setpoint": 0, "should": 0, "show": 0, "simul": 0, "sinc": 0, "singl": 0, "size": 0, "skip_required_runst": 0, "slit1": 0, "slit2": 0, "sm": 0, "smith": 0, "smp": 0, "snapshot": 0, "snapshot_crpt": 0, "so": 0, "soft": 0, "softwar": 0, "some_funct": 0, "sourc": 0, "spec": 0, "special": 0, "specif": 0, "specifi": 0, "spectra": 0, "spectrum": 0, "split": 0, "ss": 0, "standalon": 0, "start": 0, "start_timeout": 0, "state": 0, "statu": 0, "step": 0, "stop": 0, "store": 0, "str": 0, "string": 0, "sub": 0, "sum": 0, "suppli": 0, "suppress": 0, "switch": 0, "synchronis": 0, "t": 0, "t_max": 0, "t_min": 0, "tabl": 0, "take": 0, "target": 0, "tcbfile": 0, "team": 0, "tell": 0, "text": 0, "than": 0, "thei": 0, "thi": 0, "those": 0, "thouless": 0, "throw": 0, "thrown": 0, "time": 0, "time_bin": 0, "timedelta": 0, "timeout": 0, "titl": 0, "tmp": 0, "to_str": 0, "total": 0, "trang": 0, "trigger": 0, "true": 0, "try": 0, "ts1": 0, "ts2": 0, "tupl": 0, "turn": 0, "two": 0, "txt": 0, "type": 0, "uamp": 0, "unchang": 0, "underli": 0, "unit": 0, "unspecifi": 0, "until": 0, "unus": 0, "updat": 0, "updatestor": 0, "upper": 0, "us": 0, "use_numpi": 0, "user": 0, "valid": 0, "valu": 0, "verbos": 0, "version": 0, "veto": 0, "violat": 0, "wa": 0, "wai": 0, "wait": 0, "wait_al": 0, "wait_for_pv": 0, "waitfor": 0, "waitfor_block": 0, "waitfor_fram": 0, "waitfor_mev": 0, "waitfor_mov": 0, "waitfor_raw_fram": 0, "waitfor_runst": 0, "waitfor_tim": 0, "waitfor_uamp": 0, "want": 0, "warn": 0, "warnings_as_error": 0, "what": 0, "when": 0, "where": 0, "whether": 0, "which": 0, "whilst": 0, "who": 0, "why": 0, "width": 0, "window": 0, "wire": 0, "with_spec_zero": 0, "with_time_bin_zero": 0, "within": 0, "without": 0, "would": 0, "write": 0, "written": 0, "ye": 0, "year": 0, "yield": 0, "you": 0, "your": 0, "zero": 0}, "titles": ["Welcome to genie_python\u2019s documentation!"], "titleterms": {"": 0, "command": 0, "document": 0, "genie_python": 0, "welcom": 0}}) \ No newline at end of file