diff --git a/.nojekyll b/.nojekyll new file mode 100644 index 00000000..e69de29b diff --git a/_sources/about.rst.txt b/_sources/about.rst.txt new file mode 100644 index 00000000..9c23887e --- /dev/null +++ b/_sources/about.rst.txt @@ -0,0 +1,8 @@ +.. about credits, etc + + +Credits +======= + +The pilot version of this automatic documentation was constructed by Sameli Siljamo during his two-week work-life trainee period. + diff --git a/_sources/biot_savart.rst.txt b/_sources/biot_savart.rst.txt new file mode 100644 index 00000000..b0829b03 --- /dev/null +++ b/_sources/biot_savart.rst.txt @@ -0,0 +1,5 @@ +biot_savart +----------- + +.. automodule:: biot_savart + :members: \ No newline at end of file diff --git a/_sources/calculations.rst.txt b/_sources/calculations.rst.txt new file mode 100644 index 00000000..a9ac10db --- /dev/null +++ b/_sources/calculations.rst.txt @@ -0,0 +1,6 @@ +calculations +================================= + +.. automodule:: pytools.calculations + :members: + :imported-members: diff --git a/_sources/gics.rst.txt b/_sources/gics.rst.txt new file mode 100644 index 00000000..1dcdebf1 --- /dev/null +++ b/_sources/gics.rst.txt @@ -0,0 +1,5 @@ +gics +---- + +.. automodule:: gics + :members: \ No newline at end of file diff --git a/_sources/index.rst.txt b/_sources/index.rst.txt new file mode 100644 index 00000000..66d760c7 --- /dev/null +++ b/_sources/index.rst.txt @@ -0,0 +1,40 @@ +.. analysator documentation master file, created by + sphinx-quickstart on Tue Oct 29 10:43:26 2024. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + +analysator documentation +======================== + +.. .. image:: logo_color.png +.. :height: 37 +.. :width: 300 +.. :scale: 75 +.. :align: right +.. :alt: Vlasiator Logo + +`Analysator `_ is a set of Python tools and scripts used to read and analyze `Vlasiator `_ output files (`VLSV `_). Vlasiator and its related tools are developed at `University of Helsinki `_, and are open source. + + +This documentation is generated via Sphinx-autodoc from Analysator source. This page is a work in progress, with docstrings and the documentation layout in flux. Contributions via Analysator repo are welcome. + +Add your content using ``reStructuredText`` syntax. See the +`reStructuredText `_ +documentation for details. + +.. toctree:: + :maxdepth: 2 + :caption: Contents: + + plot + calculations + vlsvfile + miscellaneous + scripts + about + +.. automodule:: pytools + :members: + :imported-members: + :undoc-members: + diff --git a/_sources/magnetopause2d.rst.txt b/_sources/magnetopause2d.rst.txt new file mode 100644 index 00000000..8e1717f1 --- /dev/null +++ b/_sources/magnetopause2d.rst.txt @@ -0,0 +1,5 @@ +magnetopause2d +-------------- + +.. automodule:: magnetopause2d + :members: \ No newline at end of file diff --git a/_sources/magnetopause3d.rst.txt b/_sources/magnetopause3d.rst.txt new file mode 100644 index 00000000..7d90752f --- /dev/null +++ b/_sources/magnetopause3d.rst.txt @@ -0,0 +1,5 @@ +magnetopause3d +-------------- + +.. automodule:: magnetopause3d + :members: \ No newline at end of file diff --git a/_sources/miscellaneous.rst.txt b/_sources/miscellaneous.rst.txt new file mode 100644 index 00000000..7a7e9bf8 --- /dev/null +++ b/_sources/miscellaneous.rst.txt @@ -0,0 +1,6 @@ +miscellaneous +================================== + +.. automodule:: pytools.miscellaneous + :members: + :imported-members: diff --git a/_sources/plot.rst.txt b/_sources/plot.rst.txt new file mode 100644 index 00000000..f0b19c91 --- /dev/null +++ b/_sources/plot.rst.txt @@ -0,0 +1,8 @@ +plot +============================ + +.. automodule:: pytools.plot + :members: + :exclude-members: Version + :imported-members: + diff --git a/_sources/scripts.rst.txt b/_sources/scripts.rst.txt new file mode 100644 index 00000000..6da5198f --- /dev/null +++ b/_sources/scripts.rst.txt @@ -0,0 +1,70 @@ +scripts +===================== + +Scripts are not included in the main Analysator module import; instead, these are separate scripts utilising Analysator to some purpose. + +biot_savart +----------- +:doc:`biot_savart` + +.. automodule:: biot_savart + :no-index: + +------------ + +gics +---- +:doc:`gics` + +.. automodule:: gics + :no-index: + +------------ + +magnetopause2d +-------------- +:doc:`magnetopause2d` + +.. automodule:: magnetopause2d + :no-index: + +------------ + +magnetopause3d +-------------- +:doc:`magnetopause3d` + +.. automodule:: magnetopause3d + :no-index: + +------------ + +shue +-------------- +:doc:`shue` + +.. automodule:: shue + :no-index: + +------------ + +tsyganenko +-------------- +:doc:`tsyganenko` + +.. automodule:: tsyganenko + :no-index: + +------------ + +.. toctree:: + :maxdepth: 2 + :caption: Scripts: + + biot_savart + gics + magnetopause2d + magnetopause3d + shue + tsyganenko + diff --git a/_sources/shue.rst.txt b/_sources/shue.rst.txt new file mode 100644 index 00000000..362c0fa9 --- /dev/null +++ b/_sources/shue.rst.txt @@ -0,0 +1,5 @@ +shue +---- + +.. automodule:: shue + :members: \ No newline at end of file diff --git a/_sources/tsyganenko.rst.txt b/_sources/tsyganenko.rst.txt new file mode 100644 index 00000000..7804f48c --- /dev/null +++ b/_sources/tsyganenko.rst.txt @@ -0,0 +1,5 @@ +tsyganenko +---------- + +.. automodule:: tsyganenko + :members: \ No newline at end of file diff --git a/_sources/vlsvfile.rst.txt b/_sources/vlsvfile.rst.txt new file mode 100644 index 00000000..6fcf3ea2 --- /dev/null +++ b/_sources/vlsvfile.rst.txt @@ -0,0 +1,8 @@ +vlsvfile +============================ + +VlsvFile is responsibe for implementing read and write functionality for the vlsv format, as well as defining data reducers and reduction pipelines. Some of this will be likely moved around to be more modular in some indefinite point in the future. + +.. automodule:: pytools.vlsvfile + :members: + :imported-members: diff --git a/_static/_sphinx_javascript_frameworks_compat.js b/_static/_sphinx_javascript_frameworks_compat.js new file mode 100644 index 00000000..81415803 --- /dev/null +++ b/_static/_sphinx_javascript_frameworks_compat.js @@ -0,0 +1,123 @@ +/* Compatability shim for jQuery and underscores.js. + * + * Copyright Sphinx contributors + * Released under the two clause BSD licence + */ + +/** + * small helper function to urldecode strings + * + * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/decodeURIComponent#Decoding_query_parameters_from_a_URL + */ +jQuery.urldecode = function(x) { + if (!x) { + return x + } + return decodeURIComponent(x.replace(/\+/g, ' ')); +}; + +/** + * small helper function to urlencode strings + */ +jQuery.urlencode = encodeURIComponent; + +/** + * This function returns the parsed url parameters of the + * current request. Multiple values per key are supported, + * it will always return arrays of strings for the value parts. + */ +jQuery.getQueryParameters = function(s) { + if (typeof s === 'undefined') + s = document.location.search; + var parts = s.substr(s.indexOf('?') + 1).split('&'); + var result = {}; + for (var i = 0; i < parts.length; i++) { + var tmp = parts[i].split('=', 2); + var key = jQuery.urldecode(tmp[0]); + var value = jQuery.urldecode(tmp[1]); + if (key in result) + result[key].push(value); + else + result[key] = [value]; + } + return result; +}; + +/** + * highlight a given string on a jquery object by wrapping it in + * span elements with the given class name. + */ +jQuery.fn.highlightText = function(text, className) { + function highlight(node, addItems) { + if (node.nodeType === 3) { + var val = node.nodeValue; + var pos = val.toLowerCase().indexOf(text); + if (pos >= 0 && + !jQuery(node.parentNode).hasClass(className) && + !jQuery(node.parentNode).hasClass("nohighlight")) { + var span; + var isInSVG = jQuery(node).closest("body, svg, foreignObject").is("svg"); + if (isInSVG) { + span = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); + } else { + span = document.createElement("span"); + span.className = className; + } + span.appendChild(document.createTextNode(val.substr(pos, text.length))); + node.parentNode.insertBefore(span, node.parentNode.insertBefore( + document.createTextNode(val.substr(pos + text.length)), + node.nextSibling)); + node.nodeValue = val.substr(0, pos); + if (isInSVG) { + var rect = document.createElementNS("http://www.w3.org/2000/svg", "rect"); + var bbox = node.parentElement.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": node.parentNode, + "target": rect}); + } + } + } + else if (!jQuery(node).is("button, select, textarea")) { + jQuery.each(node.childNodes, function() { + highlight(this, addItems); + }); + } + } + var addItems = []; + var result = this.each(function() { + highlight(this, addItems); + }); + for (var i = 0; i < addItems.length; ++i) { + jQuery(addItems[i].parent).before(addItems[i].target); + } + return result; +}; + +/* + * backward compatibility for jQuery.browser + * This will be supported until firefox bug is fixed. + */ +if (!jQuery.browser) { + jQuery.uaMatch = function(ua) { + ua = ua.toLowerCase(); + + var match = /(chrome)[ \/]([\w.]+)/.exec(ua) || + /(webkit)[ \/]([\w.]+)/.exec(ua) || + /(opera)(?:.*version|)[ \/]([\w.]+)/.exec(ua) || + /(msie) ([\w.]+)/.exec(ua) || + ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec(ua) || + []; + + return { + browser: match[ 1 ] || "", + version: match[ 2 ] || "0" + }; + }; + jQuery.browser = {}; + jQuery.browser[jQuery.uaMatch(navigator.userAgent).browser] = true; +} 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/css/badge_only.css b/_static/css/badge_only.css new file mode 100644 index 00000000..88ba55b9 --- /dev/null +++ b/_static/css/badge_only.css @@ -0,0 +1 @@ +.clearfix{*zoom:1}.clearfix:after,.clearfix:before{display:table;content:""}.clearfix:after{clear:both}@font-face{font-family:FontAwesome;font-style:normal;font-weight:400;src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713?#iefix) format("embedded-opentype"),url(fonts/fontawesome-webfont.woff2?af7ae505a9eed503f8b8e6982036873e) format("woff2"),url(fonts/fontawesome-webfont.woff?fee66e712a8a08eef5805a46892932ad) format("woff"),url(fonts/fontawesome-webfont.ttf?b06871f281fee6b241d60582ae9369b9) format("truetype"),url(fonts/fontawesome-webfont.svg?912ec66d7572ff821749319396470bde#FontAwesome) format("svg")}.fa:before{font-family:FontAwesome;font-style:normal;font-weight:400;line-height:1}.fa:before,a .fa{text-decoration:inherit}.fa:before,a .fa,li .fa{display:inline-block}li .fa-large:before{width:1.875em}ul.fas{list-style-type:none;margin-left:2em;text-indent:-.8em}ul.fas li .fa{width:.8em}ul.fas li .fa-large:before{vertical-align:baseline}.fa-book:before,.icon-book:before{content:"\f02d"}.fa-caret-down:before,.icon-caret-down:before{content:"\f0d7"}.fa-caret-up:before,.icon-caret-up:before{content:"\f0d8"}.fa-caret-left:before,.icon-caret-left:before{content:"\f0d9"}.fa-caret-right:before,.icon-caret-right:before{content:"\f0da"}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1d1d;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;z-index:400}.rst-versions a{color:#2980b9;text-decoration:none}.rst-versions .rst-badge-small{display:none}.rst-versions .rst-current-version{padding:12px;background-color:#272525;display:block;text-align:right;font-size:90%;cursor:pointer;color:#27ae60}.rst-versions .rst-current-version:after{clear:both;content:"";display:block}.rst-versions .rst-current-version .fa{color:#fcfcfc}.rst-versions .rst-current-version .fa-book,.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version.rst-out-of-date{background-color:#e74c3c;color:#fff}.rst-versions .rst-current-version.rst-active-old-version{background-color:#f1c40f;color:#000}.rst-versions.shift-up{height:auto;max-height:100%;overflow-y:scroll}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:grey;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:1px solid #413d3d}.rst-versions .rst-other-versions dd{display:inline-block;margin:0}.rst-versions .rst-other-versions dd a{display:inline-block;padding:6px;color:#fcfcfc}.rst-versions .rst-other-versions .rtd-current-item{font-weight:700}.rst-versions.rst-badge{width:auto;bottom:20px;right:20px;left:auto;border:none;max-width:300px;max-height:90%}.rst-versions.rst-badge .fa-book,.rst-versions.rst-badge .icon-book{float:none;line-height:30px}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .fa-book,.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge>.rst-current-version{width:auto;height:30px;line-height:30px;padding:0 6px;display:block;text-align:center}@media screen and (max-width:768px){.rst-versions{width:85%;display:none}.rst-versions.shift{display:block}}#flyout-search-form{padding:6px} \ No newline at end of file diff --git a/_static/css/fonts/Roboto-Slab-Bold.woff b/_static/css/fonts/Roboto-Slab-Bold.woff new file mode 100644 index 00000000..6cb60000 Binary files /dev/null and b/_static/css/fonts/Roboto-Slab-Bold.woff differ diff --git a/_static/css/fonts/Roboto-Slab-Bold.woff2 b/_static/css/fonts/Roboto-Slab-Bold.woff2 new file mode 100644 index 00000000..7059e231 Binary files /dev/null and b/_static/css/fonts/Roboto-Slab-Bold.woff2 differ diff --git a/_static/css/fonts/Roboto-Slab-Regular.woff b/_static/css/fonts/Roboto-Slab-Regular.woff new file mode 100644 index 00000000..f815f63f Binary files /dev/null and b/_static/css/fonts/Roboto-Slab-Regular.woff differ diff --git a/_static/css/fonts/Roboto-Slab-Regular.woff2 b/_static/css/fonts/Roboto-Slab-Regular.woff2 new file mode 100644 index 00000000..f2c76e5b Binary files /dev/null and b/_static/css/fonts/Roboto-Slab-Regular.woff2 differ diff --git a/_static/css/fonts/fontawesome-webfont.eot b/_static/css/fonts/fontawesome-webfont.eot new file mode 100644 index 00000000..e9f60ca9 Binary files /dev/null and b/_static/css/fonts/fontawesome-webfont.eot differ diff --git a/_static/css/fonts/fontawesome-webfont.svg b/_static/css/fonts/fontawesome-webfont.svg new file mode 100644 index 00000000..855c845e --- /dev/null +++ b/_static/css/fonts/fontawesome-webfont.svg @@ -0,0 +1,2671 @@ + + + + +Created by FontForge 20120731 at Mon Oct 24 17:37:40 2016 + By ,,, +Copyright Dave Gandy 2016. All rights reserved. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/_static/css/fonts/fontawesome-webfont.ttf b/_static/css/fonts/fontawesome-webfont.ttf new file mode 100644 index 00000000..35acda2f Binary files /dev/null and b/_static/css/fonts/fontawesome-webfont.ttf differ diff --git a/_static/css/fonts/fontawesome-webfont.woff b/_static/css/fonts/fontawesome-webfont.woff new file mode 100644 index 00000000..400014a4 Binary files /dev/null and b/_static/css/fonts/fontawesome-webfont.woff differ diff --git a/_static/css/fonts/fontawesome-webfont.woff2 b/_static/css/fonts/fontawesome-webfont.woff2 new file mode 100644 index 00000000..4d13fc60 Binary files /dev/null and b/_static/css/fonts/fontawesome-webfont.woff2 differ diff --git a/_static/css/fonts/lato-bold-italic.woff b/_static/css/fonts/lato-bold-italic.woff new file mode 100644 index 00000000..88ad05b9 Binary files /dev/null and b/_static/css/fonts/lato-bold-italic.woff differ diff --git a/_static/css/fonts/lato-bold-italic.woff2 b/_static/css/fonts/lato-bold-italic.woff2 new file mode 100644 index 00000000..c4e3d804 Binary files /dev/null and b/_static/css/fonts/lato-bold-italic.woff2 differ diff --git a/_static/css/fonts/lato-bold.woff b/_static/css/fonts/lato-bold.woff new file mode 100644 index 00000000..c6dff51f Binary files /dev/null and b/_static/css/fonts/lato-bold.woff differ diff --git a/_static/css/fonts/lato-bold.woff2 b/_static/css/fonts/lato-bold.woff2 new file mode 100644 index 00000000..bb195043 Binary files /dev/null and b/_static/css/fonts/lato-bold.woff2 differ diff --git a/_static/css/fonts/lato-normal-italic.woff b/_static/css/fonts/lato-normal-italic.woff new file mode 100644 index 00000000..76114bc0 Binary files /dev/null and b/_static/css/fonts/lato-normal-italic.woff differ diff --git a/_static/css/fonts/lato-normal-italic.woff2 b/_static/css/fonts/lato-normal-italic.woff2 new file mode 100644 index 00000000..3404f37e Binary files /dev/null and b/_static/css/fonts/lato-normal-italic.woff2 differ diff --git a/_static/css/fonts/lato-normal.woff b/_static/css/fonts/lato-normal.woff new file mode 100644 index 00000000..ae1307ff Binary files /dev/null and b/_static/css/fonts/lato-normal.woff differ diff --git a/_static/css/fonts/lato-normal.woff2 b/_static/css/fonts/lato-normal.woff2 new file mode 100644 index 00000000..3bf98433 Binary files /dev/null and b/_static/css/fonts/lato-normal.woff2 differ diff --git a/_static/css/theme.css b/_static/css/theme.css new file mode 100644 index 00000000..0f14f106 --- /dev/null +++ b/_static/css/theme.css @@ -0,0 +1,4 @@ +html{box-sizing:border-box}*,:after,:before{box-sizing:inherit}article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block}audio,canvas,video{display:inline-block;*display:inline;*zoom:1}[hidden],audio:not([controls]){display:none}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}blockquote{margin:0}dfn{font-style:italic}ins{background:#ff9;text-decoration:none}ins,mark{color:#000}mark{background:#ff0;font-style:italic;font-weight:700}.rst-content code,.rst-content tt,code,kbd,pre,samp{font-family:monospace,serif;_font-family:courier new,monospace;font-size:1em}pre{white-space:pre}q{quotes:none}q:after,q:before{content:"";content:none}small{font-size:85%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}dl,ol,ul{margin:0;padding:0;list-style:none;list-style-image:none}li{list-style:none}dd{margin:0}img{border:0;-ms-interpolation-mode:bicubic;vertical-align:middle;max-width:100%}svg:not(:root){overflow:hidden}figure,form{margin:0}label{cursor:pointer}button,input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle}button,input{line-height:normal}button,input[type=button],input[type=reset],input[type=submit]{cursor:pointer;-webkit-appearance:button;*overflow:visible}button[disabled],input[disabled]{cursor:default}input[type=search]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}textarea{resize:vertical}table{border-collapse:collapse;border-spacing:0}td{vertical-align:top}.chromeframe{margin:.2em 0;background:#ccc;color:#000;padding:.2em 0}.ir{display:block;border:0;text-indent:-999em;overflow:hidden;background-color:transparent;background-repeat:no-repeat;text-align:left;direction:ltr;*line-height:0}.ir br{display:none}.hidden{display:none!important;visibility:hidden}.visuallyhidden{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.visuallyhidden.focusable:active,.visuallyhidden.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.invisible{visibility:hidden}.relative{position:relative}big,small{font-size:100%}@media print{body,html,section{background:none!important}*{box-shadow:none!important;text-shadow:none!important;filter:none!important;-ms-filter:none!important}a,a:visited{text-decoration:underline}.ir a:after,a[href^="#"]:after,a[href^="javascript:"]:after{content:""}blockquote,pre{page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}@page{margin:.5cm}.rst-content .toctree-wrapper>p.caption,h2,h3,p{orphans:3;widows:3}.rst-content .toctree-wrapper>p.caption,h2,h3{page-break-after:avoid}}.btn,.fa:before,.icon:before,.rst-content .admonition,.rst-content .admonition-title:before,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .code-block-caption .headerlink:before,.rst-content .danger,.rst-content .eqno .headerlink:before,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning,.rst-content code.download span:first-child:before,.rst-content dl dt .headerlink:before,.rst-content h1 .headerlink:before,.rst-content h2 .headerlink:before,.rst-content h3 .headerlink:before,.rst-content h4 .headerlink:before,.rst-content h5 .headerlink:before,.rst-content h6 .headerlink:before,.rst-content p.caption .headerlink:before,.rst-content p .headerlink:before,.rst-content table>caption .headerlink:before,.rst-content tt.download span:first-child:before,.wy-alert,.wy-dropdown .caret:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before,.wy-menu-vertical li button.toctree-expand:before,input[type=color],input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week],select,textarea{-webkit-font-smoothing:antialiased}.clearfix{*zoom:1}.clearfix:after,.clearfix:before{display:table;content:""}.clearfix:after{clear:both}/*! + * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome + * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) + */@font-face{font-family:FontAwesome;src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713);src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713?#iefix&v=4.7.0) format("embedded-opentype"),url(fonts/fontawesome-webfont.woff2?af7ae505a9eed503f8b8e6982036873e) format("woff2"),url(fonts/fontawesome-webfont.woff?fee66e712a8a08eef5805a46892932ad) format("woff"),url(fonts/fontawesome-webfont.ttf?b06871f281fee6b241d60582ae9369b9) format("truetype"),url(fonts/fontawesome-webfont.svg?912ec66d7572ff821749319396470bde#fontawesomeregular) format("svg");font-weight:400;font-style:normal}.fa,.icon,.rst-content .admonition-title,.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content code.download span:first-child,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink,.rst-content tt.download span:first-child,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li button.toctree-expand{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14286em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14286em;width:2.14286em;top:.14286em;text-align:center}.fa-li.fa-lg{left:-1.85714em}.fa-border{padding:.2em .25em .15em;border:.08em solid #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa-pull-left.icon,.fa.fa-pull-left,.rst-content .code-block-caption .fa-pull-left.headerlink,.rst-content .eqno .fa-pull-left.headerlink,.rst-content .fa-pull-left.admonition-title,.rst-content code.download span.fa-pull-left:first-child,.rst-content dl dt .fa-pull-left.headerlink,.rst-content h1 .fa-pull-left.headerlink,.rst-content h2 .fa-pull-left.headerlink,.rst-content h3 .fa-pull-left.headerlink,.rst-content h4 .fa-pull-left.headerlink,.rst-content h5 .fa-pull-left.headerlink,.rst-content h6 .fa-pull-left.headerlink,.rst-content p .fa-pull-left.headerlink,.rst-content table>caption .fa-pull-left.headerlink,.rst-content tt.download span.fa-pull-left:first-child,.wy-menu-vertical li.current>a button.fa-pull-left.toctree-expand,.wy-menu-vertical li.on a button.fa-pull-left.toctree-expand,.wy-menu-vertical li button.fa-pull-left.toctree-expand{margin-right:.3em}.fa-pull-right.icon,.fa.fa-pull-right,.rst-content .code-block-caption .fa-pull-right.headerlink,.rst-content .eqno .fa-pull-right.headerlink,.rst-content .fa-pull-right.admonition-title,.rst-content code.download span.fa-pull-right:first-child,.rst-content dl dt .fa-pull-right.headerlink,.rst-content h1 .fa-pull-right.headerlink,.rst-content h2 .fa-pull-right.headerlink,.rst-content h3 .fa-pull-right.headerlink,.rst-content h4 .fa-pull-right.headerlink,.rst-content h5 .fa-pull-right.headerlink,.rst-content h6 .fa-pull-right.headerlink,.rst-content p .fa-pull-right.headerlink,.rst-content table>caption .fa-pull-right.headerlink,.rst-content tt.download span.fa-pull-right:first-child,.wy-menu-vertical li.current>a button.fa-pull-right.toctree-expand,.wy-menu-vertical li.on a button.fa-pull-right.toctree-expand,.wy-menu-vertical li button.fa-pull-right.toctree-expand{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left,.pull-left.icon,.rst-content .code-block-caption .pull-left.headerlink,.rst-content .eqno .pull-left.headerlink,.rst-content .pull-left.admonition-title,.rst-content code.download span.pull-left:first-child,.rst-content dl dt .pull-left.headerlink,.rst-content h1 .pull-left.headerlink,.rst-content h2 .pull-left.headerlink,.rst-content h3 .pull-left.headerlink,.rst-content h4 .pull-left.headerlink,.rst-content h5 .pull-left.headerlink,.rst-content h6 .pull-left.headerlink,.rst-content p .pull-left.headerlink,.rst-content table>caption .pull-left.headerlink,.rst-content tt.download span.pull-left:first-child,.wy-menu-vertical li.current>a button.pull-left.toctree-expand,.wy-menu-vertical li.on a button.pull-left.toctree-expand,.wy-menu-vertical li button.pull-left.toctree-expand{margin-right:.3em}.fa.pull-right,.pull-right.icon,.rst-content .code-block-caption .pull-right.headerlink,.rst-content .eqno .pull-right.headerlink,.rst-content .pull-right.admonition-title,.rst-content code.download span.pull-right:first-child,.rst-content dl dt .pull-right.headerlink,.rst-content h1 .pull-right.headerlink,.rst-content h2 .pull-right.headerlink,.rst-content h3 .pull-right.headerlink,.rst-content h4 .pull-right.headerlink,.rst-content h5 .pull-right.headerlink,.rst-content h6 .pull-right.headerlink,.rst-content p .pull-right.headerlink,.rst-content table>caption .pull-right.headerlink,.rst-content tt.download span.pull-right:first-child,.wy-menu-vertical li.current>a button.pull-right.toctree-expand,.wy-menu-vertical li.on a button.pull-right.toctree-expand,.wy-menu-vertical li button.pull-right.toctree-expand{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s linear infinite;animation:fa-spin 2s linear infinite}.fa-pulse{-webkit-animation:fa-spin 1s steps(8) infinite;animation:fa-spin 1s steps(8) infinite}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scaleX(-1);-ms-transform:scaleX(-1);transform:scaleX(-1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scaleY(-1);-ms-transform:scaleY(-1);transform:scaleY(-1)}:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:""}.fa-music:before{content:""}.fa-search:before,.icon-search:before{content:""}.fa-envelope-o:before{content:""}.fa-heart:before{content:""}.fa-star:before{content:""}.fa-star-o:before{content:""}.fa-user:before{content:""}.fa-film:before{content:""}.fa-th-large:before{content:""}.fa-th:before{content:""}.fa-th-list:before{content:""}.fa-check:before{content:""}.fa-close:before,.fa-remove:before,.fa-times:before{content:""}.fa-search-plus:before{content:""}.fa-search-minus:before{content:""}.fa-power-off:before{content:""}.fa-signal:before{content:""}.fa-cog:before,.fa-gear:before{content:""}.fa-trash-o:before{content:""}.fa-home:before,.icon-home:before{content:""}.fa-file-o:before{content:""}.fa-clock-o:before{content:""}.fa-road:before{content:""}.fa-download:before,.rst-content code.download span:first-child:before,.rst-content tt.download span:first-child:before{content:""}.fa-arrow-circle-o-down:before{content:""}.fa-arrow-circle-o-up:before{content:""}.fa-inbox:before{content:""}.fa-play-circle-o:before{content:""}.fa-repeat:before,.fa-rotate-right:before{content:""}.fa-refresh:before{content:""}.fa-list-alt:before{content:""}.fa-lock:before{content:""}.fa-flag:before{content:""}.fa-headphones:before{content:""}.fa-volume-off:before{content:""}.fa-volume-down:before{content:""}.fa-volume-up:before{content:""}.fa-qrcode:before{content:""}.fa-barcode:before{content:""}.fa-tag:before{content:""}.fa-tags:before{content:""}.fa-book:before,.icon-book:before{content:""}.fa-bookmark:before{content:""}.fa-print:before{content:""}.fa-camera:before{content:""}.fa-font:before{content:""}.fa-bold:before{content:""}.fa-italic:before{content:""}.fa-text-height:before{content:""}.fa-text-width:before{content:""}.fa-align-left:before{content:""}.fa-align-center:before{content:""}.fa-align-right:before{content:""}.fa-align-justify:before{content:""}.fa-list:before{content:""}.fa-dedent:before,.fa-outdent:before{content:""}.fa-indent:before{content:""}.fa-video-camera:before{content:""}.fa-image:before,.fa-photo:before,.fa-picture-o:before{content:""}.fa-pencil:before{content:""}.fa-map-marker:before{content:""}.fa-adjust:before{content:""}.fa-tint:before{content:""}.fa-edit:before,.fa-pencil-square-o:before{content:""}.fa-share-square-o:before{content:""}.fa-check-square-o:before{content:""}.fa-arrows:before{content:""}.fa-step-backward:before{content:""}.fa-fast-backward:before{content:""}.fa-backward:before{content:""}.fa-play:before{content:""}.fa-pause:before{content:""}.fa-stop:before{content:""}.fa-forward:before{content:""}.fa-fast-forward:before{content:""}.fa-step-forward:before{content:""}.fa-eject:before{content:""}.fa-chevron-left:before{content:""}.fa-chevron-right:before{content:""}.fa-plus-circle:before{content:""}.fa-minus-circle:before{content:""}.fa-times-circle:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before{content:""}.fa-check-circle:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before{content:""}.fa-question-circle:before{content:""}.fa-info-circle:before{content:""}.fa-crosshairs:before{content:""}.fa-times-circle-o:before{content:""}.fa-check-circle-o:before{content:""}.fa-ban:before{content:""}.fa-arrow-left:before{content:""}.fa-arrow-right:before{content:""}.fa-arrow-up:before{content:""}.fa-arrow-down:before{content:""}.fa-mail-forward:before,.fa-share:before{content:""}.fa-expand:before{content:""}.fa-compress:before{content:""}.fa-plus:before{content:""}.fa-minus:before{content:""}.fa-asterisk:before{content:""}.fa-exclamation-circle:before,.rst-content .admonition-title:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before{content:""}.fa-gift:before{content:""}.fa-leaf:before{content:""}.fa-fire:before,.icon-fire:before{content:""}.fa-eye:before{content:""}.fa-eye-slash:before{content:""}.fa-exclamation-triangle:before,.fa-warning:before{content:""}.fa-plane:before{content:""}.fa-calendar:before{content:""}.fa-random:before{content:""}.fa-comment:before{content:""}.fa-magnet:before{content:""}.fa-chevron-up:before{content:""}.fa-chevron-down:before{content:""}.fa-retweet:before{content:""}.fa-shopping-cart:before{content:""}.fa-folder:before{content:""}.fa-folder-open:before{content:""}.fa-arrows-v:before{content:""}.fa-arrows-h:before{content:""}.fa-bar-chart-o:before,.fa-bar-chart:before{content:""}.fa-twitter-square:before{content:""}.fa-facebook-square:before{content:""}.fa-camera-retro:before{content:""}.fa-key:before{content:""}.fa-cogs:before,.fa-gears:before{content:""}.fa-comments:before{content:""}.fa-thumbs-o-up:before{content:""}.fa-thumbs-o-down:before{content:""}.fa-star-half:before{content:""}.fa-heart-o:before{content:""}.fa-sign-out:before{content:""}.fa-linkedin-square:before{content:""}.fa-thumb-tack:before{content:""}.fa-external-link:before{content:""}.fa-sign-in:before{content:""}.fa-trophy:before{content:""}.fa-github-square:before{content:""}.fa-upload:before{content:""}.fa-lemon-o:before{content:""}.fa-phone:before{content:""}.fa-square-o:before{content:""}.fa-bookmark-o:before{content:""}.fa-phone-square:before{content:""}.fa-twitter:before{content:""}.fa-facebook-f:before,.fa-facebook:before{content:""}.fa-github:before,.icon-github:before{content:""}.fa-unlock:before{content:""}.fa-credit-card:before{content:""}.fa-feed:before,.fa-rss:before{content:""}.fa-hdd-o:before{content:""}.fa-bullhorn:before{content:""}.fa-bell:before{content:""}.fa-certificate:before{content:""}.fa-hand-o-right:before{content:""}.fa-hand-o-left:before{content:""}.fa-hand-o-up:before{content:""}.fa-hand-o-down:before{content:""}.fa-arrow-circle-left:before,.icon-circle-arrow-left:before{content:""}.fa-arrow-circle-right:before,.icon-circle-arrow-right:before{content:""}.fa-arrow-circle-up:before{content:""}.fa-arrow-circle-down:before{content:""}.fa-globe:before{content:""}.fa-wrench:before{content:""}.fa-tasks:before{content:""}.fa-filter:before{content:""}.fa-briefcase:before{content:""}.fa-arrows-alt:before{content:""}.fa-group:before,.fa-users:before{content:""}.fa-chain:before,.fa-link:before,.icon-link:before{content:""}.fa-cloud:before{content:""}.fa-flask:before{content:""}.fa-cut:before,.fa-scissors:before{content:""}.fa-copy:before,.fa-files-o:before{content:""}.fa-paperclip:before{content:""}.fa-floppy-o:before,.fa-save:before{content:""}.fa-square:before{content:""}.fa-bars:before,.fa-navicon:before,.fa-reorder:before{content:""}.fa-list-ul:before{content:""}.fa-list-ol:before{content:""}.fa-strikethrough:before{content:""}.fa-underline:before{content:""}.fa-table:before{content:""}.fa-magic:before{content:""}.fa-truck:before{content:""}.fa-pinterest:before{content:""}.fa-pinterest-square:before{content:""}.fa-google-plus-square:before{content:""}.fa-google-plus:before{content:""}.fa-money:before{content:""}.fa-caret-down:before,.icon-caret-down:before,.wy-dropdown .caret:before{content:""}.fa-caret-up:before{content:""}.fa-caret-left:before{content:""}.fa-caret-right:before{content:""}.fa-columns:before{content:""}.fa-sort:before,.fa-unsorted:before{content:""}.fa-sort-desc:before,.fa-sort-down:before{content:""}.fa-sort-asc:before,.fa-sort-up:before{content:""}.fa-envelope:before{content:""}.fa-linkedin:before{content:""}.fa-rotate-left:before,.fa-undo:before{content:""}.fa-gavel:before,.fa-legal:before{content:""}.fa-dashboard:before,.fa-tachometer:before{content:""}.fa-comment-o:before{content:""}.fa-comments-o:before{content:""}.fa-bolt:before,.fa-flash:before{content:""}.fa-sitemap:before{content:""}.fa-umbrella:before{content:""}.fa-clipboard:before,.fa-paste:before{content:""}.fa-lightbulb-o:before{content:""}.fa-exchange:before{content:""}.fa-cloud-download:before{content:""}.fa-cloud-upload:before{content:""}.fa-user-md:before{content:""}.fa-stethoscope:before{content:""}.fa-suitcase:before{content:""}.fa-bell-o:before{content:""}.fa-coffee:before{content:""}.fa-cutlery:before{content:""}.fa-file-text-o:before{content:""}.fa-building-o:before{content:""}.fa-hospital-o:before{content:""}.fa-ambulance:before{content:""}.fa-medkit:before{content:""}.fa-fighter-jet:before{content:""}.fa-beer:before{content:""}.fa-h-square:before{content:""}.fa-plus-square:before{content:""}.fa-angle-double-left:before{content:""}.fa-angle-double-right:before{content:""}.fa-angle-double-up:before{content:""}.fa-angle-double-down:before{content:""}.fa-angle-left:before{content:""}.fa-angle-right:before{content:""}.fa-angle-up:before{content:""}.fa-angle-down:before{content:""}.fa-desktop:before{content:""}.fa-laptop:before{content:""}.fa-tablet:before{content:""}.fa-mobile-phone:before,.fa-mobile:before{content:""}.fa-circle-o:before{content:""}.fa-quote-left:before{content:""}.fa-quote-right:before{content:""}.fa-spinner:before{content:""}.fa-circle:before{content:""}.fa-mail-reply:before,.fa-reply:before{content:""}.fa-github-alt:before{content:""}.fa-folder-o:before{content:""}.fa-folder-open-o:before{content:""}.fa-smile-o:before{content:""}.fa-frown-o:before{content:""}.fa-meh-o:before{content:""}.fa-gamepad:before{content:""}.fa-keyboard-o:before{content:""}.fa-flag-o:before{content:""}.fa-flag-checkered:before{content:""}.fa-terminal:before{content:""}.fa-code:before{content:""}.fa-mail-reply-all:before,.fa-reply-all:before{content:""}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:""}.fa-location-arrow:before{content:""}.fa-crop:before{content:""}.fa-code-fork:before{content:""}.fa-chain-broken:before,.fa-unlink:before{content:""}.fa-question:before{content:""}.fa-info:before{content:""}.fa-exclamation:before{content:""}.fa-superscript:before{content:""}.fa-subscript:before{content:""}.fa-eraser:before{content:""}.fa-puzzle-piece:before{content:""}.fa-microphone:before{content:""}.fa-microphone-slash:before{content:""}.fa-shield:before{content:""}.fa-calendar-o:before{content:""}.fa-fire-extinguisher:before{content:""}.fa-rocket:before{content:""}.fa-maxcdn:before{content:""}.fa-chevron-circle-left:before{content:""}.fa-chevron-circle-right:before{content:""}.fa-chevron-circle-up:before{content:""}.fa-chevron-circle-down:before{content:""}.fa-html5:before{content:""}.fa-css3:before{content:""}.fa-anchor:before{content:""}.fa-unlock-alt:before{content:""}.fa-bullseye:before{content:""}.fa-ellipsis-h:before{content:""}.fa-ellipsis-v:before{content:""}.fa-rss-square:before{content:""}.fa-play-circle:before{content:""}.fa-ticket:before{content:""}.fa-minus-square:before{content:""}.fa-minus-square-o:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before{content:""}.fa-level-up:before{content:""}.fa-level-down:before{content:""}.fa-check-square:before{content:""}.fa-pencil-square:before{content:""}.fa-external-link-square:before{content:""}.fa-share-square:before{content:""}.fa-compass:before{content:""}.fa-caret-square-o-down:before,.fa-toggle-down:before{content:""}.fa-caret-square-o-up:before,.fa-toggle-up:before{content:""}.fa-caret-square-o-right:before,.fa-toggle-right:before{content:""}.fa-eur:before,.fa-euro:before{content:""}.fa-gbp:before{content:""}.fa-dollar:before,.fa-usd:before{content:""}.fa-inr:before,.fa-rupee:before{content:""}.fa-cny:before,.fa-jpy:before,.fa-rmb:before,.fa-yen:before{content:""}.fa-rouble:before,.fa-rub:before,.fa-ruble:before{content:""}.fa-krw:before,.fa-won:before{content:""}.fa-bitcoin:before,.fa-btc:before{content:""}.fa-file:before{content:""}.fa-file-text:before{content:""}.fa-sort-alpha-asc:before{content:""}.fa-sort-alpha-desc:before{content:""}.fa-sort-amount-asc:before{content:""}.fa-sort-amount-desc:before{content:""}.fa-sort-numeric-asc:before{content:""}.fa-sort-numeric-desc:before{content:""}.fa-thumbs-up:before{content:""}.fa-thumbs-down:before{content:""}.fa-youtube-square:before{content:""}.fa-youtube:before{content:""}.fa-xing:before{content:""}.fa-xing-square:before{content:""}.fa-youtube-play:before{content:""}.fa-dropbox:before{content:""}.fa-stack-overflow:before{content:""}.fa-instagram:before{content:""}.fa-flickr:before{content:""}.fa-adn:before{content:""}.fa-bitbucket:before,.icon-bitbucket:before{content:""}.fa-bitbucket-square:before{content:""}.fa-tumblr:before{content:""}.fa-tumblr-square:before{content:""}.fa-long-arrow-down:before{content:""}.fa-long-arrow-up:before{content:""}.fa-long-arrow-left:before{content:""}.fa-long-arrow-right:before{content:""}.fa-apple:before{content:""}.fa-windows:before{content:""}.fa-android:before{content:""}.fa-linux:before{content:""}.fa-dribbble:before{content:""}.fa-skype:before{content:""}.fa-foursquare:before{content:""}.fa-trello:before{content:""}.fa-female:before{content:""}.fa-male:before{content:""}.fa-gittip:before,.fa-gratipay:before{content:""}.fa-sun-o:before{content:""}.fa-moon-o:before{content:""}.fa-archive:before{content:""}.fa-bug:before{content:""}.fa-vk:before{content:""}.fa-weibo:before{content:""}.fa-renren:before{content:""}.fa-pagelines:before{content:""}.fa-stack-exchange:before{content:""}.fa-arrow-circle-o-right:before{content:""}.fa-arrow-circle-o-left:before{content:""}.fa-caret-square-o-left:before,.fa-toggle-left:before{content:""}.fa-dot-circle-o:before{content:""}.fa-wheelchair:before{content:""}.fa-vimeo-square:before{content:""}.fa-try:before,.fa-turkish-lira:before{content:""}.fa-plus-square-o:before,.wy-menu-vertical li button.toctree-expand:before{content:""}.fa-space-shuttle:before{content:""}.fa-slack:before{content:""}.fa-envelope-square:before{content:""}.fa-wordpress:before{content:""}.fa-openid:before{content:""}.fa-bank:before,.fa-institution:before,.fa-university:before{content:""}.fa-graduation-cap:before,.fa-mortar-board:before{content:""}.fa-yahoo:before{content:""}.fa-google:before{content:""}.fa-reddit:before{content:""}.fa-reddit-square:before{content:""}.fa-stumbleupon-circle:before{content:""}.fa-stumbleupon:before{content:""}.fa-delicious:before{content:""}.fa-digg:before{content:""}.fa-pied-piper-pp:before{content:""}.fa-pied-piper-alt:before{content:""}.fa-drupal:before{content:""}.fa-joomla:before{content:""}.fa-language:before{content:""}.fa-fax:before{content:""}.fa-building:before{content:""}.fa-child:before{content:""}.fa-paw:before{content:""}.fa-spoon:before{content:""}.fa-cube:before{content:""}.fa-cubes:before{content:""}.fa-behance:before{content:""}.fa-behance-square:before{content:""}.fa-steam:before{content:""}.fa-steam-square:before{content:""}.fa-recycle:before{content:""}.fa-automobile:before,.fa-car:before{content:""}.fa-cab:before,.fa-taxi:before{content:""}.fa-tree:before{content:""}.fa-spotify:before{content:""}.fa-deviantart:before{content:""}.fa-soundcloud:before{content:""}.fa-database:before{content:""}.fa-file-pdf-o:before{content:""}.fa-file-word-o:before{content:""}.fa-file-excel-o:before{content:""}.fa-file-powerpoint-o:before{content:""}.fa-file-image-o:before,.fa-file-photo-o:before,.fa-file-picture-o:before{content:""}.fa-file-archive-o:before,.fa-file-zip-o:before{content:""}.fa-file-audio-o:before,.fa-file-sound-o:before{content:""}.fa-file-movie-o:before,.fa-file-video-o:before{content:""}.fa-file-code-o:before{content:""}.fa-vine:before{content:""}.fa-codepen:before{content:""}.fa-jsfiddle:before{content:""}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-ring:before,.fa-life-saver:before,.fa-support:before{content:""}.fa-circle-o-notch:before{content:""}.fa-ra:before,.fa-rebel:before,.fa-resistance:before{content:""}.fa-empire:before,.fa-ge:before{content:""}.fa-git-square:before{content:""}.fa-git:before{content:""}.fa-hacker-news:before,.fa-y-combinator-square:before,.fa-yc-square:before{content:""}.fa-tencent-weibo:before{content:""}.fa-qq:before{content:""}.fa-wechat:before,.fa-weixin:before{content:""}.fa-paper-plane:before,.fa-send:before{content:""}.fa-paper-plane-o:before,.fa-send-o:before{content:""}.fa-history:before{content:""}.fa-circle-thin:before{content:""}.fa-header:before{content:""}.fa-paragraph:before{content:""}.fa-sliders:before{content:""}.fa-share-alt:before{content:""}.fa-share-alt-square:before{content:""}.fa-bomb:before{content:""}.fa-futbol-o:before,.fa-soccer-ball-o:before{content:""}.fa-tty:before{content:""}.fa-binoculars:before{content:""}.fa-plug:before{content:""}.fa-slideshare:before{content:""}.fa-twitch:before{content:""}.fa-yelp:before{content:""}.fa-newspaper-o:before{content:""}.fa-wifi:before{content:""}.fa-calculator:before{content:""}.fa-paypal:before{content:""}.fa-google-wallet:before{content:""}.fa-cc-visa:before{content:""}.fa-cc-mastercard:before{content:""}.fa-cc-discover:before{content:""}.fa-cc-amex:before{content:""}.fa-cc-paypal:before{content:""}.fa-cc-stripe:before{content:""}.fa-bell-slash:before{content:""}.fa-bell-slash-o:before{content:""}.fa-trash:before{content:""}.fa-copyright:before{content:""}.fa-at:before{content:""}.fa-eyedropper:before{content:""}.fa-paint-brush:before{content:""}.fa-birthday-cake:before{content:""}.fa-area-chart:before{content:""}.fa-pie-chart:before{content:""}.fa-line-chart:before{content:""}.fa-lastfm:before{content:""}.fa-lastfm-square:before{content:""}.fa-toggle-off:before{content:""}.fa-toggle-on:before{content:""}.fa-bicycle:before{content:""}.fa-bus:before{content:""}.fa-ioxhost:before{content:""}.fa-angellist:before{content:""}.fa-cc:before{content:""}.fa-ils:before,.fa-shekel:before,.fa-sheqel:before{content:""}.fa-meanpath:before{content:""}.fa-buysellads:before{content:""}.fa-connectdevelop:before{content:""}.fa-dashcube:before{content:""}.fa-forumbee:before{content:""}.fa-leanpub:before{content:""}.fa-sellsy:before{content:""}.fa-shirtsinbulk:before{content:""}.fa-simplybuilt:before{content:""}.fa-skyatlas:before{content:""}.fa-cart-plus:before{content:""}.fa-cart-arrow-down:before{content:""}.fa-diamond:before{content:""}.fa-ship:before{content:""}.fa-user-secret:before{content:""}.fa-motorcycle:before{content:""}.fa-street-view:before{content:""}.fa-heartbeat:before{content:""}.fa-venus:before{content:""}.fa-mars:before{content:""}.fa-mercury:before{content:""}.fa-intersex:before,.fa-transgender:before{content:""}.fa-transgender-alt:before{content:""}.fa-venus-double:before{content:""}.fa-mars-double:before{content:""}.fa-venus-mars:before{content:""}.fa-mars-stroke:before{content:""}.fa-mars-stroke-v:before{content:""}.fa-mars-stroke-h:before{content:""}.fa-neuter:before{content:""}.fa-genderless:before{content:""}.fa-facebook-official:before{content:""}.fa-pinterest-p:before{content:""}.fa-whatsapp:before{content:""}.fa-server:before{content:""}.fa-user-plus:before{content:""}.fa-user-times:before{content:""}.fa-bed:before,.fa-hotel:before{content:""}.fa-viacoin:before{content:""}.fa-train:before{content:""}.fa-subway:before{content:""}.fa-medium:before{content:""}.fa-y-combinator:before,.fa-yc:before{content:""}.fa-optin-monster:before{content:""}.fa-opencart:before{content:""}.fa-expeditedssl:before{content:""}.fa-battery-4:before,.fa-battery-full:before,.fa-battery:before{content:""}.fa-battery-3:before,.fa-battery-three-quarters:before{content:""}.fa-battery-2:before,.fa-battery-half:before{content:""}.fa-battery-1:before,.fa-battery-quarter:before{content:""}.fa-battery-0:before,.fa-battery-empty:before{content:""}.fa-mouse-pointer:before{content:""}.fa-i-cursor:before{content:""}.fa-object-group:before{content:""}.fa-object-ungroup:before{content:""}.fa-sticky-note:before{content:""}.fa-sticky-note-o:before{content:""}.fa-cc-jcb:before{content:""}.fa-cc-diners-club:before{content:""}.fa-clone:before{content:""}.fa-balance-scale:before{content:""}.fa-hourglass-o:before{content:""}.fa-hourglass-1:before,.fa-hourglass-start:before{content:""}.fa-hourglass-2:before,.fa-hourglass-half:before{content:""}.fa-hourglass-3:before,.fa-hourglass-end:before{content:""}.fa-hourglass:before{content:""}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:""}.fa-hand-paper-o:before,.fa-hand-stop-o:before{content:""}.fa-hand-scissors-o:before{content:""}.fa-hand-lizard-o:before{content:""}.fa-hand-spock-o:before{content:""}.fa-hand-pointer-o:before{content:""}.fa-hand-peace-o:before{content:""}.fa-trademark:before{content:""}.fa-registered:before{content:""}.fa-creative-commons:before{content:""}.fa-gg:before{content:""}.fa-gg-circle:before{content:""}.fa-tripadvisor:before{content:""}.fa-odnoklassniki:before{content:""}.fa-odnoklassniki-square:before{content:""}.fa-get-pocket:before{content:""}.fa-wikipedia-w:before{content:""}.fa-safari:before{content:""}.fa-chrome:before{content:""}.fa-firefox:before{content:""}.fa-opera:before{content:""}.fa-internet-explorer:before{content:""}.fa-television:before,.fa-tv:before{content:""}.fa-contao:before{content:""}.fa-500px:before{content:""}.fa-amazon:before{content:""}.fa-calendar-plus-o:before{content:""}.fa-calendar-minus-o:before{content:""}.fa-calendar-times-o:before{content:""}.fa-calendar-check-o:before{content:""}.fa-industry:before{content:""}.fa-map-pin:before{content:""}.fa-map-signs:before{content:""}.fa-map-o:before{content:""}.fa-map:before{content:""}.fa-commenting:before{content:""}.fa-commenting-o:before{content:""}.fa-houzz:before{content:""}.fa-vimeo:before{content:""}.fa-black-tie:before{content:""}.fa-fonticons:before{content:""}.fa-reddit-alien:before{content:""}.fa-edge:before{content:""}.fa-credit-card-alt:before{content:""}.fa-codiepie:before{content:""}.fa-modx:before{content:""}.fa-fort-awesome:before{content:""}.fa-usb:before{content:""}.fa-product-hunt:before{content:""}.fa-mixcloud:before{content:""}.fa-scribd:before{content:""}.fa-pause-circle:before{content:""}.fa-pause-circle-o:before{content:""}.fa-stop-circle:before{content:""}.fa-stop-circle-o:before{content:""}.fa-shopping-bag:before{content:""}.fa-shopping-basket:before{content:""}.fa-hashtag:before{content:""}.fa-bluetooth:before{content:""}.fa-bluetooth-b:before{content:""}.fa-percent:before{content:""}.fa-gitlab:before,.icon-gitlab:before{content:""}.fa-wpbeginner:before{content:""}.fa-wpforms:before{content:""}.fa-envira:before{content:""}.fa-universal-access:before{content:""}.fa-wheelchair-alt:before{content:""}.fa-question-circle-o:before{content:""}.fa-blind:before{content:""}.fa-audio-description:before{content:""}.fa-volume-control-phone:before{content:""}.fa-braille:before{content:""}.fa-assistive-listening-systems:before{content:""}.fa-american-sign-language-interpreting:before,.fa-asl-interpreting:before{content:""}.fa-deaf:before,.fa-deafness:before,.fa-hard-of-hearing:before{content:""}.fa-glide:before{content:""}.fa-glide-g:before{content:""}.fa-sign-language:before,.fa-signing:before{content:""}.fa-low-vision:before{content:""}.fa-viadeo:before{content:""}.fa-viadeo-square:before{content:""}.fa-snapchat:before{content:""}.fa-snapchat-ghost:before{content:""}.fa-snapchat-square:before{content:""}.fa-pied-piper:before{content:""}.fa-first-order:before{content:""}.fa-yoast:before{content:""}.fa-themeisle:before{content:""}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:""}.fa-fa:before,.fa-font-awesome:before{content:""}.fa-handshake-o:before{content:""}.fa-envelope-open:before{content:""}.fa-envelope-open-o:before{content:""}.fa-linode:before{content:""}.fa-address-book:before{content:""}.fa-address-book-o:before{content:""}.fa-address-card:before,.fa-vcard:before{content:""}.fa-address-card-o:before,.fa-vcard-o:before{content:""}.fa-user-circle:before{content:""}.fa-user-circle-o:before{content:""}.fa-user-o:before{content:""}.fa-id-badge:before{content:""}.fa-drivers-license:before,.fa-id-card:before{content:""}.fa-drivers-license-o:before,.fa-id-card-o:before{content:""}.fa-quora:before{content:""}.fa-free-code-camp:before{content:""}.fa-telegram:before{content:""}.fa-thermometer-4:before,.fa-thermometer-full:before,.fa-thermometer:before{content:""}.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:""}.fa-thermometer-2:before,.fa-thermometer-half:before{content:""}.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:""}.fa-thermometer-0:before,.fa-thermometer-empty:before{content:""}.fa-shower:before{content:""}.fa-bath:before,.fa-bathtub:before,.fa-s15:before{content:""}.fa-podcast:before{content:""}.fa-window-maximize:before{content:""}.fa-window-minimize:before{content:""}.fa-window-restore:before{content:""}.fa-times-rectangle:before,.fa-window-close:before{content:""}.fa-times-rectangle-o:before,.fa-window-close-o:before{content:""}.fa-bandcamp:before{content:""}.fa-grav:before{content:""}.fa-etsy:before{content:""}.fa-imdb:before{content:""}.fa-ravelry:before{content:""}.fa-eercast:before{content:""}.fa-microchip:before{content:""}.fa-snowflake-o:before{content:""}.fa-superpowers:before{content:""}.fa-wpexplorer:before{content:""}.fa-meetup:before{content:""}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}.fa,.icon,.rst-content .admonition-title,.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content code.download span:first-child,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink,.rst-content tt.download span:first-child,.wy-dropdown .caret,.wy-inline-validate.wy-inline-validate-danger .wy-input-context,.wy-inline-validate.wy-inline-validate-info .wy-input-context,.wy-inline-validate.wy-inline-validate-success .wy-input-context,.wy-inline-validate.wy-inline-validate-warning .wy-input-context,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li button.toctree-expand{font-family:inherit}.fa:before,.icon:before,.rst-content .admonition-title:before,.rst-content .code-block-caption .headerlink:before,.rst-content .eqno .headerlink:before,.rst-content code.download span:first-child:before,.rst-content dl dt .headerlink:before,.rst-content h1 .headerlink:before,.rst-content h2 .headerlink:before,.rst-content h3 .headerlink:before,.rst-content h4 .headerlink:before,.rst-content h5 .headerlink:before,.rst-content h6 .headerlink:before,.rst-content p.caption .headerlink:before,.rst-content p .headerlink:before,.rst-content table>caption .headerlink:before,.rst-content tt.download span:first-child:before,.wy-dropdown .caret:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before,.wy-menu-vertical li button.toctree-expand:before{font-family:FontAwesome;display:inline-block;font-style:normal;font-weight:400;line-height:1;text-decoration:inherit}.rst-content .code-block-caption a .headerlink,.rst-content .eqno a .headerlink,.rst-content a .admonition-title,.rst-content code.download a span:first-child,.rst-content dl dt a .headerlink,.rst-content h1 a .headerlink,.rst-content h2 a .headerlink,.rst-content h3 a .headerlink,.rst-content h4 a .headerlink,.rst-content h5 a .headerlink,.rst-content h6 a .headerlink,.rst-content p.caption a .headerlink,.rst-content p a .headerlink,.rst-content table>caption a .headerlink,.rst-content tt.download a span:first-child,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li a button.toctree-expand,a .fa,a .icon,a .rst-content .admonition-title,a .rst-content .code-block-caption .headerlink,a .rst-content .eqno .headerlink,a .rst-content code.download span:first-child,a .rst-content dl dt .headerlink,a .rst-content h1 .headerlink,a .rst-content h2 .headerlink,a .rst-content h3 .headerlink,a .rst-content h4 .headerlink,a .rst-content h5 .headerlink,a .rst-content h6 .headerlink,a .rst-content p.caption .headerlink,a .rst-content p .headerlink,a .rst-content table>caption .headerlink,a .rst-content tt.download span:first-child,a .wy-menu-vertical li button.toctree-expand{display:inline-block;text-decoration:inherit}.btn .fa,.btn .icon,.btn .rst-content .admonition-title,.btn .rst-content .code-block-caption .headerlink,.btn .rst-content .eqno .headerlink,.btn .rst-content code.download span:first-child,.btn .rst-content dl dt .headerlink,.btn .rst-content h1 .headerlink,.btn .rst-content h2 .headerlink,.btn .rst-content h3 .headerlink,.btn .rst-content h4 .headerlink,.btn .rst-content h5 .headerlink,.btn .rst-content h6 .headerlink,.btn .rst-content p .headerlink,.btn .rst-content table>caption .headerlink,.btn .rst-content tt.download span:first-child,.btn .wy-menu-vertical li.current>a button.toctree-expand,.btn .wy-menu-vertical li.on a button.toctree-expand,.btn .wy-menu-vertical li button.toctree-expand,.nav .fa,.nav .icon,.nav .rst-content .admonition-title,.nav .rst-content .code-block-caption .headerlink,.nav .rst-content .eqno .headerlink,.nav .rst-content code.download span:first-child,.nav .rst-content dl dt .headerlink,.nav .rst-content h1 .headerlink,.nav .rst-content h2 .headerlink,.nav .rst-content h3 .headerlink,.nav .rst-content h4 .headerlink,.nav .rst-content h5 .headerlink,.nav .rst-content h6 .headerlink,.nav .rst-content p .headerlink,.nav .rst-content table>caption .headerlink,.nav .rst-content tt.download span:first-child,.nav .wy-menu-vertical li.current>a button.toctree-expand,.nav .wy-menu-vertical li.on a button.toctree-expand,.nav .wy-menu-vertical li button.toctree-expand,.rst-content .btn .admonition-title,.rst-content .code-block-caption .btn .headerlink,.rst-content .code-block-caption .nav .headerlink,.rst-content .eqno .btn .headerlink,.rst-content .eqno .nav .headerlink,.rst-content .nav .admonition-title,.rst-content code.download .btn span:first-child,.rst-content code.download .nav span:first-child,.rst-content dl dt .btn .headerlink,.rst-content dl dt .nav .headerlink,.rst-content h1 .btn .headerlink,.rst-content h1 .nav .headerlink,.rst-content h2 .btn .headerlink,.rst-content h2 .nav .headerlink,.rst-content h3 .btn .headerlink,.rst-content h3 .nav .headerlink,.rst-content h4 .btn .headerlink,.rst-content h4 .nav .headerlink,.rst-content h5 .btn .headerlink,.rst-content h5 .nav .headerlink,.rst-content h6 .btn .headerlink,.rst-content h6 .nav .headerlink,.rst-content p .btn .headerlink,.rst-content p .nav .headerlink,.rst-content table>caption .btn .headerlink,.rst-content table>caption .nav .headerlink,.rst-content tt.download .btn span:first-child,.rst-content tt.download .nav span:first-child,.wy-menu-vertical li .btn button.toctree-expand,.wy-menu-vertical li.current>a .btn button.toctree-expand,.wy-menu-vertical li.current>a .nav button.toctree-expand,.wy-menu-vertical li .nav button.toctree-expand,.wy-menu-vertical li.on a .btn button.toctree-expand,.wy-menu-vertical li.on a .nav button.toctree-expand{display:inline}.btn .fa-large.icon,.btn .fa.fa-large,.btn .rst-content .code-block-caption .fa-large.headerlink,.btn .rst-content .eqno .fa-large.headerlink,.btn .rst-content .fa-large.admonition-title,.btn .rst-content code.download span.fa-large:first-child,.btn .rst-content dl dt .fa-large.headerlink,.btn .rst-content h1 .fa-large.headerlink,.btn .rst-content h2 .fa-large.headerlink,.btn .rst-content h3 .fa-large.headerlink,.btn .rst-content h4 .fa-large.headerlink,.btn .rst-content h5 .fa-large.headerlink,.btn .rst-content h6 .fa-large.headerlink,.btn .rst-content p .fa-large.headerlink,.btn .rst-content table>caption .fa-large.headerlink,.btn .rst-content tt.download span.fa-large:first-child,.btn .wy-menu-vertical li button.fa-large.toctree-expand,.nav .fa-large.icon,.nav .fa.fa-large,.nav .rst-content .code-block-caption .fa-large.headerlink,.nav .rst-content .eqno .fa-large.headerlink,.nav .rst-content .fa-large.admonition-title,.nav .rst-content code.download span.fa-large:first-child,.nav .rst-content dl dt .fa-large.headerlink,.nav .rst-content h1 .fa-large.headerlink,.nav .rst-content h2 .fa-large.headerlink,.nav .rst-content h3 .fa-large.headerlink,.nav .rst-content h4 .fa-large.headerlink,.nav .rst-content h5 .fa-large.headerlink,.nav .rst-content h6 .fa-large.headerlink,.nav .rst-content p .fa-large.headerlink,.nav .rst-content table>caption .fa-large.headerlink,.nav .rst-content tt.download span.fa-large:first-child,.nav .wy-menu-vertical li button.fa-large.toctree-expand,.rst-content .btn .fa-large.admonition-title,.rst-content .code-block-caption .btn .fa-large.headerlink,.rst-content .code-block-caption .nav .fa-large.headerlink,.rst-content .eqno .btn .fa-large.headerlink,.rst-content .eqno .nav .fa-large.headerlink,.rst-content .nav .fa-large.admonition-title,.rst-content code.download .btn span.fa-large:first-child,.rst-content code.download .nav span.fa-large:first-child,.rst-content dl dt .btn .fa-large.headerlink,.rst-content dl dt .nav .fa-large.headerlink,.rst-content h1 .btn .fa-large.headerlink,.rst-content h1 .nav .fa-large.headerlink,.rst-content h2 .btn .fa-large.headerlink,.rst-content h2 .nav .fa-large.headerlink,.rst-content h3 .btn .fa-large.headerlink,.rst-content h3 .nav .fa-large.headerlink,.rst-content h4 .btn .fa-large.headerlink,.rst-content h4 .nav .fa-large.headerlink,.rst-content h5 .btn .fa-large.headerlink,.rst-content h5 .nav .fa-large.headerlink,.rst-content h6 .btn .fa-large.headerlink,.rst-content h6 .nav .fa-large.headerlink,.rst-content p .btn .fa-large.headerlink,.rst-content p .nav .fa-large.headerlink,.rst-content table>caption .btn .fa-large.headerlink,.rst-content table>caption .nav .fa-large.headerlink,.rst-content tt.download .btn span.fa-large:first-child,.rst-content tt.download .nav span.fa-large:first-child,.wy-menu-vertical li .btn button.fa-large.toctree-expand,.wy-menu-vertical li .nav button.fa-large.toctree-expand{line-height:.9em}.btn .fa-spin.icon,.btn .fa.fa-spin,.btn .rst-content .code-block-caption .fa-spin.headerlink,.btn .rst-content .eqno .fa-spin.headerlink,.btn .rst-content .fa-spin.admonition-title,.btn .rst-content code.download span.fa-spin:first-child,.btn .rst-content dl dt .fa-spin.headerlink,.btn .rst-content h1 .fa-spin.headerlink,.btn .rst-content h2 .fa-spin.headerlink,.btn .rst-content h3 .fa-spin.headerlink,.btn .rst-content h4 .fa-spin.headerlink,.btn .rst-content h5 .fa-spin.headerlink,.btn .rst-content h6 .fa-spin.headerlink,.btn .rst-content p .fa-spin.headerlink,.btn .rst-content table>caption .fa-spin.headerlink,.btn .rst-content tt.download span.fa-spin:first-child,.btn .wy-menu-vertical li button.fa-spin.toctree-expand,.nav .fa-spin.icon,.nav .fa.fa-spin,.nav .rst-content .code-block-caption .fa-spin.headerlink,.nav .rst-content .eqno .fa-spin.headerlink,.nav .rst-content .fa-spin.admonition-title,.nav .rst-content code.download span.fa-spin:first-child,.nav .rst-content dl dt .fa-spin.headerlink,.nav .rst-content h1 .fa-spin.headerlink,.nav .rst-content h2 .fa-spin.headerlink,.nav .rst-content h3 .fa-spin.headerlink,.nav .rst-content h4 .fa-spin.headerlink,.nav .rst-content h5 .fa-spin.headerlink,.nav .rst-content h6 .fa-spin.headerlink,.nav .rst-content p .fa-spin.headerlink,.nav .rst-content table>caption .fa-spin.headerlink,.nav .rst-content tt.download span.fa-spin:first-child,.nav .wy-menu-vertical li button.fa-spin.toctree-expand,.rst-content .btn .fa-spin.admonition-title,.rst-content .code-block-caption .btn .fa-spin.headerlink,.rst-content .code-block-caption .nav .fa-spin.headerlink,.rst-content .eqno .btn .fa-spin.headerlink,.rst-content .eqno .nav .fa-spin.headerlink,.rst-content .nav .fa-spin.admonition-title,.rst-content code.download .btn span.fa-spin:first-child,.rst-content code.download .nav span.fa-spin:first-child,.rst-content dl dt .btn .fa-spin.headerlink,.rst-content dl dt .nav .fa-spin.headerlink,.rst-content h1 .btn .fa-spin.headerlink,.rst-content h1 .nav .fa-spin.headerlink,.rst-content h2 .btn .fa-spin.headerlink,.rst-content h2 .nav .fa-spin.headerlink,.rst-content h3 .btn .fa-spin.headerlink,.rst-content h3 .nav .fa-spin.headerlink,.rst-content h4 .btn .fa-spin.headerlink,.rst-content h4 .nav .fa-spin.headerlink,.rst-content h5 .btn .fa-spin.headerlink,.rst-content h5 .nav .fa-spin.headerlink,.rst-content h6 .btn .fa-spin.headerlink,.rst-content h6 .nav .fa-spin.headerlink,.rst-content p .btn .fa-spin.headerlink,.rst-content p .nav .fa-spin.headerlink,.rst-content table>caption .btn .fa-spin.headerlink,.rst-content table>caption .nav .fa-spin.headerlink,.rst-content tt.download .btn span.fa-spin:first-child,.rst-content tt.download .nav span.fa-spin:first-child,.wy-menu-vertical li .btn button.fa-spin.toctree-expand,.wy-menu-vertical li .nav button.fa-spin.toctree-expand{display:inline-block}.btn.fa:before,.btn.icon:before,.rst-content .btn.admonition-title:before,.rst-content .code-block-caption .btn.headerlink:before,.rst-content .eqno .btn.headerlink:before,.rst-content code.download span.btn:first-child:before,.rst-content dl dt .btn.headerlink:before,.rst-content h1 .btn.headerlink:before,.rst-content h2 .btn.headerlink:before,.rst-content h3 .btn.headerlink:before,.rst-content h4 .btn.headerlink:before,.rst-content h5 .btn.headerlink:before,.rst-content h6 .btn.headerlink:before,.rst-content p .btn.headerlink:before,.rst-content table>caption .btn.headerlink:before,.rst-content tt.download span.btn:first-child:before,.wy-menu-vertical li button.btn.toctree-expand:before{opacity:.5;-webkit-transition:opacity .05s ease-in;-moz-transition:opacity .05s ease-in;transition:opacity .05s ease-in}.btn.fa:hover:before,.btn.icon:hover:before,.rst-content .btn.admonition-title:hover:before,.rst-content .code-block-caption .btn.headerlink:hover:before,.rst-content .eqno .btn.headerlink:hover:before,.rst-content code.download span.btn:first-child:hover:before,.rst-content dl dt .btn.headerlink:hover:before,.rst-content h1 .btn.headerlink:hover:before,.rst-content h2 .btn.headerlink:hover:before,.rst-content h3 .btn.headerlink:hover:before,.rst-content h4 .btn.headerlink:hover:before,.rst-content h5 .btn.headerlink:hover:before,.rst-content h6 .btn.headerlink:hover:before,.rst-content p .btn.headerlink:hover:before,.rst-content table>caption .btn.headerlink:hover:before,.rst-content tt.download span.btn:first-child:hover:before,.wy-menu-vertical li button.btn.toctree-expand:hover:before{opacity:1}.btn-mini .fa:before,.btn-mini .icon:before,.btn-mini .rst-content .admonition-title:before,.btn-mini .rst-content .code-block-caption .headerlink:before,.btn-mini .rst-content .eqno .headerlink:before,.btn-mini .rst-content code.download span:first-child:before,.btn-mini .rst-content dl dt .headerlink:before,.btn-mini .rst-content h1 .headerlink:before,.btn-mini .rst-content h2 .headerlink:before,.btn-mini .rst-content h3 .headerlink:before,.btn-mini .rst-content h4 .headerlink:before,.btn-mini .rst-content h5 .headerlink:before,.btn-mini .rst-content h6 .headerlink:before,.btn-mini .rst-content p .headerlink:before,.btn-mini .rst-content table>caption .headerlink:before,.btn-mini .rst-content tt.download span:first-child:before,.btn-mini .wy-menu-vertical li button.toctree-expand:before,.rst-content .btn-mini .admonition-title:before,.rst-content .code-block-caption .btn-mini .headerlink:before,.rst-content .eqno .btn-mini .headerlink:before,.rst-content code.download .btn-mini span:first-child:before,.rst-content dl dt .btn-mini .headerlink:before,.rst-content h1 .btn-mini .headerlink:before,.rst-content h2 .btn-mini .headerlink:before,.rst-content h3 .btn-mini .headerlink:before,.rst-content h4 .btn-mini .headerlink:before,.rst-content h5 .btn-mini .headerlink:before,.rst-content h6 .btn-mini .headerlink:before,.rst-content p .btn-mini .headerlink:before,.rst-content table>caption .btn-mini .headerlink:before,.rst-content tt.download .btn-mini span:first-child:before,.wy-menu-vertical li .btn-mini button.toctree-expand:before{font-size:14px;vertical-align:-15%}.rst-content .admonition,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning,.wy-alert{padding:12px;line-height:24px;margin-bottom:24px;background:#e7f2fa}.rst-content .admonition-title,.wy-alert-title{font-weight:700;display:block;color:#fff;background:#6ab0de;padding:6px 12px;margin:-12px -12px 12px}.rst-content .danger,.rst-content .error,.rst-content .wy-alert-danger.admonition,.rst-content .wy-alert-danger.admonition-todo,.rst-content .wy-alert-danger.attention,.rst-content .wy-alert-danger.caution,.rst-content .wy-alert-danger.hint,.rst-content .wy-alert-danger.important,.rst-content .wy-alert-danger.note,.rst-content .wy-alert-danger.seealso,.rst-content .wy-alert-danger.tip,.rst-content .wy-alert-danger.warning,.wy-alert.wy-alert-danger{background:#fdf3f2}.rst-content .danger .admonition-title,.rst-content .danger .wy-alert-title,.rst-content .error .admonition-title,.rst-content .error .wy-alert-title,.rst-content .wy-alert-danger.admonition-todo .admonition-title,.rst-content .wy-alert-danger.admonition-todo .wy-alert-title,.rst-content .wy-alert-danger.admonition .admonition-title,.rst-content .wy-alert-danger.admonition .wy-alert-title,.rst-content .wy-alert-danger.attention .admonition-title,.rst-content .wy-alert-danger.attention .wy-alert-title,.rst-content .wy-alert-danger.caution .admonition-title,.rst-content .wy-alert-danger.caution .wy-alert-title,.rst-content .wy-alert-danger.hint .admonition-title,.rst-content .wy-alert-danger.hint .wy-alert-title,.rst-content .wy-alert-danger.important .admonition-title,.rst-content .wy-alert-danger.important .wy-alert-title,.rst-content .wy-alert-danger.note .admonition-title,.rst-content .wy-alert-danger.note .wy-alert-title,.rst-content .wy-alert-danger.seealso .admonition-title,.rst-content .wy-alert-danger.seealso .wy-alert-title,.rst-content .wy-alert-danger.tip .admonition-title,.rst-content .wy-alert-danger.tip .wy-alert-title,.rst-content .wy-alert-danger.warning .admonition-title,.rst-content .wy-alert-danger.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-danger .admonition-title,.wy-alert.wy-alert-danger .rst-content .admonition-title,.wy-alert.wy-alert-danger .wy-alert-title{background:#f29f97}.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .warning,.rst-content .wy-alert-warning.admonition,.rst-content .wy-alert-warning.danger,.rst-content .wy-alert-warning.error,.rst-content .wy-alert-warning.hint,.rst-content .wy-alert-warning.important,.rst-content .wy-alert-warning.note,.rst-content .wy-alert-warning.seealso,.rst-content .wy-alert-warning.tip,.wy-alert.wy-alert-warning{background:#ffedcc}.rst-content .admonition-todo .admonition-title,.rst-content .admonition-todo .wy-alert-title,.rst-content .attention .admonition-title,.rst-content .attention .wy-alert-title,.rst-content .caution .admonition-title,.rst-content .caution .wy-alert-title,.rst-content .warning .admonition-title,.rst-content .warning .wy-alert-title,.rst-content .wy-alert-warning.admonition .admonition-title,.rst-content .wy-alert-warning.admonition .wy-alert-title,.rst-content .wy-alert-warning.danger .admonition-title,.rst-content .wy-alert-warning.danger .wy-alert-title,.rst-content .wy-alert-warning.error .admonition-title,.rst-content .wy-alert-warning.error .wy-alert-title,.rst-content .wy-alert-warning.hint .admonition-title,.rst-content .wy-alert-warning.hint .wy-alert-title,.rst-content .wy-alert-warning.important .admonition-title,.rst-content .wy-alert-warning.important .wy-alert-title,.rst-content .wy-alert-warning.note .admonition-title,.rst-content .wy-alert-warning.note .wy-alert-title,.rst-content .wy-alert-warning.seealso .admonition-title,.rst-content .wy-alert-warning.seealso .wy-alert-title,.rst-content .wy-alert-warning.tip .admonition-title,.rst-content .wy-alert-warning.tip .wy-alert-title,.rst-content .wy-alert.wy-alert-warning .admonition-title,.wy-alert.wy-alert-warning .rst-content .admonition-title,.wy-alert.wy-alert-warning .wy-alert-title{background:#f0b37e}.rst-content .note,.rst-content .seealso,.rst-content .wy-alert-info.admonition,.rst-content .wy-alert-info.admonition-todo,.rst-content .wy-alert-info.attention,.rst-content .wy-alert-info.caution,.rst-content .wy-alert-info.danger,.rst-content .wy-alert-info.error,.rst-content .wy-alert-info.hint,.rst-content .wy-alert-info.important,.rst-content .wy-alert-info.tip,.rst-content .wy-alert-info.warning,.wy-alert.wy-alert-info{background:#e7f2fa}.rst-content .note .admonition-title,.rst-content .note .wy-alert-title,.rst-content .seealso .admonition-title,.rst-content .seealso .wy-alert-title,.rst-content .wy-alert-info.admonition-todo .admonition-title,.rst-content .wy-alert-info.admonition-todo .wy-alert-title,.rst-content .wy-alert-info.admonition .admonition-title,.rst-content .wy-alert-info.admonition .wy-alert-title,.rst-content .wy-alert-info.attention .admonition-title,.rst-content .wy-alert-info.attention .wy-alert-title,.rst-content .wy-alert-info.caution .admonition-title,.rst-content .wy-alert-info.caution .wy-alert-title,.rst-content .wy-alert-info.danger .admonition-title,.rst-content .wy-alert-info.danger .wy-alert-title,.rst-content .wy-alert-info.error .admonition-title,.rst-content .wy-alert-info.error .wy-alert-title,.rst-content .wy-alert-info.hint .admonition-title,.rst-content .wy-alert-info.hint .wy-alert-title,.rst-content .wy-alert-info.important .admonition-title,.rst-content .wy-alert-info.important .wy-alert-title,.rst-content .wy-alert-info.tip .admonition-title,.rst-content .wy-alert-info.tip .wy-alert-title,.rst-content .wy-alert-info.warning .admonition-title,.rst-content .wy-alert-info.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-info .admonition-title,.wy-alert.wy-alert-info .rst-content .admonition-title,.wy-alert.wy-alert-info .wy-alert-title{background:#6ab0de}.rst-content .hint,.rst-content .important,.rst-content .tip,.rst-content .wy-alert-success.admonition,.rst-content .wy-alert-success.admonition-todo,.rst-content .wy-alert-success.attention,.rst-content .wy-alert-success.caution,.rst-content .wy-alert-success.danger,.rst-content .wy-alert-success.error,.rst-content .wy-alert-success.note,.rst-content .wy-alert-success.seealso,.rst-content .wy-alert-success.warning,.wy-alert.wy-alert-success{background:#dbfaf4}.rst-content .hint .admonition-title,.rst-content .hint .wy-alert-title,.rst-content .important .admonition-title,.rst-content .important .wy-alert-title,.rst-content .tip .admonition-title,.rst-content .tip .wy-alert-title,.rst-content .wy-alert-success.admonition-todo .admonition-title,.rst-content .wy-alert-success.admonition-todo .wy-alert-title,.rst-content .wy-alert-success.admonition .admonition-title,.rst-content .wy-alert-success.admonition .wy-alert-title,.rst-content .wy-alert-success.attention .admonition-title,.rst-content .wy-alert-success.attention .wy-alert-title,.rst-content .wy-alert-success.caution .admonition-title,.rst-content .wy-alert-success.caution .wy-alert-title,.rst-content .wy-alert-success.danger .admonition-title,.rst-content .wy-alert-success.danger .wy-alert-title,.rst-content .wy-alert-success.error .admonition-title,.rst-content .wy-alert-success.error .wy-alert-title,.rst-content .wy-alert-success.note .admonition-title,.rst-content .wy-alert-success.note .wy-alert-title,.rst-content .wy-alert-success.seealso .admonition-title,.rst-content .wy-alert-success.seealso .wy-alert-title,.rst-content .wy-alert-success.warning .admonition-title,.rst-content .wy-alert-success.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-success .admonition-title,.wy-alert.wy-alert-success .rst-content .admonition-title,.wy-alert.wy-alert-success .wy-alert-title{background:#1abc9c}.rst-content .wy-alert-neutral.admonition,.rst-content .wy-alert-neutral.admonition-todo,.rst-content .wy-alert-neutral.attention,.rst-content .wy-alert-neutral.caution,.rst-content .wy-alert-neutral.danger,.rst-content .wy-alert-neutral.error,.rst-content .wy-alert-neutral.hint,.rst-content .wy-alert-neutral.important,.rst-content .wy-alert-neutral.note,.rst-content .wy-alert-neutral.seealso,.rst-content .wy-alert-neutral.tip,.rst-content .wy-alert-neutral.warning,.wy-alert.wy-alert-neutral{background:#f3f6f6}.rst-content .wy-alert-neutral.admonition-todo .admonition-title,.rst-content .wy-alert-neutral.admonition-todo .wy-alert-title,.rst-content .wy-alert-neutral.admonition .admonition-title,.rst-content .wy-alert-neutral.admonition .wy-alert-title,.rst-content .wy-alert-neutral.attention .admonition-title,.rst-content .wy-alert-neutral.attention .wy-alert-title,.rst-content .wy-alert-neutral.caution .admonition-title,.rst-content .wy-alert-neutral.caution .wy-alert-title,.rst-content .wy-alert-neutral.danger .admonition-title,.rst-content .wy-alert-neutral.danger .wy-alert-title,.rst-content .wy-alert-neutral.error .admonition-title,.rst-content .wy-alert-neutral.error .wy-alert-title,.rst-content .wy-alert-neutral.hint .admonition-title,.rst-content .wy-alert-neutral.hint .wy-alert-title,.rst-content .wy-alert-neutral.important .admonition-title,.rst-content .wy-alert-neutral.important .wy-alert-title,.rst-content .wy-alert-neutral.note .admonition-title,.rst-content .wy-alert-neutral.note .wy-alert-title,.rst-content .wy-alert-neutral.seealso .admonition-title,.rst-content .wy-alert-neutral.seealso .wy-alert-title,.rst-content .wy-alert-neutral.tip .admonition-title,.rst-content .wy-alert-neutral.tip .wy-alert-title,.rst-content .wy-alert-neutral.warning .admonition-title,.rst-content .wy-alert-neutral.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-neutral .admonition-title,.wy-alert.wy-alert-neutral .rst-content .admonition-title,.wy-alert.wy-alert-neutral .wy-alert-title{color:#404040;background:#e1e4e5}.rst-content .wy-alert-neutral.admonition-todo a,.rst-content .wy-alert-neutral.admonition a,.rst-content .wy-alert-neutral.attention a,.rst-content .wy-alert-neutral.caution a,.rst-content .wy-alert-neutral.danger a,.rst-content .wy-alert-neutral.error a,.rst-content .wy-alert-neutral.hint a,.rst-content .wy-alert-neutral.important a,.rst-content .wy-alert-neutral.note a,.rst-content .wy-alert-neutral.seealso a,.rst-content .wy-alert-neutral.tip a,.rst-content .wy-alert-neutral.warning a,.wy-alert.wy-alert-neutral a{color:#2980b9}.rst-content .admonition-todo p:last-child,.rst-content .admonition p:last-child,.rst-content .attention p:last-child,.rst-content .caution p:last-child,.rst-content .danger p:last-child,.rst-content .error p:last-child,.rst-content .hint p:last-child,.rst-content .important p:last-child,.rst-content .note p:last-child,.rst-content .seealso p:last-child,.rst-content .tip p:last-child,.rst-content .warning p:last-child,.wy-alert p:last-child{margin-bottom:0}.wy-tray-container{position:fixed;bottom:0;left:0;z-index:600}.wy-tray-container li{display:block;width:300px;background:transparent;color:#fff;text-align:center;box-shadow:0 5px 5px 0 rgba(0,0,0,.1);padding:0 24px;min-width:20%;opacity:0;height:0;line-height:56px;overflow:hidden;-webkit-transition:all .3s ease-in;-moz-transition:all .3s ease-in;transition:all .3s ease-in}.wy-tray-container li.wy-tray-item-success{background:#27ae60}.wy-tray-container li.wy-tray-item-info{background:#2980b9}.wy-tray-container li.wy-tray-item-warning{background:#e67e22}.wy-tray-container li.wy-tray-item-danger{background:#e74c3c}.wy-tray-container li.on{opacity:1;height:56px}@media screen and (max-width:768px){.wy-tray-container{bottom:auto;top:0;width:100%}.wy-tray-container li{width:100%}}button{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle;cursor:pointer;line-height:normal;-webkit-appearance:button;*overflow:visible}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}button[disabled]{cursor:default}.btn{display:inline-block;border-radius:2px;line-height:normal;white-space:nowrap;text-align:center;cursor:pointer;font-size:100%;padding:6px 12px 8px;color:#fff;border:1px solid rgba(0,0,0,.1);background-color:#27ae60;text-decoration:none;font-weight:400;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;box-shadow:inset 0 1px 2px -1px hsla(0,0%,100%,.5),inset 0 -2px 0 0 rgba(0,0,0,.1);outline-none:false;vertical-align:middle;*display:inline;zoom:1;-webkit-user-drag:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-transition:all .1s linear;-moz-transition:all .1s linear;transition:all .1s linear}.btn-hover{background:#2e8ece;color:#fff}.btn:hover{background:#2cc36b;color:#fff}.btn:focus{background:#2cc36b;outline:0}.btn:active{box-shadow:inset 0 -1px 0 0 rgba(0,0,0,.05),inset 0 2px 0 0 rgba(0,0,0,.1);padding:8px 12px 6px}.btn:visited{color:#fff}.btn-disabled,.btn-disabled:active,.btn-disabled:focus,.btn-disabled:hover,.btn:disabled{background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);filter:alpha(opacity=40);opacity:.4;cursor:not-allowed;box-shadow:none}.btn::-moz-focus-inner{padding:0;border:0}.btn-small{font-size:80%}.btn-info{background-color:#2980b9!important}.btn-info:hover{background-color:#2e8ece!important}.btn-neutral{background-color:#f3f6f6!important;color:#404040!important}.btn-neutral:hover{background-color:#e5ebeb!important;color:#404040}.btn-neutral:visited{color:#404040!important}.btn-success{background-color:#27ae60!important}.btn-success:hover{background-color:#295!important}.btn-danger{background-color:#e74c3c!important}.btn-danger:hover{background-color:#ea6153!important}.btn-warning{background-color:#e67e22!important}.btn-warning:hover{background-color:#e98b39!important}.btn-invert{background-color:#222}.btn-invert:hover{background-color:#2f2f2f!important}.btn-link{background-color:transparent!important;color:#2980b9;box-shadow:none;border-color:transparent!important}.btn-link:active,.btn-link:hover{background-color:transparent!important;color:#409ad5!important;box-shadow:none}.btn-link:visited{color:#9b59b6}.wy-btn-group .btn,.wy-control .btn{vertical-align:middle}.wy-btn-group{margin-bottom:24px;*zoom:1}.wy-btn-group:after,.wy-btn-group:before{display:table;content:""}.wy-btn-group:after{clear:both}.wy-dropdown{position:relative;display:inline-block}.wy-dropdown-active .wy-dropdown-menu{display:block}.wy-dropdown-menu{position:absolute;left:0;display:none;float:left;top:100%;min-width:100%;background:#fcfcfc;z-index:100;border:1px solid #cfd7dd;box-shadow:0 2px 2px 0 rgba(0,0,0,.1);padding:12px}.wy-dropdown-menu>dd>a{display:block;clear:both;color:#404040;white-space:nowrap;font-size:90%;padding:0 12px;cursor:pointer}.wy-dropdown-menu>dd>a:hover{background:#2980b9;color:#fff}.wy-dropdown-menu>dd.divider{border-top:1px solid #cfd7dd;margin:6px 0}.wy-dropdown-menu>dd.search{padding-bottom:12px}.wy-dropdown-menu>dd.search input[type=search]{width:100%}.wy-dropdown-menu>dd.call-to-action{background:#e3e3e3;text-transform:uppercase;font-weight:500;font-size:80%}.wy-dropdown-menu>dd.call-to-action:hover{background:#e3e3e3}.wy-dropdown-menu>dd.call-to-action .btn{color:#fff}.wy-dropdown.wy-dropdown-up .wy-dropdown-menu{bottom:100%;top:auto;left:auto;right:0}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu{background:#fcfcfc;margin-top:2px}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a{padding:6px 12px}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a:hover{background:#2980b9;color:#fff}.wy-dropdown.wy-dropdown-left .wy-dropdown-menu{right:0;left:auto;text-align:right}.wy-dropdown-arrow:before{content:" ";border-bottom:5px solid #f5f5f5;border-left:5px solid transparent;border-right:5px solid transparent;position:absolute;display:block;top:-4px;left:50%;margin-left:-3px}.wy-dropdown-arrow.wy-dropdown-arrow-left:before{left:11px}.wy-form-stacked select{display:block}.wy-form-aligned .wy-help-inline,.wy-form-aligned input,.wy-form-aligned label,.wy-form-aligned select,.wy-form-aligned textarea{display:inline-block;*display:inline;*zoom:1;vertical-align:middle}.wy-form-aligned .wy-control-group>label{display:inline-block;vertical-align:middle;width:10em;margin:6px 12px 0 0;float:left}.wy-form-aligned .wy-control{float:left}.wy-form-aligned .wy-control label{display:block}.wy-form-aligned .wy-control select{margin-top:6px}fieldset{margin:0}fieldset,legend{border:0;padding:0}legend{width:100%;white-space:normal;margin-bottom:24px;font-size:150%;*margin-left:-7px}label,legend{display:block}label{margin:0 0 .3125em;color:#333;font-size:90%}input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle}.wy-control-group{margin-bottom:24px;max-width:1200px;margin-left:auto;margin-right:auto;*zoom:1}.wy-control-group:after,.wy-control-group:before{display:table;content:""}.wy-control-group:after{clear:both}.wy-control-group.wy-control-group-required>label:after{content:" *";color:#e74c3c}.wy-control-group .wy-form-full,.wy-control-group .wy-form-halves,.wy-control-group .wy-form-thirds{padding-bottom:12px}.wy-control-group .wy-form-full input[type=color],.wy-control-group .wy-form-full input[type=date],.wy-control-group .wy-form-full input[type=datetime-local],.wy-control-group .wy-form-full input[type=datetime],.wy-control-group .wy-form-full input[type=email],.wy-control-group .wy-form-full input[type=month],.wy-control-group .wy-form-full input[type=number],.wy-control-group .wy-form-full input[type=password],.wy-control-group .wy-form-full input[type=search],.wy-control-group .wy-form-full input[type=tel],.wy-control-group .wy-form-full input[type=text],.wy-control-group .wy-form-full input[type=time],.wy-control-group .wy-form-full input[type=url],.wy-control-group .wy-form-full input[type=week],.wy-control-group .wy-form-full select,.wy-control-group .wy-form-halves input[type=color],.wy-control-group .wy-form-halves input[type=date],.wy-control-group .wy-form-halves input[type=datetime-local],.wy-control-group .wy-form-halves input[type=datetime],.wy-control-group .wy-form-halves input[type=email],.wy-control-group .wy-form-halves input[type=month],.wy-control-group .wy-form-halves input[type=number],.wy-control-group .wy-form-halves input[type=password],.wy-control-group .wy-form-halves input[type=search],.wy-control-group .wy-form-halves input[type=tel],.wy-control-group .wy-form-halves input[type=text],.wy-control-group .wy-form-halves input[type=time],.wy-control-group .wy-form-halves input[type=url],.wy-control-group .wy-form-halves input[type=week],.wy-control-group .wy-form-halves select,.wy-control-group .wy-form-thirds input[type=color],.wy-control-group .wy-form-thirds input[type=date],.wy-control-group .wy-form-thirds input[type=datetime-local],.wy-control-group .wy-form-thirds input[type=datetime],.wy-control-group .wy-form-thirds input[type=email],.wy-control-group .wy-form-thirds input[type=month],.wy-control-group .wy-form-thirds input[type=number],.wy-control-group .wy-form-thirds input[type=password],.wy-control-group .wy-form-thirds input[type=search],.wy-control-group .wy-form-thirds input[type=tel],.wy-control-group .wy-form-thirds input[type=text],.wy-control-group .wy-form-thirds input[type=time],.wy-control-group .wy-form-thirds input[type=url],.wy-control-group .wy-form-thirds input[type=week],.wy-control-group .wy-form-thirds select{width:100%}.wy-control-group .wy-form-full{float:left;display:block;width:100%;margin-right:0}.wy-control-group .wy-form-full:last-child{margin-right:0}.wy-control-group .wy-form-halves{float:left;display:block;margin-right:2.35765%;width:48.82117%}.wy-control-group .wy-form-halves:last-child,.wy-control-group .wy-form-halves:nth-of-type(2n){margin-right:0}.wy-control-group .wy-form-halves:nth-of-type(odd){clear:left}.wy-control-group .wy-form-thirds{float:left;display:block;margin-right:2.35765%;width:31.76157%}.wy-control-group .wy-form-thirds:last-child,.wy-control-group .wy-form-thirds:nth-of-type(3n){margin-right:0}.wy-control-group .wy-form-thirds:nth-of-type(3n+1){clear:left}.wy-control-group.wy-control-group-no-input .wy-control,.wy-control-no-input{margin:6px 0 0;font-size:90%}.wy-control-no-input{display:inline-block}.wy-control-group.fluid-input input[type=color],.wy-control-group.fluid-input input[type=date],.wy-control-group.fluid-input input[type=datetime-local],.wy-control-group.fluid-input input[type=datetime],.wy-control-group.fluid-input input[type=email],.wy-control-group.fluid-input input[type=month],.wy-control-group.fluid-input input[type=number],.wy-control-group.fluid-input input[type=password],.wy-control-group.fluid-input input[type=search],.wy-control-group.fluid-input input[type=tel],.wy-control-group.fluid-input input[type=text],.wy-control-group.fluid-input input[type=time],.wy-control-group.fluid-input input[type=url],.wy-control-group.fluid-input input[type=week]{width:100%}.wy-form-message-inline{padding-left:.3em;color:#666;font-size:90%}.wy-form-message{display:block;color:#999;font-size:70%;margin-top:.3125em;font-style:italic}.wy-form-message p{font-size:inherit;font-style:italic;margin-bottom:6px}.wy-form-message p:last-child{margin-bottom:0}input{line-height:normal}input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;*overflow:visible}input[type=color],input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week]{-webkit-appearance:none;padding:6px;display:inline-block;border:1px solid #ccc;font-size:80%;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;box-shadow:inset 0 1px 3px #ddd;border-radius:0;-webkit-transition:border .3s linear;-moz-transition:border .3s linear;transition:border .3s linear}input[type=datetime-local]{padding:.34375em .625em}input[disabled]{cursor:default}input[type=checkbox],input[type=radio]{padding:0;margin-right:.3125em;*height:13px;*width:13px}input[type=checkbox],input[type=radio],input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}input[type=color]:focus,input[type=date]:focus,input[type=datetime-local]:focus,input[type=datetime]:focus,input[type=email]:focus,input[type=month]:focus,input[type=number]:focus,input[type=password]:focus,input[type=search]:focus,input[type=tel]:focus,input[type=text]:focus,input[type=time]:focus,input[type=url]:focus,input[type=week]:focus{outline:0;outline:thin dotted\9;border-color:#333}input.no-focus:focus{border-color:#ccc!important}input[type=checkbox]:focus,input[type=file]:focus,input[type=radio]:focus{outline:thin dotted #333;outline:1px auto #129fea}input[type=color][disabled],input[type=date][disabled],input[type=datetime-local][disabled],input[type=datetime][disabled],input[type=email][disabled],input[type=month][disabled],input[type=number][disabled],input[type=password][disabled],input[type=search][disabled],input[type=tel][disabled],input[type=text][disabled],input[type=time][disabled],input[type=url][disabled],input[type=week][disabled]{cursor:not-allowed;background-color:#fafafa}input:focus:invalid,select:focus:invalid,textarea:focus:invalid{color:#e74c3c;border:1px solid #e74c3c}input:focus:invalid:focus,select:focus:invalid:focus,textarea:focus:invalid:focus{border-color:#e74c3c}input[type=checkbox]:focus:invalid:focus,input[type=file]:focus:invalid:focus,input[type=radio]:focus:invalid:focus{outline-color:#e74c3c}input.wy-input-large{padding:12px;font-size:100%}textarea{overflow:auto;vertical-align:top;width:100%;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif}select,textarea{padding:.5em .625em;display:inline-block;border:1px solid #ccc;font-size:80%;box-shadow:inset 0 1px 3px #ddd;-webkit-transition:border .3s linear;-moz-transition:border .3s linear;transition:border .3s linear}select{border:1px solid #ccc;background-color:#fff}select[multiple]{height:auto}select:focus,textarea:focus{outline:0}input[readonly],select[disabled],select[readonly],textarea[disabled],textarea[readonly]{cursor:not-allowed;background-color:#fafafa}input[type=checkbox][disabled],input[type=radio][disabled]{cursor:not-allowed}.wy-checkbox,.wy-radio{margin:6px 0;color:#404040;display:block}.wy-checkbox input,.wy-radio input{vertical-align:baseline}.wy-form-message-inline{display:inline-block;*display:inline;*zoom:1;vertical-align:middle}.wy-input-prefix,.wy-input-suffix{white-space:nowrap;padding:6px}.wy-input-prefix .wy-input-context,.wy-input-suffix .wy-input-context{line-height:27px;padding:0 8px;display:inline-block;font-size:80%;background-color:#f3f6f6;border:1px solid #ccc;color:#999}.wy-input-suffix .wy-input-context{border-left:0}.wy-input-prefix .wy-input-context{border-right:0}.wy-switch{position:relative;display:block;height:24px;margin-top:12px;cursor:pointer}.wy-switch:before{left:0;top:0;width:36px;height:12px;background:#ccc}.wy-switch:after,.wy-switch:before{position:absolute;content:"";display:block;border-radius:4px;-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.wy-switch:after{width:18px;height:18px;background:#999;left:-3px;top:-3px}.wy-switch span{position:absolute;left:48px;display:block;font-size:12px;color:#ccc;line-height:1}.wy-switch.active:before{background:#1e8449}.wy-switch.active:after{left:24px;background:#27ae60}.wy-switch.disabled{cursor:not-allowed;opacity:.8}.wy-control-group.wy-control-group-error .wy-form-message,.wy-control-group.wy-control-group-error>label{color:#e74c3c}.wy-control-group.wy-control-group-error input[type=color],.wy-control-group.wy-control-group-error input[type=date],.wy-control-group.wy-control-group-error input[type=datetime-local],.wy-control-group.wy-control-group-error input[type=datetime],.wy-control-group.wy-control-group-error input[type=email],.wy-control-group.wy-control-group-error input[type=month],.wy-control-group.wy-control-group-error input[type=number],.wy-control-group.wy-control-group-error input[type=password],.wy-control-group.wy-control-group-error input[type=search],.wy-control-group.wy-control-group-error input[type=tel],.wy-control-group.wy-control-group-error input[type=text],.wy-control-group.wy-control-group-error input[type=time],.wy-control-group.wy-control-group-error input[type=url],.wy-control-group.wy-control-group-error input[type=week],.wy-control-group.wy-control-group-error textarea{border:1px solid #e74c3c}.wy-inline-validate{white-space:nowrap}.wy-inline-validate .wy-input-context{padding:.5em .625em;display:inline-block;font-size:80%}.wy-inline-validate.wy-inline-validate-success .wy-input-context{color:#27ae60}.wy-inline-validate.wy-inline-validate-danger .wy-input-context{color:#e74c3c}.wy-inline-validate.wy-inline-validate-warning .wy-input-context{color:#e67e22}.wy-inline-validate.wy-inline-validate-info .wy-input-context{color:#2980b9}.rotate-90{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-ms-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg)}.rotate-180{-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-ms-transform:rotate(180deg);-o-transform:rotate(180deg);transform:rotate(180deg)}.rotate-270{-webkit-transform:rotate(270deg);-moz-transform:rotate(270deg);-ms-transform:rotate(270deg);-o-transform:rotate(270deg);transform:rotate(270deg)}.mirror{-webkit-transform:scaleX(-1);-moz-transform:scaleX(-1);-ms-transform:scaleX(-1);-o-transform:scaleX(-1);transform:scaleX(-1)}.mirror.rotate-90{-webkit-transform:scaleX(-1) rotate(90deg);-moz-transform:scaleX(-1) rotate(90deg);-ms-transform:scaleX(-1) rotate(90deg);-o-transform:scaleX(-1) rotate(90deg);transform:scaleX(-1) rotate(90deg)}.mirror.rotate-180{-webkit-transform:scaleX(-1) rotate(180deg);-moz-transform:scaleX(-1) rotate(180deg);-ms-transform:scaleX(-1) rotate(180deg);-o-transform:scaleX(-1) rotate(180deg);transform:scaleX(-1) rotate(180deg)}.mirror.rotate-270{-webkit-transform:scaleX(-1) rotate(270deg);-moz-transform:scaleX(-1) rotate(270deg);-ms-transform:scaleX(-1) rotate(270deg);-o-transform:scaleX(-1) rotate(270deg);transform:scaleX(-1) rotate(270deg)}@media only screen and (max-width:480px){.wy-form button[type=submit]{margin:.7em 0 0}.wy-form input[type=color],.wy-form input[type=date],.wy-form input[type=datetime-local],.wy-form input[type=datetime],.wy-form input[type=email],.wy-form input[type=month],.wy-form input[type=number],.wy-form input[type=password],.wy-form input[type=search],.wy-form input[type=tel],.wy-form input[type=text],.wy-form input[type=time],.wy-form input[type=url],.wy-form input[type=week],.wy-form label{margin-bottom:.3em;display:block}.wy-form input[type=color],.wy-form input[type=date],.wy-form input[type=datetime-local],.wy-form input[type=datetime],.wy-form input[type=email],.wy-form input[type=month],.wy-form input[type=number],.wy-form input[type=password],.wy-form input[type=search],.wy-form input[type=tel],.wy-form input[type=time],.wy-form input[type=url],.wy-form input[type=week]{margin-bottom:0}.wy-form-aligned .wy-control-group label{margin-bottom:.3em;text-align:left;display:block;width:100%}.wy-form-aligned .wy-control{margin:1.5em 0 0}.wy-form-message,.wy-form-message-inline,.wy-form .wy-help-inline{display:block;font-size:80%;padding:6px 0}}@media screen and (max-width:768px){.tablet-hide{display:none}}@media screen and (max-width:480px){.mobile-hide{display:none}}.float-left{float:left}.float-right{float:right}.full-width{width:100%}.rst-content table.docutils,.rst-content table.field-list,.wy-table{border-collapse:collapse;border-spacing:0;empty-cells:show;margin-bottom:24px}.rst-content table.docutils caption,.rst-content table.field-list caption,.wy-table caption{color:#000;font:italic 85%/1 arial,sans-serif;padding:1em 0;text-align:center}.rst-content table.docutils td,.rst-content table.docutils th,.rst-content table.field-list td,.rst-content table.field-list th,.wy-table td,.wy-table th{font-size:90%;margin:0;overflow:visible;padding:8px 16px}.rst-content table.docutils td:first-child,.rst-content table.docutils th:first-child,.rst-content table.field-list td:first-child,.rst-content table.field-list th:first-child,.wy-table td:first-child,.wy-table th:first-child{border-left-width:0}.rst-content table.docutils thead,.rst-content table.field-list thead,.wy-table thead{color:#000;text-align:left;vertical-align:bottom;white-space:nowrap}.rst-content table.docutils thead th,.rst-content table.field-list thead th,.wy-table thead th{font-weight:700;border-bottom:2px solid #e1e4e5}.rst-content table.docutils td,.rst-content table.field-list td,.wy-table td{background-color:transparent;vertical-align:middle}.rst-content table.docutils td p,.rst-content table.field-list td p,.wy-table td p{line-height:18px}.rst-content table.docutils td p:last-child,.rst-content table.field-list td p:last-child,.wy-table td p:last-child{margin-bottom:0}.rst-content table.docutils .wy-table-cell-min,.rst-content table.field-list .wy-table-cell-min,.wy-table .wy-table-cell-min{width:1%;padding-right:0}.rst-content table.docutils .wy-table-cell-min input[type=checkbox],.rst-content table.field-list .wy-table-cell-min input[type=checkbox],.wy-table .wy-table-cell-min input[type=checkbox]{margin:0}.wy-table-secondary{color:grey;font-size:90%}.wy-table-tertiary{color:grey;font-size:80%}.rst-content table.docutils:not(.field-list) tr:nth-child(2n-1) td,.wy-table-backed,.wy-table-odd td,.wy-table-striped tr:nth-child(2n-1) td{background-color:#f3f6f6}.rst-content table.docutils,.wy-table-bordered-all{border:1px solid #e1e4e5}.rst-content table.docutils td,.wy-table-bordered-all td{border-bottom:1px solid #e1e4e5;border-left:1px solid #e1e4e5}.rst-content table.docutils tbody>tr:last-child td,.wy-table-bordered-all tbody>tr:last-child td{border-bottom-width:0}.wy-table-bordered{border:1px solid #e1e4e5}.wy-table-bordered-rows td{border-bottom:1px solid #e1e4e5}.wy-table-bordered-rows tbody>tr:last-child td{border-bottom-width:0}.wy-table-horizontal td,.wy-table-horizontal th{border-width:0 0 1px;border-bottom:1px solid #e1e4e5}.wy-table-horizontal tbody>tr:last-child td{border-bottom-width:0}.wy-table-responsive{margin-bottom:24px;max-width:100%;overflow:auto}.wy-table-responsive table{margin-bottom:0!important}.wy-table-responsive table td,.wy-table-responsive table th{white-space:nowrap}a{color:#2980b9;text-decoration:none;cursor:pointer}a:hover{color:#3091d1}a:visited{color:#9b59b6}html{height:100%}body,html{overflow-x:hidden}body{font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;font-weight:400;color:#404040;min-height:100%;background:#edf0f2}.wy-text-left{text-align:left}.wy-text-center{text-align:center}.wy-text-right{text-align:right}.wy-text-large{font-size:120%}.wy-text-normal{font-size:100%}.wy-text-small,small{font-size:80%}.wy-text-strike{text-decoration:line-through}.wy-text-warning{color:#e67e22!important}a.wy-text-warning:hover{color:#eb9950!important}.wy-text-info{color:#2980b9!important}a.wy-text-info:hover{color:#409ad5!important}.wy-text-success{color:#27ae60!important}a.wy-text-success:hover{color:#36d278!important}.wy-text-danger{color:#e74c3c!important}a.wy-text-danger:hover{color:#ed7669!important}.wy-text-neutral{color:#404040!important}a.wy-text-neutral:hover{color:#595959!important}.rst-content .toctree-wrapper>p.caption,h1,h2,h3,h4,h5,h6,legend{margin-top:0;font-weight:700;font-family:Roboto Slab,ff-tisa-web-pro,Georgia,Arial,sans-serif}p{line-height:24px;font-size:16px;margin:0 0 24px}h1{font-size:175%}.rst-content .toctree-wrapper>p.caption,h2{font-size:150%}h3{font-size:125%}h4{font-size:115%}h5{font-size:110%}h6{font-size:100%}hr{display:block;height:1px;border:0;border-top:1px solid #e1e4e5;margin:24px 0;padding:0}.rst-content code,.rst-content tt,code{white-space:nowrap;max-width:100%;background:#fff;border:1px solid #e1e4e5;font-size:75%;padding:0 5px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;color:#e74c3c;overflow-x:auto}.rst-content tt.code-large,code.code-large{font-size:90%}.rst-content .section ul,.rst-content .toctree-wrapper ul,.rst-content section ul,.wy-plain-list-disc,article ul{list-style:disc;line-height:24px;margin-bottom:24px}.rst-content .section ul li,.rst-content .toctree-wrapper ul li,.rst-content section ul li,.wy-plain-list-disc li,article ul li{list-style:disc;margin-left:24px}.rst-content .section ul li p:last-child,.rst-content .section ul li ul,.rst-content .toctree-wrapper ul li p:last-child,.rst-content .toctree-wrapper ul li ul,.rst-content section ul li p:last-child,.rst-content section ul li ul,.wy-plain-list-disc li p:last-child,.wy-plain-list-disc li ul,article ul li p:last-child,article ul li ul{margin-bottom:0}.rst-content .section ul li li,.rst-content .toctree-wrapper ul li li,.rst-content section ul li li,.wy-plain-list-disc li li,article ul li li{list-style:circle}.rst-content .section ul li li li,.rst-content .toctree-wrapper ul li li li,.rst-content section ul li li li,.wy-plain-list-disc li li li,article ul li li li{list-style:square}.rst-content .section ul li ol li,.rst-content .toctree-wrapper ul li ol li,.rst-content section ul li ol li,.wy-plain-list-disc li ol li,article ul li ol li{list-style:decimal}.rst-content .section ol,.rst-content .section ol.arabic,.rst-content .toctree-wrapper ol,.rst-content .toctree-wrapper ol.arabic,.rst-content section ol,.rst-content section ol.arabic,.wy-plain-list-decimal,article ol{list-style:decimal;line-height:24px;margin-bottom:24px}.rst-content .section ol.arabic li,.rst-content .section ol li,.rst-content .toctree-wrapper ol.arabic li,.rst-content .toctree-wrapper ol li,.rst-content section ol.arabic li,.rst-content section ol li,.wy-plain-list-decimal li,article ol li{list-style:decimal;margin-left:24px}.rst-content .section ol.arabic li ul,.rst-content .section ol li p:last-child,.rst-content .section ol li ul,.rst-content .toctree-wrapper ol.arabic li ul,.rst-content .toctree-wrapper ol li p:last-child,.rst-content .toctree-wrapper ol li ul,.rst-content section ol.arabic li ul,.rst-content section ol li p:last-child,.rst-content section ol li ul,.wy-plain-list-decimal li p:last-child,.wy-plain-list-decimal li ul,article ol li p:last-child,article ol li ul{margin-bottom:0}.rst-content .section ol.arabic li ul li,.rst-content .section ol li ul li,.rst-content .toctree-wrapper ol.arabic li ul li,.rst-content .toctree-wrapper ol li ul li,.rst-content section ol.arabic li ul li,.rst-content section ol li ul li,.wy-plain-list-decimal li ul li,article ol li ul li{list-style:disc}.wy-breadcrumbs{*zoom:1}.wy-breadcrumbs:after,.wy-breadcrumbs:before{display:table;content:""}.wy-breadcrumbs:after{clear:both}.wy-breadcrumbs>li{display:inline-block;padding-top:5px}.wy-breadcrumbs>li.wy-breadcrumbs-aside{float:right}.rst-content .wy-breadcrumbs>li code,.rst-content .wy-breadcrumbs>li tt,.wy-breadcrumbs>li .rst-content tt,.wy-breadcrumbs>li code{all:inherit;color:inherit}.breadcrumb-item:before{content:"/";color:#bbb;font-size:13px;padding:0 6px 0 3px}.wy-breadcrumbs-extra{margin-bottom:0;color:#b3b3b3;font-size:80%;display:inline-block}@media screen and (max-width:480px){.wy-breadcrumbs-extra,.wy-breadcrumbs li.wy-breadcrumbs-aside{display:none}}@media print{.wy-breadcrumbs li.wy-breadcrumbs-aside{display:none}}html{font-size:16px}.wy-affix{position:fixed;top:1.618em}.wy-menu a:hover{text-decoration:none}.wy-menu-horiz{*zoom:1}.wy-menu-horiz:after,.wy-menu-horiz:before{display:table;content:""}.wy-menu-horiz:after{clear:both}.wy-menu-horiz li,.wy-menu-horiz ul{display:inline-block}.wy-menu-horiz li:hover{background:hsla(0,0%,100%,.1)}.wy-menu-horiz li.divide-left{border-left:1px solid #404040}.wy-menu-horiz li.divide-right{border-right:1px solid #404040}.wy-menu-horiz a{height:32px;display:inline-block;line-height:32px;padding:0 16px}.wy-menu-vertical{width:300px}.wy-menu-vertical header,.wy-menu-vertical p.caption{color:#55a5d9;height:32px;line-height:32px;padding:0 1.618em;margin:12px 0 0;display:block;font-weight:700;text-transform:uppercase;font-size:85%;white-space:nowrap}.wy-menu-vertical ul{margin-bottom:0}.wy-menu-vertical li.divide-top{border-top:1px solid #404040}.wy-menu-vertical li.divide-bottom{border-bottom:1px solid #404040}.wy-menu-vertical li.current{background:#e3e3e3}.wy-menu-vertical li.current a{color:grey;border-right:1px solid #c9c9c9;padding:.4045em 2.427em}.wy-menu-vertical li.current a:hover{background:#d6d6d6}.rst-content .wy-menu-vertical li tt,.wy-menu-vertical li .rst-content tt,.wy-menu-vertical li code{border:none;background:inherit;color:inherit;padding-left:0;padding-right:0}.wy-menu-vertical li button.toctree-expand{display:block;float:left;margin-left:-1.2em;line-height:18px;color:#4d4d4d;border:none;background:none;padding:0}.wy-menu-vertical li.current>a,.wy-menu-vertical li.on a{color:#404040;font-weight:700;position:relative;background:#fcfcfc;border:none;padding:.4045em 1.618em}.wy-menu-vertical li.current>a:hover,.wy-menu-vertical li.on a:hover{background:#fcfcfc}.wy-menu-vertical li.current>a:hover button.toctree-expand,.wy-menu-vertical li.on a:hover button.toctree-expand{color:grey}.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand{display:block;line-height:18px;color:#333}.wy-menu-vertical li.toctree-l1.current>a{border-bottom:1px solid #c9c9c9;border-top:1px solid #c9c9c9}.wy-menu-vertical .toctree-l1.current .toctree-l2>ul,.wy-menu-vertical .toctree-l2.current .toctree-l3>ul,.wy-menu-vertical .toctree-l3.current .toctree-l4>ul,.wy-menu-vertical .toctree-l4.current .toctree-l5>ul,.wy-menu-vertical .toctree-l5.current .toctree-l6>ul,.wy-menu-vertical .toctree-l6.current .toctree-l7>ul,.wy-menu-vertical .toctree-l7.current .toctree-l8>ul,.wy-menu-vertical .toctree-l8.current .toctree-l9>ul,.wy-menu-vertical .toctree-l9.current .toctree-l10>ul,.wy-menu-vertical .toctree-l10.current .toctree-l11>ul{display:none}.wy-menu-vertical .toctree-l1.current .current.toctree-l2>ul,.wy-menu-vertical .toctree-l2.current .current.toctree-l3>ul,.wy-menu-vertical .toctree-l3.current .current.toctree-l4>ul,.wy-menu-vertical .toctree-l4.current .current.toctree-l5>ul,.wy-menu-vertical .toctree-l5.current .current.toctree-l6>ul,.wy-menu-vertical .toctree-l6.current .current.toctree-l7>ul,.wy-menu-vertical .toctree-l7.current .current.toctree-l8>ul,.wy-menu-vertical .toctree-l8.current .current.toctree-l9>ul,.wy-menu-vertical .toctree-l9.current .current.toctree-l10>ul,.wy-menu-vertical .toctree-l10.current .current.toctree-l11>ul{display:block}.wy-menu-vertical li.toctree-l3,.wy-menu-vertical li.toctree-l4{font-size:.9em}.wy-menu-vertical li.toctree-l2 a,.wy-menu-vertical li.toctree-l3 a,.wy-menu-vertical li.toctree-l4 a,.wy-menu-vertical li.toctree-l5 a,.wy-menu-vertical li.toctree-l6 a,.wy-menu-vertical li.toctree-l7 a,.wy-menu-vertical li.toctree-l8 a,.wy-menu-vertical li.toctree-l9 a,.wy-menu-vertical li.toctree-l10 a{color:#404040}.wy-menu-vertical li.toctree-l2 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l3 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l4 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l5 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l6 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l7 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l8 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l9 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l10 a:hover button.toctree-expand{color:grey}.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a,.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a,.wy-menu-vertical li.toctree-l4.current li.toctree-l5>a,.wy-menu-vertical li.toctree-l5.current li.toctree-l6>a,.wy-menu-vertical li.toctree-l6.current li.toctree-l7>a,.wy-menu-vertical li.toctree-l7.current li.toctree-l8>a,.wy-menu-vertical li.toctree-l8.current li.toctree-l9>a,.wy-menu-vertical li.toctree-l9.current li.toctree-l10>a,.wy-menu-vertical li.toctree-l10.current li.toctree-l11>a{display:block}.wy-menu-vertical li.toctree-l2.current>a{padding:.4045em 2.427em}.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a{padding:.4045em 1.618em .4045em 4.045em}.wy-menu-vertical li.toctree-l3.current>a{padding:.4045em 4.045em}.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a{padding:.4045em 1.618em .4045em 5.663em}.wy-menu-vertical li.toctree-l4.current>a{padding:.4045em 5.663em}.wy-menu-vertical li.toctree-l4.current li.toctree-l5>a{padding:.4045em 1.618em .4045em 7.281em}.wy-menu-vertical li.toctree-l5.current>a{padding:.4045em 7.281em}.wy-menu-vertical li.toctree-l5.current li.toctree-l6>a{padding:.4045em 1.618em .4045em 8.899em}.wy-menu-vertical li.toctree-l6.current>a{padding:.4045em 8.899em}.wy-menu-vertical li.toctree-l6.current li.toctree-l7>a{padding:.4045em 1.618em .4045em 10.517em}.wy-menu-vertical li.toctree-l7.current>a{padding:.4045em 10.517em}.wy-menu-vertical li.toctree-l7.current li.toctree-l8>a{padding:.4045em 1.618em .4045em 12.135em}.wy-menu-vertical li.toctree-l8.current>a{padding:.4045em 12.135em}.wy-menu-vertical li.toctree-l8.current li.toctree-l9>a{padding:.4045em 1.618em .4045em 13.753em}.wy-menu-vertical li.toctree-l9.current>a{padding:.4045em 13.753em}.wy-menu-vertical li.toctree-l9.current li.toctree-l10>a{padding:.4045em 1.618em .4045em 15.371em}.wy-menu-vertical li.toctree-l10.current>a{padding:.4045em 15.371em}.wy-menu-vertical li.toctree-l10.current li.toctree-l11>a{padding:.4045em 1.618em .4045em 16.989em}.wy-menu-vertical li.toctree-l2.current>a,.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a{background:#c9c9c9}.wy-menu-vertical li.toctree-l2 button.toctree-expand{color:#a3a3a3}.wy-menu-vertical li.toctree-l3.current>a,.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a{background:#bdbdbd}.wy-menu-vertical li.toctree-l3 button.toctree-expand{color:#969696}.wy-menu-vertical li.current ul{display:block}.wy-menu-vertical li ul{margin-bottom:0;display:none}.wy-menu-vertical li ul li a{margin-bottom:0;color:#d9d9d9;font-weight:400}.wy-menu-vertical a{line-height:18px;padding:.4045em 1.618em;display:block;position:relative;font-size:90%;color:#d9d9d9}.wy-menu-vertical a:hover{background-color:#4e4a4a;cursor:pointer}.wy-menu-vertical a:hover button.toctree-expand{color:#d9d9d9}.wy-menu-vertical a:active{background-color:#2980b9;cursor:pointer;color:#fff}.wy-menu-vertical a:active button.toctree-expand{color:#fff}.wy-side-nav-search{display:block;width:300px;padding:.809em;margin-bottom:.809em;z-index:200;background-color:#2980b9;text-align:center;color:#fcfcfc}.wy-side-nav-search input[type=text]{width:100%;border-radius:50px;padding:6px 12px;border-color:#2472a4}.wy-side-nav-search img{display:block;margin:auto auto .809em;height:45px;width:45px;background-color:#2980b9;padding:5px;border-radius:100%}.wy-side-nav-search .wy-dropdown>a,.wy-side-nav-search>a{color:#fcfcfc;font-size:100%;font-weight:700;display:inline-block;padding:4px 6px;margin-bottom:.809em;max-width:100%}.wy-side-nav-search .wy-dropdown>a:hover,.wy-side-nav-search .wy-dropdown>aactive,.wy-side-nav-search .wy-dropdown>afocus,.wy-side-nav-search>a:hover,.wy-side-nav-search>aactive,.wy-side-nav-search>afocus{background:hsla(0,0%,100%,.1)}.wy-side-nav-search .wy-dropdown>a img.logo,.wy-side-nav-search>a img.logo{display:block;margin:0 auto;height:auto;width:auto;border-radius:0;max-width:100%;background:transparent}.wy-side-nav-search .wy-dropdown>a.icon,.wy-side-nav-search>a.icon{display:block}.wy-side-nav-search .wy-dropdown>a.icon img.logo,.wy-side-nav-search>a.icon img.logo{margin-top:.85em}.wy-side-nav-search>div.switch-menus{position:relative;display:block;margin-top:-.4045em;margin-bottom:.809em;font-weight:400;color:hsla(0,0%,100%,.3)}.wy-side-nav-search>div.switch-menus>div.language-switch,.wy-side-nav-search>div.switch-menus>div.version-switch{display:inline-block;padding:.2em}.wy-side-nav-search>div.switch-menus>div.language-switch select,.wy-side-nav-search>div.switch-menus>div.version-switch select{display:inline-block;margin-right:-2rem;padding-right:2rem;max-width:240px;text-align-last:center;background:none;border:none;border-radius:0;box-shadow:none;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;font-size:1em;font-weight:400;color:hsla(0,0%,100%,.3);cursor:pointer;appearance:none;-webkit-appearance:none;-moz-appearance:none}.wy-side-nav-search>div.switch-menus>div.language-switch select:active,.wy-side-nav-search>div.switch-menus>div.language-switch select:focus,.wy-side-nav-search>div.switch-menus>div.language-switch select:hover,.wy-side-nav-search>div.switch-menus>div.version-switch select:active,.wy-side-nav-search>div.switch-menus>div.version-switch select:focus,.wy-side-nav-search>div.switch-menus>div.version-switch select:hover{background:hsla(0,0%,100%,.1);color:hsla(0,0%,100%,.5)}.wy-side-nav-search>div.switch-menus>div.language-switch select option,.wy-side-nav-search>div.switch-menus>div.version-switch select option{color:#000}.wy-side-nav-search>div.switch-menus>div.language-switch:has(>select):after,.wy-side-nav-search>div.switch-menus>div.version-switch:has(>select):after{display:inline-block;width:1.5em;height:100%;padding:.1em;content:"\f0d7";font-size:1em;line-height:1.2em;font-family:FontAwesome;text-align:center;pointer-events:none;box-sizing:border-box}.wy-nav .wy-menu-vertical header{color:#2980b9}.wy-nav .wy-menu-vertical a{color:#b3b3b3}.wy-nav .wy-menu-vertical a:hover{background-color:#2980b9;color:#fff}[data-menu-wrap]{-webkit-transition:all .2s ease-in;-moz-transition:all .2s ease-in;transition:all .2s ease-in;position:absolute;opacity:1;width:100%;opacity:0}[data-menu-wrap].move-center{left:0;right:auto;opacity:1}[data-menu-wrap].move-left{right:auto;left:-100%;opacity:0}[data-menu-wrap].move-right{right:-100%;left:auto;opacity:0}.wy-body-for-nav{background:#fcfcfc}.wy-grid-for-nav{position:absolute;width:100%;height:100%}.wy-nav-side{position:fixed;top:0;bottom:0;left:0;padding-bottom:2em;width:300px;overflow-x:hidden;overflow-y:hidden;min-height:100%;color:#9b9b9b;background:#343131;z-index:200}.wy-side-scroll{width:320px;position:relative;overflow-x:hidden;overflow-y:scroll;height:100%}.wy-nav-top{display:none;background:#2980b9;color:#fff;padding:.4045em .809em;position:relative;line-height:50px;text-align:center;font-size:100%;*zoom:1}.wy-nav-top:after,.wy-nav-top:before{display:table;content:""}.wy-nav-top:after{clear:both}.wy-nav-top a{color:#fff;font-weight:700}.wy-nav-top img{margin-right:12px;height:45px;width:45px;background-color:#2980b9;padding:5px;border-radius:100%}.wy-nav-top i{font-size:30px;float:left;cursor:pointer;padding-top:inherit}.wy-nav-content-wrap{margin-left:300px;background:#fcfcfc;min-height:100%}.wy-nav-content{padding:1.618em 3.236em;height:100%;max-width:800px;margin:auto}.wy-body-mask{position:fixed;width:100%;height:100%;background:rgba(0,0,0,.2);display:none;z-index:499}.wy-body-mask.on{display:block}footer{color:grey}footer p{margin-bottom:12px}.rst-content footer span.commit tt,footer span.commit .rst-content tt,footer span.commit code{padding:0;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;font-size:1em;background:none;border:none;color:grey}.rst-footer-buttons{*zoom:1}.rst-footer-buttons:after,.rst-footer-buttons:before{width:100%;display:table;content:""}.rst-footer-buttons:after{clear:both}.rst-breadcrumbs-buttons{margin-top:12px;*zoom:1}.rst-breadcrumbs-buttons:after,.rst-breadcrumbs-buttons:before{display:table;content:""}.rst-breadcrumbs-buttons:after{clear:both}#search-results .search li{margin-bottom:24px;border-bottom:1px solid #e1e4e5;padding-bottom:24px}#search-results .search li:first-child{border-top:1px solid #e1e4e5;padding-top:24px}#search-results .search li a{font-size:120%;margin-bottom:12px;display:inline-block}#search-results .context{color:grey;font-size:90%}.genindextable li>ul{margin-left:24px}@media screen and (max-width:768px){.wy-body-for-nav{background:#fcfcfc}.wy-nav-top{display:block}.wy-nav-side{left:-300px}.wy-nav-side.shift{width:85%;left:0}.wy-menu.wy-menu-vertical,.wy-side-nav-search,.wy-side-scroll{width:auto}.wy-nav-content-wrap{margin-left:0}.wy-nav-content-wrap .wy-nav-content{padding:1.618em}.wy-nav-content-wrap.shift{position:fixed;min-width:100%;left:85%;top:0;height:100%;overflow:hidden}}@media screen and (min-width:1100px){.wy-nav-content-wrap{background:rgba(0,0,0,.05)}.wy-nav-content{margin:0;background:#fcfcfc}}@media print{.rst-versions,.wy-nav-side,footer{display:none}.wy-nav-content-wrap{margin-left:0}}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1d1d;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;z-index:400}.rst-versions a{color:#2980b9;text-decoration:none}.rst-versions .rst-badge-small{display:none}.rst-versions .rst-current-version{padding:12px;background-color:#272525;display:block;text-align:right;font-size:90%;cursor:pointer;color:#27ae60;*zoom:1}.rst-versions .rst-current-version:after,.rst-versions .rst-current-version:before{display:table;content:""}.rst-versions .rst-current-version:after{clear:both}.rst-content .code-block-caption .rst-versions .rst-current-version .headerlink,.rst-content .eqno .rst-versions .rst-current-version .headerlink,.rst-content .rst-versions .rst-current-version .admonition-title,.rst-content code.download .rst-versions .rst-current-version span:first-child,.rst-content dl dt .rst-versions .rst-current-version .headerlink,.rst-content h1 .rst-versions .rst-current-version .headerlink,.rst-content h2 .rst-versions .rst-current-version .headerlink,.rst-content h3 .rst-versions .rst-current-version .headerlink,.rst-content h4 .rst-versions .rst-current-version .headerlink,.rst-content h5 .rst-versions .rst-current-version .headerlink,.rst-content h6 .rst-versions .rst-current-version .headerlink,.rst-content p .rst-versions .rst-current-version .headerlink,.rst-content table>caption .rst-versions .rst-current-version .headerlink,.rst-content tt.download .rst-versions .rst-current-version span:first-child,.rst-versions .rst-current-version .fa,.rst-versions .rst-current-version .icon,.rst-versions .rst-current-version .rst-content .admonition-title,.rst-versions .rst-current-version .rst-content .code-block-caption .headerlink,.rst-versions .rst-current-version .rst-content .eqno .headerlink,.rst-versions .rst-current-version .rst-content code.download span:first-child,.rst-versions .rst-current-version .rst-content dl dt .headerlink,.rst-versions .rst-current-version .rst-content h1 .headerlink,.rst-versions .rst-current-version .rst-content h2 .headerlink,.rst-versions .rst-current-version .rst-content h3 .headerlink,.rst-versions .rst-current-version .rst-content h4 .headerlink,.rst-versions .rst-current-version .rst-content h5 .headerlink,.rst-versions .rst-current-version .rst-content h6 .headerlink,.rst-versions .rst-current-version .rst-content p .headerlink,.rst-versions .rst-current-version .rst-content table>caption .headerlink,.rst-versions .rst-current-version .rst-content tt.download span:first-child,.rst-versions .rst-current-version .wy-menu-vertical li button.toctree-expand,.wy-menu-vertical li .rst-versions .rst-current-version button.toctree-expand{color:#fcfcfc}.rst-versions .rst-current-version .fa-book,.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version.rst-out-of-date{background-color:#e74c3c;color:#fff}.rst-versions .rst-current-version.rst-active-old-version{background-color:#f1c40f;color:#000}.rst-versions.shift-up{height:auto;max-height:100%;overflow-y:scroll}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:grey;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:1px solid #413d3d}.rst-versions .rst-other-versions dd{display:inline-block;margin:0}.rst-versions .rst-other-versions dd a{display:inline-block;padding:6px;color:#fcfcfc}.rst-versions .rst-other-versions .rtd-current-item{font-weight:700}.rst-versions.rst-badge{width:auto;bottom:20px;right:20px;left:auto;border:none;max-width:300px;max-height:90%}.rst-versions.rst-badge .fa-book,.rst-versions.rst-badge .icon-book{float:none;line-height:30px}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .fa-book,.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge>.rst-current-version{width:auto;height:30px;line-height:30px;padding:0 6px;display:block;text-align:center}@media screen and (max-width:768px){.rst-versions{width:85%;display:none}.rst-versions.shift{display:block}}#flyout-search-form{padding:6px}.rst-content .toctree-wrapper>p.caption,.rst-content h1,.rst-content h2,.rst-content h3,.rst-content h4,.rst-content h5,.rst-content h6{margin-bottom:24px}.rst-content img{max-width:100%;height:auto}.rst-content div.figure,.rst-content figure{margin-bottom:24px}.rst-content div.figure .caption-text,.rst-content figure .caption-text{font-style:italic}.rst-content div.figure p:last-child.caption,.rst-content figure p:last-child.caption{margin-bottom:0}.rst-content div.figure.align-center,.rst-content figure.align-center{text-align:center}.rst-content .section>a>img,.rst-content .section>img,.rst-content section>a>img,.rst-content section>img{margin-bottom:24px}.rst-content abbr[title]{text-decoration:none}.rst-content.style-external-links a.reference.external:after{font-family:FontAwesome;content:"\f08e";color:#b3b3b3;vertical-align:super;font-size:60%;margin:0 .2em}.rst-content blockquote{margin-left:24px;line-height:24px;margin-bottom:24px}.rst-content pre.literal-block{white-space:pre;margin:0;padding:12px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;display:block;overflow:auto}.rst-content div[class^=highlight],.rst-content pre.literal-block{border:1px solid #e1e4e5;overflow-x:auto;margin:1px 0 24px}.rst-content div[class^=highlight] div[class^=highlight],.rst-content pre.literal-block div[class^=highlight]{padding:0;border:none;margin:0}.rst-content div[class^=highlight] td.code{width:100%}.rst-content .linenodiv pre{border-right:1px solid #e6e9ea;margin:0;padding:12px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;user-select:none;pointer-events:none}.rst-content div[class^=highlight] pre{white-space:pre;margin:0;padding:12px;display:block;overflow:auto}.rst-content div[class^=highlight] pre .hll{display:block;margin:0 -12px;padding:0 12px}.rst-content .linenodiv pre,.rst-content div[class^=highlight] pre,.rst-content pre.literal-block{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;font-size:12px;line-height:1.4}.rst-content div.highlight .gp,.rst-content div.highlight span.linenos{user-select:none;pointer-events:none}.rst-content div.highlight span.linenos{display:inline-block;padding-left:0;padding-right:12px;margin-right:12px;border-right:1px solid #e6e9ea}.rst-content .code-block-caption{font-style:italic;font-size:85%;line-height:1;padding:1em 0;text-align:center}@media print{.rst-content .codeblock,.rst-content div[class^=highlight],.rst-content div[class^=highlight] pre{white-space:pre-wrap}}.rst-content .admonition,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning{clear:both}.rst-content .admonition-todo .last,.rst-content .admonition-todo>:last-child,.rst-content .admonition .last,.rst-content .admonition>:last-child,.rst-content .attention .last,.rst-content .attention>:last-child,.rst-content .caution .last,.rst-content .caution>:last-child,.rst-content .danger .last,.rst-content .danger>:last-child,.rst-content .error .last,.rst-content .error>:last-child,.rst-content .hint .last,.rst-content .hint>:last-child,.rst-content .important .last,.rst-content .important>:last-child,.rst-content .note .last,.rst-content .note>:last-child,.rst-content .seealso .last,.rst-content .seealso>:last-child,.rst-content .tip .last,.rst-content .tip>:last-child,.rst-content .warning .last,.rst-content .warning>:last-child{margin-bottom:0}.rst-content .admonition-title:before{margin-right:4px}.rst-content .admonition table{border-color:rgba(0,0,0,.1)}.rst-content .admonition table td,.rst-content .admonition table th{background:transparent!important;border-color:rgba(0,0,0,.1)!important}.rst-content .section ol.loweralpha,.rst-content .section ol.loweralpha>li,.rst-content .toctree-wrapper ol.loweralpha,.rst-content .toctree-wrapper ol.loweralpha>li,.rst-content section ol.loweralpha,.rst-content section ol.loweralpha>li{list-style:lower-alpha}.rst-content .section ol.upperalpha,.rst-content .section ol.upperalpha>li,.rst-content .toctree-wrapper ol.upperalpha,.rst-content .toctree-wrapper ol.upperalpha>li,.rst-content section ol.upperalpha,.rst-content section ol.upperalpha>li{list-style:upper-alpha}.rst-content .section ol li>*,.rst-content .section ul li>*,.rst-content .toctree-wrapper ol li>*,.rst-content .toctree-wrapper ul li>*,.rst-content section ol li>*,.rst-content section ul li>*{margin-top:12px;margin-bottom:12px}.rst-content .section ol li>:first-child,.rst-content .section ul li>:first-child,.rst-content .toctree-wrapper ol li>:first-child,.rst-content .toctree-wrapper ul li>:first-child,.rst-content section ol li>:first-child,.rst-content section ul li>:first-child{margin-top:0}.rst-content .section ol li>p,.rst-content .section ol li>p:last-child,.rst-content .section ul li>p,.rst-content .section ul li>p:last-child,.rst-content .toctree-wrapper ol li>p,.rst-content .toctree-wrapper ol li>p:last-child,.rst-content .toctree-wrapper ul li>p,.rst-content .toctree-wrapper ul li>p:last-child,.rst-content section ol li>p,.rst-content section ol li>p:last-child,.rst-content section ul li>p,.rst-content section ul li>p:last-child{margin-bottom:12px}.rst-content .section ol li>p:only-child,.rst-content .section ol li>p:only-child:last-child,.rst-content .section ul li>p:only-child,.rst-content .section ul li>p:only-child:last-child,.rst-content .toctree-wrapper ol li>p:only-child,.rst-content .toctree-wrapper ol li>p:only-child:last-child,.rst-content .toctree-wrapper ul li>p:only-child,.rst-content .toctree-wrapper ul li>p:only-child:last-child,.rst-content section ol li>p:only-child,.rst-content section ol li>p:only-child:last-child,.rst-content section ul li>p:only-child,.rst-content section ul li>p:only-child:last-child{margin-bottom:0}.rst-content .section ol li>ol,.rst-content .section ol li>ul,.rst-content .section ul li>ol,.rst-content .section ul li>ul,.rst-content .toctree-wrapper ol li>ol,.rst-content .toctree-wrapper ol li>ul,.rst-content .toctree-wrapper ul li>ol,.rst-content .toctree-wrapper ul li>ul,.rst-content section ol li>ol,.rst-content section ol li>ul,.rst-content section ul li>ol,.rst-content section ul li>ul{margin-bottom:12px}.rst-content .section ol.simple li>*,.rst-content .section ol.simple li ol,.rst-content .section ol.simple li ul,.rst-content .section ul.simple li>*,.rst-content .section ul.simple li ol,.rst-content .section ul.simple li ul,.rst-content .toctree-wrapper ol.simple li>*,.rst-content .toctree-wrapper ol.simple li ol,.rst-content .toctree-wrapper ol.simple li ul,.rst-content .toctree-wrapper ul.simple li>*,.rst-content .toctree-wrapper ul.simple li ol,.rst-content .toctree-wrapper ul.simple li ul,.rst-content section ol.simple li>*,.rst-content section ol.simple li ol,.rst-content section ol.simple li ul,.rst-content section ul.simple li>*,.rst-content section ul.simple li ol,.rst-content section ul.simple li ul{margin-top:0;margin-bottom:0}.rst-content .line-block{margin-left:0;margin-bottom:24px;line-height:24px}.rst-content .line-block .line-block{margin-left:24px;margin-bottom:0}.rst-content .topic-title{font-weight:700;margin-bottom:12px}.rst-content .toc-backref{color:#404040}.rst-content .align-right{float:right;margin:0 0 24px 24px}.rst-content .align-left{float:left;margin:0 24px 24px 0}.rst-content .align-center{margin:auto}.rst-content .align-center:not(table){display:block}.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content .toctree-wrapper>p.caption .headerlink,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink{opacity:0;font-size:14px;font-family:FontAwesome;margin-left:.5em}.rst-content .code-block-caption .headerlink:focus,.rst-content .code-block-caption:hover .headerlink,.rst-content .eqno .headerlink:focus,.rst-content .eqno:hover .headerlink,.rst-content .toctree-wrapper>p.caption .headerlink:focus,.rst-content .toctree-wrapper>p.caption:hover .headerlink,.rst-content dl dt .headerlink:focus,.rst-content dl dt:hover .headerlink,.rst-content h1 .headerlink:focus,.rst-content h1:hover .headerlink,.rst-content h2 .headerlink:focus,.rst-content h2:hover .headerlink,.rst-content h3 .headerlink:focus,.rst-content h3:hover .headerlink,.rst-content h4 .headerlink:focus,.rst-content h4:hover .headerlink,.rst-content h5 .headerlink:focus,.rst-content h5:hover .headerlink,.rst-content h6 .headerlink:focus,.rst-content h6:hover .headerlink,.rst-content p.caption .headerlink:focus,.rst-content p.caption:hover .headerlink,.rst-content p .headerlink:focus,.rst-content p:hover .headerlink,.rst-content table>caption .headerlink:focus,.rst-content table>caption:hover .headerlink{opacity:1}.rst-content p a{overflow-wrap:anywhere}.rst-content .wy-table td p,.rst-content .wy-table td ul,.rst-content .wy-table th p,.rst-content .wy-table th ul,.rst-content table.docutils td p,.rst-content table.docutils td ul,.rst-content table.docutils th p,.rst-content table.docutils th ul,.rst-content table.field-list td p,.rst-content table.field-list td ul,.rst-content table.field-list th p,.rst-content table.field-list th ul{font-size:inherit}.rst-content .btn:focus{outline:2px solid}.rst-content table>caption .headerlink:after{font-size:12px}.rst-content .centered{text-align:center}.rst-content .sidebar{float:right;width:40%;display:block;margin:0 0 24px 24px;padding:24px;background:#f3f6f6;border:1px solid #e1e4e5}.rst-content .sidebar dl,.rst-content .sidebar p,.rst-content .sidebar ul{font-size:90%}.rst-content .sidebar .last,.rst-content .sidebar>:last-child{margin-bottom:0}.rst-content .sidebar .sidebar-title{display:block;font-family:Roboto Slab,ff-tisa-web-pro,Georgia,Arial,sans-serif;font-weight:700;background:#e1e4e5;padding:6px 12px;margin:-24px -24px 24px;font-size:100%}.rst-content .highlighted{background:#f1c40f;box-shadow:0 0 0 2px #f1c40f;display:inline;font-weight:700}.rst-content .citation-reference,.rst-content .footnote-reference{vertical-align:baseline;position:relative;top:-.4em;line-height:0;font-size:90%}.rst-content .citation-reference>span.fn-bracket,.rst-content .footnote-reference>span.fn-bracket{display:none}.rst-content .hlist{width:100%}.rst-content dl dt span.classifier:before{content:" : "}.rst-content dl dt span.classifier-delimiter{display:none!important}html.writer-html4 .rst-content table.docutils.citation,html.writer-html4 .rst-content table.docutils.footnote{background:none;border:none}html.writer-html4 .rst-content table.docutils.citation td,html.writer-html4 .rst-content table.docutils.citation tr,html.writer-html4 .rst-content table.docutils.footnote td,html.writer-html4 .rst-content table.docutils.footnote tr{border:none;background-color:transparent!important;white-space:normal}html.writer-html4 .rst-content table.docutils.citation td.label,html.writer-html4 .rst-content table.docutils.footnote td.label{padding-left:0;padding-right:0;vertical-align:top}html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.field-list,html.writer-html5 .rst-content dl.footnote{display:grid;grid-template-columns:auto minmax(80%,95%)}html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dt{display:inline-grid;grid-template-columns:max-content auto}html.writer-html5 .rst-content aside.citation,html.writer-html5 .rst-content aside.footnote,html.writer-html5 .rst-content div.citation{display:grid;grid-template-columns:auto auto minmax(.65rem,auto) minmax(40%,95%)}html.writer-html5 .rst-content aside.citation>span.label,html.writer-html5 .rst-content aside.footnote>span.label,html.writer-html5 .rst-content div.citation>span.label{grid-column-start:1;grid-column-end:2}html.writer-html5 .rst-content aside.citation>span.backrefs,html.writer-html5 .rst-content aside.footnote>span.backrefs,html.writer-html5 .rst-content div.citation>span.backrefs{grid-column-start:2;grid-column-end:3;grid-row-start:1;grid-row-end:3}html.writer-html5 .rst-content aside.citation>p,html.writer-html5 .rst-content aside.footnote>p,html.writer-html5 .rst-content div.citation>p{grid-column-start:4;grid-column-end:5}html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.field-list,html.writer-html5 .rst-content dl.footnote{margin-bottom:24px}html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dt{padding-left:1rem}html.writer-html5 .rst-content dl.citation>dd,html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.field-list>dd,html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dd,html.writer-html5 .rst-content dl.footnote>dt{margin-bottom:0}html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.footnote{font-size:.9rem}html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.footnote>dt{margin:0 .5rem .5rem 0;line-height:1.2rem;word-break:break-all;font-weight:400}html.writer-html5 .rst-content dl.citation>dt>span.brackets:before,html.writer-html5 .rst-content dl.footnote>dt>span.brackets:before{content:"["}html.writer-html5 .rst-content dl.citation>dt>span.brackets:after,html.writer-html5 .rst-content dl.footnote>dt>span.brackets:after{content:"]"}html.writer-html5 .rst-content dl.citation>dt>span.fn-backref,html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref{text-align:left;font-style:italic;margin-left:.65rem;word-break:break-word;word-spacing:-.1rem;max-width:5rem}html.writer-html5 .rst-content dl.citation>dt>span.fn-backref>a,html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref>a{word-break:keep-all}html.writer-html5 .rst-content dl.citation>dt>span.fn-backref>a:not(:first-child):before,html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref>a:not(:first-child):before{content:" "}html.writer-html5 .rst-content dl.citation>dd,html.writer-html5 .rst-content dl.footnote>dd{margin:0 0 .5rem;line-height:1.2rem}html.writer-html5 .rst-content dl.citation>dd p,html.writer-html5 .rst-content dl.footnote>dd p{font-size:.9rem}html.writer-html5 .rst-content aside.citation,html.writer-html5 .rst-content aside.footnote,html.writer-html5 .rst-content div.citation{padding-left:1rem;padding-right:1rem;font-size:.9rem;line-height:1.2rem}html.writer-html5 .rst-content aside.citation p,html.writer-html5 .rst-content aside.footnote p,html.writer-html5 .rst-content div.citation p{font-size:.9rem;line-height:1.2rem;margin-bottom:12px}html.writer-html5 .rst-content aside.citation span.backrefs,html.writer-html5 .rst-content aside.footnote span.backrefs,html.writer-html5 .rst-content div.citation span.backrefs{text-align:left;font-style:italic;margin-left:.65rem;word-break:break-word;word-spacing:-.1rem;max-width:5rem}html.writer-html5 .rst-content aside.citation span.backrefs>a,html.writer-html5 .rst-content aside.footnote span.backrefs>a,html.writer-html5 .rst-content div.citation span.backrefs>a{word-break:keep-all}html.writer-html5 .rst-content aside.citation span.backrefs>a:not(:first-child):before,html.writer-html5 .rst-content aside.footnote span.backrefs>a:not(:first-child):before,html.writer-html5 .rst-content div.citation span.backrefs>a:not(:first-child):before{content:" "}html.writer-html5 .rst-content aside.citation span.label,html.writer-html5 .rst-content aside.footnote span.label,html.writer-html5 .rst-content div.citation span.label{line-height:1.2rem}html.writer-html5 .rst-content aside.citation-list,html.writer-html5 .rst-content aside.footnote-list,html.writer-html5 .rst-content div.citation-list{margin-bottom:24px}html.writer-html5 .rst-content dl.option-list kbd{font-size:.9rem}.rst-content table.docutils.footnote,html.writer-html4 .rst-content table.docutils.citation,html.writer-html5 .rst-content aside.footnote,html.writer-html5 .rst-content aside.footnote-list aside.footnote,html.writer-html5 .rst-content div.citation-list>div.citation,html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.footnote{color:grey}.rst-content table.docutils.footnote code,.rst-content table.docutils.footnote tt,html.writer-html4 .rst-content table.docutils.citation code,html.writer-html4 .rst-content table.docutils.citation tt,html.writer-html5 .rst-content aside.footnote-list aside.footnote code,html.writer-html5 .rst-content aside.footnote-list aside.footnote tt,html.writer-html5 .rst-content aside.footnote code,html.writer-html5 .rst-content aside.footnote tt,html.writer-html5 .rst-content div.citation-list>div.citation code,html.writer-html5 .rst-content div.citation-list>div.citation tt,html.writer-html5 .rst-content dl.citation code,html.writer-html5 .rst-content dl.citation tt,html.writer-html5 .rst-content dl.footnote code,html.writer-html5 .rst-content dl.footnote tt{color:#555}.rst-content .wy-table-responsive.citation,.rst-content .wy-table-responsive.footnote{margin-bottom:0}.rst-content .wy-table-responsive.citation+:not(.citation),.rst-content .wy-table-responsive.footnote+:not(.footnote){margin-top:24px}.rst-content .wy-table-responsive.citation:last-child,.rst-content .wy-table-responsive.footnote:last-child{margin-bottom:24px}.rst-content table.docutils th{border-color:#e1e4e5}html.writer-html5 .rst-content table.docutils th{border:1px solid #e1e4e5}html.writer-html5 .rst-content table.docutils td>p,html.writer-html5 .rst-content table.docutils th>p{line-height:1rem;margin-bottom:0;font-size:.9rem}.rst-content table.docutils td .last,.rst-content table.docutils td .last>:last-child{margin-bottom:0}.rst-content table.field-list,.rst-content table.field-list td{border:none}.rst-content table.field-list td p{line-height:inherit}.rst-content table.field-list td>strong{display:inline-block}.rst-content table.field-list .field-name{padding-right:10px;text-align:left;white-space:nowrap}.rst-content table.field-list .field-body{text-align:left}.rst-content code,.rst-content tt{color:#000;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;padding:2px 5px}.rst-content code big,.rst-content code em,.rst-content tt big,.rst-content tt em{font-size:100%!important;line-height:normal}.rst-content code.literal,.rst-content tt.literal{color:#e74c3c;white-space:normal}.rst-content code.xref,.rst-content tt.xref,a .rst-content code,a .rst-content tt{font-weight:700;color:#404040;overflow-wrap:normal}.rst-content kbd,.rst-content pre,.rst-content samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace}.rst-content a code,.rst-content a tt{color:#2980b9}.rst-content dl{margin-bottom:24px}.rst-content dl dt{font-weight:700;margin-bottom:12px}.rst-content dl ol,.rst-content dl p,.rst-content dl table,.rst-content dl ul{margin-bottom:12px}.rst-content dl dd{margin:0 0 12px 24px;line-height:24px}.rst-content dl dd>ol:last-child,.rst-content dl dd>p:last-child,.rst-content dl dd>table:last-child,.rst-content dl dd>ul:last-child{margin-bottom:0}html.writer-html4 .rst-content dl:not(.docutils),html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple){margin-bottom:24px}html.writer-html4 .rst-content dl:not(.docutils)>dt,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt{display:table;margin:6px 0;font-size:90%;line-height:normal;background:#e7f2fa;color:#2980b9;border-top:3px solid #6ab0de;padding:6px;position:relative}html.writer-html4 .rst-content dl:not(.docutils)>dt:before,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt:before{color:#6ab0de}html.writer-html4 .rst-content dl:not(.docutils)>dt .headerlink,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt .headerlink{color:#404040;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt{margin-bottom:6px;border:none;border-left:3px solid #ccc;background:#f0f0f0;color:#555}html.writer-html4 .rst-content dl:not(.docutils) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt .headerlink,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt .headerlink{color:#404040;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils)>dt:first-child,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt:first-child{margin-top:0}html.writer-html4 .rst-content dl:not(.docutils) code.descclassname,html.writer-html4 .rst-content dl:not(.docutils) code.descname,html.writer-html4 .rst-content dl:not(.docutils) tt.descclassname,html.writer-html4 .rst-content dl:not(.docutils) tt.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) code.descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) code.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) tt.descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) tt.descname{background-color:transparent;border:none;padding:0;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils) code.descname,html.writer-html4 .rst-content dl:not(.docutils) tt.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) code.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) tt.descname{font-weight:700}html.writer-html4 .rst-content dl:not(.docutils) .optional,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .optional{display:inline-block;padding:0 4px;color:#000;font-weight:700}html.writer-html4 .rst-content dl:not(.docutils) .property,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .property{display:inline-block;padding-right:8px;max-width:100%}html.writer-html4 .rst-content dl:not(.docutils) .k,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .k{font-style:italic}html.writer-html4 .rst-content dl:not(.docutils) .descclassname,html.writer-html4 .rst-content dl:not(.docutils) .descname,html.writer-html4 .rst-content dl:not(.docutils) .sig-name,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .sig-name{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;color:#000}.rst-content .viewcode-back,.rst-content .viewcode-link{display:inline-block;color:#27ae60;font-size:80%;padding-left:24px}.rst-content .viewcode-back{display:block;float:right}.rst-content p.rubric{margin-bottom:12px;font-weight:700}.rst-content code.download,.rst-content tt.download{background:inherit;padding:inherit;font-weight:400;font-family:inherit;font-size:inherit;color:inherit;border:inherit;white-space:inherit}.rst-content code.download span:first-child,.rst-content tt.download span:first-child{-webkit-font-smoothing:subpixel-antialiased}.rst-content code.download span:first-child:before,.rst-content tt.download span:first-child:before{margin-right:4px}.rst-content .guilabel,.rst-content .menuselection{font-size:80%;font-weight:700;border-radius:4px;padding:2.4px 6px;margin:auto 2px}.rst-content .guilabel,.rst-content .menuselection{border:1px solid #7fbbe3;background:#e7f2fa}.rst-content :not(dl.option-list)>:not(dt):not(kbd):not(.kbd)>.kbd,.rst-content :not(dl.option-list)>:not(dt):not(kbd):not(.kbd)>kbd{color:inherit;font-size:80%;background-color:#fff;border:1px solid #a6a6a6;border-radius:4px;box-shadow:0 2px grey;padding:2.4px 6px;margin:auto 0}.rst-content .versionmodified{font-style:italic}@media screen and (max-width:480px){.rst-content .sidebar{width:100%}}span[id*=MathJax-Span]{color:#404040}.math{text-align:center}@font-face{font-family:Lato;src:url(fonts/lato-normal.woff2?bd03a2cc277bbbc338d464e679fe9942) format("woff2"),url(fonts/lato-normal.woff?27bd77b9162d388cb8d4c4217c7c5e2a) format("woff");font-weight:400;font-style:normal;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-bold.woff2?cccb897485813c7c256901dbca54ecf2) format("woff2"),url(fonts/lato-bold.woff?d878b6c29b10beca227e9eef4246111b) format("woff");font-weight:700;font-style:normal;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-bold-italic.woff2?0b6bb6725576b072c5d0b02ecdd1900d) format("woff2"),url(fonts/lato-bold-italic.woff?9c7e4e9eb485b4a121c760e61bc3707c) format("woff");font-weight:700;font-style:italic;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-normal-italic.woff2?4eb103b4d12be57cb1d040ed5e162e9d) format("woff2"),url(fonts/lato-normal-italic.woff?f28f2d6482446544ef1ea1ccc6dd5892) format("woff");font-weight:400;font-style:italic;font-display:block}@font-face{font-family:Roboto Slab;font-style:normal;font-weight:400;src:url(fonts/Roboto-Slab-Regular.woff2?7abf5b8d04d26a2cafea937019bca958) format("woff2"),url(fonts/Roboto-Slab-Regular.woff?c1be9284088d487c5e3ff0a10a92e58c) format("woff");font-display:block}@font-face{font-family:Roboto Slab;font-style:normal;font-weight:700;src:url(fonts/Roboto-Slab-Bold.woff2?9984f4a9bda09be08e83f2506954adbe) format("woff2"),url(fonts/Roboto-Slab-Bold.woff?bed5564a116b05148e3b3bea6fb1162a) format("woff");font-display:block} \ No newline at end of file diff --git a/_static/doctools.js b/_static/doctools.js new file mode 100644 index 00000000..0398ebb9 --- /dev/null +++ b/_static/doctools.js @@ -0,0 +1,149 @@ +/* + * Base JavaScript utilities for all Sphinx HTML documentation. + */ +"use strict"; + +const BLACKLISTED_KEY_CONTROL_ELEMENTS = new Set([ + "TEXTAREA", + "INPUT", + "SELECT", + "BUTTON", +]); + +const _ready = (callback) => { + 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..87fc516a --- /dev/null +++ b/_static/documentation_options.js @@ -0,0 +1,13 @@ +const DOCUMENTATION_OPTIONS = { + VERSION: '', + LANGUAGE: 'en', + COLLAPSE_INDEX: false, + BUILDER: 'dirhtml', + 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 00000000..a858a410 Binary files /dev/null and b/_static/file.png differ diff --git a/_static/fonts/Lato/lato-bold.eot b/_static/fonts/Lato/lato-bold.eot new file mode 100644 index 00000000..3361183a Binary files /dev/null and b/_static/fonts/Lato/lato-bold.eot differ diff --git a/_static/fonts/Lato/lato-bold.ttf b/_static/fonts/Lato/lato-bold.ttf new file mode 100644 index 00000000..29f691d5 Binary files /dev/null and b/_static/fonts/Lato/lato-bold.ttf differ diff --git a/_static/fonts/Lato/lato-bold.woff b/_static/fonts/Lato/lato-bold.woff new file mode 100644 index 00000000..c6dff51f Binary files /dev/null and b/_static/fonts/Lato/lato-bold.woff differ diff --git a/_static/fonts/Lato/lato-bold.woff2 b/_static/fonts/Lato/lato-bold.woff2 new file mode 100644 index 00000000..bb195043 Binary files /dev/null and b/_static/fonts/Lato/lato-bold.woff2 differ diff --git a/_static/fonts/Lato/lato-bolditalic.eot b/_static/fonts/Lato/lato-bolditalic.eot new file mode 100644 index 00000000..3d415493 Binary files /dev/null and b/_static/fonts/Lato/lato-bolditalic.eot differ diff --git a/_static/fonts/Lato/lato-bolditalic.ttf b/_static/fonts/Lato/lato-bolditalic.ttf new file mode 100644 index 00000000..f402040b Binary files /dev/null and b/_static/fonts/Lato/lato-bolditalic.ttf differ diff --git a/_static/fonts/Lato/lato-bolditalic.woff b/_static/fonts/Lato/lato-bolditalic.woff new file mode 100644 index 00000000..88ad05b9 Binary files /dev/null and b/_static/fonts/Lato/lato-bolditalic.woff differ diff --git a/_static/fonts/Lato/lato-bolditalic.woff2 b/_static/fonts/Lato/lato-bolditalic.woff2 new file mode 100644 index 00000000..c4e3d804 Binary files /dev/null and b/_static/fonts/Lato/lato-bolditalic.woff2 differ diff --git a/_static/fonts/Lato/lato-italic.eot b/_static/fonts/Lato/lato-italic.eot new file mode 100644 index 00000000..3f826421 Binary files /dev/null and b/_static/fonts/Lato/lato-italic.eot differ diff --git a/_static/fonts/Lato/lato-italic.ttf b/_static/fonts/Lato/lato-italic.ttf new file mode 100644 index 00000000..b4bfc9b2 Binary files /dev/null and b/_static/fonts/Lato/lato-italic.ttf differ diff --git a/_static/fonts/Lato/lato-italic.woff b/_static/fonts/Lato/lato-italic.woff new file mode 100644 index 00000000..76114bc0 Binary files /dev/null and b/_static/fonts/Lato/lato-italic.woff differ diff --git a/_static/fonts/Lato/lato-italic.woff2 b/_static/fonts/Lato/lato-italic.woff2 new file mode 100644 index 00000000..3404f37e Binary files /dev/null and b/_static/fonts/Lato/lato-italic.woff2 differ diff --git a/_static/fonts/Lato/lato-regular.eot b/_static/fonts/Lato/lato-regular.eot new file mode 100644 index 00000000..11e3f2a5 Binary files /dev/null and b/_static/fonts/Lato/lato-regular.eot differ diff --git a/_static/fonts/Lato/lato-regular.ttf b/_static/fonts/Lato/lato-regular.ttf new file mode 100644 index 00000000..74decd9e Binary files /dev/null and b/_static/fonts/Lato/lato-regular.ttf differ diff --git a/_static/fonts/Lato/lato-regular.woff b/_static/fonts/Lato/lato-regular.woff new file mode 100644 index 00000000..ae1307ff Binary files /dev/null and b/_static/fonts/Lato/lato-regular.woff differ diff --git a/_static/fonts/Lato/lato-regular.woff2 b/_static/fonts/Lato/lato-regular.woff2 new file mode 100644 index 00000000..3bf98433 Binary files /dev/null and b/_static/fonts/Lato/lato-regular.woff2 differ diff --git a/_static/fonts/RobotoSlab/roboto-slab-v7-bold.eot b/_static/fonts/RobotoSlab/roboto-slab-v7-bold.eot new file mode 100644 index 00000000..79dc8efe Binary files /dev/null and b/_static/fonts/RobotoSlab/roboto-slab-v7-bold.eot differ diff --git a/_static/fonts/RobotoSlab/roboto-slab-v7-bold.ttf b/_static/fonts/RobotoSlab/roboto-slab-v7-bold.ttf new file mode 100644 index 00000000..df5d1df2 Binary files /dev/null and b/_static/fonts/RobotoSlab/roboto-slab-v7-bold.ttf differ diff --git a/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff b/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff new file mode 100644 index 00000000..6cb60000 Binary files /dev/null and b/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff differ diff --git a/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff2 b/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff2 new file mode 100644 index 00000000..7059e231 Binary files /dev/null and b/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff2 differ diff --git a/_static/fonts/RobotoSlab/roboto-slab-v7-regular.eot b/_static/fonts/RobotoSlab/roboto-slab-v7-regular.eot new file mode 100644 index 00000000..2f7ca78a Binary files /dev/null and b/_static/fonts/RobotoSlab/roboto-slab-v7-regular.eot differ diff --git a/_static/fonts/RobotoSlab/roboto-slab-v7-regular.ttf b/_static/fonts/RobotoSlab/roboto-slab-v7-regular.ttf new file mode 100644 index 00000000..eb52a790 Binary files /dev/null and b/_static/fonts/RobotoSlab/roboto-slab-v7-regular.ttf differ diff --git a/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff b/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff new file mode 100644 index 00000000..f815f63f Binary files /dev/null and b/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff differ diff --git a/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff2 b/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff2 new file mode 100644 index 00000000..f2c76e5b Binary files /dev/null and b/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff2 differ diff --git a/_static/jquery.js b/_static/jquery.js new file mode 100644 index 00000000..c4c6022f --- /dev/null +++ b/_static/jquery.js @@ -0,0 +1,2 @@ +/*! jQuery v3.6.0 | (c) OpenJS Foundation and other contributors | jquery.org/license */ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.6.0",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},j=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||D,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,D=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="",y.option=!!ce.lastChild;var ge={thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n",""]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function je(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function De(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function qe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Le(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var _t,zt=[],Ut=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=zt.pop()||S.expando+"_"+wt.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Ut.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Ut.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Ut,"$1"+r):!1!==e.jsonp&&(e.url+=(Tt.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,zt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((_t=E.implementation.createHTMLDocument("").body).innerHTML="
",2===_t.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=Fe(y.pixelPosition,function(e,t){if(t)return t=We(e,n),Pe.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0"),n("table.docutils.footnote").wrap("
"),n("table.docutils.citation").wrap("
"),n(".wy-menu-vertical ul").not(".simple").siblings("a").each((function(){var t=n(this);expand=n(''),expand.on("click",(function(n){return e.toggleCurrent(t),n.stopPropagation(),!1})),t.prepend(expand)}))},reset:function(){var n=encodeURI(window.location.hash)||"#";try{var e=$(".wy-menu-vertical"),t=e.find('[href="'+n+'"]');if(0===t.length){var i=$('.document [id="'+n.substring(1)+'"]').closest("div.section");0===(t=e.find('[href="#'+i.attr("id")+'"]')).length&&(t=e.find('[href="#"]'))}if(t.length>0){$(".wy-menu-vertical .current").removeClass("current").attr("aria-expanded","false"),t.addClass("current").attr("aria-expanded","true"),t.closest("li.toctree-l1").parent().addClass("current").attr("aria-expanded","true");for(let n=1;n<=10;n++)t.closest("li.toctree-l"+n).addClass("current").attr("aria-expanded","true");t[0].scrollIntoView()}}catch(n){console.log("Error expanding nav for anchor",n)}},onScroll:function(){this.winScroll=!1;var n=this.win.scrollTop(),e=n+this.winHeight,t=this.navBar.scrollTop()+(n-this.winPosition);n<0||e>this.docHeight||(this.navBar.scrollTop(t),this.winPosition=n)},onResize:function(){this.winResize=!1,this.winHeight=this.win.height(),this.docHeight=$(document).height()},hashChange:function(){this.linkScroll=!0,this.win.one("hashchange",(function(){this.linkScroll=!1}))},toggleCurrent:function(n){var e=n.closest("li");e.siblings("li.current").removeClass("current").attr("aria-expanded","false"),e.siblings().find("li.current").removeClass("current").attr("aria-expanded","false");var t=e.find("> ul li");t.length&&(t.removeClass("current").attr("aria-expanded","false"),e.toggleClass("current").attr("aria-expanded",(function(n,e){return"true"==e?"false":"true"})))}},"undefined"!=typeof window&&(window.SphinxRtdTheme={Navigation:n.exports.ThemeNav,StickyNav:n.exports.ThemeNav}),function(){for(var n=0,e=["ms","moz","webkit","o"],t=0;t a.language.name.localeCompare(b.language.name)); + + const languagesHTML = ` +
+
Languages
+ ${languages + .map( + (translation) => ` +
+ ${translation.language.code} +
+ `, + ) + .join("\n")} +
+ `; + return languagesHTML; + } + + function renderVersions(config) { + if (!config.versions.active.length) { + return ""; + } + const versionsHTML = ` +
+
Versions
+ ${config.versions.active + .map( + (version) => ` +
+ ${version.slug} +
+ `, + ) + .join("\n")} +
+ `; + return versionsHTML; + } + + function renderDownloads(config) { + if (!Object.keys(config.versions.current.downloads).length) { + return ""; + } + const downloadsNameDisplay = { + pdf: "PDF", + epub: "Epub", + htmlzip: "HTML", + }; + + const downloadsHTML = ` +
+
Downloads
+ ${Object.entries(config.versions.current.downloads) + .map( + ([name, url]) => ` +
+ ${downloadsNameDisplay[name]} +
+ `, + ) + .join("\n")} +
+ `; + return downloadsHTML; + } + + document.addEventListener("readthedocs-addons-data-ready", function (event) { + const config = event.detail.data(); + + const flyout = ` +
+ + Read the Docs + v: ${config.versions.current.slug} + + +
+
+ ${renderLanguages(config)} + ${renderVersions(config)} + ${renderDownloads(config)} +
+
On Read the Docs
+
+ Project Home +
+
+ Builds +
+
+ Downloads +
+
+
+
Search
+
+
+ +
+
+
+
+ + Hosted by Read the Docs + +
+
+ `; + + // Inject the generated flyout into the body HTML element. + document.body.insertAdjacentHTML("beforeend", flyout); + + // Trigger the Read the Docs Addons Search modal when clicking on the "Search docs" input from inside the flyout. + document + .querySelector("#flyout-search-form") + .addEventListener("focusin", () => { + const event = new CustomEvent("readthedocs-search-show"); + document.dispatchEvent(event); + }); + }) +} + +if (themeLanguageSelector || themeVersionSelector) { + function onSelectorSwitch(event) { + const option = event.target.selectedIndex; + const item = event.target.options[option]; + window.location.href = item.dataset.url; + } + + document.addEventListener("readthedocs-addons-data-ready", function (event) { + const config = event.detail.data(); + + const versionSwitch = document.querySelector( + "div.switch-menus > div.version-switch", + ); + if (themeVersionSelector) { + let versions = config.versions.active; + if (config.versions.current.hidden || config.versions.current.type === "external") { + versions.unshift(config.versions.current); + } + const versionSelect = ` + + `; + + versionSwitch.innerHTML = versionSelect; + versionSwitch.firstElementChild.addEventListener("change", onSelectorSwitch); + } + + const languageSwitch = document.querySelector( + "div.switch-menus > div.language-switch", + ); + + if (themeLanguageSelector) { + if (config.projects.translations.length) { + // Add the current language to the options on the selector + let languages = config.projects.translations.concat( + config.projects.current, + ); + languages = languages.sort((a, b) => + a.language.name.localeCompare(b.language.name), + ); + + const languageSelect = ` + + `; + + languageSwitch.innerHTML = languageSelect; + languageSwitch.firstElementChild.addEventListener("change", onSelectorSwitch); + } + else { + languageSwitch.remove(); + } + } + }); +} + +document.addEventListener("readthedocs-addons-data-ready", function (event) { + // Trigger the Read the Docs Addons Search modal when clicking on "Search docs" input from the topnav. + document + .querySelector("[role='search'] input") + .addEventListener("focusin", () => { + const event = new CustomEvent("readthedocs-search-show"); + document.dispatchEvent(event); + }); +}); \ No newline at end of file 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/logo_color.png b/_static/logo_color.png new file mode 100644 index 00000000..3bd85b59 Binary files /dev/null and b/_static/logo_color.png differ diff --git a/_static/minus.png b/_static/minus.png new file mode 100644 index 00000000..d96755fd Binary files /dev/null and b/_static/minus.png differ diff --git a/_static/plus.png b/_static/plus.png new file mode 100644 index 00000000..7107cec9 Binary files /dev/null and b/_static/plus.png differ diff --git a/_static/pygments.css b/_static/pygments.css new file mode 100644 index 00000000..84ab3030 --- /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: #f8f8f8; } +.highlight .c { color: #3D7B7B; font-style: italic } /* Comment */ +.highlight .err { border: 1px solid #FF0000 } /* Error */ +.highlight .k { color: #008000; font-weight: bold } /* Keyword */ +.highlight .o { color: #666666 } /* Operator */ +.highlight .ch { color: #3D7B7B; font-style: italic } /* Comment.Hashbang */ +.highlight .cm { color: #3D7B7B; font-style: italic } /* Comment.Multiline */ +.highlight .cp { color: #9C6500 } /* Comment.Preproc */ +.highlight .cpf { color: #3D7B7B; font-style: italic } /* Comment.PreprocFile */ +.highlight .c1 { color: #3D7B7B; font-style: italic } /* Comment.Single */ +.highlight .cs { color: #3D7B7B; font-style: italic } /* 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: #E40000 } /* Generic.Error */ +.highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */ +.highlight .gi { color: #008400 } /* Generic.Inserted */ +.highlight .go { color: #717171 } /* Generic.Output */ +.highlight .gp { color: #000080; 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: #008000; font-weight: bold } /* Keyword.Constant */ +.highlight .kd { color: #008000; font-weight: bold } /* Keyword.Declaration */ +.highlight .kn { color: #008000; font-weight: bold } /* Keyword.Namespace */ +.highlight .kp { color: #008000 } /* Keyword.Pseudo */ +.highlight .kr { color: #008000; font-weight: bold } /* Keyword.Reserved */ +.highlight .kt { color: #B00040 } /* Keyword.Type */ +.highlight .m { color: #666666 } /* Literal.Number */ +.highlight .s { color: #BA2121 } /* Literal.String */ +.highlight .na { color: #687822 } /* Name.Attribute */ +.highlight .nb { color: #008000 } /* Name.Builtin */ +.highlight .nc { color: #0000FF; font-weight: bold } /* Name.Class */ +.highlight .no { color: #880000 } /* Name.Constant */ +.highlight .nd { color: #AA22FF } /* Name.Decorator */ +.highlight .ni { color: #717171; font-weight: bold } /* Name.Entity */ +.highlight .ne { color: #CB3F38; font-weight: bold } /* Name.Exception */ +.highlight .nf { color: #0000FF } /* Name.Function */ +.highlight .nl { color: #767600 } /* Name.Label */ +.highlight .nn { color: #0000FF; font-weight: bold } /* Name.Namespace */ +.highlight .nt { color: #008000; font-weight: bold } /* Name.Tag */ +.highlight .nv { color: #19177C } /* Name.Variable */ +.highlight .ow { color: #AA22FF; font-weight: bold } /* Operator.Word */ +.highlight .w { color: #bbbbbb } /* Text.Whitespace */ +.highlight .mb { color: #666666 } /* Literal.Number.Bin */ +.highlight .mf { color: #666666 } /* Literal.Number.Float */ +.highlight .mh { color: #666666 } /* Literal.Number.Hex */ +.highlight .mi { color: #666666 } /* Literal.Number.Integer */ +.highlight .mo { color: #666666 } /* Literal.Number.Oct */ +.highlight .sa { color: #BA2121 } /* Literal.String.Affix */ +.highlight .sb { color: #BA2121 } /* Literal.String.Backtick */ +.highlight .sc { color: #BA2121 } /* Literal.String.Char */ +.highlight .dl { color: #BA2121 } /* Literal.String.Delimiter */ +.highlight .sd { color: #BA2121; font-style: italic } /* Literal.String.Doc */ +.highlight .s2 { color: #BA2121 } /* Literal.String.Double */ +.highlight .se { color: #AA5D1F; font-weight: bold } /* Literal.String.Escape */ +.highlight .sh { color: #BA2121 } /* Literal.String.Heredoc */ +.highlight .si { color: #A45A77; font-weight: bold } /* Literal.String.Interpol */ +.highlight .sx { color: #008000 } /* Literal.String.Other */ +.highlight .sr { color: #A45A77 } /* Literal.String.Regex */ +.highlight .s1 { color: #BA2121 } /* Literal.String.Single */ +.highlight .ss { color: #19177C } /* Literal.String.Symbol */ +.highlight .bp { color: #008000 } /* Name.Builtin.Pseudo */ +.highlight .fm { color: #0000FF } /* Name.Function.Magic */ +.highlight .vc { color: #19177C } /* Name.Variable.Class */ +.highlight .vg { color: #19177C } /* Name.Variable.Global */ +.highlight .vi { color: #19177C } /* Name.Variable.Instance */ +.highlight .vm { color: #19177C } /* Name.Variable.Magic */ +.highlight .il { color: #666666 } /* 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/about/index.html b/about/index.html new file mode 100644 index 00000000..eb29b460 --- /dev/null +++ b/about/index.html @@ -0,0 +1,115 @@ + + + + + + + + + Credits — analysator documentation + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Credits

+

The pilot version of this automatic documentation was constructed by Sameli Siljamo during his two-week work-life trainee period.

+
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/biot_savart/index.html b/biot_savart/index.html new file mode 100644 index 00000000..4044519f --- /dev/null +++ b/biot_savart/index.html @@ -0,0 +1,407 @@ + + + + + + + + + biot_savart — analysator documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

biot_savart

+
+

Follow Welling et al. (2020) calculate the magnetic field at Earth’s surface.

+
+

Integrate Biot-Savart over:

+
+
    +
  1. All currents within the Vlasov domain

  2. +
  3. Birkeland currents (FACs) in the “gap region” between the MHD inner boundary and the ionosphere, mapped (assuming J propto B) along the field lines connecting ionosphere radius R_IONO to coupling radius r_C

  4. +
  5. Horizontal Ionospheric currents (altitude 100 km)

  6. +
+
+

The integration is a discrete summation over the 3 domains.

+

Integrating the domain #2 will likely require this mesh to be ‘refined’ in order to resolve the FAC structures +see the functions refine_mesh() and graded_mesh()

+

This script has been tested with the Vlasiator runs EGL, FHA, FIA +note that the usefulness for EGL is limited because there is no ionosphere (domain #3) for that run

+

To run this script, require access to the data reducer/variable ‘vg_J’ in the .vlsv file +This may be supplied by a .vlsv file’s vlsvReader object, see keyword f_J_sidecar

+

This script is written for the UH environment. Adapt file paths as needed.

+

###

+

EXAMPLE CALL (1 thread): +python biot_savart.py -nproc 1 -task 1 -run FHA

+
+
Example sidecar .vlsv files, containing ground magnetic field data, can be found at:

/wrk-vakka/group/spacephysics/vlasiator/3D/{run name}/sidecars/ig_B/

+
+
+
+
+biot_savart.B_ionosphere(f, coord_list=None, ig_r=None, method='integrate')
+

Ionospheric (domain #3) current contribution to magnetic field

+

B_ionosphere() evaluates the magnetic field produced by ionospheric currents

+
+
Inputs:

f: VlsvReader object

+

keyword coord_list: locations where B-field is calculated

+

keyword ig_r: the ionospheric mesh

+

keyword method:

+
+

=’integrate’ (default): integrate over the whole ionosphere using Biot-Savart law

+

=’local’: ionosphere produces magnetic field locally, as by an infinite plane of current overhead

+
+
+
Outputs:

Magnetic field evaluated at coord_list

+
+
+
+ +
+
+biot_savart.B_magnetosphere(f, f_J_sidecar=None, r_C=31855000.0, ig_r=None)
+

Inner and outer magnetospheric contributions to Biot-Savart integral (domains #1, #2) +wrapper for biot_savart()

+
+ +
+
+biot_savart.b_dip(x, y, z, mag_mom_vector=array([0.e+00, 0.e+00, -8.e+22]))
+
+
Inputs: cartesian coordinates x,y,z [m]

keyword mag_mom_vector: Earth’s vector magnetic dipole moment

+
+
+

Outputs: dipole magnetic field

+
+ +
+
+biot_savart.b_dip_direction(x, y, z, mag_mom_vector=array([0.e+00, 0.e+00, -8.e+22]))
+
+
Inputs: cartesian coordinates x,y,z [m]

keyword mag_mom_vector: Earth’s vector magnetic dipole moment

+
+
+

Outputs: dipole magnetic field unit vector

+
+ +
+
+biot_savart.b_dip_magnitude(theta, r, mag_mom=8e+22)
+

Inputs: +theta: colatitude [radians] +r: radial distance [m] +keyword mag_mom: magnetic dipole moment, default=8e22 [A / m^2], as in EGI, EGL, FIA, FHA runs

+

Outputs: Earth’s magnetic field magnitude [Tesla]

+
+ +
+
+biot_savart.biot_savart(coord_list, f, f_J_sidecar=None, r_C=31855000.0, mesh='graded')
+
+
param coord_list: a list of 3-element arrays of coordinates [ [x1,y1,z1], [x2,y2,z2], … ], SI units

if considering just a single starting point, the code accepts a 3-element array-like object [x1,y1,z1]

+
+
+

f: vlsvReader object +f_J_sidecar: vlsvReader object that contains pre-computed current ‘vg_J’

+
+

e.g., for EGL, files at: /wrk-vakka/group/spacephysics/vlasiator/3D/EGL/visualizations_2/ballooning/*.vlsv

+
+

runtime (FHA): overhead of about 200 sec (setup), plus 0.2 sec for each element of coord_list

+

returns a tuple (B_inner, B_outer) +B_inner: the B-field [T] generated by FACs at 1 R_E < r< r_C +B_outer: the B-field [T] generated by currents in simulation domain at r > r_C

+
+ +
+
+biot_savart.cartesian_to_spherical(x, y, z)
+

r > 0 +0 < theta < pi +-pi < phi < pi +all are assumed to be numpy arrays of equal dimensions

+

returns: r, theta, phi [tuple]

+
+ +
+
+biot_savart.fac_map(f, vg_x, vg_y, vg_z, dx, f_J_sidecar=None, r_C=31855000.0, mag_mom_vector=array([0.e+00, 0.e+00, -8.e+22]))
+
+

Map the FACs along magnetic field lines (J propto B).

+
+
Inputs:

f: VlsvReader object +f_J_sidecar: vlsvReader object that contains pre-computed current ‘vg_J’

+
+
+
if f_J_sidecar = None:

here is assumed the data reducer ‘ig_fac’ exists (such as for runs FHA and FIA) +In this case, the currents in the FAC region (domain #2) will be mapped UP from the ionosphere ‘ig_’ grid

+
+
otherwise (f_J_sidecar = a *.vlsv string, for a file containing the current density J in the vlasov ‘vg_’ grid)

for run EGL, see files at /wrk-vakka/group/spacephysics/vlasiator/3D/EGL/visualizations_2/ballooning/*.vlsv +In this case, the currents in the FAC region (domain #2) will be mapped DOWN from the vg_ grid

+
+
+
+
+
vg_x,vg_y,vg_z position [m], 1D numpy arrays.

note: these coordinates do not have to correspond with Vlasiator’s vg_ grid, +This is relevant when fac_map() is called by biot_savart(), with keyword mesh=’refined’ or mesh=’graded’

+
+
+

dx is grid resolution [m], 1D numpy array, This is for the input cells which can be defined arbitrarily—not necessarily same as vg cells.

+
+
+

* coordinates, not just coordinates on the vg_ grid *

+
+
+
Returns:

the vector current density [A/m^2] at specified positions vg_x, vg_y, vg_z position +output J=0 for cells that fall outside the FAC region (i.e if cell is not in region R_EARTH+dx/2 < r< r_C)

+
+
+
+ +
+
+biot_savart.graded_mesh(x, y, z, dV, ns=array([8, 4, 2]), Rs=array([6371000., 12742000., 25484000.]))
+
+

Iteratively refine the mesh in ‘inner’ FAC region R_IONO < r < r_C, +used to calculate FAC contribution to Biot-Savart integral

+
+

Calls refine mesh with different refinement factors n, at specified refinement boundaries +ns: numpy array of refinement factors (ints) +Rs: numpy array of refinement boundary radii [R_E] +edge case: arrays are aligned so that for r>Rs[-1], use ns[-1] refinement

+

Want the refinement level to roughly scale as r^{-3/2}. To resolve the mapped features at all radii +This works because magnetic dipole field goes as 1/r^3, roughly, and area A goes as r^2. +(Need to set areas of the cell faces so B*A~constant, to resolve features mapped along field lines)

+
+
Example: graded_mesh(x, y, z, dV, ns = np.array([8, 4, 2]), Rs = np.array([R_EARTH, R_EARTH*2, R_EARTH*4]))

–> refines 1D mesh size by factor of 8 for 1 RE<r<=2 RE, by factor of 4 for 2 RE<r<=4 RE, by factor of 2 for r>4 RE

+
+
+
+ +
+
+biot_savart.integrate_biot_savart(coord_list, x, y, z, J, delta)
+

integration of the Biot-savart law +magnetic field is evaluated at coordinates specified in coord_list (for example, the ionospheric coordinates)

+
+
Inputs:
+

x,y,z (1D array, size n): Cartesian coordinates +delta (1D array, size n): the volume or area of the element being integrated +J (2D array, size [3, n]): current density

+
+

all units SI

+
+
Outputs:

magnetic field evaluated at coord_list

+
+
+

Note: the units of J and delta depend on the type of integral (volume or surface), but the equation form is unchanged

+
+
Biot-Savart (volume): B = (mu_0 / 4 * pi) int { J x r’ / |r’|^3 } dV ([J] = A/m^2, delta == dV)

(surface): B = (mu_0 / 4 * pi) int { J x r’ / |r’|^3 } dA ([J] = A/m, delta = dS)

+
+
+
+ +
+
+biot_savart.mkdir_path(path)
+

Make a directory from the stem of an input file name (path)

+
+ +
+
+biot_savart.nearest_node_index(f, x, y, z, node_coords_iono=None)
+

helper function for finding nearest ionospheric node

+
+ +
+
+biot_savart.refine_mesh(x, y, z, dV, n)
+

refine the mesh in ‘inner’ FAC region R_IONO < r < r_C, +used to calculate FAC contribution to Biot-Savart integral

+

x, y, z: initial coordinates (1D numpy float arrays), assumed to be at the center of cubic cell +dV: cell volume 1D array or scalar value +dx_0: side length of initial mesh (1D numpy array or single scalar value) +n (int): the factor by which to refine the mesh

+
+ +
+
+biot_savart.save_B_vlsv(input_tuple)
+

calculate magnetic field at the Earth’s surface and save in a .vslv file

+
+
Inputs: input tuple

input_tuple[0]: run (string) # ‘EGL’, ‘FHA’, or ‘FIA’ +input_tuple[1]: fileIndex (int)

+
+
Outputs:
+
ig_r: Cartesian ionospheric grid locations (radius R_EARTH + 100km)

note that B_iono, B_inner, B_outer are in fact evaluated at radius R_EARTH +ig_r is a copy of the Vlasiator ionosphere mesh, to enable combination with other data reducers

+
+
+

B_iono: Ionospheric (Domain #3) contribution to ground magnetic field (radius R_EARTH) +B_inner: Ionospheric (Domain #2) contribution to ground magnetic field (radius R_EARTH) +B_outer: Ionospheric (Domain #1) contribution to ground magnetic field (radius R_EARTH)

+
+
+

Note: the input and output .vlsv file paths may need to be modified in this script for different users

+
+ +
+
+biot_savart.spherical_to_cartesian(r, theta, phi)
+

r > 0 +0 < theta < pi +-pi < phi < pi +all are assumed to be numpy arrays of equal dimensions

+

returns: x, y, z [tuple]

+
+ +
+
+biot_savart.vec_len_2d(arr_2d)
+

Vector length

+
+ +
+
+biot_savart.vec_unit(arr_2d)
+

assume arr_2d is a numpy array with shape [N, 3]. Return unit vectors with same shape

+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/calculations/index.html b/calculations/index.html new file mode 100644 index 00000000..c3d1c355 --- /dev/null +++ b/calculations/index.html @@ -0,0 +1,813 @@ + + + + + + + + + calculations — analysator documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

calculations

+

This is a module that includes most, if not all, calculations within the analysator. Please type “.” and press tab to see which functions this module includes.

+

Example: +import pytools as pt

+

pt.calculations. +#press tab

+

#Output: list of functions

+

pt.calculations.fourier? +#Press Enter

+
+
+class pytools.calculations.AMRInterpolator(reader, method='linear', cellids=array([1, 2, 3, 4, 5]))
+

Wrapper class for interpolators, esp. at refinement interfaces. +Supported methods:

+
+
linear
    +
  • (nearly) C0 continuous, regular-grid trilinear interpolant extended to collapsed hexahedral cells.

  • +
  • Non-parametric

  • +
  • Exact handling of multiply-degenerate hexahedra is missing, with the enabling hack causing errors in trilinear coordinate on the order of 1m

  • +
+
+
Radial Basis Functions, rbf
    +
  • Accurate, slow-ish, but hard to make properly continuous and number of neighbors on which to base the interpolant is not trivial to find.

  • +
  • Not continuous with regular-grid trilinear interpolants, needs to be used in the entire interpolation domain.

  • +
  • kword options: “neighbors” for number of neighbors (64)

  • +
  • basis function uses SciPy default. A free parameter.

  • +
+
+
delaunay (not recommended)
    +
  • Choice of triangulation is not unique with regular grids, including refinement interfaces.

  • +
  • kword options as in qhull; “qhull_options” : “QJ” (breaks degeneracies)

  • +
+
+
+
+ +
+
+pytools.calculations.LMN_null_lines_FOTE(LMNs, jacobs, Bs, dxs, coords)
+

Function that uses a linear approximation of B from B and its Jacobian +in the LMN coordinates to get an approximate distance to the neutral line. +inputs: +* LMN basis vectors stack +* Jacobian of B in 9-element vector stack +* vg_b_vol

+

return a measure for closeness to the cell center for a neutral line and other data. +The return value is the minimum of the signed distance function between the neutral +line

+
+ +
+
+class pytools.calculations.VariableInfo(data_array, name='', units='', latex='', latexunits='')
+

A class/struct for holding variable info. This includes the variable data in array form, the name and the units. +Variable info is in: data, name, units.

+
LIST VARIABLES IN VARIBLE INFO:
+data              Data of the variable (array list)
+name              Name of the variable
+units             Units of the variable
+latex             Name of the variable in LaTeX
+latexunits        Units of the variable in LaTeX
+
+
+
+
+get_scaled_units(vscale=None, env='EarthSpace', manualDict=None)
+

Return scaling metadata

+
+
Parameters:
+
    +
  • env – A string to choose the scaling dictionary [default: EarthSpace]

  • +
  • manualDict – a dictionary of {units : {scalingparams}}; used to update the included dictionary

  • +
  • vscale – float, factor to scale the variable with

  • +
+
+
Returns:
+

(norming factor, scaledUnits, scaledLatexUnits)

+
+
+
+ +
+
+get_scaled_var(vscale=None, data=None, env='EarthSpace', manualDict=None)
+

Automatically scales the variableinfo data and adjusts the units correspondingly with the +default dictionaries.

+
+
Parameters:
+
    +
  • data – in case you wish to provide new data array (why, though?)

  • +
  • env – A string to choose the scaling dictionary [default: EarthSpace]

  • +
  • manualDict – a dictionary of {units : {scalingparams}}; used to update the included dictionary

  • +
+
+
Returns:
+

self, with scaled units with pre-formatted units included in the varinfo.

+
+
+
+ +
+
+get_variable(index)
+

Creates a new variable with identical data but only certain index is included

+
+
Parameters:
+

index – Vector index

+
+
Returns:
+

an edited version of the variable

+
+
+
+

Note

+

E.g. if the data is an array of 3d vectors, get_variable(0) would return the variable with data[:,0] as the data

+
+
+ +
+ +
+
+pytools.calculations.cell_time_evolution(vlsvReader_list, variables, cellids, units='')
+

Returns variable data from a time evolution of some certain cell ids

+
+
Parameters:
+
    +
  • vlsvReader_list (vlsvfile.VlsvReader) – List containing VlsvReaders with a file open

  • +
  • variables – Name of the variables

  • +
  • cellids – List of cell ids

  • +
  • units – List of units for the variables (OPTIONAL)

  • +
+
+
Returns:
+

an array containing the data for the time evolution for every cell id

+
+
+
import pytools as pt; import pylab as pl
+# Example of usage:
+time_data = pt.calculations.cell_time_evolution( vlsvReader_list=[VlsvReader("bulk.000.vlsv"), VlsvReader("bulk.001.vlsv"), VlsvReader("bulk.002.vlsv")], variables=["rho", "Pressure", "B"], cellids=[2,4], units=["N", "Pascal", "T"] )
+
+# Check output
+logging.info time_data
+
+# Now plot the results:
+time = time_data[0]
+rho = time_data[3]
+pt.plot.plot_variables(time, rho)
+pl.show()
+
+# Do post processing:
+rho_data = rho.data
+non_existing_example_function(rho_data)
+
+
+
+ +
+
+pytools.calculations.cut3d(vlsvReader, xmin, xmax, ymin, ymax, zmin, zmax, variable, operator='pass', trim_array=False)
+

Retrieves variables for the given 3d cut

+
+
Parameters:
+
    +
  • vlsvReader (vlsvfile.VlsvReader) – Some VlsvReader with a file open

  • +
  • xmin – The minimum x coordinate of the 2d cut

  • +
  • xmax – The maximum x coordinate of the 2d cut

  • +
  • ymin – The minimum y coordinate of the 2d cut

  • +
  • ymax – The maximum y coordinate of the 2d cut

  • +
  • zmin – The minimum z coordinate of the 2d cut

  • +
  • zmax – The maximum z coordinate of the 2d cut

  • +
  • variable – Some variable to read from the vlsv file

  • +
  • operator – The variable operator

  • +
  • trim_array – If true, shapes the array into an array with minimum amount of dimensions, e.g. if the cut is zmax-zmin=0 then this will return a 2d array

  • +
+
+
+
Example:
+import pytools as pt
+f = pt.vlsvfile.VlsvReader('example.vlsv')
+three_cut = pt.calculations.cut3d( vlsvReader=f, xmin=1e6, xmax=4e6, ymin=1e6, xmax=4e6, zmin=0, zmax=0, variable="rho" )
+import numpy as np
+# Now three_cut is a three-dimensional array (x,y,z), but we can transform it into a 2-d array (x,y) with:
+dimensions = np.shape( three_cut )
+two_cut = np.reshape( three_cut, dimensions[0:2] )
+
+
+
+ +
+
+pytools.calculations.cut_through(vlsvReader, point1, point2)
+

Returns cell ids and distances from point 1 for every cell in a line between given point1 and point2

+
+
Parameters:
+
    +
  • vlsvReader (vlsvfile.VlsvReader) – Some open VlsvReader

  • +
  • point1 – The starting point of a cut-through line

  • +
  • point2 – The ending point of a cut-through line

  • +
+
+
Returns:
+

an array containing cell ids, coordinates and distances in the following format: [cell ids, distances, coordinates]. NB. Last cellid is a duplicate.

+
+
+
Example:
+vlsvReader = VlsvReader("testfile.vlsv")
+cut_through = cut_through(vlsvReader, [0,0,0], [2,5e6,0])
+cellids = cut_through[0]
+distances = cut_through[1]
+logging.info "Cell ids: " + str(cellids)
+logging.info "Distance from point 1 for every cell: " + str(distances)
+
+
+
+ +
+
+pytools.calculations.cut_through_curve(vlsvReader, curve)
+

Returns cell ids and distances from point 1 for every cell in a line between given point1 and point2

+
+
Parameters:
+
    +
  • vlsvReader (vlsvfile.VlsvReader) – Some open VlsvReader

  • +
  • point1 – The starting point of a cut-through line

  • +
+
+
Returns:
+

an array containing cell ids, edge distances, and the coordinates of edges in the following format: [cell ids, distances, coordinates]. NB. Last cellid is a duplicate.

+
+
+
Example:
+vlsvReader = VlsvReader("testfile.vlsv")
+cut_through_curve = cut_through(vlsvReader, [[0,0,0], [2,5e6,0]])
+cellids = cut_through[0]
+distances = cut_through[1]
+logging.info "Cell ids: " + str(cellids)
+logging.info "Distance from point 1 for every cell: " + str(distances)
+
+
+
+ +
+
+pytools.calculations.cut_through_step(vlsvReader, point1, point2)
+

Returns cell ids and distances from point 1 to point 2, returning not every cell in a line +but rather the amount of cells which corresponds with the largest axis-aligned component of the line.

+
+
Parameters:
+
    +
  • vlsvReader (vlsvfile.VlsvReader) – Some open VlsvReader

  • +
  • point1 – The starting point of a cut-through line

  • +
  • point2 – The ending point of a cut-through line

  • +
+
+
Returns:
+

an array containing cell ids, coordinates and distances in the following format: [cell ids, distances, coordinates]

+
+
+
Example:
+vlsvReader = VlsvReader("testfile.vlsv")
+cut_through = cut_through_step(vlsvReader, [0,0,0], [2,5e6,0])
+cellids = cut_through[0]
+distances = cut_through[1]
+logging.info "Cell ids: " + str(cellids)
+logging.info "Distance from point 1 for every cell: " + str(distances)
+
+
+
+ +
+
+pytools.calculations.dynamic_field_tracer(vlsvReader_list, x0, max_iterations, dx)
+

Field tracer in a dynamic time frame

+
+
Parameters:
+
    +
  • vlsvReader_list – List of vlsv readers

  • +
  • x0 – The starting point for the streamlines

  • +
+
+
+
+ +
+
+pytools.calculations.epsilon_M(f, cell, pop='proton', m=1.67262192369e-27, bulk=None, B=None, model='bimaxwellian', normorder=1, norm=2, threshold=0, dummy=None)
+

Calculates the ‘non-maxwellianity’ parameter for a distribution function f_i and its corresponding Maxwellian g_M.

+
+
Parameters:
+
    +
  • f – VlsvReader containing VDF data

  • +
  • cell – CellID for the queried cell

  • +
+
+
Kword pop:
+

Population to calculate the parameter for

+
+
Kword m:
+

Species mass (default: m_p)

+
+
Kword bulk:
+

Bulk file name to use for moments (if available and needed)

+
+
Kword B:
+

Optional, user-given magnetic field vector for a bimaxwellian model distribution

+
+
Kword model:
+

VDF model to be used. Available models “maxwellian”, “bimaxwellian” (default)

+
+
Kword normorder:
+

Norm used for model-data distance measure (default: 1)

+
+
Kword norm:
+

Constant norm (default 2, see below)

+
+
Kword threshold:
+

Disregard vspace cells under this threshold [0]

+
+
Kword dummy:
+

If not None, generate dummy data for e.g. integration.

+
+
Returns:
+

scalar, non-Maxwellianity parameter for given model and norm

+
+
+

The definition is given by Graham et al. (2021): +(1/2n) * integral(|f_i - g_M|) d^3v

+

valued between 0 (bi-Maxwellian) and 1 (complete deviation from a bi-Maxwellian).

+

NOTE that this is different to the definition by Greco et al. (2012): +(1/n) * sqrt(integral((f_i - g_M)^2) d^3v)

+

examples comparing these two definitions can be found in Settino et al. (2021).

+
+ +
+
+pytools.calculations.fourier(t, y, kaiserwindowparameter=0)
+

Function for returning fourier series and frequencies of some given arrays t and y

+
+
Parameters:
+
    +
  • t – Time

  • +
  • y – Some variable data

  • +
+
+
Returns:
+

the frequencies, new time variables and frequencies

+
+
+
+

Note

+

return format: [FFT, frequencies, t, y]

+
+
+

Note

+

t must have a constant time stepping

+
+
Example usage:
+fourier_data = fourier( t=np.arange(0,500,0.5), y=rho_data, kaiserwindowparameter=14 )
+
+
+
+ +
+
+pytools.calculations.gyrophase_angles_from_file(vlsvReader, cellid)
+

Calculates the gyrophase angle angle distribution for a given cell with a given file +:param vlsvReader: Some VlsvReader class with a file open +:type vlsvReader: vlsvfile.VlsvReader +:param cellid: The cell id whose gyrophase angle the user wants NOTE: The cell id must have a velocity distribution! +:returns: gyrophase angles and avgs [gyro_angles, avgs]

+

+
+
+

# Example usage: +vlsvReader = VlsvReader(“fullf.0001.vlsv”) +result = gyrophase_angles_from_file( vlsvReader=vlsvReader, cellid=1924) +# Plot the data +import pylab as pl +pl.hist(result[0].data, weights=result[1].data, bins=100, log=False)

+
+ +
+
+pytools.calculations.lineout(vlsvReader, point1, point2, variable, operator='pass', interpolation_order=1, points=100)
+

Returns a line cut-through from a given VLSV file for distance, coordinates and variable values. The main difference between this and cut_through is that this function interpolates a given variable.

+
+
Parameters:
+
    +
  • vlsvReader (vlsvfile.VlsvReader) – Some open VlsvReader

  • +
  • point1 – The starting point of a cut-through line

  • +
  • point2 – The ending point of a cut-through line

  • +
  • variable – Variable to return

  • +
  • operator – The operator for the variable, for example “x” for x-component or “magnitude” for magnitude

  • +
  • interpolation_order – Order of interpolation (0 or 1), defaults to 1

  • +
  • points – Number of points to return

  • +
+
+
Returns:
+

A tuple with output: (distance, coordinates, variable_values)

+
+
+
# Example:
+import pytools as pt # import analysator
+
+vlsvReader = pt.vlsvfile.VlsvReader("testfile.vlsv") # Open a vlsv file
+lineout_rho = pt.calculations.lineout( vlsvReader=vlsvReader, point1=[1.0e5, 1.0e6, 0], point2=[2.0e5, 2.0e6, 0], variable="rho", interpolation_order=1, points=100 )
+distance = lineout_rho[0]
+coordinates = lineout_rho[1]
+values = lineout_rho[2]
+
+
+
+ +
+
+pytools.calculations.pitch_angles(vlsvReader, cellid, nbins=10, filename=None, filedir=None, step=None, outputdir=None, outputfile=None, cosine=False, plasmaframe=False, vcut=None, vcutmax=None, pop='proton')
+

Calculates the pitch angle distribution for a given cell

+
+
Parameters:
+
    +
  • vlsvReader – Some VlsvReader class with a file open. Can be overriden by keywords.

  • +
  • cellid – The cell id whose pitch angle the user wants +NOTE: The cell id must have a velocity distribution!

  • +
+
+
Kword filename:
+

path to .vlsv file to use for input.

+
+
Kword filedir:
+

Optionally provide directory where files are located and use step for bulk file name

+
+
Kword step:
+

output step index, used for constructing output (and possibly input) filename

+
+
Kword nbins:
+

How many bins to use for the distribution

+
+
Kword cosine:
+

True if returning the pitch angles as a cosine(alpha) plot [-1,1]. +If false, returns as pitch angle in degrees [0,180].

+
+
Kword plasmaframe:
+

True if the user wants to get the pitch angle distribution +in the plasma frame (for this population). +If set to a string, will try to use the string as a variable for +the frame to transform into. +If set to a 3-element vector, will use that frame instead.

+
+
Kword vcut:
+

Set to True to ignore velocity cells below 2x the thermal speed. +If set to a number, will use that velocity in m/s instead.

+
+
Kword vcutmax:
+

Set to True to ignore velocity cells above 2x the thermal speed. +If set to a number, will use that velocity in m/s instead.

+
+
Kword outputdir:
+

Optional (recommended) method to save results to a file in the given directory. +If directory does not exist, it will be created. Filenames within directory are +generated automatically.

+
+
Kword outputfile:
+

Provide exact output file name (including complete path)

+
+
Kword pop:
+

Active population, defaults to proton (avgs)

+
+
Returns:
+

pitch angles and avgs [pitch_angles, avgs]

+
+
+
# Example usage:
+vlsvReader = VlsvReader("restart.0000798.vlsv")
+result = pitch_angles( vlsvReader=vlsvReader, 1924, cosine=True,
+                     plasmaframe=True, outputdir="/wrk/username/pitchangledirectory/" )
+
+
+
+ +
+
+pytools.calculations.static_field_tracer(vlsvReader, x0, max_iterations, dx, direction='+', bvar='B', centering='default', boundary_inner=-1)
+

Field tracer in a static frame

+
+
Parameters:
+
    +
  • vlsvReader – An open vlsv file

  • +
  • x – Starting point for the field trace

  • +
  • max_iterations – The maximum amount of iteractions before the algorithm stops

  • +
  • dx – One iteration step length

  • +
  • direction – ‘+’ or ‘-’ or ‘+-’ Follow field in the plus direction or minus direction

  • +
  • bvar – String, variable name to trace [default ‘B’]

  • +
  • centering – String, variable centering: ‘face’, ‘volume’, ‘node’ [defaults to ‘face’]

  • +
  • boundary_inner – Float, stop propagation if closer to origin than this value [default -1]

  • +
+
+
Returns:
+

List of coordinates

+
+
+
+ +
+
+pytools.calculations.static_field_tracer_3d(vlsvReader, seed_coords, max_iterations, dx, direction='+', grid_var='vg_b_vol', stop_condition=<function default_stopping_condition>, centering=None)
+

static_field_tracer_3d() integrates along the (static) field-grid vector field to calculate a final position. +Code uses forward Euler method to conduct the tracing. +Based on Analysator’s static_field_tracer() +:Inputs:

+
+

param vlsvReader: A vlsvReader object (~an open .vlsv file)

+
+
param coord_list: a list of 3-element array-like initial coordinates [ [x1,y1,z1], [x2,y2,z2], … ] ::

if considering just a single starting point, the code accepts a 3-element array-like object [x1,y1,z1]

+
+
+

param max_iterations: The maximum number of iterations (int) before the algorithm stops. Total traced length is dx*max_iterations

+

param dx: One iteration step length [meters] (ex. dx=1e4 for typical applications)

+

keyword direction: ‘+’ or ‘-’ or ‘+-’ Follow field in the plus direction, minus direction, or both

+
+
keyword grid_var: Variable to be traced (A string)
+
options include:
+
grid_var = some string

grid_var = ‘vg_b_vol’: AMR-grid B-field +grid_var =’fg_b’: fieldsolver grid B-field, grid_var=’fg_e’: fieldsolver grid E-field +static_field_tracer_3d() will load the appropriate variable via the vlsvReader object +NOTE: volumetric variables, with ‘_vol’ suffix, may not work as intended. Use face-centered values: ‘fg_b’, ‘fg_e’ etc.

+
+
grid_var = some fieldsolver-grid (“fg”) array. dimensions [dimx,dimy,dimz,3]

ex. fg = vlsvobj.read_variable(‘fg_b’) +field grid data is already loaded externally using read_variable() method (see vlsvreader.py). +If fg keyword is set this way, the input vlsvReader is only referred to for metadata (esp. grid dimensions)

+
+

keyword stop_condition: Boolean array (seed_coords.shape[0],)

+
+
+
+
+
+

Determine when the iteration stop, for the vg trace only +If not specified, it will always be True for each seed points. +eg. def my_stop(points):

+
+

distances = np.linalg.norm(points[:,:],axis = 1) +return (distances <= lower_bound) | (distances >= upper_bound)

+
+
+
+
+
+
Returns:
+

points_traced — a 3d numpy array [len(seed_coords),max_iterations (or 2*max_iterations-1 for ‘+-‘),3] +Non-traced sections (e.g. iterations after reaching outer boundaries) filled with np.nan

+
+
+
+
keyword centering: Set to a string (‘face’ or ‘edge’) indicating whether the fg variable is face- or edge-centered

If keyword fg == ‘fg_b’, then centering = ‘face’ (overriding input) +If keyword fg == ‘fg_e’, then centering = ‘edge’ (overriding input)

+
+
EXAMPLE: vlsvobj = pytools.vlsvfile.VlsvReader(vlsvfile)

fg_b = vlsvobj.read_variable(‘fg_b’) +traces = static_field_tracer_3d( vlsvobj, [[5e7,0,0], [0,0,5e7]], 10, 1e5, direction=’+’, fg = fg_b )

+
+
+
+ +
+
+pytools.calculations.themis_observation_from_file(vlsvReader, cellid, matrix=array([[1, 0, 0], [0, 1, 0], [0, 0, 1]]), countrates=True, interpolate=True, binOffset=[0.0, 0.0], pop='proton')
+

Calculates artificial THEMIS EMS observation from the given cell +:param vlsvReader: Some VlsvReader class with a file open +:type vlsvReader: vlsvfile.VlsvReader +:param cellid: The cell id where the distribution is supposet to be sampled NOTE: The cell id must have a velocity distribution! +:param matrix: Matrix to transform velocities from simulation space into detector space (use simulation_to_spacecraft_frame helper function) +:param countrates: Transform phase space densities into count rates? +:param interpolate: interpolate into detector bins? +:param binOffset: offset bin allocation in (angle, energy) by this amount (used to align polar plots) +:returns: detector bins angles, energies and counts [bin_thetas,energies,min,max,counts]

+

+
+
+

# Example usage: +vlsvReader = VlsvReader(“fullf.0001.vlsv”) +angles, energies, vmin, vmax, values = themis_observation_from_file( vlsvReader=self.vlsvReader, cellid=cellid) +# plot: +grid_r, grid_theta = np.meshgrid(energies,angles) +fig,ax=pl.subplots(subplot_kw=dict(projection=”polar”),figsize=(12,10)) +ax.set_title(“Detector view at cell “ + str(cellid)) +cax = ax.pcolormesh(grid_theta,grid_r,values, norm=matplotlib.colors.LogNorm(vmin=vmin,vmax=vmax)) +pl.show()

+
+ +
+
+pytools.calculations.themis_plot_detector(vlsvReader, cellID, detector_axis=array([0, 1, 0]), pop='proton')
+

Plots a view of the detector countrates using matplotlib +:param vlsvReader: Some VlsvReader class with a file open +:type vlsvReader: vlsvfile.VlsvReader +:param cellid: The cell id where the distribution is supposet to be sampled NOTE: The cell id must have a velocity distribution! +:param detector_axis: detector axis direction (note: this is not spacecraft spin axis!)

+
+ +
+
+pytools.calculations.themis_plot_phasespace_contour(vlsvReader, cellID, plane_x=array([1., 0., 0.]), plane_y=array([0., 0., 1.]), smooth=False, xlabel='Vx', ylabel='Vy', pop='proton')
+

Plots a contour view of phasespace, as seen by a themis detector, at the given cellID +:param vlsvReader: Some VlsvReader class with a file open +:type vlsvReader: vlsvfile.VlsvReader +:param cellid: The cell id where the distribution is supposet to be sampled NOTE: The cell id must have a velocity distribution! +:param plane_x and plane_y: x and y direction of the resulting plot plane

+
+ +
+
+pytools.calculations.themis_plot_phasespace_helistyle(vlsvReader, cellID, plane_x=array([1., 0., 0.]), plane_y=array([0., 0., 1.]), smooth=True, xlabel='Vx', ylabel='Vy')
+

Plots a view of phasespace, as seen by a themis detector, at the given cellID, in the style that heli likes. +:param vlsvReader: Some VlsvReader class with a file open +:type vlsvReader: vlsvfile.VlsvReader +:param cellid: The cell id where the distribution is supposet to be sampled NOTE: The cell id must have a velocity distribution! +:param smooth: Smooth re-gridded phasespace before plotting +:param plane_x and plane_y: x and y direction of the resulting plot plane

+
+ +
+
+pytools.calculations.vlsv_intpol_file(file_vlsv, file_orbit, varlist, file_output)
+

Writes interpolated values of variables in ascii file +:param file_vlsv: VLSV file +:param file_orbit: Orbit file (columns: x,y,z or t,x,y,z) +:param varlist: Variable list +:param file_output: Output ascii file (columns: x,y,z,cellid,var1,var2,var3,…) +:returns: none

+
# Example:
+import pytools as pt
+pt.calculations.vlsv_intpol_file("state00040000.vlsv","orbit.dat",["cellB","n_H+sw_ave"],"output.dat")
+
+
+
+ +
+
+pytools.calculations.vlsv_intpol_points(vlsvReader, points, varlist, operator='pass', interpolation_order=1)
+

Returns interpolated values of variables at given points +:param vlsvReader: Some open VlsvReader +:type vlsvReader: vlsvfile.VlsvReader +:param points: Coordinate points +:param varlist: Variable list, if empty all variables are got +:param operator: The operator for the variable, for example “x” for x-component or “magnitude” for magnitude +:param interpolation_order: Order of interpolation (0 or 1), defaults to 1 +:returns: A tuple with output: (coordinates,variable_values,header_string)

+
# Example:
+import pytools as pt
+import numpy as np
+f=pt.vlsvfile.VlsvReader(file_name="state00040000.vlsv")
+mesh_limits = f.get_spatial_mesh_extent()
+x = np.linspace(mesh_limits[0],mesh_limits[3],100) # points along x-axis
+y = np.zeros(len(x))
+z = np.zeros(len(x))
+points=(np.array([x,y,z])).transpose()
+varlist = ["cellB","n_H+sw_ave"]
+[crd,cellids,params,hstr]=pt.calculations.vlsv_intpol_points(f,points,varlist)
+x=crd[:,0]
+y=crd[:,1]
+z=crd[:,2]
+Bx=params[:,0]
+By=params[:,1]
+Bz=params[:,2]
+n=params[:,3]
+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/genindex/index.html b/genindex/index.html new file mode 100644 index 00000000..66255fd3 --- /dev/null +++ b/genindex/index.html @@ -0,0 +1,721 @@ + + + + + + + + Index — analysator documentation + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ + +

Index

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

A

+ + +
+ +

B

+ + + +
+ +

C

+ + + +
+ +

D

+ + + +
+ +

E

+ + + +
+ +

F

+ + + +
+ +

G

+ + + +
+ +

I

+ + +
+ +

L

+ + + +
+ +

M

+ + +
+ +

N

+ + +
+ +

O

+ + + +
+ +

P

+ + + +
+ +

R

+ + + +
+ +

S

+ + + +
+ +

T

+ + + +
+ +

U

+ + +
+ +

V

+ + + +
+ +

W

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

© Copyright 2024, University of Helsinki.

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/gics/index.html b/gics/index.html new file mode 100644 index 00000000..aeca4749 --- /dev/null +++ b/gics/index.html @@ -0,0 +1,212 @@ + + + + + + + + + gics — analysator documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

gics

+

Given a batch of .vlsv files, containing ground magnetic field vector data at different times, +calculate the north & east components of induced ground electric field [V/m], and save in corresponding .vlsv files

+

This script has been tested with the Vlasiator runs EGL, FHA, FIA +note that the usefulness for EGL is limited because there is no ionosphere (domain #3) for that run

+

Note that the Geomagnetically Induced Currents (GICs) can be computed immediately from the geoelectric field: +The surface current density is J = sigma*E, where E, sigma are respectively the ground electric field and conductivity.

+

This script is written for the UH environment. Adapt file paths as needed.

+

###

+
+
EXAMPLE CALL:

python gics.py

+
+
Example sidecar .vlsv files, containing ground magnetic field data (over the ionosphere mesh), can be found at:

/wrk-vakka/group/spacephysics/vlasiator/3D/FHA/bulk1_sidecars/geoelectric_field/

+
+
+
+
+gics.E_horizontal(dB_dt, pos, time, sigma=0.001, method='liu')
+
+
Calculate the horizontal electric field by integrating components of dB/dt

References: Cagniard et al 1952 (eq. 12), Pulkinnen et al 2006 (eq. 19)

+
+
Inputs:

dB_dt: cartesian dB/dt [T/s] array dimension [3, len(time)] +pos: cartesian position [m] 1D 3-element array, vector position +time: 1D array of times [s], monotonically increasing

+
+
Keywords:

sigma = ground conductivity (siemens/meter) +method:

+
+
+
‘liu’: use integration method described in Liu et al., (2009) doi:10.1029/2008SW000439, 2009

this method is exact for piecewise linear B (i.e., piecewise constant dB/dt)

+
+
+

‘RH-riemann’: use right-handed Riemann sum.

+
+
+
+
+ +
+
+gics.cartesian_to_spherical(x, y, z)
+

r > 0 +0 < theta < pi +-pi < phi < pi +all are assumed to be numpy arrays of equal dimensions

+

returns: r, theta, phi [tuple]

+
+ +
+
+gics.cartesian_to_spherical_vector(vx, vy, vz, x, y, z)
+

Convert cartesian vector(s) with coordinates (vx, vy, vz) +at the position(s) theta, phi (note: position r does not affect the vector transformation) +to spherical coordinates (v_r, v_theta, v_phi)

+

dimensions of vx, vy, vz, x, y, z arrays must either match or be a single number

+
+ +
+
+gics.mkdir_path(path)
+

Make a directory from the stem of an input file name (path)

+
+ +
+
+gics.spherical_to_cartesian(r, theta, phi)
+

r > 0 +0 < theta < pi +-pi < phi < pi +all are assumed to be numpy arrays of equal dimensions

+

returns: x, y, z [tuple]

+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/index.html b/index.html new file mode 100644 index 00000000..12b9c60d --- /dev/null +++ b/index.html @@ -0,0 +1,187 @@ + + + + + + + + + analysator documentation — analysator documentation + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

analysator documentation

+

Analysator is a set of Python tools and scripts used to read and analyze Vlasiator output files (VLSV). Vlasiator and its related tools are developed at University of Helsinki, and are open source.

+

This documentation is generated via Sphinx-autodoc from Analysator source. This page is a work in progress, with docstrings and the documentation layout in flux. Contributions via Analysator repo are welcome.

+

Add your content using reStructuredText syntax. See the +reStructuredText +documentation for details.

+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/magnetopause2d/index.html b/magnetopause2d/index.html new file mode 100644 index 00000000..5d4883ad --- /dev/null +++ b/magnetopause2d/index.html @@ -0,0 +1,134 @@ + + + + + + + + + magnetopause2d — analysator documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

magnetopause2d

+

Finds the magnetopause position by tracing steamines of the plasma flow for two-dimensional Vlasiator runs. Needs the yt package.

+
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/magnetopause3d/index.html b/magnetopause3d/index.html new file mode 100644 index 00000000..2cfeb948 --- /dev/null +++ b/magnetopause3d/index.html @@ -0,0 +1,162 @@ + + + + + + + + + magnetopause3d — analysator documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

magnetopause3d

+

Finds the magnetopause position by tracing steamines of the plasma flow for three-dimensional Vlasiator runs. Needs the yt package.

+
+
+magnetopause3d.make_surface(coords)
+

Defines surface constructed of input coordinates as triangles +Returns list of verts and vert indices of surface triangles

+

coordinates must be in form […[c11, c21, c31, … cn1],[c12, c22, c32, … cn2],… +where cij = [xij, yij, zij], i marks slice, j marks yz-plane (x_coord) index

+

How it works: +Three points make a triangle, triangles make the surface. +For every two planes next to each other: +- take every other point from plane1, every other from plane2 (in order!) +- from list of points: every three points closest to each other make a surface

+

Example: +plane 1: [v1, v2, v3, v4] +plane 2: [v5, v6, v7, v8]

+

-> list: [v1, v5, v2, v6, v3,…] +-> triangles: +v1 v5 v2 +v5 v2 v6 +v2 v6 v3 +. +. +.

+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/miscellaneous/index.html b/miscellaneous/index.html new file mode 100644 index 00000000..d6a173dc --- /dev/null +++ b/miscellaneous/index.html @@ -0,0 +1,204 @@ + + + + + + + + + miscellaneous — analysator documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

miscellaneous

+

This file module includes all the relevant functions/classes from the misc folder +Miscellaneous functions include functions which dont fit any other category

+

# List of functions:

+
import pytools as pt
+pt.miscellaneous.
+#press tab -> get the functions
+
+
+
+
+pytools.miscellaneous.get_sorted_file_names(name='*.vlsv')
+

Gets the file names in the current directory and sorts them.

+
+
Parameters:
+

name – Name of the file(s), for example “*.vlsv”

+
+
Returns:
+

a list of file names in sorted order

+
+
+
+ +
+
+pytools.miscellaneous.oblique_shock(Vx1, Vy1, Bx1, By1, T1, rho1)
+

Calculates the rankine hugoniot jump conditions on the other side of the shock for given parameters

+
+
Parameters:
+
    +
  • Vx1 – Velocity component parallel to the shock normal vector on one side of the shock

  • +
  • Vy1 – Velocity component perpendicular to the shock normal vector on one side of the shock

  • +
  • Bx1 – Magnetic field component parallel to the shock normal vector on one side of the shock

  • +
  • By1 – Magnetic field component perpendicular to the shock normal vector on one side of the shock

  • +
  • T1 – Temperature on one side of the shock

  • +
  • rho1 – Density on one side of the shock

  • +
+
+
Returns:
+

Components on the other side plus pressure P2 and compression ratio X in format [Vx2, Vy2, Bx2, By2, T2, rho2, P2, X]

+
+
+
+ +
+
+pytools.miscellaneous.plot_rankine(vlsvReader, point1, point2)
+

A function that plots the theoretical rankine-hugoniot jump condition variables for two given points along with the actual values from a given vlsv file

+
+
Parameters:
+
    +
  • vlsvReader – Some open vlsv reader file

  • +
  • point1 – The first point of interest along the bow-shock

  • +
  • point2 – The second point of interest along the bow-shock

  • +
+
+
Returns:
+

pylab figure

+
+
+
+ +
+
+pytools.miscellaneous.write_vtk_file(filename, point_data)
+

Writes a line into a VTK file with given points

+
+
Parameters:
+
    +
  • filename – Name of the file e.g. “test.vtk”

  • +
  • points – Points in a line in array format

  • +
+
+
+
# Example usage:
+import pytools as pt
+filename = "test.vtk"
+point_data = [[0.,0.,0.], [1.,1.,1.], [2.,2.,2.], [3.,3.,3.], [4.,4.,4.]]
+pt.miscellaneous.write_vtk_file( filename=filename, point_data=point_data )
+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/objects.inv b/objects.inv new file mode 100644 index 00000000..12fb1efa Binary files /dev/null and b/objects.inv differ diff --git a/plot/index.html b/plot/index.html new file mode 100644 index 00000000..9551efd9 --- /dev/null +++ b/plot/index.html @@ -0,0 +1,1969 @@ + + + + + + + + + plot — analysator documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

plot

+

The plot module has all the functions related to plotting variables.

+
# Example:
+import pytools as pt
+pt.pt.
+#press [tab] -> get the functions
+
+
+
+
+pytools.plot.plot_colormap(filename=None, vlsvobj=None, filedir=None, step=None, outputdir=None, outputfile=None, nooverwrite=False, var=None, op=None, operator=None, title=None, cbtitle=None, draw=None, usesci=True, symlog=None, diff=None, boxm=None, boxre=None, colormap=None, run=None, nocb=False, internalcb=False, wmark=False, wmarkb=False, axisunit=None, thick=1.0, scale=1.0, tickinterval=0, noborder=False, noxlabels=False, noylabels=False, vmin=None, vmax=None, lin=None, external=None, expression=None, vscale=1.0, absolute=False, symmetric=False, pass_vars=None, pass_times=None, pass_full=False, fluxfile=None, fluxdir=None, flux_levels=None, fluxthick=1.0, fluxlines=1, fsaved=None, nomask=False, Earth=None, highres=None, vectors=None, vectordensity=100, vectorcolormap='gray', vectorsize=1.0, streamlines=None, streamlinedensity=1, streamlinecolor='white', streamlinethick=1.0, axes=None, cbaxes=None, useimshow=False, imshowinterp='none')
+

Plots a coloured plot with axes and a colour bar.

+
+
Kword filename:
+

path to .vlsv file to use for input. Assumes a bulk file.

+
+
Kword vlsvobj:
+

Optionally provide a python vlsvfile object instead

+
+
Kword filedir:
+

Optionally provide directory where files are located and use step for bulk file name

+
+
Kword step:
+

output step index, used for constructing output (and possibly input) filename

+
+
Kword outputdir:
+

path to directory where output files are created (default: $HOME/Plots/ or override with PTOUTPUTDIR) +If directory does not exist, it will be created. If the string does not end in a +forward slash, the final part will be used as a prefix for the files.

+
+
Kword outputfile:
+

Singular output file name

+
+
Kword nooverwrite:
+

Set to only perform actions if the target output file does not yet exist

+
+
Kword var:
+

variable to plot, e.g. rho, RhoBackstream, beta, Temperature, MA, Mms, va, vms, +E, B, v, V or others. Accepts any variable known by analysator/pytools. +Per-population variables are simply given as “proton/rho” etc

+
+
Kword operator:
+

Operator to apply to variable: None, x, y, or z. Vector variables return either +the queried component, or otherwise the magnitude.

+
+
Kword op:
+

duplicate of operator

+
+
Kword boxm:
+

zoom box extents [x0,x1,y0,y1] in metres (default and truncate to: whole simulation box)

+
+
Kword boxre:
+

zoom box extents [x0,x1,y0,y1] in Earth radii (default and truncate to: whole simulation box)

+
+
Kword colormap:
+

colour scale for plot, use e.g. hot_desaturated, jet, viridis, plasma, inferno, +magma, parula, nipy_spectral, RdBu, bwr

+
+
Kword run:
+

run identifier, used for constructing output filename

+
+
Kword title:
+

string to use as plot title instead of time. +Special case: Set to “msec” to plot time with millisecond accuracy or “musec” +for microsecond accuracy. “sec” is integer second accuracy.

+
+
Kword cbtitle:
+

string to use as colorbar title instead of map name

+
+
Kword axisunit:
+

Plot axes using 10^{axisunit} m (default: Earth radius R_E)

+
+
Kword tickinterval:
+

Interval at which to have ticks on axes (not colorbar)

+
+
Kwird usesci:
+

Use scientific notation for colorbar ticks? (default: True)

+
+
Kword vmin,vmax:
+

min and max values for colour scale and colour bar. If no values are given, +min and max values for whole plot (non-zero rho regions only) are used.

+
+
Kword symmetric:
+

Set the absolute value of vmin and vmax to the greater of the two

+
+
Kword lin:
+

Flag for using linear colour scaling instead of log. If an integer, defines number +of colorbar ticks.

+
+
Kword symlog:
+

Use logarithmic scaling, but linear when abs(value) is below the value given to symlog. +Allows symmetric quasi-logarithmic plots of e.g. transverse field components. +A given of 0 or True translates to a threshold of max(abs(vmin),abs(vmax)) * 1.e-2, but this can +result in the innermost tick marks overlapping. In this case, using a larger value for +symlog is suggested.

+
+
Kword wmark:
+

If set to non-zero, will plot a Vlasiator watermark in the top left corner. If set to a text +string, tries to use that as the location, e.g. “NW”,”NE”,”SW”,”SW”

+
+
Kword wmarkb:
+

As for wmark, but uses an all-black Vlasiator logo.

+
+
Kword Earth:
+

If set, draws an earth at (0,0)

+
+
Kword highres:
+

Creates the image in high resolution, scaled up by this value (suitable for print).

+
+
Kword draw:
+

Set to anything but None or False in order to draw image on-screen instead of saving to file (requires x-windowing)

+
+
Kword noborder:
+

Plot figure edge-to-edge without borders (default off)

+
+
Kword noxlabels:
+

Suppress x-axis labels and title

+
+
Kword noylabels:
+

Suppress y-axis labels and title

+
+
Kword scale:
+

Scale text size (default=1.0)

+
+
Kword thick:
+

line and axis thickness, default=1.0

+
+
Kword nocb:
+

Set to suppress drawing of colourbar

+
+
Kword internalcb:
+

Set to draw colorbar inside plot instead of outside. If set to a text +string, tries to use that as the location, e.g. “NW”,”NE”,”SW”,”SW”

+
+
Kword external:
+

Optional function to use for external plotting of e.g. contours. The function +receives the following arguments: ax, XmeshXY,YmeshXY, pass_maps +If the function accepts a fifth variable, if set to true, it is expected to +return a list of required variables for constructing the pass_maps dictionary.

+
+
Kword expression:
+

Optional function which calculates a custom expression to plot. The function +receives the same dictionary of numpy arrays as external, as an argument pass_maps, +the contents of which are maps of variables. Each is either of size [ysize,xsize] +or for multi-dimensional variables (vectors, tensors) it’s [ysize,xsize,dim]. +If the function accepts a second variable, if set to true, it is expected to +return a list of required variables for pass_maps.

+
+
Kword diff:
+

Instead of a regular plot, plot the difference between the selected plot type for +the regular source file and the file given by this keyword. This overides external +and expression keywords, as well as related pass_vars, pass_times, and pass_full.

+
+
+

Important note: the dictionaries of arrays passed to external and expression are of shape [ysize,xzize], so +for some analysis transposing them is necessary. For pre-existing functions to use and to base new functions +on, see the plot_helpers.py file.

+
+
Kword vscale:
+

Scale all values with this before plotting. Useful for going from e.g. m^-3 to cm^-3 +or from tesla to nanotesla. Guesses correct units for colourbar for some known +variables. Set to None to search for a default scaling settings.

+
+
Kword absolute:
+

Plot the absolute of the evaluated variable

+
+
Kword pass_vars:
+

Optional list of map names to pass to the external/expression functions +as a dictionary of numpy arrays. Each is either of size [ysize,xsize] or +for multi-dimensional variables (vectors, tensors) it’s [ysize,xsize,dim].

+
+
Kword pass_times:
+

Integer, how many timesteps in each direction should be passed to external/expression +functions in pass_vars (e.g. pass_times=1 passes the values of three timesteps). If +pass_times has two values, the first is the extent before, the second after. +(e.g. pass_times=[2,1] passes the values of two preceding and one following timesteps +for a total of four timesteps) +This causes pass_vars to become a list of timesteps, with each timestep containing +a dictionary of numpy arrays as for regular pass_vars. An additional dictionary entry is +added as ‘dstep’ which gives the timestep offset from the master frame. +Does not work if working from a vlsv-object.

+
+
Kword pass_full:
+

Set to anything but None in order to pass the full arrays instead of a zoomed-in section

+
+
Kword fluxfile:
+

Filename to plot fluxfunction from

+
+
Kword flux_levels:
+

A list of flux function values to plot as the contours (default: None, a set of constant +intervals: np.linspace(-10,10,fluxlines*60))

+
+
Kword fluxdir:
+

Directory in which fluxfunction files can be found

+
+
Kword fluxthick:
+

Scale fluxfunction line thickness

+
+
Kword fluxlines:
+

Relative density of fluxfunction contours

+
+
Kword fsaved:
+

Overplot locations of fSaved. If keyword is set to a string, that will be the colour used.

+
+
Kword nomask:
+

Do not mask plotting based on proton density

+
+
Kword vectors:
+

Set to a vector variable to overplot (unit length vectors, color displays variable magnitude)

+
+
Kword vectordensity:
+

Aim for how many vectors to show in plot window (default 100)

+
+
Kword vectorcolormap:
+

Colormap to use for overplotted vectors (default: gray)

+
+
Kword vectorsize:
+

Scaling of vector sizes

+
+
Kword streamlines:
+

Set to a vector variable to overplot as streamlines

+
+
Kword streamlinedensity:
+

Set streamline density (default 1)

+
+
Kword streamlinecolor:
+

Set streamline color (default white)

+
+
Kword streamlinethick:
+

Set streamline thickness

+
+
Kword axes:
+

Provide the routine a set of axes to draw within instead of generating a new image. +It is recommended to either also provide cbaxes or activate nocb, unless one wants a colorbar +to be automatically added next to the panel (but this may affect the overall layout) +Note that the aspect ratio of the colormap is made equal in any case, hence the axes +proportions may change if the box and axes size are not designed to match by the user

+
+
Kword cbaxes:
+

Provide the routine a set of axes for the colourbar.

+
+
Kword useimshow:
+

Use imshow for raster background instead (default: False)

+
+
Kword imshowinterp:
+

Use this matplotlib interpolation for imshow (default: ‘none’)

+
+
Returns:
+

Outputs an image to a file or to the screen.

+
+
+
# Example usage:
+plot_colormap(filename=fileLocation, var="MA", run="BCQ",
+            colormap='nipy_spectral',step=j, outputdir=outputLocation,
+            lin=True, wmark=1, vmin=2.7, vmax=10, 
+            external=cavitoncontours, pass_vars=['rho','B','beta'])
+# Where cavitoncontours is an external function which receives the arguments
+#  ax, XmeshXY,YmeshXY, pass_maps
+# where pass_maps is a dictionary of maps for the requested variables.
+
+# example (simple) use of expressions:
+def exprMA_cust(exprmaps, requestvariables=False):
+    if requestvariables==True:
+    return ['va']
+    custombulkspeed=750000. # m/s
+    va = exprmaps['va'][:,:]
+    MA = custombulkspeed/va
+    return MA
+plot_colormap(filename=fileLocation, vmin=1 vmax=40, expression=exprMA_cust,lin=True)
+
+
+
+ +
+
+pytools.plot.plot_colormap3dslice(filename=None, vlsvobj=None, filedir=None, step=None, run=None, outputdir=None, outputfile=None, nooverwrite=False, var=None, op=None, operator=None, title=None, cbtitle=None, draw=None, usesci=True, symlog=None, boxm=None, boxre=None, colormap=None, nocb=False, internalcb=False, wmark=False, wmarkb=False, axisunit=None, thick=1.0, scale=1.0, tickinterval=0, noborder=False, noxlabels=False, noylabels=False, vmin=None, vmax=None, lin=None, external=None, expression=None, diff=None, vscale=1.0, absolute=False, symmetric=False, pass_vars=None, pass_times=None, pass_full=False, fsaved=None, nomask=None, Earth=None, highres=None, vectors=None, vectordensity=100, vectorcolormap='gray', vectorsize=1.0, streamlines=None, streamlinedensity=1, streamlinecolor='white', streamlinethick=1.0, axes=None, cbaxes=None, normal='y', cutpoint=0.0, cutpointre=None, useimshow=False, imshowinterp='none')
+

Plots a coloured plot with axes and a colour bar.

+
+
Kword filename:
+

path to .vlsv file to use for input. Assumes a bulk file.

+
+
Kword vlsvobj:
+

Optionally provide a python vlsvfile object instead

+
+
Kword filedir:
+

Optionally provide directory where files are located and use step for bulk file name

+
+
Kword step:
+

output step index, used for constructing output (and possibly input) filename

+
+
Kword run:
+

run identifier, used for constructing output filename

+
+
Kword outputdir:
+

path to directory where output files are created (default: $HOME/Plots/ or override with PTOUTPUTDIR) +If directory does not exist, it will be created. If the string does not end in a +forward slash, the final part will be used as a prefix for the files.

+
+
Kword outputfile:
+

Singular output file name

+
+
Kword nooverwrite:
+

Set to only perform actions if the target output file does not yet exist

+
+
Kword var:
+

variable to plot, e.g. rho, RhoBackstream, beta, Temperature, MA, Mms, va, vms, +E, B, v, V or others. Accepts any variable known by analysator/pytools. +Per-population variables are simply given as “proton/rho” etc

+
+
Kword operator:
+

Operator to apply to variable: None, x, y, or z. Vector variables return either +the queried component, or otherwise the magnitude.

+
+
Kword op:
+

duplicate of operator

+
+
Kword boxm:
+

zoom box extents [x0,x1,y0,y1] in metres (default and truncate to: whole simulation box)

+
+
Kword boxre:
+

zoom box extents [x0,x1,y0,y1] in Earth radii (default and truncate to: whole simulation box)

+
+
Kword colormap:
+

colour scale for plot, use e.g. hot_desaturated, jet, viridis, plasma, inferno, +magma, parula, nipy_spectral, RdBu, bwr

+
+
Kword title:
+

string to use as plot title instead of time. +Special case: Set to “msec” to plot time with millisecond accuracy or “musec” +for microsecond accuracy. “sec” is integer second accuracy.

+
+
Kword cbtitle:
+

string to use as colorbar title instead of map name

+
+
Kword axisunit:
+

Plot axes using 10^{axisunit} m (default: Earth radius R_E)

+
+
Kword tickinterval:
+

Interval at which to have ticks on axes (not colorbar)

+
+
Kwird usesci:
+

Use scientific notation for colorbar ticks? (default: True)

+
+
Kword vmin,vmax:
+

min and max values for colour scale and colour bar. If no values are given, +min and max values for whole plot (non-zero rho regions only) are used.

+
+
Kword symmetric:
+

Set the absolute value of vmin and vmax to the greater of the two

+
+
Kword lin:
+

Flag for using linear colour scaling instead of log

+
+
Kword symlog:
+

Use logarithmic scaling, but linear when abs(value) is below the value given to symlog. +Allows symmetric quasi-logarithmic plots of e.g. transverse field components. +A given of 0 translates to a threshold of max(abs(vmin),abs(vmax)) * 1.e-2, but this can +result in the innermost tick marks overlapping. In this case, using a larger value for +symlog is suggested.

+
+
Kword wmark:
+

If set to non-zero, will plot a Vlasiator watermark in the top left corner. If set to a text +string, tries to use that as the location, e.g. “NW”,”NE”,”SW”,”SW”

+
+
Kword wmarkb:
+

As for wmark, but uses an all-black Vlasiator logo.

+
+
Kword Earth:
+

If set, draws an earth at (0,0)

+
+
Kword highres:
+

Creates the image in high resolution, scaled up by this value (suitable for print).

+
+
Kword draw:
+

Set to nonzero in order to draw image on-screen instead of saving to file (requires x-windowing)

+
+
Kword noborder:
+

Plot figure edge-to-edge without borders (default off)

+
+
Kword noxlabels:
+

Suppress x-axis labels and title

+
+
Kword noylabels:
+

Suppress y-axis labels and title

+
+
Kword scale:
+

Scale text size (default=1.0)

+
+
Kword thick:
+

line and axis thickness, default=1.0

+
+
Kword nocb:
+

Set to suppress drawing of colourbar

+
+
Kword internalcb:
+

Set to draw colorbar inside plot instead of outside. If set to a text +string, tries to use that as the location, e.g. “NW”,”NE”,”SW”,”SW”

+
+
Kword external:
+

Optional function to use for external plotting of e.g. contours. The function +receives the following arguments: ax, XmeshXY,YmeshXY, pass_maps +If the function accepts a fifth variable, if set to true, it is expected to +return a list of required variables for constructing the pass_maps dictionary.

+
+
Kword expression:
+

Optional function which calculates a custom expression to plot. The function +receives the same dictionary of numpy arrays as external, as an argument pass_maps, +the contents of which are maps of variables. Each is either of size [ysize,xsize] +or for multi-dimensional variables (vectors, tensors) it’s [ysize,xsize,dim]. +If the function accepts a second variable, if set to true, it is expected to +return a list of required variables for pass_maps.

+
+
+

Important note: the dictionaries of arrays passed to external and expression are of shape [ysize,xzize], so +for some analysis transposing them is necessary. For pre-existing functions to use and to base new functions +on, see the plot_helpers.py file.

+
+
Kword vscale:
+

Scale all values with this before plotting. Useful for going from e.g. m^-3 to cm^-3 +or from tesla to nanotesla. Guesses correct units for colourbar for some known +variables. Set to None to seek for a default scaling.

+
+
Kword absolute:
+

Plot the absolute of the evaluated variable

+
+
Kword pass_vars:
+

Optional list of map names to pass to the external/expression functions +as a dictionary of numpy arrays. Each is either of size [ysize,xsize] or +for multi-dimensional variables (vectors, tensors) it’s [ysize,xsize,dim].

+
+
Kword pass_times:
+

Integer, how many timesteps in each direction should be passed to external/expression +functions in pass_vars (e.g. pass_times=1 passes the values of three timesteps). If +pass_times has two values, the first is the extent before, the second after. +(e.g. pass_times=[2,1] passes the values of two preceding and one following timesteps +for a total of four timesteps) +This causes pass_vars to become a list of timesteps, with each timestep containing +a dictionary of numpy arrays as for regular pass_vars. An additional dictionary entry is +added as ‘dstep’ which gives the timestep offset from the master frame. +Does not work if working from a vlsv-object.

+
+
Kword pass_full:
+

Set to anything but None in order to pass the full arrays instead of a zoomed-in section

+
+
Kword diff:
+

Instead of a regular plot, plot the difference between the selected plot type for +the regular source file and the file given by this keyword. This overides external +and expression keywords, as well as related pass_vars, pass_times, and pass_full.

+
+
Kword fsaved:
+

Overplot locations of fSaved. If keyword is set to a string, that will be the colour used.

+
+
Kword nomask:
+

Do not mask plotting based on proton density

+
+
Kword vectors:
+

Set to a vector variable to overplot (unit length vectors, color displays variable magnitude)

+
+
Kword vectordensity:
+

Aim for how many vectors to show in plot window (default 100)

+
+
Kword vectorcolormap:
+

Colormap to use for overplotted vectors (default: gray)

+
+
Kword vectorsize:
+

Scaling of vector sizes

+
+
Kword streamlines:
+

Set to a vector variable to overplot as streamlines

+
+
Kword streamlinedensity:
+

Set streamline density (default 1)

+
+
Kword streamlinecolor:
+

Set streamline color (default white)

+
+
Kword streamlinethick:
+

Set streamline thickness

+
+
Kword axes:
+

Provide the routine a set of axes to draw within instead of generating a new image. +It is recommended to either also provide cbaxes or activate nocb, unless one wants a colorbar +to be automatically added next to the panel (but this may affect the overall layout) +Note that the aspect ratio of the colormap is made equal in any case, hence the axes +proportions may change if the box and axes size are not designed to match by the user

+
+
Kword cbaxes:
+

Provide the routine a set of axes for the colourbar.

+
+
Kword normal:
+

Direction of the normal of the 2D cut through (‘x’, ‘y’, or ‘z’ or a vector)

+
+
Kword cutpoint:
+

Coordinate (in normal direction) through which the cut must pass [m]

+
+
Kword cutpointre:
+

Coordinate (in normal direction) through which the cut must pass [rE]

+
+
Kword useimshow:
+

Use imshow for raster background instead (default: False)

+
+
Kword imshowinterp:
+

Use this matplotlib interpolation for imshow (default: ‘none’)

+
+
Returns:
+

Outputs an image to a file or to the screen.

+
+
+
# Example usage:
+plot_colormap(filename=fileLocation, var="MA", run="BCQ",
+            colormap='nipy_spectral',step=j, outputdir=outputLocation,
+            lin=1, wmark=1, vmin=2.7, vmax=10, 
+            external=cavitoncontours, pass_vars=['rho','B','beta'])
+# Where cavitoncontours is an external function which receives the arguments
+#  ax, XmeshXY,YmeshXY, pass_maps
+# where pass_maps is a dictionary of maps for the requested variables.
+
+# example (simple) use of expressions:
+def exprMA_cust(exprmaps, requestvariables=False):
+    if requestvariables==True:
+    return ['va']
+    custombulkspeed=750000. # m/s
+    va = exprmaps['va'][:,:]
+    MA = custombulkspeed/va
+    return MA
+plot_colormap(filename=fileLocation, vmin=1 vmax=40, expression=exprMA_cust,lin=1)
+
+
+
+ +
+
+pytools.plot.plot_ionosphere(filename=None, vlsvobj=None, filedir=None, step=None, run=None, outputdir=None, outputfile=None, nooverwrite=False, var=None, op=None, operator=None, colormap=None, vmin=None, vmax=None, symmetric=False, absolute=None, usesci=True, log=None, lin=None, symlog=None, nocb=False, internalcb=False, minlatitude=60, cbtitle=None, title=None, cbaxes=None, thick=1.0, scale=1.0, vscale=1.0, wmark=False, wmarkb=False, viewdir=1.0, draw=None, axes=None)
+

Plots a 2d projection of an ionosphere variable

+
+
Kword filename:
+

path to .vlsv file to use for input. Assumes a bulk file.

+
+
Kword vlsvobj:
+

Optionally provide a python vlsvfile object instead

+
+
Kword filedir:
+

Optionally provide directory where files are located and use step for bulk file name

+
+
Kword step:
+

output step index, used for constructing output (and possibly input) filename

+
+
Kword run:
+

run identifier, used for constructing output filename

+
+
Kword outputdir:
+

path to directory where output files are created (default: $HOME/Plots/ or override with PTOUTPUTDIR) +If directory does not exist, it will be created. If the string does not end in a +forward slash, the final part will be used as a prefix for the files.

+
+
Kword outputfile:
+

Singular output file name

+
+
Kword nooverwrite:
+

Set to only perform actions if the target output file does not yet exist

+
+
Kword var:
+

variable to plot, e.g. rho, RhoBackstream, beta, Temperature, MA, Mms, va, vms, +E, B, v, V or others. Accepts any variable known by analysator/pytools. +Per-population variables are simply given as “proton/rho” etc

+
+
Kword operator:
+

Operator to apply to variable: None, x, y, or z. Vector variables return either +the queried component, or otherwise the magnitude.

+
+
Kword op:
+

duplicate of operator

+
+
Kword colormap:
+

colour scale for plot, use e.g. hot_desaturated, jet, viridis, plasma, inferno, +magma, parula, nipy_spectral, RdBu, bwr

+
+
Kword vmin,vmax:
+

min and max values for colour scale and colour bar. If no values are given, +min and max values for whole plot (non-zero rho regions only) are used.

+
+
Kword symmetric:
+

Set the absolute value of vmin and vmax to the greater of the two

+
+
Kword absolute:
+

Plot the absolute of the evaluated variable

+
+
Kwird usesci:
+

Use scientific notation for colorbar ticks? (default: True)

+
+
Kword lin:
+

Flag for using linear colour scaling instead of log

+
+
Kword symlog:
+

Use logarithmic scaling, but linear when abs(value) is below the value given to symlog. +Allows symmetric quasi-logarithmic plots of e.g. transverse field components. +A given of 0 translates to a threshold of max(abs(vmin),abs(vmax)) * 1.e-2, but this can +result in the innermost tick marks overlapping. In this case, using a larger value for +symlog is suggested.

+
+
Kword nocb:
+

Set to suppress drawing of colourbar

+
+
Kword internalcb:
+

Set to draw colorbar inside plot instead of outside. If set to a text +string, tries to use that as the location, e.g. “NW”,”NE”,”SW”,”SW”

+
+
Kword minlatitude:
+

Minimum plot latitude (default=60 degrees)

+
+
Kword title:
+

string to use as plot title instead of time. +Special case: Set to “msec” to plot time with millisecond accuracy or “musec” +for microsecond accuracy. “sec” is integer second accuracy.

+
+
Kword cbtitle:
+

string to use as colorbar title instead of map name

+
+
Kword viewdir:
+

view direction onto the sphere. Positive value: North pole. Negative values: South pole.

+
+
Kword scale:
+

Scale text size (default=1.0)

+
+
Kword vscale:
+

Scale all values with this before plotting. Useful for going from e.g. m^-3 to cm^-3 +or from tesla to nanotesla. Guesses correct units for colourbar for some known +variables.

+
+
Kword axes:
+

Provide the routine a set of axes to draw within instead of generating a new image.

+
+
Kword cbaxes:
+

Provide the routine a set of axes for the colourbar.

+
+
Kword thick:
+

line and axis thickness, default=1.0

+
+
Kword draw:
+

Set to anything but None or False in order to draw image on-screen instead of saving to file (requires x-windowing)

+
+
Kword wmark:
+

If set to non-zero, will plot a Vlasiator watermark in the top left corner. If set to a text +string, tries to use that as the location, e.g. “NW”,”NE”,”SW”,”SW”

+
+
Kword wmarkb:
+

As for wmark, but uses an all-black Vlasiator logo.

+
+
+

+
+
+
+ +
+
+pytools.plot.plot_isosurface(filename=None, vlsvobj=None, filedir=None, step=None, outputdir=None, nooverwrite=None, surf_var=None, surf_op=None, surf_level=None, color_var=None, color_op=None, surf_step=1, title=None, cbtitle=None, draw=None, usesci=None, symmetric=False, highres=None, boxm=[], boxre=[], colormap=None, run=None, wmark=None, nocb=False, unit=None, thick=1.0, scale=1.0, vscale=1.0, vmin=None, vmax=None, lin=None, symlog=None, angle=[30.0, 90.0], transparent=True)
+

Plots a coloured isosurface plot with axes and a colour bar.

+
+
Kword filename:
+

path to .vlsv file to use for input. Assumes a bulk file.

+
+
Kword vlsvobj:
+

Optionally provide a python vlsvfile object instead

+
+
Kword filedir:
+

Optionally provide directory where files are located and use step for bulk file name

+
+
Kword step:
+

output step index, used for constructing output (and possibly input) filename

+
+
Kword outputdir:
+

path to directory where output files are created (default: $HOME/Plots/ or override with PTOUTPUTDIR) +If directory does not exist, it will be created. If the string does not end in a +forward slash, the final parti will be used as a perfix for the files.

+
+
Kword nooverwrite:
+

Set to only perform actions if the target output file does not yet exist

+
+
Kword surf_var:
+

Variable to read for defining surface

+
+
Kword surf_op:
+

Operator to use for variable to read surface

+
+
Kword surf_level:
+

Level at which to define surface

+
+
Kword surf_step:
+

Vertex stepping for surface generation: larger value returns coarser surface

+
+
Kword color_var:
+

Variable to read for coloring surface

+
+
Kword color_op:
+

Operator to use for variable to color surface (‘x’, ‘y’, ‘z’; if None and color_var is a vector, the magnitude is taken)

+
+
Kword boxm:
+

zoom box extents [x0,x1,y0,y1] in metres (default and truncate to: whole simulation box)

+
+
Kword boxre:
+

zoom box extents [x0,x1,y0,y1] in Earth radii (default and truncate to: whole simulation box)

+
+
Kword colormap:
+

colour scale for plot, use e.g. hot_desaturated, jet, viridis, plasma, inferno, +magma, parula, nipy_spectral, RdBu, bwr

+
+
Kword run:
+

run identifier, used for constructing output filename

+
+
Kword title:
+

string to use as plot title instead of time

+
+
Kword cbtitle:
+

string to use as colorbar title instead of map name

+
+
Kword unit:
+

Plot axes using 10^{unit} m (default: Earth radius R_E)

+
+
Kwird usesci:
+

Use scientific notation for colorbar ticks? (default: 1)

+
+
Kword vscale:
+

Scale all values with this before plotting. Useful for going from e.g. m^-3 to cm^-3 +or from tesla to nanotesla. Guesses correct units for colourbar for some known +variables. Set to None to seek for a default scaling.

+
+
Kword vmin,vmax:
+

min and max values for colour scale and colour bar. If no values are given, +min and max values for whole plot (non-zero rho regions only) are used.

+
+
Kword symmetric:
+

Set the absolute value of vmin and vmax to the greater of the two

+
+
Kword lin:
+

Flag for using linear colour scaling instead of log

+
+
Kword symlog:
+

Use logarithmic scaling, but linear when abs(value) is below the value given to symlog. +Allows symmetric quasi-logarithmic plots of e.g. transverse field components. +A given of 0 translates to a threshold of max(abs(vmin),abs(vmax)) * 1.e-2.

+
+
Kword wmark:
+

If set to non-zero, will plot a Vlasiator watermark in the top left corner.

+
+
Kword highres:
+

Creates the image in high resolution, scaled up by this value (suitable for logging.info).

+
+
Kword draw:
+

Set to nonzero in order to draw image on-screen instead of saving to file (requires x-windowing)

+
+
Kword transparent:
+

Set to False in order to make the surface opaque

+
+
Kword scale:
+

Scale text size (default=1.0)

+
+
Kword thick:
+

line and axis thickness, default=1.0

+
+
Kword nocb:
+

Set to suppress drawing of colourbar

+
+
Kword angle:
+

Viewing elevation and azimuthal angles in degrees

+
+
Returns:
+

Outputs an image to a file or to the screen.

+
+
+

+
+
+

# Example usage:

+
+ +
+
+pytools.plot.plot_multiple_variables(variables_x_list, variables_y_list, figure=[], clean_xticks=False)
+

Plots multiple variables from the input with pylab

+
+
Parameters:
+
    +
  • variables_x_list – Some list of variables to be plotted in the x-axis

  • +
  • variables_y_list – Some list of variables to be plotted in the y-axis

  • +
  • figure – If one wants to plot into an existing figure then the matplotlib figure should be passed as an argument (OPTIONAL)

  • +
+
+
Returns:
+

a pylab figure with the plot

+
+
+
#Example usage:
+plot_multiple_variables( [distances, xcoordinates], [rho, B_x] )
+# This would plot rho_values as a function of distance and B_x_values as a function of xcoordinates
+
+
+
+

Note

+

Multiplot expects variables to be saved in the VariableInfo class

+
+
+

Note

+

If for some reason some variable list (x or y) is empty, e.g. variables_x_list = [B_x, [], B_z, rho], then the variable will not be plotted. This can be used if one wants to plot only into certain subplots.

+
+
+ +
+
+pytools.plot.plot_neutral_sheet(filename=None, vlsvobj=None, filedir=None, step=None, run=None, outputdir=None, outputfile=None, nooverwrite=False, var=None, op=None, operator=None, title=None, cbtitle=None, draw=None, usesci=True, symlog=None, boxm=None, boxre=None, colormap=None, nocb=False, internalcb=False, wmark=False, wmarkb=False, axisunit=None, thick=1.0, scale=1.0, tickinterval=0, noborder=False, noxlabels=False, noylabels=False, vmin=None, vmax=None, lin=None, external=None, expression=None, diff=None, vscale=1.0, absolute=False, symmetric=False, pass_vars=None, pass_times=None, pass_full=False, nomask=None, Earth=None, highres=None, vectors=None, vectordensity=100, vectorcolormap='gray', vectorsize=1.0, streamlines=None, streamlinedensity=1, streamlinecolor='white', streamlinethick=1.0, axes=None, cbaxes=None, useimshow=False, imshowinterp='none', folding_alpha=0.2, z_extent=[-5, 5], sheetlayer='above')
+

Plots a coloured plot along the neutral sheet with axes and a colour bar.

+
+
Kword filename:
+

path to .vlsv file to use for input. Assumes a bulk file.

+
+
Kword vlsvobj:
+

Optionally provide a python vlsvfile object instead

+
+
Kword filedir:
+

Optionally provide directory where files are located and use step for bulk file name

+
+
Kword step:
+

output step index, used for constructing output (and possibly input) filename

+
+
Kword run:
+

run identifier, used for constructing output filename

+
+
Kword outputdir:
+

path to directory where output files are created (default: $HOME/Plots/ or override with PTOUTPUTDIR) +If directory does not exist, it will be created. If the string does not end in a +forward slash, the final part will be used as a prefix for the files.

+
+
Kword outputfile:
+

Singular output file name

+
+
Kword nooverwrite:
+

Set to only perform actions if the target output file does not yet exist

+
+
Kword var:
+

variable to plot, e.g. rho, RhoBackstream, beta, Temperature, MA, Mms, va, vms, +E, B, v, V or others. Accepts any variable known by analysator/pytools. +Per-population variables are simply given as “proton/rho” etc

+
+
Kword operator:
+

Operator to apply to variable: None, x, y, or z. Vector variables return either +the queried component, or otherwise the magnitude.

+
+
Kword op:
+

duplicate of operator

+
+
Kword boxm:
+

zoom box extents [x0,x1,y0,y1] in metres (default and truncate to: whole simulation box)

+
+
Kword boxre:
+

zoom box extents [x0,x1,y0,y1] in Earth radii (default and truncate to: whole simulation box)

+
+
Kword colormap:
+

colour scale for plot, use e.g. hot_desaturated, jet, viridis, plasma, inferno, +magma, parula, nipy_spectral, RdBu, bwr

+
+
Kword title:
+

string to use as plot title instead of time. +Special case: Set to “msec” to plot time with millisecond accuracy or “musec” +for microsecond accuracy. “sec” is integer second accuracy.

+
+
Kword cbtitle:
+

string to use as colorbar title instead of map name

+
+
Kword axisunit:
+

Plot axes using 10^{axisunit} m (default: Earth radius R_E)

+
+
Kword tickinterval:
+

Interval at which to have ticks on axes (not colorbar)

+
+
Kwird usesci:
+

Use scientific notation for colorbar ticks? (default: True)

+
+
Kword vmin,vmax:
+

min and max values for colour scale and colour bar. If no values are given, +min and max values for whole plot (non-zero rho regions only) are used.

+
+
Kword symmetric:
+

Set the absolute value of vmin and vmax to the greater of the two

+
+
Kword lin:
+

Flag for using linear colour scaling instead of log

+
+
Kword symlog:
+

Use logarithmic scaling, but linear when abs(value) is below the value given to symlog. +Allows symmetric quasi-logarithmic plots of e.g. transverse field components. +A given of 0 translates to a threshold of max(abs(vmin),abs(vmax)) * 1.e-2, but this can +result in the innermost tick marks overlapping. In this case, using a larger value for +symlog is suggested.

+
+
Kword wmark:
+

If set to non-zero, will plot a Vlasiator watermark in the top left corner. If set to a text +string, tries to use that as the location, e.g. “NW”,”NE”,”SW”,”SW”

+
+
Kword wmarkb:
+

As for wmark, but uses an all-black Vlasiator logo.

+
+
Kword Earth:
+

If set, draws an earth at (0,0)

+
+
Kword highres:
+

Creates the image in high resolution, scaled up by this value (suitable for print).

+
+
Kword draw:
+

Set to nonzero in order to draw image on-screen instead of saving to file (requires x-windowing)

+
+
Kword noborder:
+

Plot figure edge-to-edge without borders (default off)

+
+
Kword noxlabels:
+

Suppress x-axis labels and title

+
+
Kword noylabels:
+

Suppress y-axis labels and title

+
+
Kword scale:
+

Scale text size (default=1.0)

+
+
Kword thick:
+

line and axis thickness, default=1.0

+
+
Kword nocb:
+

Set to suppress drawing of colourbar

+
+
Kword internalcb:
+

Set to draw colorbar inside plot instead of outside. If set to a text +string, tries to use that as the location, e.g. “NW”,”NE”,”SW”,”SW”

+
+
Kword external:
+

Optional function to use for external plotting of e.g. contours. The function +receives the following arguments: ax, XmeshXY,YmeshXY, pass_maps +If the function accepts a fifth variable, if set to true, it is expected to +return a list of required variables for constructing the pass_maps dictionary.

+
+
Kword expression:
+

Optional function which calculates a custom expression to plot. The function +receives the same dictionary of numpy arrays as external, as an argument pass_maps, +the contents of which are maps of variables. Each is either of size [ysize,xsize] +or for multi-dimensional variables (vectors, tensors) it’s [ysize,xsize,dim]. +If the function accepts a second variable, if set to true, it is expected to +return a list of required variables for pass_maps.

+
+
+

Important note: the dictionaries of arrays passed to external and expression are of shape [ysize,xzize], so +for some analysis transposing them is necessary. For pre-existing functions to use and to base new functions +on, see the plot_helpers.py file.

+
+
Kword vscale:
+

Scale all values with this before plotting. Useful for going from e.g. m^-3 to cm^-3 +or from tesla to nanotesla. Guesses correct units for colourbar for some known +variables. Set to None to seek for a default scaling.

+
+
Kword absolute:
+

Plot the absolute of the evaluated variable

+
+
Kword pass_vars:
+

Optional list of map names to pass to the external/expression functions +as a dictionary of numpy arrays. Each is either of size [ysize,xsize] or +for multi-dimensional variables (vectors, tensors) it’s [ysize,xsize,dim].

+
+
Kword pass_times:
+

Integer, how many timesteps in each direction should be passed to external/expression +functions in pass_vars (e.g. pass_times=1 passes the values of three timesteps). If +pass_times has two values, the first is the extent before, the second after. +(e.g. pass_times=[2,1] passes the values of two preceding and one following timesteps +for a total of four timesteps) +This causes pass_vars to become a list of timesteps, with each timestep containing +a dictionary of numpy arrays as for regular pass_vars. An additional dictionary entry is +added as ‘dstep’ which gives the timestep offset from the master frame. +Does not work if working from a vlsv-object.

+
+
Kword pass_full:
+

Set to anything but None in order to pass the full arrays instead of a zoomed-in section

+
+
Kword diff:
+

Instead of a regular plot, plot the difference between the selected plot type for +the regular source file and the file given by this keyword. This overides external +and expression keywords, as well as related pass_vars, pass_times, and pass_full.

+
+
Kword z_extent:
+

Search bracket for the neutral sheet in axisunit units

+
+
Kword folding_alpha:
+

If non-zero, plots transparent dots over the regions where the sheet has multiple separate z-values. A value of 1.0 is opaque, a value of 0.0 is transparent.

+
+
Kword sheetlayer:
+

If set to ‘above’, plots the topmost layer of the neutral sheet in case of folding. If set to anything else, +the downmost layer is plotted.

+
+
Kword nomask:
+

Do not mask plotting based on proton density

+
+
Kword vectors:
+

Set to a vector variable to overplot (unit length vectors, color displays variable magnitude)

+
+
Kword vectordensity:
+

Aim for how many vectors to show in plot window (default 100)

+
+
Kword vectorcolormap:
+

Colormap to use for overplotted vectors (default: gray)

+
+
Kword vectorsize:
+

Scaling of vector sizes

+
+
Kword streamlines:
+

Set to a vector variable to overplot as streamlines

+
+
Kword streamlinedensity:
+

Set streamline density (default 1)

+
+
Kword streamlinecolor:
+

Set streamline color (default white)

+
+
Kword streamlinethick:
+

Set streamline thickness

+
+
Kword axes:
+

Provide the routine a set of axes to draw within instead of generating a new image. +It is recommended to either also provide cbaxes or activate nocb, unless one wants a colorbar +to be automatically added next to the panel (but this may affect the overall layout) +Note that the aspect ratio of the colormap is made equal in any case, hence the axes +proportions may change if the box and axes size are not designed to match by the user

+
+
Kword cbaxes:
+

Provide the routine a set of axes for the colourbar.

+
+
Kword normal:
+

Direction of the normal of the 2D cut through (‘x’, ‘y’, or ‘z’ or a vector)

+
+
Kword cutpoint:
+

Coordinate (in normal direction) through which the cut must pass [m]

+
+
Kword cutpointre:
+

Coordinate (in normal direction) through which the cut must pass [rE]

+
+
Kword useimshow:
+

Use imshow for raster background instead (default: False)

+
+
Kword imshowinterp:
+

Use this matplotlib interpolation for imshow (default: ‘none’)

+
+
Returns:
+

Outputs an image to a file or to the screen.

+
+
+
# Example usage:
+plot_colormap(filename=fileLocation, var="MA", run="BCQ",
+            colormap='nipy_spectral',step=j, outputdir=outputLocation,
+            lin=1, wmark=1, vmin=2.7, vmax=10, 
+            external=cavitoncontours, pass_vars=['rho','B','beta'])
+# Where cavitoncontours is an external function which receives the arguments
+#  ax, XmeshXY,YmeshXY, pass_maps
+# where pass_maps is a dictionary of maps for the requested variables.
+
+# example (simple) use of expressions:
+def exprMA_cust(exprmaps, requestvariables=False):
+    if requestvariables==True:
+    return ['va']
+    custombulkspeed=750000. # m/s
+    va = exprmaps['va'][:,:]
+    MA = custombulkspeed/va
+    return MA
+plot_colormap(filename=fileLocation, vmin=1 vmax=40, expression=exprMA_cust,lin=1)
+
+
+
+ +
+
+pytools.plot.plot_threeslice(filename=None, vlsvobj=None, filedir=None, step=None, run=None, outputdir=None, outputfile=None, nooverwrite=False, var=None, op=None, operator=None, boxm=None, boxre=None, colormap=None, vmin=None, vmax=None, symmetric=False, absolute=None, lin=None, symlog=None, nocb=False, cbtitle=None, title=None, halfaxes=False, usesci=True, axisunit=None, axiscolor=None, shadings=None, draw=None, tickinterval=None, fixedticks=False, pass_full=None, wmark=False, wmarkb=False, nomask=None, Earth=True, thick=1.0, scale=1.0, expression=None, vscale=1.0, viewangle=(-60.0, 30.0), cutpointm=None, cutpointre=None, slices=None)
+

Plots a 3d plot constructed of three 2d cut throughs.

+
+
Kword filename:
+

path to .vlsv file to use for input. Assumes a bulk file.

+
+
Kword vlsvobj:
+

Optionally provide a python vlsvfile object instead

+
+
Kword filedir:
+

Optionally provide directory where files are located and use step for bulk file name

+
+
Kword step:
+

output step index, used for constructing output (and possibly input) filename

+
+
Kword run:
+

run identifier, used for constructing output filename

+
+
Kword outputdir:
+

path to directory where output files are created (default: $HOME/Plots/ or override with PTOUTPUTDIR) +If directory does not exist, it will be created. If the string does not end in a +forward slash, the final part will be used as a prefix for the files.

+
+
Kword outputfile:
+

Singular output file name

+
+
Kword draw:
+

Set to anything but None or False in order to draw image on-screen instead of saving to file (requires x-windowing)

+
+
Kword nooverwrite:
+

Set to only perform actions if the target output file does not yet exist

+
+
Kword var:
+

variable to plot, e.g. rho, RhoBackstream, beta, Temperature, MA, Mms, va, vms, +E, B, v, V or others. Accepts any variable known by analysator/pytools. +Per-population variables are simply given as “proton/rho” etc

+
+
Kword operator:
+

Operator to apply to variable: None, x, y, or z. Vector variables return either +the queried component, or otherwise the magnitude.

+
+
Kword op:
+

duplicate of operator

+
+
Kword boxm:
+

zoom box extents [x0,x1,y0,y1,z0,z1] in metres (default and truncate to: whole simulation box)

+
+
Kword boxre:
+

zoom box extents [x0,x1,y0,y1,z0,z1] in Earth radii (default and truncate to: whole simulation box)

+
+
Kword colormap:
+

colour scale for plot, use e.g. hot_desaturated, jet, viridis, plasma, inferno, +magma, parula, nipy_spectral, RdBu, bwr

+
+
Kword vmin,vmax:
+

min and max values for colour scale and colour bar. If no values are given, +min and max values for whole plot (non-zero rho regions only) are used.

+
+
Kword symmetric:
+

Set the absolute value of vmin and vmax to the greater of the two

+
+
Kword absolute:
+

Plot the absolute of the evaluated variable

+
+
Kword lin:
+

Flag for using linear colour scaling instead of log

+
+
Kword symlog:
+

Use logarithmic scaling, but linear when abs(value) is below the value given to symlog. +Allows symmetric quasi-logarithmic plots of e.g. transverse field components. +A given of 0 translates to a threshold of max(abs(vmin),abs(vmax)) * 1.e-2, but this can +result in the innermost tick marks overlapping. In this case, using a larger value for +symlog is suggested.

+
+
Kword nocb:
+

Set to suppress drawing of colourbar

+
+
Kword title:
+

string to use as plot title instead of time. +Special case: Set to “msec” to plot time with millisecond accuracy or “musec” +for microsecond accuracy. “sec” is integer second accuracy.

+
+
Kword cbtitle:
+

string to use as colorbar title instead of map name

+
+
Kword halfaxes:
+

Flag to prevent plotting the hidden half of the axes, otherwise shown as dashed lines +(default: False)

+
+
Kwird usesci:
+

Use scientific notation for colorbar ticks? (default: True)

+
+
Kword axisunit:
+

Plot axes using 10^{axisunit} m (default: Earth radius R_E)

+
+
Kword axiscolor:
+

Color for drawing axes (default black)

+
+
Kword shadings:
+

Dimming values for the surfaces normal to the X, Y, Z directions, respectively, +to better distinguish the slices, e.g. “(0.6,0.8,1.0). Default using the angles between +the surface normal directions and the viewing angle.

+
+
Kword tickinterval:Axis tick interval, expressed in 10^{axisunit} (default:
+

10 Earth radii)

+
+
Kword fixedticks:
+

Set ticks at fixed locations instead of relative to the triple cut point (default: False)

+
+
Kword pass_full:
+

Set to anything but None in order to pass the full arrays instead of a zoomed-in section

+
+
Kword wmark:
+

If set to non-zero, will plot a Vlasiator watermark in the top left corner. If set to a text +string, tries to use that as the location, e.g. “NW”,”NE”,”SW”,”SW”

+
+
Kword wmarkb:
+

As for wmark, but uses an all-black Vlasiator logo.

+
+
Kword nomask:
+

Do not mask plotting based on proton density

+
+
Kword Earth:
+

Draw Earth at origin (default True)

+
+
Kword scale:
+

Scale text size (default=1.0)

+
+
Kword thick:
+

line and axis thickness, default=1.0

+
+
Kword expression:
+

Optional function which calculates a custom expression to plot. The function +receives the same dictionary of numpy arrays as external, as an argument pass_maps, +the contents of which are maps of variables. Each is either of size [ysize,xsize] +or for multi-dimensional variables (vectors, tensors) it’s [ysize,xsize,dim]. +If the function accepts a second variable, if set to true, it is expected to +return a list of required variables for pass_maps.

+
+
+

Important note: the dictionaries of arrays passed to external and expression are of shape [ysize,xzize], so +for some analysis transposing them is necessary. For pre-existing functions to use and to base new functions +on, see the plot_helpers.py file.

+
+
Kword vscale:
+

Scale all values with this before plotting. Useful for going from e.g. m^-3 to cm^-3 +or from tesla to nanotesla. Guesses correct units for colourbar for some known +variables. Set to None to search for a default scaling.

+
+
Kword viewangle:
+

Azimuth and elevation angles giving the point of view on the 3D axes, in degrees. +(default=(-60.,30.); corresponds to dayside, morningside, northern hemisphere)

+
+
Kword cutpointm:
+

Coordinates of the point through which all three 2D cuts must pass [m]

+
+
Kword cutpointre:
+

Coordinates of the point through which all three 2D cuts must pass [rE]

+
+
Kword slices:
+

Normal directions of the slices to plot, default=’xyz’

+
+
+

+
+
+
+ +
+
+pytools.plot.plot_variables(x, y, figure=[])
+

Plots x and y variables from the input with pylab

+
+
Parameters:
+
    +
  • x – Some variable to be plotted in the x-axis

  • +
  • y – Some variable to be plotted in the y-axis

  • +
  • figure – If one wants to plot into an existing figure then the matplotlib figure should be passed as an argument (OPTIONAL)

  • +
+
+
Returns:
+

a pylab figure with the plot

+
+
+
# Example usage:
+plot_variables( distances, rho )
+# This would plot rho as a function of distance
+
+
+
+ +
+
+pytools.plot.plot_vdf(filename=None, vlsvobj=None, filedir=None, step=None, cellids=None, pop='proton', coordinates=None, coordre=None, outputdir=None, outputfile=None, nooverwrite=None, draw=None, axisunit=None, axiskmps=None, title=None, cbtitle=None, tickinterval=None, colormap=None, box=None, nocb=None, internalcb=None, run=None, thick=1.0, wmark=None, wmarkb=None, fmin=None, fmax=None, slicethick=None, reducer='integrate', resampler=True, cellsize=None, xy=None, xz=None, yz=None, normal=None, normalx=None, bpara=None, bpara1=None, bperp=None, coordswap=None, bvector=None, bvectorscale=0.2, cbulk=None, cpeak=None, center=None, wflux=None, setThreshold=None, noborder=None, scale=1.0, scale_text=8.0, scale_title=10.0, scale_cb=5.0, scale_label=12.0, biglabel=None, biglabloc=None, noxlabels=None, noylabels=None, axes=None, cbaxes=None, contours=None)
+

Plots a coloured 2D plot of a VDF (a slice of given thickness or fully projected) with axes and a colour bar.

+
+
Kword filename:
+

path to .vlsv file to use for input. Assumes a bulk file.

+
+
Kword vlsvobj:
+

Optionally provide a python vlsvfile object instead

+
+
Kword filedir:
+

Optionally provide directory where files are located and use step for bulk file name

+
+
Kword step:
+

output step index, used for constructing output (and possibly input) filename

+
+
Kword outputdir:
+

path to directory where output files are created (default: $HOME/Plots/ or override with PTOUTPUTDIR) +If directory does not exist, it will be created. If the string does not end in a +forward slash, the final parti will be used as a perfix for the files.

+
+
Kword nooverwrite:
+

Set to only perform actions if the target output file does not yet exist

+
+
Kword cellids:
+

LIST of cell IDs to plot VDF for

+
+
Kword coordinates:
+

LIST of 3-element spatial coordinate lusts to plot VDF for (given in metres)

+
+
Kword coordre:
+

LIST of 3-element spatial coordinate lists to plot VDF for (given in Earth radii)

+
+
Kword pop:
+

Population to plot, default proton

+
+
Kword colormap:
+

colour scale for plot, use e.g. hot_desaturated, jet, viridis, plasma, inferno, +magma, parula, nipy_spectral, RdBu, bwr

+
+
Kword run:
+

run identifier, used for constructing output filename

+
+
Kword title:
+

string to use as plot title instead of time. +Special case: Set to “msec” to plot time with millisecond accuracy or “musec” +for microsecond accuracy. “sec” is integer second accuracy.

+
+
Kword cbtitle:
+

string to use as colorbar title instead of phase space density of flux

+
+
Kword contours:
+

Set to number of contours to draw

+
+
Kword fmin,fmax:
+

min and max values for colour scale and colour bar. If no values are given, +min and max values for whole plot are used.

+
+
Kword box:
+

extents of plotted velocity grid as [x0,x1,y0,y1] (in m/s)

+
+
Kword axisunit:
+

Plot v-axes using 10^{axisunit} m/s (default: km/s)

+
+
Kword axiskmps:
+

Plot v-axes using 10^{axiskmps} km/s (default: km/s, when the kword has a value)

+
+
Kword tickinterval:
+

Interval at which to have ticks on axes

+
+
Kword xy:
+

Perform slice in x-y-direction

+
+
Kword xz:
+

Perform slice in x-z-direction

+
+
Kword yz:
+

Perform slice in y-z-direction

+
+
Kword normal:
+

Perform slice in plane perpendicular to given vector

+
+
Kword normalx:
+

X-axis direction for slice in plane perpendicular to given vector

+
+
Kword bpara:
+

Perform slice in B_para / B_perp2 plane

+
+
Kword bpara1:
+

Perform slice in B_para / B_perp1 plane

+
+
Kword bperp:
+

Perform slice in B_perp1 / B_perp2 plane +If no plane is given, default is simulation plane (for 2D simulations)

+
+
Kword coordswap:
+

Swap the parallel and perpendicular coordinates

+
+
Kword bvector:
+

Plot a magnetic field vector projection in-plane

+
+
Kword bvectorscale:
+

Scale of bvector (default: 0.2 in units of axis lengths)

+
+
Kword cbulk:
+

Center plot on position of total bulk velocity (or if not available, +bulk velocity for this population)

+
+
Kword cpeak:
+

Center plot on velocity associated with highest (peak) phase-space density for +this population)

+
+
Kword center:
+

Center plot on provided 3-element velocity vector position (in m/s) +If set instead to “bulk” will center on bulk velocity +If set instead to “peak” will center on velocity with highest phase-space density

+
+
Kword wflux:
+

Plot flux instead of distribution function

+
+
Kword slicethick:
+

Thickness of slice as multiplier of cell size (default: 1 or minimum for good coverage). +This can be set to zero in order to project the whole VDF to a plane.

+
+
Kword reducer:
+

How to reduce to 2D - default ‘integrate’ for LOS integration +and reduced units, ‘average’ for old (slightly questionable) behaviour

+
+
Kword resampler:
+

Resample onto a regular grid? Default: yes, use False to disable.

+
+
Kword cellsize:
+

Plotting grid cell size as multiplier of input cell size (default: 1 or minimum for good coverage)

+
+
Kword setThreshold:
+

Use given setThreshold value instead of EffectiveSparsityThreshold or MinValue value read from file +Useful if EffectiveSparsityThreshold wasn’t saved, or user wants to draw buffer cells +with values below the sparsity threshold

+
+
Kword wmark:
+

If set to non-zero, will plot a Vlasiator watermark in the top left corner. If set to a text +string, tries to use that as the location, e.g. “NW”,”NE”,”SW”,”SW”

+
+
Kword wmarkb:
+

As for wmark, but uses an all-black Vlasiator logo.

+
+
Kword draw:
+

Draw image on-screen instead of saving to file (requires x-windowing)

+
+
Kword nocb:
+

Suppress plotting of colourbar legend

+
+
Kword internalcb:
+

Set to draw colorbar inside plot instead of outside. If set to a text +string, tries to use that as the location, e.g. “NW”,”NE”,”SW”,”SW”

+
+
Kword biglabel:
+

Plot large label (in top-left corner)

+
+
Kword biglabloc:
+

Move large label to: 0: NW 1: NE 2: SE 3: SW corner

+
+
Kword axes:
+

Provide the routine a set of axes to draw within instead of generating a new image.

+
+
Kword cbaxes:
+

Provide the routine a set of axes for the colourbar.

+
+
Kword noborder:
+

Plot figure edge-to-edge without borders (default off)

+
+
Kword noxlabels:
+

Suppress x-axis labels and title

+
+
Kword noylabels:
+

Suppress y-axis labels and title

+
+
Kword scale:
+

Scale text size everywhere (default=1.0)

+
+
Kword scale_text:
+

Most text additional scale factor (default=8.0)

+
+
Kword scale_title:
+

Title additional scale factor (default=10.0)

+
+
Kword scale_cb:
+

Colour bar text additional scale factor (default=5.0)

+
+
Kword scale_label:
+

Big label text additional scale factor (default=12.0)

+
+
Kword thick:
+

line and axis thickness, default=1.0

+
+
Returns:
+

Outputs an image to a file or to the screen.

+
+
+

+
+
+

# Example usage:

+
+
pt.plot.plot_vdf(filename=”/proj/vlasov/2D/ABC/distributions/distributions.0000100.vlsv”,

coordre=[[11.7,-1.6,0.]], cbulk=1, bpara=1,box=[-2e6,2e6,-2e6,2e6],draw=1)

+
+
pt.plot.plot_vdf(filename=”/proj/vlasov/2D/ABC/distributions/distributions.0000100.vlsv”,

cellids=1670561, xy=1, box=[-2e6,2e6,-2e6,2e6], slicethick=5)

+
+
pt.plot.plot_vdf(filename=”/proj/vlasov/2D/ABC/distributions/distributions.0000100.vlsv”,

cellids=[1670561,], xz=1, box=[-2e6,2e6,-2e6,2e6], slicethick=0)

+
+
+

Note tilted slices: By default, the program samples the V-space with a slice where each cell is cube the +dimensions of which are found by performing a rotation on a sample square and finding the maximum xyz-extent. This ensures +adequate coverage and decreases sampling effects. This behaviour can be overridden with the slicethick and cellsize keywords.

+

Setting a value of slicethick=0 will result in the whole VDF being flattened into a single plane. This may result in +some slight sampling artefacts, but is a good measure of complex populations.

+
+ +
+
+pytools.plot.plot_vdf_profiles(filename=None, vlsvobj=None, filedir=None, step=None, cellids=None, pop='proton', coordinates=None, coordre=None, outputdir=None, outputfile=None, nooverwrite=None, draw=None, axisunit=None, title=None, tickinterval=None, lin=None, run=None, thick=1.0, wmark=None, wmarkb=None, fmin=None, fmax=None, vmin=None, vmax=None, xy=None, xz=None, yz=None, normal=None, bpara=None, bpara1=None, bperp=None, cbulk=None, cpeak=None, center=None, setThreshold=None, axes=None)
+

Plots vdf values along axis-aligned lines (see axis definitions).

+
+
Kword filename:
+

path to .vlsv file to use for input. Assumes a bulk file.

+
+
Kword vlsvobj:
+

Optionally provide a python vlsvfile object instead

+
+
Kword filedir:
+

Optionally provide directory where files are located and use step for bulk file name

+
+
Kword step:
+

output step index, used for constructing output (and possibly input) filename

+
+
Kword outputdir:
+

path to directory where output files are created (default: $HOME/Plots/ or override with PTOUTPUTDIR) +If directory does not exist, it will be created. If the string does not end in a +forward slash, the final parti will be used as a perfix for the files.

+
+
Kword nooverwrite:
+

Set to only perform actions if the target output file does not yet exist

+
+
Kword cellids:
+

LIST of cell IDs to plot VDF for

+
+
Kword coordinates:
+

LIST of 3-element spatial coordinate lusts to plot VDF for (given in metres)

+
+
Kword coordre:
+

LIST of 3-element spatial coordinate lists to plot VDF for (given in Earth radii)

+
+
Kword pop:
+

Population to plot, default proton

+
+
Kword run:
+

run identifier, used for constructing output filename

+
+
Kword title:
+

string to use as plot title instead of time. +Special case: Set to “msec” to plot time with millisecond accuracy or “musec” +for microsecond accuracy. “sec” is integer second accuracy.

+
+
Kword fmin,fmax:
+

min and max values for colour scale and colour bar. If no values are given, +min and max values for whole plot are used.

+
+
Kword vmin,vmax:
+

min and max values for x-axis

+
+
Kword axisunit:
+

Plot v-axes using 10^{axisunit} m/s (default: km/s)

+
+
Kword tickinterval:
+

Interval at which to have ticks on axes

+
+
Kword lin:
+

Plot using linear y-axis (default log)

+
+
Kword xy:
+

Perform slice in x-y-direction

+
+
Kword xz:
+

Perform slice in x-z-direction

+
+
Kword yz:
+

Perform slice in y-z-direction

+
+
Kword normal:
+

Perform slice in plane perpendicular to given vector

+
+
Kword bpara:
+

Perform slice in B_para / B_perp2 plane

+
+
Kword bpara1:
+

Perform slice in B_para / B_perp1 plane

+
+
Kword bperp:
+

Perform slice in B_perp1 / B_perp2 plane +If no plane is given, default is simulation plane (for 2D simulations)

+
+
Kword cbulk:
+

Center plot on position of total bulk velocity (or if not available, +bulk velocity for this population)

+
+
Kword cpeak:
+

Center plot on velocity with highest phase-space density

+
+
Kword center:
+

Center plot on provided 3-element velocity vector position (in m/s) +If set instead to “bulk” will center on bulk velocity +If set instead to “peak” will center on velocity with highest phase-space density

+
+
Kword setThreshold:
+

Use given setThreshold value instead of EffectiveSparsityThreshold or MinValue value read from file +Useful if EffectiveSparsityThreshold wasn’t saved, or user wants to draw buffer cells +with values below the sparsity threshold

+
+
Kword wmark:
+

If set to non-zero, will plot a Vlasiator watermark in the top left corner. If set to a text +string, tries to use that as the location, e.g. “NW”,”NE”,”SW”,”SW”

+
+
Kword wmarkb:
+

As for wmark, but uses an all-black Vlasiator logo.

+
+
Kword draw:
+

Draw image on-screen instead of saving to file (requires x-windowing)

+
+
Kword axes:
+

Provide the routine a set of axes to draw within instead of generating a new image.

+
+
Kword scale:
+

Scale text size (default=1.0)

+
+
Kword thick:
+

line and axis thickness, default=1.0

+
+
Returns:
+

Outputs an image to a file or to the screen.

+
+
+

+
+
+

# Example usage:

+
+
pt.plot.plot_vdf(filename=”/proj/vlasov/2D/ABC/distributions/distributions.0000100.vlsv”,

coordre=[[11.7,-1.6,0.]], cbulk=1, bpara=1,box=[-2e6,2e6,-2e6,2e6],draw=1)

+
+
pt.plot.plot_vdf(filename=”/proj/vlasov/2D/ABC/distributions/distributions.0000100.vlsv”,

cellids=1670561, xy=1, box=[-2e6,2e6,-2e6,2e6], slicethick=5)

+
+
pt.plot.plot_vdf(filename=”/proj/vlasov/2D/ABC/distributions/distributions.0000100.vlsv”,

cellids=[1670561,], xz=1, box=[-2e6,2e6,-2e6,2e6], slicethick=0)

+
+
+

Note tilted slices: By default, the program samples the V-space with a slice where each cell is cube the +dimensions of which are found by performing a rotation on a sample square and finding the maximum xyz-extent. This ensures +adequate coverage and decreases sampling effects. This behaviour can be overridden with the slicethick and cellsize keywords.

+

Setting a value of slicethick=0 will result in the whole VDF being flattened into a single plane. This may result in +some slight sampling artefacts, but is a good measure of complex populations.

+
+ +
+
+pytools.plot.plot_vdfdiff(filename1=None, filename2=None, vlsvobj1=None, vlsvobj2=None, filedir=None, step=None, cellids=None, cellids2=None, pop='proton', coordinates=None, coordre=None, outputdir=None, outputfile=None, nooverwrite=None, draw=None, axisunit=None, axiskmps=None, title=None, cbtitle=None, tickinterval=None, colormap=None, box=None, nocb=None, internalcb=None, run=None, thick=1.0, wmark=None, wmarkb=None, fmin=None, fmax=None, slicethick=None, reducer='integrate', resampler=False, cellsize=None, xy=None, xz=None, yz=None, normal=None, normalx=None, bpara=None, bpara1=None, bperp=None, coordswap=None, bvector=None, bvectorscale=0.2, cbulk=None, center=None, wflux=None, setThreshold=None, noborder=None, scale=1.0, scale_text=8.0, scale_title=10.0, scale_cb=5.0, scale_label=12.0, biglabel=None, biglabloc=None, noxlabels=None, noylabels=None, axes=None, cbaxes=None, contours=None)
+

Plots the difference between VDFs as a coloured 2D plot with axes and a colour bar.

+
+
Kword filename1:
+

path to .vlsv file to use for input. Assumes a bulk file.

+
+
Kword filename2:
+

path to .vlsv file to use for input. Assumes a bulk file.

+
+
Kword vlsvobj1:
+

Optionally provide a python vlsvfile object instead

+
+
Kword vlsvobj2:
+

Optionally provide a python vlsvfile object instead

+
+
Kword filedir:
+

Optionally provide directory where files are located and use step for bulk file name

+
+
Kword step:
+

output step index, used for constructing output (and possibly input) filename

+
+
Kword outputdir:
+

path to directory where output files are created (default: $HOME/Plots/ or override with PTOUTPUTDIR) +If directory does not exist, it will be created. If the string does not end in a +forward slash, the final parti will be used as a perfix for the files.

+
+
Kword nooverwrite:
+

Set to only perform actions if the target output file does not yet exist

+
+
Kword cellids:
+

LIST of cell IDs to plot VDF for

+
+
Kword cellids2:
+

Optional: LIST of cell IDs from input file 2. Same as cellids if omitted.

+
+
Kword coordinates:
+

LIST of 3-element spatial coordinate lusts to plot VDF for (given in metres)

+
+
Kword coordre:
+

LIST of 3-element spatial coordinate lists to plot VDF for (given in Earth radii)

+
+
Kword pop:
+

Population to plot, default proton

+
+
Kword colormap:
+

colour scale for plot, use e.g. hot_desaturated, jet, viridis, plasma, inferno, +magma, parula, nipy_spectral, RdBu, bwr

+
+
Kword run:
+

run identifier, used for constructing output filename

+
+
Kword title:
+

string to use as plot title instead of time. +Special case: Set to “msec” to plot time with millisecond accuracy or “musec” +for microsecond accuracy. “sec” is integer second accuracy.

+
+
Kword cbtitle:
+

string to use as colorbar title instead of phase space density of flux

+
+
Kword contours:
+

Set to number of contours to draw

+
+
Kword fmin,fmax:
+

min and max values for colour scale and colour bar. If no values are given, +min and max values for whole plot are used.

+
+
Kword box:
+

extents of plotted velocity grid as [x0,x1,y0,y1] (in m/s)

+
+
Kword axisunit:
+

Plot v-axes using 10^{axisunit} m/s (default: km/s)

+
+
Kword axiskmps:
+

Plot v-axes using 10^{axiskmps} km/s (default: km/s, when the kword has a value)

+
+
Kword tickinterval:
+

Interval at which to have ticks on axes

+
+
Kword xy:
+

Perform slice in x-y-direction

+
+
Kword xz:
+

Perform slice in x-z-direction

+
+
Kword yz:
+

Perform slice in y-z-direction

+
+
Kword normal:
+

Perform slice in plane perpendicular to given vector

+
+
Kword normalx:
+

X-axis direction for slice in plane perpendicular to given vector

+
+
Kword bpara:
+

Perform slice in B_para / B_perp2 plane

+
+
Kword bpara1:
+

Perform slice in B_para / B_perp1 plane

+
+
Kword bperp:
+

Perform slice in B_perp1 / B_perp2 plane +If no plane is given, default is simulation plane (for 2D simulations)

+
+
Kword coordswap:
+

Swap the parallel and perpendicular coordinates

+
+
Kword bvector:
+

Plot a magnetic field vector projection in-plane

+
+
Kword bvectorscale:
+

Scale of bvector (default: 0.2 in units of axis lengths)

+
+
Kword cbulk:
+

Center plot on position of total bulk velocity (or if not available, +bulk velocity for this population)

+
+
Kword center:
+

Center plot on provided 3-element velocity vector position (in m/s) +If set instead to “bulk” will center on bulk velocity +If set instead to “peak” will center on velocity with highest phase-space density

+
+
Kword wflux:
+

Plot flux instead of distribution function

+
+
Kword slicethick:
+

Thickness of slice as multiplier of cell size (default: 1 or minimum for good coverage). +This can be set to zero in order to project the whole VDF to a plane.

+
+
Kword reducer:
+

How to reduce to 2D - default ‘integrate’ for LOS integration +and reduced units, ‘average’ for old (slightly questionable) behaviour

+
+
Kword resampler:
+

Resample onto a regular grid? Default: yes, use False to disable.

+
+
Kword cellsize:
+

Plotting grid cell size as multiplier of input cell size (default: 1 or minimum for good coverage)

+
+
Kword setThreshold:
+

Use given setThreshold value instead of EffectiveSparsityThreshold or MinValue value read from file +Useful if EffectiveSparsityThreshold wasn’t saved, or user wants to draw buffer cells +with values below the sparsity threshold

+
+
Kword wmark:
+

If set to non-zero, will plot a Vlasiator watermark in the top left corner. If set to a text +string, tries to use that as the location, e.g. “NW”,”NE”,”SW”,”SW”

+
+
Kword wmarkb:
+

As for wmark, but uses an all-black Vlasiator logo.

+
+
Kword draw:
+

Draw image on-screen instead of saving to file (requires x-windowing)

+
+
Kword nocb:
+

Suppress plotting of colourbar legend

+
+
Kword internalcb:
+

Set to draw colorbar inside plot instead of outside. If set to a text +string, tries to use that as the location, e.g. “NW”,”NE”,”SW”,”SW”

+
+
Kword biglabel:
+

Plot large label (in top-left corner)

+
+
Kword biglabloc:
+

Move large label to: 0: NW 1: NE 2: SE 3: SW corner

+
+
Kword axes:
+

Provide the routine a set of axes to draw within instead of generating a new image.

+
+
Kword cbaxes:
+

Provide the routine a set of axes for the colourbar.

+
+
Kword noborder:
+

Plot figure edge-to-edge without borders (default off)

+
+
Kword noxlabels:
+

Suppress x-axis labels and title

+
+
Kword noylabels:
+

Suppress y-axis labels and title

+
+
Kword scale:
+

Scale text size everywhere (default=1.0)

+
+
Kword scale_text:
+

Most text additional scale factor (default=8.0)

+
+
Kword scale_title:
+

Title additional scale factor (default=10.0)

+
+
Kword scale_cb:
+

Colour bar text additional scale factor (default=5.0)

+
+
Kword scale_label:
+

Big label text additional scale factor (default=12.0)

+
+
Kword thick:
+

line and axis thickness, default=1.0

+
+
Returns:
+

Outputs an image to a file or to the screen.

+
+
+

+
+
+

# Example usage:

+
+
pt.plot.plot_vdfdiff(“bulk.0000040.vlsv”,”bulk.0000048.vlsv”,cellids=1,xy=1,slicethick=1,colormap=”seismic”,

fmin=-1e-9,fmax=1e-9,cbulk=1)

+
+
+

See documentation of plot_vdf() for more usage information.

+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/py-modindex/index.html b/py-modindex/index.html new file mode 100644 index 00000000..a16bb171 --- /dev/null +++ b/py-modindex/index.html @@ -0,0 +1,201 @@ + + + + + + + + Python Module Index — analysator documentation + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ + +

Python Module Index

+ +
+ b | + g | + m | + p | + s | + t +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
 
+ b
+ biot_savart +
 
+ g
+ gics +
 
+ m
+ magnetopause2d +
+ magnetopause3d +
 
+ p
+ pytools +
    + pytools.calculations +
    + pytools.miscellaneous +
    + pytools.plot +
    + pytools.vlsvfile +
 
+ s
+ shue +
 
+ t
+ tsyganenko +
+ + +
+
+
+ +
+ +
+

© Copyright 2024, University of Helsinki.

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/scripts/index.html b/scripts/index.html new file mode 100644 index 00000000..4ef5f70a --- /dev/null +++ b/scripts/index.html @@ -0,0 +1,280 @@ + + + + + + + + + scripts — analysator documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

scripts

+

Scripts are not included in the main Analysator module import; instead, these are separate scripts utilising Analysator to some purpose.

+
+

biot_savart

+

biot_savart

+
+

Follow Welling et al. (2020) calculate the magnetic field at Earth’s surface.

+
+

Integrate Biot-Savart over:

+
+
    +
  1. All currents within the Vlasov domain

  2. +
  3. Birkeland currents (FACs) in the “gap region” between the MHD inner boundary and the ionosphere, mapped (assuming J propto B) along the field lines connecting ionosphere radius R_IONO to coupling radius r_C

  4. +
  5. Horizontal Ionospheric currents (altitude 100 km)

  6. +
+
+

The integration is a discrete summation over the 3 domains.

+

Integrating the domain #2 will likely require this mesh to be ‘refined’ in order to resolve the FAC structures +see the functions refine_mesh() and graded_mesh()

+

This script has been tested with the Vlasiator runs EGL, FHA, FIA +note that the usefulness for EGL is limited because there is no ionosphere (domain #3) for that run

+

To run this script, require access to the data reducer/variable ‘vg_J’ in the .vlsv file +This may be supplied by a .vlsv file’s vlsvReader object, see keyword f_J_sidecar

+

This script is written for the UH environment. Adapt file paths as needed.

+

###

+

EXAMPLE CALL (1 thread): +python biot_savart.py -nproc 1 -task 1 -run FHA

+
+
Example sidecar .vlsv files, containing ground magnetic field data, can be found at:

/wrk-vakka/group/spacephysics/vlasiator/3D/{run name}/sidecars/ig_B/

+
+
+
+
+
+

gics

+

gics

+

Given a batch of .vlsv files, containing ground magnetic field vector data at different times, +calculate the north & east components of induced ground electric field [V/m], and save in corresponding .vlsv files

+

This script has been tested with the Vlasiator runs EGL, FHA, FIA +note that the usefulness for EGL is limited because there is no ionosphere (domain #3) for that run

+

Note that the Geomagnetically Induced Currents (GICs) can be computed immediately from the geoelectric field: +The surface current density is J = sigma*E, where E, sigma are respectively the ground electric field and conductivity.

+

This script is written for the UH environment. Adapt file paths as needed.

+

###

+
+
EXAMPLE CALL:

python gics.py

+
+
Example sidecar .vlsv files, containing ground magnetic field data (over the ionosphere mesh), can be found at:

/wrk-vakka/group/spacephysics/vlasiator/3D/FHA/bulk1_sidecars/geoelectric_field/

+
+
+
+
+
+

magnetopause2d

+

magnetopause2d

+

Finds the magnetopause position by tracing steamines of the plasma flow for two-dimensional Vlasiator runs. Needs the yt package.

+
+
+
+

magnetopause3d

+

magnetopause3d

+

Finds the magnetopause position by tracing steamines of the plasma flow for three-dimensional Vlasiator runs. Needs the yt package.

+
+
+
+

shue

+

shue

+
+

See Shue et al. (1997): “A new functional form to study the solar wind control of the magnetopause size and shape”

+

They describe a model where the radial magnetopause position r is treated as a function of angle wrt x-GSE axis

+
+

r(theta) = r_0 * (2 / (1+ cos(theta)))^alpha

+
+

r_0 is the subsolar standoff distance [in earth radii], alpha is a dimensionless parameter

+
+
The parameters r_0, alpha depend on the solar wind parameters:

B_z: z-component (GSE) of the magnetic field [nT] +n_p: number density [cm^-3] +v_sw: solar wind speed [km/sec]

+
+
+

Different Vlasiator runs had

+
+

Example usage (plot magnetopause for run ‘EGI’):

+
+

import numpy as np +import matplotlib.pyplot as plt

+

theta = np.linspace(0,np.pi / 2, 1000) +r, r0, alpha = f_shue(theta, run=’EGI’) +x = r*np.cos(theta) +y = r*np.sin(theta) +plt.plot(x,y)

+
+
+
+
+

tsyganenko

+

tsyganenko

+
+ +
+
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/search/index.html b/search/index.html new file mode 100644 index 00000000..66077cef --- /dev/null +++ b/search/index.html @@ -0,0 +1,127 @@ + + + + + + + + Search — analysator documentation + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ + + + +
+ +
+ +
+
+
+ +
+ +
+

© Copyright 2024, University of Helsinki.

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/searchindex.js b/searchindex.js new file mode 100644 index 00000000..4523e1e9 --- /dev/null +++ b/searchindex.js @@ -0,0 +1 @@ +Search.setIndex({"alltitles": {"Contents:": [[4, null]], "Credits": [[0, null]], "Scripts:": [[9, null]], "analysator documentation": [[4, null]], "biot_savart": [[1, null], [9, "biot-savart"]], "calculations": [[2, null]], "gics": [[3, null], [9, "gics"]], "magnetopause2d": [[5, null], [9, "magnetopause2d"]], "magnetopause3d": [[6, null], [9, "magnetopause3d"]], "miscellaneous": [[7, null]], "plot": [[8, null]], "scripts": [[9, null]], "shue": [[9, "shue"], [10, null]], "tsyganenko": [[9, "tsyganenko"], [11, null]], "vlsvfile": [[12, null]]}, "docnames": ["about", "biot_savart", "calculations", "gics", "index", "magnetopause2d", "magnetopause3d", "miscellaneous", "plot", "scripts", "shue", "tsyganenko", "vlsvfile"], "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": ["about.rst", "biot_savart.rst", "calculations.rst", "gics.rst", "index.rst", "magnetopause2d.rst", "magnetopause3d.rst", "miscellaneous.rst", "plot.rst", "scripts.rst", "shue.rst", "tsyganenko.rst", "vlsvfile.rst"], "indexentries": {"amrinterpolator (class in pytools.calculations)": [[2, "pytools.calculations.AMRInterpolator", false]], "b_dip() (in module biot_savart)": [[1, "biot_savart.b_dip", false]], "b_dip_direction() (in module biot_savart)": [[1, "biot_savart.b_dip_direction", false]], "b_dip_magnitude() (in module biot_savart)": [[1, "biot_savart.b_dip_magnitude", false]], "b_ionosphere() (in module biot_savart)": [[1, "biot_savart.B_ionosphere", false]], "b_magnetosphere() (in module biot_savart)": [[1, "biot_savart.B_magnetosphere", false]], "biot_savart": [[1, "module-biot_savart", false]], "biot_savart() (in module biot_savart)": [[1, "biot_savart.biot_savart", false]], "build_cell_vertices() (pytools.vlsvfile.vlsvreader method)": [[12, "pytools.vlsvfile.VlsvReader.build_cell_vertices", false]], "cartesian_to_spherical() (in module biot_savart)": [[1, "biot_savart.cartesian_to_spherical", false]], "cartesian_to_spherical() (in module gics)": [[3, "gics.cartesian_to_spherical", false]], "cartesian_to_spherical_vector() (in module gics)": [[3, "gics.cartesian_to_spherical_vector", false]], "cell_time_evolution() (in module pytools.calculations)": [[2, "pytools.calculations.cell_time_evolution", false]], "cellid_has_vdf() (pytools.vlsvfile.vlsvreader method)": [[12, "pytools.vlsvfile.VlsvReader.cellid_has_vdf", false]], "check_parameter() (pytools.vlsvfile.vlsvreader method)": [[12, "pytools.vlsvfile.VlsvReader.check_parameter", false]], "check_population() (pytools.vlsvfile.vlsvreader method)": [[12, "pytools.vlsvfile.VlsvReader.check_population", false]], "check_variable() (pytools.vlsvfile.vlsvreader method)": [[12, "pytools.vlsvfile.VlsvReader.check_variable", false]], "clone_file() (pytools.vlsvfile.vlsvwriter method)": [[12, "pytools.vlsvfile.VlsvWriter.clone_file", false]], "construct_velocity_cell_coordinates() (pytools.vlsvfile.vlsvreader method)": [[12, "pytools.vlsvfile.VlsvReader.construct_velocity_cell_coordinates", false]], "construct_velocity_cell_nodes() (pytools.vlsvfile.vlsvreader method)": [[12, "pytools.vlsvfile.VlsvReader.construct_velocity_cell_nodes", false]], "construct_velocity_cells() (pytools.vlsvfile.vlsvreader method)": [[12, "pytools.vlsvfile.VlsvReader.construct_velocity_cells", false]], "copy_variables() (pytools.vlsvfile.vlsvwriter method)": [[12, "pytools.vlsvfile.VlsvWriter.copy_variables", false]], "copy_variables_list() (pytools.vlsvfile.vlsvwriter method)": [[12, "pytools.vlsvfile.VlsvWriter.copy_variables_list", false]], "cut3d() (in module pytools.calculations)": [[2, "pytools.calculations.cut3d", false]], "cut_through() (in module pytools.calculations)": [[2, "pytools.calculations.cut_through", false]], "cut_through_curve() (in module pytools.calculations)": [[2, "pytools.calculations.cut_through_curve", false]], "cut_through_step() (in module pytools.calculations)": [[2, "pytools.calculations.cut_through_step", false]], "downsample_fsgrid_subarray() (pytools.vlsvfile.vlsvreader method)": [[12, "pytools.vlsvfile.VlsvReader.downsample_fsgrid_subarray", false]], "dynamic_field_tracer() (in module pytools.calculations)": [[2, "pytools.calculations.dynamic_field_tracer", false]], "e_horizontal() (in module gics)": [[3, "gics.E_horizontal", false]], "epsilon_m() (in module pytools.calculations)": [[2, "pytools.calculations.epsilon_M", false]], "f_shue() (in module shue)": [[10, "shue.f_shue", false]], "fac_map() (in module biot_savart)": [[1, "biot_savart.fac_map", false]], "fourier() (in module pytools.calculations)": [[2, "pytools.calculations.fourier", false]], "fsgrid_array_to_vg() (pytools.vlsvfile.vlsvreader method)": [[12, "pytools.vlsvfile.VlsvReader.fsgrid_array_to_vg", false]], "get_all_variables() (pytools.vlsvfile.vlsvreader method)": [[12, "pytools.vlsvfile.VlsvReader.get_all_variables", false]], "get_amr_level() (pytools.vlsvfile.vlsvreader method)": [[12, "pytools.vlsvfile.VlsvReader.get_amr_level", false]], "get_bbox_fsgrid_slicemap() (pytools.vlsvfile.vlsvreader method)": [[12, "pytools.vlsvfile.VlsvReader.get_bbox_fsgrid_slicemap", false]], "get_bbox_fsgrid_subarray() (pytools.vlsvfile.vlsvreader method)": [[12, "pytools.vlsvfile.VlsvReader.get_bbox_fsgrid_subarray", false]], "get_cell_bbox() (pytools.vlsvfile.vlsvreader method)": [[12, "pytools.vlsvfile.VlsvReader.get_cell_bbox", false]], "get_cell_coordinates() (pytools.vlsvfile.vlsvreader method)": [[12, "pytools.vlsvfile.VlsvReader.get_cell_coordinates", false]], "get_cell_corner_vertices() (pytools.vlsvfile.vlsvreader method)": [[12, "pytools.vlsvfile.VlsvReader.get_cell_corner_vertices", false]], "get_cell_dx() (pytools.vlsvfile.vlsvreader method)": [[12, "pytools.vlsvfile.VlsvReader.get_cell_dx", false]], "get_cell_fsgrid() (pytools.vlsvfile.vlsvreader method)": [[12, "pytools.vlsvfile.VlsvReader.get_cell_fsgrid", false]], "get_cell_fsgrid_slicemap() (pytools.vlsvfile.vlsvreader method)": [[12, "pytools.vlsvfile.VlsvReader.get_cell_fsgrid_slicemap", false]], "get_cell_fsgrid_subarray() (pytools.vlsvfile.vlsvreader method)": [[12, "pytools.vlsvfile.VlsvReader.get_cell_fsgrid_subarray", false]], "get_cell_indices() (pytools.vlsvfile.vlsvreader method)": [[12, "pytools.vlsvfile.VlsvReader.get_cell_indices", false]], "get_cell_neighbor() (pytools.vlsvfile.vlsvreader method)": [[12, "pytools.vlsvfile.VlsvReader.get_cell_neighbor", false]], "get_cellid() (pytools.vlsvfile.vlsvreader method)": [[12, "pytools.vlsvfile.VlsvReader.get_cellid", false]], "get_cellid_locations() (pytools.vlsvfile.vlsvreader method)": [[12, "pytools.vlsvfile.VlsvReader.get_cellid_locations", false]], "get_cellid_with_vdf() (pytools.vlsvfile.vlsvreader method)": [[12, "pytools.vlsvfile.VlsvReader.get_cellid_with_vdf", false]], "get_config() (pytools.vlsvfile.vlsvreader method)": [[12, "pytools.vlsvfile.VlsvReader.get_config", false]], "get_config_string() (pytools.vlsvfile.vlsvreader method)": [[12, "pytools.vlsvfile.VlsvReader.get_config_string", false]], "get_dual() (pytools.vlsvfile.vlsvreader method)": [[12, "pytools.vlsvfile.VlsvReader.get_dual", false]], "get_duals() (pytools.vlsvfile.vlsvreader method)": [[12, "pytools.vlsvfile.VlsvReader.get_duals", false]], "get_fsgrid_cell_size() (pytools.vlsvfile.vlsvreader method)": [[12, "pytools.vlsvfile.VlsvReader.get_fsgrid_cell_size", false]], "get_fsgrid_coordinates() (pytools.vlsvfile.vlsvreader method)": [[12, "pytools.vlsvfile.VlsvReader.get_fsgrid_coordinates", false]], "get_fsgrid_indices() (pytools.vlsvfile.vlsvreader method)": [[12, "pytools.vlsvfile.VlsvReader.get_fsgrid_indices", false]], "get_fsgrid_mesh_extent() (pytools.vlsvfile.vlsvreader method)": [[12, "pytools.vlsvfile.VlsvReader.get_fsgrid_mesh_extent", false]], "get_fsgrid_mesh_size() (pytools.vlsvfile.vlsvreader method)": [[12, "pytools.vlsvfile.VlsvReader.get_fsgrid_mesh_size", false]], "get_fsgrid_slice_indices() (pytools.vlsvfile.vlsvreader method)": [[12, "pytools.vlsvfile.VlsvReader.get_fsgrid_slice_indices", false]], "get_ionosphere_element_coords() (pytools.vlsvfile.vlsvreader method)": [[12, "pytools.vlsvfile.VlsvReader.get_ionosphere_element_coords", false]], "get_ionosphere_element_corners() (pytools.vlsvfile.vlsvreader method)": [[12, "pytools.vlsvfile.VlsvReader.get_ionosphere_element_corners", false]], "get_ionosphere_latlon_coords() (pytools.vlsvfile.vlsvreader method)": [[12, "pytools.vlsvfile.VlsvReader.get_ionosphere_latlon_coords", false]], "get_ionosphere_mesh_area() (pytools.vlsvfile.vlsvreader method)": [[12, "pytools.vlsvfile.VlsvReader.get_ionosphere_mesh_area", false]], "get_ionosphere_mesh_size() (pytools.vlsvfile.vlsvreader method)": [[12, "pytools.vlsvfile.VlsvReader.get_ionosphere_mesh_size", false]], "get_ionosphere_node_coords() (pytools.vlsvfile.vlsvreader method)": [[12, "pytools.vlsvfile.VlsvReader.get_ionosphere_node_coords", false]], "get_max_refinement_level() (pytools.vlsvfile.vlsvreader method)": [[12, "pytools.vlsvfile.VlsvReader.get_max_refinement_level", false]], "get_precipitation_centre_energy() (pytools.vlsvfile.vlsvreader method)": [[12, "pytools.vlsvfile.VlsvReader.get_precipitation_centre_energy", false]], "get_scaled_units() (pytools.calculations.variableinfo method)": [[2, "pytools.calculations.VariableInfo.get_scaled_units", false]], "get_scaled_var() (pytools.calculations.variableinfo method)": [[2, "pytools.calculations.VariableInfo.get_scaled_var", false]], "get_sorted_file_names() (in module pytools.miscellaneous)": [[7, "pytools.miscellaneous.get_sorted_file_names", false]], "get_spatial_block_size() (pytools.vlsvfile.vlsvreader method)": [[12, "pytools.vlsvfile.VlsvReader.get_spatial_block_size", false]], "get_spatial_mesh_extent() (pytools.vlsvfile.vlsvreader method)": [[12, "pytools.vlsvfile.VlsvReader.get_spatial_mesh_extent", false]], "get_spatial_mesh_size() (pytools.vlsvfile.vlsvreader method)": [[12, "pytools.vlsvfile.VlsvReader.get_spatial_mesh_size", false]], "get_unique_cellids() (pytools.vlsvfile.vlsvreader method)": [[12, "pytools.vlsvfile.VlsvReader.get_unique_cellids", false]], "get_variable() (pytools.calculations.variableinfo method)": [[2, "pytools.calculations.VariableInfo.get_variable", false]], "get_velocity_block_coordinates() (pytools.vlsvfile.vlsvreader method)": [[12, "pytools.vlsvfile.VlsvReader.get_velocity_block_coordinates", false]], "get_velocity_block_indices() (pytools.vlsvfile.vlsvreader method)": [[12, "pytools.vlsvfile.VlsvReader.get_velocity_block_indices", false]], "get_velocity_block_size() (pytools.vlsvfile.vlsvreader method)": [[12, "pytools.vlsvfile.VlsvReader.get_velocity_block_size", false]], "get_velocity_blocks() (pytools.vlsvfile.vlsvreader method)": [[12, "pytools.vlsvfile.VlsvReader.get_velocity_blocks", false]], "get_velocity_cell_coordinates() (pytools.vlsvfile.vlsvreader method)": [[12, "pytools.vlsvfile.VlsvReader.get_velocity_cell_coordinates", false]], "get_velocity_cell_ids() (pytools.vlsvfile.vlsvreader method)": [[12, "pytools.vlsvfile.VlsvReader.get_velocity_cell_ids", false]], "get_velocity_mesh_dv() (pytools.vlsvfile.vlsvreader method)": [[12, "pytools.vlsvfile.VlsvReader.get_velocity_mesh_dv", false]], "get_velocity_mesh_extent() (pytools.vlsvfile.vlsvreader method)": [[12, "pytools.vlsvfile.VlsvReader.get_velocity_mesh_extent", false]], "get_velocity_mesh_size() (pytools.vlsvfile.vlsvreader method)": [[12, "pytools.vlsvfile.VlsvReader.get_velocity_mesh_size", false]], "get_vertex_coordinates_from_indices() (pytools.vlsvfile.vlsvreader method)": [[12, "pytools.vlsvfile.VlsvReader.get_vertex_coordinates_from_indices", false]], "get_vertex_indices() (pytools.vlsvfile.vlsvreader method)": [[12, "pytools.vlsvfile.VlsvReader.get_vertex_indices", false]], "gics": [[3, "module-gics", false]], "graded_mesh() (in module biot_savart)": [[1, "biot_savart.graded_mesh", false]], "gyrophase_angles_from_file() (in module pytools.calculations)": [[2, "pytools.calculations.gyrophase_angles_from_file", false]], "integrate_biot_savart() (in module biot_savart)": [[1, "biot_savart.integrate_biot_savart", false]], "lineout() (in module pytools.calculations)": [[2, "pytools.calculations.lineout", false]], "list() (pytools.vlsvfile.vlsvparticles method)": [[12, "pytools.vlsvfile.VlsvParticles.list", false]], "list() (pytools.vlsvfile.vlsvreader method)": [[12, "pytools.vlsvfile.VlsvReader.list", false]], "lmn_null_lines_fote() (in module pytools.calculations)": [[2, "pytools.calculations.LMN_null_lines_FOTE", false]], "magnetopause2d": [[5, "module-magnetopause2d", false]], "magnetopause3d": [[6, "module-magnetopause3d", false]], "make_surface() (in module magnetopause3d)": [[6, "magnetopause3d.make_surface", false]], "mkdir_path() (in module biot_savart)": [[1, "biot_savart.mkdir_path", false]], "mkdir_path() (in module gics)": [[3, "gics.mkdir_path", false]], "module": [[1, "module-biot_savart", false], [2, "module-pytools.calculations", false], [3, "module-gics", false], [4, "module-pytools", false], [5, "module-magnetopause2d", false], [6, "module-magnetopause3d", false], [7, "module-pytools.miscellaneous", false], [8, "module-pytools.plot", false], [10, "module-shue", false], [11, "module-tsyganenko", false], [12, "module-pytools.vlsvfile", false]], "nearest_node_index() (in module biot_savart)": [[1, "biot_savart.nearest_node_index", false]], "oblique_shock() (in module pytools.miscellaneous)": [[7, "pytools.miscellaneous.oblique_shock", false]], "optimize_clear_fileindex_for_cellid() (pytools.vlsvfile.vlsvreader method)": [[12, "pytools.vlsvfile.VlsvReader.optimize_clear_fileindex_for_cellid", false]], "optimize_clear_fileindex_for_cellid_blocks() (pytools.vlsvfile.vlsvreader method)": [[12, "pytools.vlsvfile.VlsvReader.optimize_clear_fileindex_for_cellid_blocks", false]], "optimize_close_file() (pytools.vlsvfile.vlsvreader method)": [[12, "pytools.vlsvfile.VlsvReader.optimize_close_file", false]], "optimize_open_file() (pytools.vlsvfile.vlsvreader method)": [[12, "pytools.vlsvfile.VlsvReader.optimize_open_file", false]], "pitch_angles() (in module pytools.calculations)": [[2, "pytools.calculations.pitch_angles", false]], "plot_colormap() (in module pytools.plot)": [[8, "pytools.plot.plot_colormap", false]], "plot_colormap3dslice() (in module pytools.plot)": [[8, "pytools.plot.plot_colormap3dslice", false]], "plot_ionosphere() (in module pytools.plot)": [[8, "pytools.plot.plot_ionosphere", false]], "plot_isosurface() (in module pytools.plot)": [[8, "pytools.plot.plot_isosurface", false]], "plot_multiple_variables() (in module pytools.plot)": [[8, "pytools.plot.plot_multiple_variables", false]], "plot_neutral_sheet() (in module pytools.plot)": [[8, "pytools.plot.plot_neutral_sheet", false]], "plot_rankine() (in module pytools.miscellaneous)": [[7, "pytools.miscellaneous.plot_rankine", false]], "plot_threeslice() (in module pytools.plot)": [[8, "pytools.plot.plot_threeslice", false]], "plot_variables() (in module pytools.plot)": [[8, "pytools.plot.plot_variables", false]], "plot_vdf() (in module pytools.plot)": [[8, "pytools.plot.plot_vdf", false]], "plot_vdf_profiles() (in module pytools.plot)": [[8, "pytools.plot.plot_vdf_profiles", false]], "plot_vdfdiff() (in module pytools.plot)": [[8, "pytools.plot.plot_vdfdiff", false]], "print_config() (pytools.vlsvfile.vlsvreader method)": [[12, "pytools.vlsvfile.VlsvReader.print_config", false]], "print_version() (pytools.vlsvfile.vlsvreader method)": [[12, "pytools.vlsvfile.VlsvReader.print_version", false]], "pytools": [[4, "module-pytools", false]], "pytools.calculations": [[2, "module-pytools.calculations", false]], "pytools.miscellaneous": [[7, "module-pytools.miscellaneous", false]], "pytools.plot": [[8, "module-pytools.plot", false]], "pytools.vlsvfile": [[12, "module-pytools.vlsvfile", false]], "read() (pytools.vlsvfile.vlsvreader method)": [[12, "pytools.vlsvfile.VlsvReader.read", false]], "read_attribute() (pytools.vlsvfile.vlsvreader method)": [[12, "pytools.vlsvfile.VlsvReader.read_attribute", false]], "read_blocks() (pytools.vlsvfile.vlsvreader method)": [[12, "pytools.vlsvfile.VlsvReader.read_blocks", false]], "read_fsgrid_variable() (pytools.vlsvfile.vlsvreader method)": [[12, "pytools.vlsvfile.VlsvReader.read_fsgrid_variable", false]], "read_fsgrid_variable_cellid() (pytools.vlsvfile.vlsvreader method)": [[12, "pytools.vlsvfile.VlsvReader.read_fsgrid_variable_cellid", false]], "read_interpolated_fsgrid_variable() (pytools.vlsvfile.vlsvreader method)": [[12, "pytools.vlsvfile.VlsvReader.read_interpolated_fsgrid_variable", false]], "read_interpolated_ionosphere_variable() (pytools.vlsvfile.vlsvreader method)": [[12, "pytools.vlsvfile.VlsvReader.read_interpolated_ionosphere_variable", false]], "read_interpolated_variable() (pytools.vlsvfile.vlsvreader method)": [[12, "pytools.vlsvfile.VlsvReader.read_interpolated_variable", false]], "read_interpolated_variable_irregular() (pytools.vlsvfile.vlsvreader method)": [[12, "pytools.vlsvfile.VlsvReader.read_interpolated_variable_irregular", false]], "read_ionosphere_node_variable_at_elements() (pytools.vlsvfile.vlsvreader method)": [[12, "pytools.vlsvfile.VlsvReader.read_ionosphere_node_variable_at_elements", false]], "read_ionosphere_variable() (pytools.vlsvfile.vlsvreader method)": [[12, "pytools.vlsvfile.VlsvReader.read_ionosphere_variable", false]], "read_metadata() (pytools.vlsvfile.vlsvreader method)": [[12, "pytools.vlsvfile.VlsvReader.read_metadata", false]], "read_parameter() (pytools.vlsvfile.vlsvreader method)": [[12, "pytools.vlsvfile.VlsvReader.read_parameter", false]], "read_particles() (pytools.vlsvfile.vlsvparticles method)": [[12, "pytools.vlsvfile.VlsvParticles.read_particles", false]], "read_particles_all() (pytools.vlsvfile.vlsvparticles method)": [[12, "pytools.vlsvfile.VlsvParticles.read_particles_all", false]], "read_variable() (pytools.vlsvfile.vlsvreader method)": [[12, "pytools.vlsvfile.VlsvReader.read_variable", false]], "read_variable_from_cache() (pytools.vlsvfile.vlsvreader method)": [[12, "pytools.vlsvfile.VlsvReader.read_variable_from_cache", false]], "read_variable_info() (pytools.vlsvfile.vlsvreader method)": [[12, "pytools.vlsvfile.VlsvReader.read_variable_info", false]], "read_variable_to_cache() (pytools.vlsvfile.vlsvreader method)": [[12, "pytools.vlsvfile.VlsvReader.read_variable_to_cache", false]], "read_velocity_cells() (pytools.vlsvfile.vlsvreader method)": [[12, "pytools.vlsvfile.VlsvReader.read_velocity_cells", false]], "refine_mesh() (in module biot_savart)": [[1, "biot_savart.refine_mesh", false]], "save_b_vlsv() (in module biot_savart)": [[1, "biot_savart.save_B_vlsv", false]], "shue": [[10, "module-shue", false]], "spherical_to_cartesian() (in module biot_savart)": [[1, "biot_savart.spherical_to_cartesian", false]], "spherical_to_cartesian() (in module gics)": [[3, "gics.spherical_to_cartesian", false]], "spherical_to_cartesian() (in module tsyganenko)": [[11, "tsyganenko.spherical_to_cartesian", false]], "static_field_tracer() (in module pytools.calculations)": [[2, "pytools.calculations.static_field_tracer", false]], "static_field_tracer_3d() (in module pytools.calculations)": [[2, "pytools.calculations.static_field_tracer_3d", false]], "themis_observation_from_file() (in module pytools.calculations)": [[2, "pytools.calculations.themis_observation_from_file", false]], "themis_plot_detector() (in module pytools.calculations)": [[2, "pytools.calculations.themis_plot_detector", false]], "themis_plot_phasespace_contour() (in module pytools.calculations)": [[2, "pytools.calculations.themis_plot_phasespace_contour", false]], "themis_plot_phasespace_helistyle() (in module pytools.calculations)": [[2, "pytools.calculations.themis_plot_phasespace_helistyle", false]], "tsyganenko": [[11, "module-tsyganenko", false]], "tsyganenko_b() (in module tsyganenko)": [[11, "tsyganenko.tsyganenko_b", false]], "tsyganenko_ocb() (in module tsyganenko)": [[11, "tsyganenko.tsyganenko_ocb", false]], "tsyganenko_open() (in module tsyganenko)": [[11, "tsyganenko.tsyganenko_open", false]], "tsyganenko_trace() (in module tsyganenko)": [[11, "tsyganenko.tsyganenko_trace", false]], "upsample_fsgrid_subarray() (pytools.vlsvfile.vlsvreader method)": [[12, "pytools.vlsvfile.VlsvReader.upsample_fsgrid_subarray", false]], "variableinfo (class in pytools.calculations)": [[2, "pytools.calculations.VariableInfo", false]], "vec_len_2d() (in module biot_savart)": [[1, "biot_savart.vec_len_2d", false]], "vec_unit() (in module biot_savart)": [[1, "biot_savart.vec_unit", false]], "vlasiatorreader (class in pytools.vlsvfile)": [[12, "pytools.vlsvfile.VlasiatorReader", false]], "vlsv_intpol_file() (in module pytools.calculations)": [[2, "pytools.calculations.vlsv_intpol_file", false]], "vlsv_intpol_points() (in module pytools.calculations)": [[2, "pytools.calculations.vlsv_intpol_points", false]], "vlsvparticles (class in pytools.vlsvfile)": [[12, "pytools.vlsvfile.VlsvParticles", false]], "vlsvreader (class in pytools.vlsvfile)": [[12, "pytools.vlsvfile.VlsvReader", false]], "vlsvwriter (class in pytools.vlsvfile)": [[12, "pytools.vlsvfile.VlsvWriter", false]], "write() (pytools.vlsvfile.vlsvwriter method)": [[12, "pytools.vlsvfile.VlsvWriter.write", false]], "write_variable() (pytools.vlsvfile.vlsvwriter method)": [[12, "pytools.vlsvfile.VlsvWriter.write_variable", false]], "write_variable_info() (pytools.vlsvfile.vlsvwriter method)": [[12, "pytools.vlsvfile.VlsvWriter.write_variable_info", false]], "write_velocity_space() (pytools.vlsvfile.vlsvwriter method)": [[12, "pytools.vlsvfile.VlsvWriter.write_velocity_space", false]], "write_vtk_file() (in module pytools.miscellaneous)": [[7, "pytools.miscellaneous.write_vtk_file", false]]}, "objects": {"": [[1, 0, 0, "-", "biot_savart"], [3, 0, 0, "-", "gics"], [5, 0, 0, "-", "magnetopause2d"], [6, 0, 0, "-", "magnetopause3d"], [4, 0, 0, "-", "pytools"], [10, 0, 0, "-", "shue"], [11, 0, 0, "-", "tsyganenko"]], "biot_savart": [[1, 1, 1, "", "B_ionosphere"], [1, 1, 1, "", "B_magnetosphere"], [1, 1, 1, "", "b_dip"], [1, 1, 1, "", "b_dip_direction"], [1, 1, 1, "", "b_dip_magnitude"], [1, 1, 1, "", "biot_savart"], [1, 1, 1, "", "cartesian_to_spherical"], [1, 1, 1, "", "fac_map"], [1, 1, 1, "", "graded_mesh"], [1, 1, 1, "", "integrate_biot_savart"], [1, 1, 1, "", "mkdir_path"], [1, 1, 1, "", "nearest_node_index"], [1, 1, 1, "", "refine_mesh"], [1, 1, 1, "", "save_B_vlsv"], [1, 1, 1, "", "spherical_to_cartesian"], [1, 1, 1, "", "vec_len_2d"], [1, 1, 1, "", "vec_unit"]], "gics": [[3, 1, 1, "", "E_horizontal"], [3, 1, 1, "", "cartesian_to_spherical"], [3, 1, 1, "", "cartesian_to_spherical_vector"], [3, 1, 1, "", "mkdir_path"], [3, 1, 1, "", "spherical_to_cartesian"]], "magnetopause3d": [[6, 1, 1, "", "make_surface"]], "pytools": [[2, 0, 0, "-", "calculations"], [7, 0, 0, "-", "miscellaneous"], [8, 0, 0, "-", "plot"], [12, 0, 0, "-", "vlsvfile"]], "pytools.calculations": [[2, 2, 1, "", "AMRInterpolator"], [2, 1, 1, "", "LMN_null_lines_FOTE"], [2, 2, 1, "", "VariableInfo"], [2, 1, 1, "", "cell_time_evolution"], [2, 1, 1, "", "cut3d"], [2, 1, 1, "", "cut_through"], [2, 1, 1, "", "cut_through_curve"], [2, 1, 1, "", "cut_through_step"], [2, 1, 1, "", "dynamic_field_tracer"], [2, 1, 1, "", "epsilon_M"], [2, 1, 1, "", "fourier"], [2, 1, 1, "", "gyrophase_angles_from_file"], [2, 1, 1, "", "lineout"], [2, 1, 1, "", "pitch_angles"], [2, 1, 1, "", "static_field_tracer"], [2, 1, 1, "", "static_field_tracer_3d"], [2, 1, 1, "", "themis_observation_from_file"], [2, 1, 1, "", "themis_plot_detector"], [2, 1, 1, "", "themis_plot_phasespace_contour"], [2, 1, 1, "", "themis_plot_phasespace_helistyle"], [2, 1, 1, "", "vlsv_intpol_file"], [2, 1, 1, "", "vlsv_intpol_points"]], "pytools.calculations.VariableInfo": [[2, 3, 1, "", "get_scaled_units"], [2, 3, 1, "", "get_scaled_var"], [2, 3, 1, "", "get_variable"]], "pytools.miscellaneous": [[7, 1, 1, "", "get_sorted_file_names"], [7, 1, 1, "", "oblique_shock"], [7, 1, 1, "", "plot_rankine"], [7, 1, 1, "", "write_vtk_file"]], "pytools.plot": [[8, 1, 1, "", "plot_colormap"], [8, 1, 1, "", "plot_colormap3dslice"], [8, 1, 1, "", "plot_ionosphere"], [8, 1, 1, "", "plot_isosurface"], [8, 1, 1, "", "plot_multiple_variables"], [8, 1, 1, "", "plot_neutral_sheet"], [8, 1, 1, "", "plot_threeslice"], [8, 1, 1, "", "plot_variables"], [8, 1, 1, "", "plot_vdf"], [8, 1, 1, "", "plot_vdf_profiles"], [8, 1, 1, "", "plot_vdfdiff"]], "pytools.vlsvfile": [[12, 2, 1, "", "VlasiatorReader"], [12, 2, 1, "", "VlsvParticles"], [12, 2, 1, "", "VlsvReader"], [12, 2, 1, "", "VlsvWriter"]], "pytools.vlsvfile.VlsvParticles": [[12, 3, 1, "", "list"], [12, 3, 1, "", "read_particles"], [12, 3, 1, "", "read_particles_all"]], "pytools.vlsvfile.VlsvReader": [[12, 3, 1, "", "build_cell_vertices"], [12, 3, 1, "", "cellid_has_vdf"], [12, 3, 1, "", "check_parameter"], [12, 3, 1, "", "check_population"], [12, 3, 1, "", "check_variable"], [12, 3, 1, "", "construct_velocity_cell_coordinates"], [12, 3, 1, "", "construct_velocity_cell_nodes"], [12, 3, 1, "", "construct_velocity_cells"], [12, 3, 1, "", "downsample_fsgrid_subarray"], [12, 3, 1, "", "fsgrid_array_to_vg"], [12, 3, 1, "", "get_all_variables"], [12, 3, 1, "", "get_amr_level"], [12, 3, 1, "", "get_bbox_fsgrid_slicemap"], [12, 3, 1, "", "get_bbox_fsgrid_subarray"], [12, 3, 1, "", "get_cell_bbox"], [12, 3, 1, "", "get_cell_coordinates"], [12, 3, 1, "", "get_cell_corner_vertices"], [12, 3, 1, "", "get_cell_dx"], [12, 3, 1, "", "get_cell_fsgrid"], [12, 3, 1, "", "get_cell_fsgrid_slicemap"], [12, 3, 1, "", "get_cell_fsgrid_subarray"], [12, 3, 1, "", "get_cell_indices"], [12, 3, 1, "", "get_cell_neighbor"], [12, 3, 1, "", "get_cellid"], [12, 3, 1, "", "get_cellid_locations"], [12, 3, 1, "", "get_cellid_with_vdf"], [12, 3, 1, "", "get_config"], [12, 3, 1, "", "get_config_string"], [12, 3, 1, "", "get_dual"], [12, 3, 1, "", "get_duals"], [12, 3, 1, "", "get_fsgrid_cell_size"], [12, 3, 1, "", "get_fsgrid_coordinates"], [12, 3, 1, "", "get_fsgrid_indices"], [12, 3, 1, "", "get_fsgrid_mesh_extent"], [12, 3, 1, "", "get_fsgrid_mesh_size"], [12, 3, 1, "", "get_fsgrid_slice_indices"], [12, 3, 1, "", "get_ionosphere_element_coords"], [12, 3, 1, "", "get_ionosphere_element_corners"], [12, 3, 1, "", "get_ionosphere_latlon_coords"], [12, 3, 1, "", "get_ionosphere_mesh_area"], [12, 3, 1, "", "get_ionosphere_mesh_size"], [12, 3, 1, "", "get_ionosphere_node_coords"], [12, 3, 1, "", "get_max_refinement_level"], [12, 3, 1, "", "get_precipitation_centre_energy"], [12, 3, 1, "", "get_spatial_block_size"], [12, 3, 1, "", "get_spatial_mesh_extent"], [12, 3, 1, "", "get_spatial_mesh_size"], [12, 3, 1, "", "get_unique_cellids"], [12, 3, 1, "", "get_velocity_block_coordinates"], [12, 3, 1, "", "get_velocity_block_indices"], [12, 3, 1, "", "get_velocity_block_size"], [12, 3, 1, "", "get_velocity_blocks"], [12, 3, 1, "", "get_velocity_cell_coordinates"], [12, 3, 1, "", "get_velocity_cell_ids"], [12, 3, 1, "", "get_velocity_mesh_dv"], [12, 3, 1, "", "get_velocity_mesh_extent"], [12, 3, 1, "", "get_velocity_mesh_size"], [12, 3, 1, "", "get_vertex_coordinates_from_indices"], [12, 3, 1, "", "get_vertex_indices"], [12, 3, 1, "", "list"], [12, 3, 1, "", "optimize_clear_fileindex_for_cellid"], [12, 3, 1, "", "optimize_clear_fileindex_for_cellid_blocks"], [12, 3, 1, "", "optimize_close_file"], [12, 3, 1, "", "optimize_open_file"], [12, 3, 1, "", "print_config"], [12, 3, 1, "", "print_version"], [12, 3, 1, "", "read"], [12, 3, 1, "", "read_attribute"], [12, 3, 1, "", "read_blocks"], [12, 3, 1, "", "read_fsgrid_variable"], [12, 3, 1, "", "read_fsgrid_variable_cellid"], [12, 3, 1, "", "read_interpolated_fsgrid_variable"], [12, 3, 1, "", "read_interpolated_ionosphere_variable"], [12, 3, 1, "", "read_interpolated_variable"], [12, 3, 1, "", "read_interpolated_variable_irregular"], [12, 3, 1, "", "read_ionosphere_node_variable_at_elements"], [12, 3, 1, "", "read_ionosphere_variable"], [12, 3, 1, "", "read_metadata"], [12, 3, 1, "", "read_parameter"], [12, 3, 1, "", "read_variable"], [12, 3, 1, "", "read_variable_from_cache"], [12, 3, 1, "", "read_variable_info"], [12, 3, 1, "", "read_variable_to_cache"], [12, 3, 1, "", "read_velocity_cells"], [12, 3, 1, "", "upsample_fsgrid_subarray"]], "pytools.vlsvfile.VlsvWriter": [[12, 3, 1, "", "clone_file"], [12, 3, 1, "", "copy_variables"], [12, 3, 1, "", "copy_variables_list"], [12, 3, 1, "", "write"], [12, 3, 1, "", "write_variable"], [12, 3, 1, "", "write_variable_info"], [12, 3, 1, "", "write_velocity_space"]], "shue": [[10, 1, 1, "", "f_shue"]], "tsyganenko": [[11, 1, 1, "", "spherical_to_cartesian"], [11, 1, 1, "", "tsyganenko_b"], [11, 1, 1, "", "tsyganenko_ocb"], [11, 1, 1, "", "tsyganenko_open"], [11, 1, 1, "", "tsyganenko_trace"]]}, "objnames": {"0": ["py", "module", "Python module"], "1": ["py", "function", "Python function"], "2": ["py", "class", "Python class"], "3": ["py", "method", "Python method"]}, "objtypes": {"0": "py:module", "1": "py:function", "2": "py:class", "3": "py:method"}, "terms": {"": [1, 2, 3, 7, 8, 9, 10, 11, 12], "0": [1, 2, 3, 7, 8, 9, 10, 11, 12], "00": 1, "000": 2, "0000040": 8, "0000048": 8, "0000100": 8, "0000798": 2, "0001": 2, "001": [2, 3, 12], "002": 2, "0e": 12, "0e5": 2, "0e6": 2, "1": [1, 2, 6, 7, 8, 9, 10, 11, 12], "10": [2, 3, 8, 11], "100": [1, 2, 8, 9], "1000": [9, 10], "10000": 11, "100km": 1, "1029": 3, "11": 8, "1111": 12, "12": [2, 3, 8], "12742000": 1, "14": 2, "15": 11, "1670561": 8, "180": [2, 11], "19": 3, "1924": 2, "1952": 3, "1997": [9, 10], "1d": [1, 3, 10, 12], "1e": [8, 11, 12], "1e4": 2, "1e5": 2, "1e6": 2, "1e8": 12, "1m": 2, "2": [1, 2, 6, 7, 8, 9, 10, 11, 12], "200": 1, "20000": 11, "2006": 3, "2008sw000439": 3, "2009": 3, "2012": 2, "2020": [1, 9], "2021": 2, "2022": 11, "21": 12, "22": 1, "234": 12, "25484000": 1, "27": 2, "2d": [1, 2, 8], "2e6": 8, "2n": 2, "2pi": 10, "2x": 2, "3": [1, 2, 3, 7, 8, 9, 10, 11, 12], "30": [8, 11], "31855000": 1, "3d": [1, 2, 3, 8, 9, 12], "3v": 2, "4": [1, 2, 7, 11, 12], "40": 8, "44": 12, "45": 11, "4e6": 2, "5": [2, 8, 11, 12], "500": 2, "522": 12, "56": 12, "5e6": 2, "5e7": 2, "6": [8, 11, 12], "60": [8, 11], "6371000": 1, "64": [2, 12], "67262192369e": 2, "6e": 11, "7": 8, "750": 11, "750000": 8, "8": [1, 8, 11, 12], "80": 11, "857": 11, "8e": 1, "8e22": 1, "9": [2, 8, 11, 12], "90": [8, 11], "99": 11, "A": [1, 2, 7, 8, 9, 10, 12], "As": 8, "But": 11, "By": [2, 8, 11], "For": [6, 8, 12], "IN": 2, "If": [2, 8, 10, 11, 12], "In": [1, 8], "It": 8, "Not": [2, 12], "One": [2, 12], "The": [0, 1, 2, 3, 7, 8, 9, 10, 11, 12], "To": [1, 9], "_f_shue_paramet": 10, "_vol": 2, "ab": 8, "abc": 8, "about": 1, "abov": [2, 8], "absolut": 8, "accept": [1, 2, 8], "access": [1, 9], "account": 12, "accur": 2, "accuraci": [8, 11], "action": 8, "activ": [2, 8, 11, 12], "actual": 7, "ad": 8, "adapt": [1, 3, 9], "add": 4, "addit": 8, "adequ": 8, "adjust": [2, 12], "affect": [3, 8], "after": [2, 8, 11, 12], "against": 11, "aim": 8, "al": [1, 2, 3, 9, 10, 11], "algorithm": [2, 11], "align": [1, 2, 8], "all": [1, 2, 3, 7, 8, 9, 11, 12], "alloc": 2, "allow": [8, 11], "along": [1, 2, 7, 8, 9, 11, 12], "alpha": [2, 9, 10], "alreadi": 2, "also": 8, "altitud": [1, 9], "alwai": 2, "amount": 2, "amr": [2, 12], "amrinterpol": [2, 4], "an": [1, 2, 3, 8, 12], "analys": [2, 8, 9], "analysi": 8, "analyz": 4, "angl": [2, 8, 9, 10, 11], "ani": [7, 8], "anti": 11, "anyth": [8, 11], "appear": 12, "append": 12, "appli": [8, 12], "applic": [2, 11], "appropri": 2, "approxim": 2, "ar": [1, 2, 3, 4, 8, 9, 11, 12], "arang": 2, "arbitrarili": 1, "area": [1, 12], "aren": 12, "argument": [8, 12], "around": 12, "arr_2d": 1, "arrai": [1, 2, 3, 7, 8, 10, 11, 12], "arriv": 11, "artefact": 8, "artifici": 2, "ascii": 2, "aspect": 8, "associ": [8, 12], "assum": [1, 3, 8, 9, 11, 12], "attribut": 12, "autodoc": 4, "automat": [0, 2, 8, 12], "avail": [2, 8], "averag": [8, 12], "avg": [2, 12], "ax": [2, 8], "axi": [2, 8, 9, 10], "axiscolor": 8, "axiskmp": 8, "axisunit": 8, "azimuth": 8, "b": [1, 2, 3, 8, 9, 12], "b_dip": [1, 9], "b_dip_direct": [1, 9], "b_dip_magnitud": [1, 9], "b_inner": 1, "b_iono": 1, "b_ionospher": [1, 9], "b_magnetospher": [1, 9], "b_outer": 1, "b_para": 8, "b_perp1": 8, "b_perp2": 8, "b_x": 8, "b_x_valu": 8, "b_z": [8, 9, 10], "back": 11, "background": 8, "balloon": 1, "bar": 8, "barycent": 12, "barycentr": 12, "base": [2, 8], "basi": 2, "batch": [3, 9], "bbox": 12, "bcq": 8, "becaus": [1, 3, 9], "becom": 8, "been": [1, 3, 9], "befor": [2, 8, 11], "behav": 12, "behavior": 12, "behaviour": [8, 12], "being": [1, 8], "below": [2, 8, 11], "benefici": 12, "besid": 12, "beta": 8, "better": 8, "between": [1, 2, 8, 9], "beyond": 11, "bi": 2, "big": 8, "biglabel": 8, "biglabloc": 8, "bimaxwellian": 2, "bin": [2, 12], "bin_theta": 2, "binari": 11, "binoffset": 2, "biot": [1, 9], "biot_savart": 4, "birkeland": [1, 9], "black": 8, "block": 12, "block1": 12, "block1_valu": 12, "block2": 12, "block2_valu": 12, "blockcoordin": 12, "blocks_and_valu": 12, "bool": 12, "boolean": [2, 11], "border": 8, "both": 2, "bound": 12, "boundari": [1, 2, 9, 11], "boundary_inn": 2, "bow": 7, "box": [8, 12], "boxm": 8, "boxr": 8, "bpara": 8, "bpara1": 8, "bperp": 8, "bracket": 8, "break": 2, "buffer": 8, "build": 12, "build_cell_vertic": 12, "bulk": [2, 8], "bulk1_sidecar": [3, 9], "bvar": 2, "bvector": 8, "bvectorscal": 8, "bwr": 8, "bx": [2, 11], "bx1": 7, "bx2": 7, "bx_imf": 11, "by1": 7, "by2": 7, "by_imf": 11, "bz": [2, 11], "bz_imf": 11, "c": 12, "c0": 2, "c1": 12, "c11": 6, "c12": 6, "c2": 12, "c21": 6, "c22": 6, "c3": 12, "c31": 6, "c32": 6, "cach": 12, "cagniard": 3, "calcul": [1, 3, 4, 7, 8, 9], "call": [1, 3, 9, 12], "can": [1, 2, 3, 8, 9, 11, 12], "cartesian": [1, 3, 12], "cartesian_to_spher": [1, 3, 9], "cartesian_to_spherical_vector": [3, 9], "case": [1, 2, 8, 11, 12], "categori": 7, "caus": [2, 8], "cavitoncontour": 8, "cax": 2, "cbax": 8, "cbtitl": 8, "cbulk": 8, "cell": [1, 2, 8, 12], "cell_time_evolut": [2, 4], "cellb": 2, "cellid": [2, 8, 12], "cellid_has_vdf": 12, "cellids2": 8, "cellidss": 12, "cellsiz": 8, "center": [1, 2, 8, 12], "centr": 12, "certain": [2, 8], "chang": 8, "check": [2, 11, 12], "check_paramet": 12, "check_popul": 12, "check_vari": 12, "choic": 2, "choos": 2, "chosen": 11, "cid": 12, "cij": 6, "class": [2, 7, 8, 12], "clean_xtick": 8, "clear": 12, "clone": 12, "clone_fil": 12, "close": [2, 11, 12], "closer": 2, "closest": 6, "cm": [8, 9, 10, 11], "cn1": 6, "cn2": 6, "co": [9, 10], "coarser": 8, "code": [1, 2, 12], "colatitud": 1, "collaps": 2, "color": [2, 8], "color_op": 8, "color_var": 8, "colorbar": 8, "colormap": 8, "colour": 8, "colourbar": 8, "column": 2, "combin": 1, "command": 12, "compar": [2, 11], "complet": 2, "complex": 8, "compon": [2, 3, 7, 8, 9, 10, 11], "compress": 7, "comput": [1, 3, 9], "condit": 7, "conduct": [2, 3, 9], "config": 12, "configur": 12, "connect": [1, 9], "conserv": 12, "consid": [1, 2], "constant": [1, 2, 3, 8], "construct": [0, 2, 6, 8, 12], "construct_velocity_cel": 12, "construct_velocity_cell_coordin": 12, "construct_velocity_cell_nod": 12, "contain": [1, 2, 3, 8, 9, 10, 11, 12], "content": [8, 12], "continu": 2, "contour": [2, 8], "contribut": [1, 4], "control": [9, 10], "convent": 11, "convers": 12, "convert": [3, 12], "coord": [2, 6, 12], "coord_list": [1, 2], "coordin": [1, 2, 3, 6, 8, 11, 12], "coordr": 8, "coordswap": 8, "copi": [1, 12], "copy_mesh": 12, "copy_vari": 12, "copy_variables_list": 12, "corner": [8, 12], "correct": 8, "correspond": [1, 2, 3, 8, 9, 11, 12], "correspondingli": 2, "cosin": 2, "count": 2, "countrat": 2, "coupl": [1, 9], "cover": 12, "coverag": 8, "cpeak": 8, "crd": 2, "creat": [2, 8], "credit": 4, "cross": 11, "cube": 8, "cubic": 1, "cuboid": 12, "current": [1, 3, 7, 9], "curv": 2, "cusp": 11, "custom": 8, "custombulkspe": 8, "cut": [2, 8], "cut3d": [2, 4], "cut_through": [2, 4], "cut_through_curv": [2, 4], "cut_through_step": [2, 4], "cutpoint": 8, "cutpointm": 8, "cutpointr": 8, "d": [1, 2], "da": 1, "dash": 8, "dat": 2, "data": [1, 2, 3, 9, 12], "data_arrai": 2, "datareduc": 12, "datareduct": 12, "daysid": [8, 11], "db": 3, "db_dt": 3, "decreas": 8, "def": [2, 8], "default": [1, 2, 8, 11, 12], "default_stopping_condit": 2, "defin": [1, 6, 8, 12], "definit": [2, 8], "degener": 2, "degeneraci": 2, "degre": [2, 8, 11], "delaunai": [2, 12], "delta": 1, "densiti": [1, 2, 3, 7, 8, 9, 10, 11], "depend": [1, 9, 10, 11], "describ": [3, 9, 10], "descript": 12, "design": 8, "detail": 4, "detector": 2, "detector_axi": 2, "determin": [2, 11], "develop": 4, "deviat": 2, "dict": [2, 12], "dictionari": [2, 8, 12], "diff": 8, "differ": [1, 2, 3, 8, 9, 10, 12], "dim": 8, "dimens": [1, 2, 3, 8, 11, 12], "dimension": [2, 5, 6, 8, 9, 12], "dimensionless": [9, 10], "dimi": 2, "dimx": 2, "dimz": 2, "dipol": [1, 11], "dir": 11, "direct": [2, 8, 11, 12], "directori": [1, 2, 3, 7, 8], "disabl": 8, "discret": [1, 9], "displai": 8, "disregard": 2, "distanc": [1, 2, 8, 9, 10], "distinguish": 8, "distribut": [2, 8], "divid": 12, "do": [1, 2, 8, 12], "doc": 11, "docstr": 4, "document": [0, 8], "doe": [2, 3, 8, 11, 12], "doesn": 11, "doi": 3, "domain": [1, 2, 3, 9], "dont": 7, "dot": 8, "down": 1, "downmost": 8, "downsampl": 12, "downsample_fsgrid_subarrai": 12, "draw": 8, "drive": 11, "dst": [11, 12], "dstep": 8, "dt": 3, "dual": 12, "dummi": 2, "duplic": [2, 8, 12], "dure": 0, "dv": 1, "dvx": 12, "dvy": 12, "dvz": 12, "dx": [1, 2, 12], "dx_0": 1, "dx_fsgrid": 12, "dy": 12, "dynam": 2, "dynamic_field_trac": [2, 4], "dz": 12, "e": [1, 2, 3, 7, 8, 9, 10, 11, 12], "e_horizont": [3, 9], "each": [1, 2, 6, 8, 12], "earth": [1, 8, 9, 10, 11], "earthspac": 2, "easi": 11, "east": [3, 9], "edg": [1, 2, 8], "edit": 2, "effect": 8, "effectivesparsitythreshold": 8, "eg": [2, 12], "egi": [1, 9, 10, 11], "egl": [1, 3, 9, 11], "either": [3, 8, 11, 12], "electr": [3, 9], "element": [1, 2, 3, 8, 11, 12], "elev": 8, "elif": 12, "els": [8, 12], "em": 2, "empti": [2, 8], "enabl": [1, 2, 12], "end": [2, 8], "energi": [2, 12], "ensur": 8, "enter": 2, "entir": 2, "entri": [8, 12], "env": 2, "environ": [1, 3, 9], "ep": 12, "epsilon_m": [2, 4], "eq": 3, "equal": [1, 3, 8, 11], "equat": 1, "error": 2, "esp": 2, "estim": 11, "et": [1, 2, 3, 9, 10, 11], "etc": [2, 8], "euler": 2, "evalu": [1, 8, 11], "everi": [2, 6, 12], "everywher": 8, "evolut": 2, "ex": [2, 12], "exact": [2, 3], "exactli": 11, "exampl": [1, 2, 3, 6, 7, 8, 9, 10, 11, 12], "example_cellid": 12, "exist": [1, 2, 8, 12], "expect": 8, "express": 8, "exprma_cust": 8, "exprmap": 8, "extend": 2, "extent": [8, 12], "extern": [2, 8, 11], "extra_attrib": 12, "f": [1, 2, 12], "f_i": 2, "f_j_sidecar": [1, 9], "f_shue": [9, 10], "fac": [1, 9], "fac_map": [1, 9], "face": [1, 2], "fact": 1, "factor": [1, 2, 8, 12], "fall": [1, 12], "fals": [2, 8, 11, 12], "far": 11, "featur": 1, "feel": 12, "fetch": 12, "fft": 2, "fg": 2, "fg_b": 2, "fg_e": 2, "fha": [1, 3, 9], "fia": [1, 3, 9], "field": [1, 2, 3, 7, 8, 9, 10, 11], "fieldsolv": 2, "fifth": 8, "fig": 2, "figsiz": 2, "figur": [7, 8], "file": [1, 2, 3, 4, 7, 8, 9, 12], "file_nam": [2, 12], "file_orbit": 2, "file_output": 2, "file_vlsv": 2, "filedir": [2, 8], "fileindex": 1, "fileloc": 8, "filenam": [2, 7, 8], "filename1": 8, "filename2": 8, "fill": 2, "final": [2, 8, 11], "find": [1, 2, 5, 6, 8, 9, 11, 12], "find_ksi": 12, "first": [7, 8, 12], "fit": 7, "fix": 8, "fixedtick": 8, "flag": 8, "flatten": 8, "float": [1, 2, 11], "flow": [5, 6, 9], "flux": [4, 8], "flux_level": 8, "fluxdir": 8, "fluxfil": 8, "fluxfunct": 8, "fluxlin": 8, "fluxthick": 8, "fmax": 8, "fmin": 8, "fold": 8, "folder": 7, "folding_alpha": 8, "follow": [1, 2, 8, 9, 12], "form": [1, 2, 6, 9, 10, 12], "format": [2, 7, 12], "forward": [2, 8], "found": [1, 2, 3, 8, 9, 11, 12], "four": [8, 12], "fourier": [2, 4], "fourier_data": 2, "frame": [2, 8], "free": [2, 12], "frequenc": 2, "fresh": 12, "from": [1, 2, 3, 4, 6, 7, 8, 9, 11, 12], "fsave": 8, "fsgrid": 12, "fsgrid_array_to_vg": 12, "fsgriddecomposit": 12, "fsvar_arrai": 12, "fsvar_at_coord": 12, "full": [8, 12], "fullf": 2, "fulli": 8, "function": [1, 2, 7, 8, 9, 10, 11, 12], "futur": 12, "g": [1, 2, 7, 8, 10, 11, 12], "g_m": 2, "gap": [1, 9], "gener": [1, 2, 4, 8], "geoelectr": [3, 9], "geoelectric_field": [3, 9], "geograph": 11, "geomagnet": [3, 9, 11], "geopack": 11, "get": [2, 7, 8, 11, 12], "get_all_vari": 12, "get_amr_level": 12, "get_bbox_fsgrid_slicemap": 12, "get_bbox_fsgrid_subarrai": 12, "get_cell_bbox": 12, "get_cell_coordin": 12, "get_cell_corner_vertic": 12, "get_cell_dx": 12, "get_cell_fsgrid": 12, "get_cell_fsgrid_slicemap": 12, "get_cell_fsgrid_subarrai": 12, "get_cell_indic": 12, "get_cell_neighbor": 12, "get_cellid": 12, "get_cellid_loc": 12, "get_cellid_with_vdf": 12, "get_config": [10, 12], "get_config_str": 12, "get_dual": 12, "get_fsgrid_cell_s": 12, "get_fsgrid_coordin": 12, "get_fsgrid_indic": 12, "get_fsgrid_mesh_ext": 12, "get_fsgrid_mesh_s": 12, "get_fsgrid_slice_indic": 12, "get_ionosphere_element_coord": 12, "get_ionosphere_element_corn": 12, "get_ionosphere_latlon_coord": 12, "get_ionosphere_mesh_area": 12, "get_ionosphere_mesh_s": 12, "get_ionosphere_node_coord": 12, "get_max_refinement_level": 12, "get_precipitation_centre_energi": 12, "get_scaled_unit": 2, "get_scaled_var": 2, "get_sorted_file_nam": [4, 7], "get_spatial_block_s": 12, "get_spatial_mesh_ext": [2, 12], "get_spatial_mesh_s": 12, "get_unique_cellid": 12, "get_vari": [2, 12], "get_velocity_block": 12, "get_velocity_block_coordin": 12, "get_velocity_block_indic": 12, "get_velocity_block_s": 12, "get_velocity_cell_coordin": 12, "get_velocity_cell_id": 12, "get_velocity_mesh_dv": 12, "get_velocity_mesh_ext": 12, "get_velocity_mesh_s": 12, "get_vertex_coordinates_from_indic": 12, "get_vertex_indic": 12, "gic": 4, "give": 8, "given": [2, 3, 7, 8, 9, 11, 12], "go": [8, 12], "goe": [1, 11], "good": 8, "got": 2, "gp": 11, "grade": 1, "graded_mesh": [1, 9], "graham": 2, "grai": 8, "grandin": 11, "greater": 8, "greco": 2, "grid": [1, 2, 8, 12], "grid_r": 2, "grid_theta": 2, "grid_var": 2, "ground": [1, 3, 9], "group": [1, 3, 9, 12], "gse": [9, 10, 11], "gsm": 12, "guess": 8, "gyro_angl": 2, "gyrophas": 2, "gyrophase_angles_from_fil": [2, 4], "ha": [1, 3, 8, 9, 12], "hack": 2, "had": [9, 10], "half": 8, "halfax": 8, "hand": 3, "handl": [2, 12], "hard": 2, "hardcod": 12, "have": [1, 2, 8, 12], "head": 12, "header_str": 2, "heli": 2, "help": 12, "helper": [1, 2], "helsinki": 4, "hemispher": 8, "henc": 8, "here": 1, "hexahedr": 2, "hexahedra": 2, "hi": 0, "hidden": 8, "high": 8, "highest": 8, "highr": 8, "hist": 2, "hold": 2, "home": 8, "horait": 11, "horizont": [1, 3, 9], "hot_desatur": 8, "how": [2, 6, 8], "hstr": 2, "hugoniot": 7, "i": [1, 2, 3, 4, 6, 8, 9, 10, 11, 12], "id": [2, 8, 12], "ident": 2, "identifi": 8, "ig_": 1, "ig_b": [1, 9], "ig_fac": 1, "ig_r": 1, "ignor": 2, "igrf": 11, "ii": 12, "imag": 8, "imf": 11, "immedi": [3, 9], "implement": 12, "import": [2, 7, 8, 9, 10, 12], "imshow": 8, "imshowinterp": 8, "inact": 12, "includ": [2, 7, 9, 12], "inclus": 12, "increas": 3, "indefinit": 12, "index": [2, 6, 8, 11, 12], "indic": [2, 6, 12], "induc": [3, 9], "inferno": 8, "infinit": 1, "info": [2, 8], "inform": [8, 12], "initi": [1, 2, 11], "inner": [1, 9, 11], "innermost": 8, "input": [1, 2, 3, 6, 8, 10, 11, 12], "input_tupl": 1, "insid": [8, 12], "instead": [2, 8, 9, 10, 12], "int": [1, 2, 12], "integ": [8, 12], "integr": [1, 2, 3, 8, 9], "integrate_biot_savart": [1, 9], "intend": 2, "interact": 12, "interest": 7, "interfac": 2, "intern": 11, "internalb": 11, "internalcb": 8, "interp": 12, "interpol": [2, 8, 12], "interpolation_ord": 2, "interv": 8, "inward": 12, "ionospher": [1, 3, 8, 9, 12], "ish": 2, "isosurfac": 8, "item": 12, "iter": [1, 2, 12], "iteract": 2, "its": [2, 4, 12], "j": [1, 3, 6, 8, 9], "jacob": 2, "jacobian": 2, "jet": 8, "jump": 7, "just": [1, 2, 12], "kaiserwindowparamet": 2, "keep": 12, "kei": 12, "keyword": [1, 2, 3, 8, 9, 10, 11, 12], "km": [1, 8, 9, 10, 11], "known": 8, "kp": 11, "ksi": 12, "kwarg": [11, 12], "kwird": 8, "kword": [2, 8, 12], "label": 8, "larg": [8, 11], "larger": 8, "largest": 2, "last": 2, "lat": [11, 12], "lat_rang": 11, "latex": [2, 12], "latexunit": [2, 12], "latidu": 11, "latitud": [8, 11, 12], "law": 1, "layer": 8, "layout": [4, 8], "left": 8, "legend": 8, "len": [2, 3], "length": [1, 2, 8, 12], "level": [1, 8, 12], "lie": 12, "life": 0, "like": [1, 2, 9, 12], "limit": [1, 3, 9], "lin": 8, "linalg": 2, "line": [1, 2, 7, 8, 9, 11, 12], "linear": [2, 3, 8, 12], "linearli": 12, "linearndinterpol": 12, "lineout": [2, 4], "lineout_rho": 2, "linspac": [2, 8, 9, 10], "list": [1, 2, 6, 7, 8, 11, 12], "liu": 3, "lmn": 2, "lmn_null_lines_fot": [2, 4], "lo": 8, "load": 2, "local": 1, "locat": [1, 2, 8, 12], "log": [2, 8], "logarithm": 8, "lognorm": 2, "logo": 8, "lon": 12, "longitud": [11, 12], "look": 10, "low": 12, "lower": 12, "lower_bound": 2, "lust": 8, "m": [1, 2, 3, 8, 9, 12], "m_p": 2, "ma": 8, "made": 8, "mag_mom": 1, "mag_mom_vector": 1, "magma": 8, "magnet": [1, 2, 3, 7, 8, 9, 10, 11, 12], "magnetopaus": [5, 6, 9, 10, 11], "magnetopause2d": 4, "magnetopause3d": 4, "magnetospher": 1, "magnitud": [1, 2, 8], "mai": [1, 2, 8, 9, 11], "main": [2, 9], "make": [1, 2, 3, 6, 8, 11], "make_surfac": [6, 9], "mani": [2, 8, 12], "manualdict": 2, "map": [1, 8, 9, 12], "mark": [6, 8], "mask": 8, "mass": 2, "master": 8, "match": [3, 8, 12], "matplotlib": [2, 8, 9, 10], "matrix": 2, "max": [2, 8, 11, 12], "max_iter": 2, "maximum": [2, 8, 12], "maxloop": 11, "maxwellian": 2, "mayavi": 12, "mean": 12, "meant": 12, "measur": [2, 8], "mesh": [1, 3, 9, 12], "mesh_limit": 2, "meshgrid": 2, "metadata": [2, 12], "meter": [2, 3, 12], "method": [1, 2, 3, 10, 12], "methodarg": 12, "metr": 8, "mhd": [1, 9], "microsecond": 8, "might": 12, "millisecond": 8, "min": [2, 8, 11], "minimum": [2, 8, 12], "minlatitud": 8, "minu": 2, "minvalu": 8, "misc": 7, "miscellan": 4, "miss": [2, 12], "mkdir_path": [1, 3, 9], "mm": 8, "model": [2, 9, 10, 11], "modifi": 1, "modul": [2, 7, 8, 9, 12], "modular": 12, "moment": [1, 2], "monoton": 3, "more": [8, 12], "morningsid": 8, "most": [2, 8, 11], "move": [8, 12], "msec": 8, "mu_0": 1, "multi": 8, "multipl": [8, 12], "multipli": [2, 8], "multiplot": 8, "musec": 8, "must": [2, 3, 6, 8], "mutat": 12, "my_stop": 2, "n": [1, 2, 12], "n_h": 2, "n_in": 12, "n_p": [9, 10], "n_sw": 11, "name": [1, 2, 3, 7, 8, 9, 10, 12], "nan": 2, "nanotesla": 8, "nb": 2, "nbin": 2, "nchannel": 12, "nd": 12, "ndim": 12, "ne": 8, "nearest": [1, 12], "nearest_node_index": [1, 9], "nearli": [2, 11], "necessari": 8, "necessarili": 1, "need": [1, 2, 3, 5, 6, 9, 11], "neg": 8, "neighbor": [2, 12], "neighbour": 12, "nest": 12, "neutral": [2, 8], "new": [2, 8, 9, 10, 12], "newer": 12, "next": [6, 8], "nipy_spectr": 8, "nobord": 8, "nocb": 8, "node": [1, 2, 12], "node_coords_iono": 1, "nomask": 8, "non": [2, 8], "non_existing_example_funct": 2, "none": [1, 2, 8, 10, 11, 12], "nonzero": [8, 12], "noon": 11, "nooverwrit": 8, "norm": 2, "normal": [7, 8], "normalx": 8, "normord": 2, "north": [3, 8, 9, 11], "northern": 8, "notat": 8, "note": [1, 2, 3, 8, 9, 11, 12], "now": 2, "noxlabel": 8, "noylabel": 8, "np": [1, 2, 8, 9, 10, 12], "nproc": [1, 9], "nstep": 11, "nt": [9, 10, 11], "number": [2, 3, 8, 9, 10, 11, 12], "numpi": [1, 2, 3, 8, 9, 10, 11, 12], "nw": 8, "obc": 11, "object": [1, 2, 8, 9, 10, 12], "oblique_shock": [4, 7], "observ": 2, "ocb": 11, "off": 8, "offset": [2, 8, 12], "offsetss": 12, "old": 8, "omit": 8, "onc": 12, "one": [7, 8, 12], "ones": 12, "onli": [2, 8, 12], "onto": 8, "op": 8, "opaqu": 8, "open": [2, 4, 7, 11, 12], "oper": [2, 8, 12], "opposit": 11, "optim": 12, "optimize_clear_fileindex_for_cellid": 12, "optimize_clear_fileindex_for_cellid_block": 12, "optimize_close_fil": 12, "optimize_open_fil": 12, "option": [2, 8, 11, 12], "orbit": 2, "order": [1, 2, 6, 7, 8, 9, 12], "origin": [2, 8], "other": [1, 2, 6, 7, 8, 11, 12], "otherwis": [1, 8, 12], "out": [11, 12], "outer": [1, 2, 11], "output": [1, 2, 4, 8, 10, 11, 12], "outputdir": [2, 8], "outputfil": [2, 8], "outputloc": 8, "outsid": [1, 8], "over": [1, 3, 8, 9, 12], "overal": 8, "overhead": 1, "overid": 8, "overlap": 8, "overplot": 8, "overrid": [2, 8], "overridden": 8, "overriden": 2, "overwrit": 12, "p2": 7, "packag": [5, 6, 9, 11], "page": 4, "pair": 12, "panel": 8, "parallel": [7, 8, 11], "param": [1, 2, 12], "paramet": [2, 7, 8, 9, 10, 11, 12], "parametr": 2, "part": 8, "parti": 8, "particl": 12, "particular": 12, "parula": 8, "pascal": 2, "pass": [2, 8, 11, 12], "pass_ful": 8, "pass_map": 8, "pass_tim": 8, "pass_var": 8, "path": [1, 2, 3, 8, 9], "pcolormesh": 2, "peak": 8, "per": 8, "perfix": 8, "perform": 8, "period": [0, 12], "perpendicular": [7, 8], "phase": [2, 8], "phasespac": 2, "phi": [1, 3, 11], "physic": 12, "pi": [1, 3, 9, 10, 11], "piecewis": 3, "pilot": 0, "pipelin": 12, "pitch": 2, "pitch_angl": [2, 4], "pitchangledirectori": 2, "pl": 2, "plaintext": 12, "plane": [1, 2, 6, 8], "plane1": 6, "plane2": 6, "plane_i": 2, "plane_x": 2, "plasma": [2, 5, 6, 8, 9], "plasmafram": 2, "pleas": 2, "plot": [2, 4, 7, 9, 10, 12], "plot_b": 12, "plot_b_vol": 12, "plot_colormap": [4, 8], "plot_colormap3dslic": [4, 8], "plot_help": 8, "plot_ionospher": [4, 8], "plot_isosurfac": [4, 8], "plot_multiple_vari": [4, 8], "plot_neutral_sheet": [4, 8], "plot_popul": 12, "plot_rankin": [4, 7], "plot_threeslic": [4, 8], "plot_vari": [2, 4, 8], "plot_vdf": [4, 8], "plot_vdf_profil": [4, 8], "plot_vdfdiff": [4, 8], "plt": [9, 10], "plu": [1, 2, 7], "po": 3, "point": [1, 2, 6, 7, 8, 11, 12], "point1": [2, 7], "point2": [2, 7], "point_data": 7, "points_trac": 2, "polar": 2, "pole": [8, 11], "pop": [2, 8, 12], "popnam": 12, "popul": [2, 8, 12], "posit": [1, 2, 3, 5, 6, 8, 9, 10, 11], "possibli": [2, 8], "post": 2, "pre": [1, 2, 8], "preced": 8, "precipit": 12, "prefix": 8, "press": [2, 7, 8, 12], "pressur": [2, 7], "prevent": 8, "print": [8, 12], "print_config": 12, "print_vers": 12, "privat": 12, "process": 2, "produc": 1, "program": 8, "progress": 4, "proj": 8, "project": [2, 8], "propag": 2, "properli": 2, "proport": 8, "propto": [1, 9], "proton": [2, 8, 12], "proton_precipit": 12, "provid": [2, 8, 12], "prune_uniqu": 12, "pt": [2, 7, 8, 12], "ptoutputdir": 8, "public": 11, "pulkinnen": 3, "puls": 11, "purpos": [9, 12], "pusher": 12, "py": [1, 2, 3, 8, 9, 11], "pylab": [2, 7, 8], "pyplot": [9, 10], "python": [1, 3, 4, 8, 9, 12], "pytool": [2, 7, 8, 12], "qhull": 2, "qhull_opt": [2, 12], "qj": [2, 12], "quasi": 8, "queri": [2, 8, 12], "question": [8, 12], "r": [1, 3, 9, 10, 11], "r0": [9, 10], "r_0": [9, 10], "r_c": [1, 9], "r_e": [1, 8, 10, 11], "r_earth": 1, "r_inner": 11, "r_iono": [1, 9], "r_outer": 11, "radial": [1, 2, 9, 10], "radian": [1, 10, 11], "radii": [1, 8, 9, 10], "radiu": [1, 8, 9, 11], "random_index": 12, "random_velocity_cell_coordin": 12, "random_velocity_cell_id": 12, "rang": [11, 12], "rankin": 7, "raster": 8, "rate": 2, "rather": [2, 11], "ratio": [7, 8], "raw": 12, "rbf": [2, 12], "rbfinterpol": 12, "rdbu": 8, "re": [1, 2, 8], "reach": 2, "read": [2, 4, 8, 12], "read_attribut": 12, "read_block": 12, "read_fsgrid_vari": 12, "read_fsgrid_variable_cellid": 12, "read_interpolated_fsgrid_vari": 12, "read_interpolated_ionosphere_vari": 12, "read_interpolated_vari": 12, "read_interpolated_variable_irregular": 12, "read_ionosphere_node_variable_at_el": 12, "read_ionosphere_vari": 12, "read_metadata": 12, "read_paramet": 12, "read_particl": 12, "read_particles_al": 12, "read_vari": [2, 12], "read_variable_from_cach": 12, "read_variable_info": 12, "read_variable_to_cach": 12, "read_velocity_cel": 12, "reader": [2, 7, 12], "real": 12, "reason": 8, "recalc": 11, "receiv": 8, "recommend": [2, 8], "reduc": [1, 8, 9, 12], "reduct": 12, "refer": [2, 3], "refin": [1, 2, 9, 12], "refine_mesh": [1, 9], "reflevel": 12, "region": [1, 8, 9], "regular": [2, 8, 12], "rel": [8, 11, 12], "relat": [4, 8, 12], "relev": [1, 7], "repeat": 12, "repo": 4, "represent": 12, "request": 8, "requestvari": 8, "requir": [1, 8, 9, 12], "resampl": 8, "reshap": 2, "resolut": [1, 8, 12], "resolv": [1, 9], "respect": [3, 8, 9], "responsib": 12, "restart": 2, "restructuredtext": 4, "result": [2, 8, 11, 12], "retriev": 2, "return": [1, 2, 3, 6, 7, 8, 11, 12], "rh": 3, "rho": [2, 8], "rho1": 7, "rho2": 7, "rho_data": 2, "rho_valu": 8, "rhobackstream": 8, "ri": 12, "riemann": 3, "right": 3, "rotat": [8, 11], "roughli": [1, 11], "routin": [8, 11, 12], "run": [1, 3, 5, 6, 8, 9, 10, 11], "runtim": 1, "same": [0, 1, 8, 12], "sampl": [2, 8], "savart": [1, 9], "save": [1, 2, 3, 8, 9], "save_b_vlsv": [1, 9], "scalar": [1, 2], "scale": [1, 2, 8], "scale_cb": 8, "scale_label": 8, "scale_text": 8, "scale_titl": 8, "scaledlatexunit": 2, "scaledunit": 2, "scalingparam": 2, "scientif": 8, "scipi": [2, 12], "screen": 8, "script": [1, 3, 4], "se": 8, "search": [8, 11], "sec": [1, 8, 9, 10, 11], "second": [7, 8], "section": [2, 8], "see": [1, 2, 4, 8, 9, 10, 11, 12], "seealso": 12, "seed": 2, "seed_coord": 2, "seek": 8, "seen": 2, "seismic": 8, "select": [8, 12], "self": 2, "separ": [8, 9, 12], "seri": 2, "set": [1, 2, 4, 8, 10, 12], "set_titl": 2, "setthreshold": 8, "settino": 2, "setup": 1, "shade": 8, "shape": [1, 2, 8, 9, 10, 12], "sheet": 8, "sheetlay": 8, "shift": 12, "shock": 7, "should": [8, 11, 12], "show": [2, 8], "shown": 8, "shue": 4, "si": [1, 12], "side": [1, 7], "sidecar": [1, 3, 9], "siemen": 3, "sigma": [3, 9], "sign": 2, "siljamo": 0, "simpl": 8, "simpli": [8, 12], "simul": [1, 2, 8], "simulation_to_spacecraft_fram": 2, "sin": [9, 10], "singl": [1, 2, 3, 8, 11], "singular": 8, "size": [1, 8, 9, 10, 12], "slash": 8, "slice": [6, 8, 12], "slicethick": 8, "slight": 8, "slightli": 8, "slow": 2, "small": 11, "smooth": 2, "so": [1, 8, 11, 12], "solar": [9, 10, 11], "solut": 11, "some": [2, 7, 8, 9, 12], "sort": 7, "sourc": [4, 8], "south": 8, "space": [2, 8, 12], "spacecraft": 2, "spacephys": [1, 3, 9], "sparsiti": 8, "spatial": [8, 12], "spatialgrid": 12, "speci": 2, "special": 8, "specif": 11, "specifi": [1, 2, 11, 12], "speed": [2, 9, 10], "sphere": 8, "spheric": 3, "spherical_to_cartesian": [1, 3, 9, 11], "sphinx": 4, "spin": 2, "sqrt": 2, "squar": 8, "stack": 2, "standoff": [9, 10], "start": [1, 2, 11, 12], "state00040000": 2, "static": 2, "static_field_trac": [2, 4], "static_field_tracer_3d": [2, 4], "steamin": [5, 6, 9], "stem": [1, 3], "step": [2, 8], "stop": [2, 11], "stop_condit": 2, "str": [2, 12], "streamlin": [2, 8], "streamlinecolor": 8, "streamlinedens": 8, "streamlinethick": 8, "string": [1, 2, 8, 10, 12], "struct": 2, "structur": [1, 9, 12], "studi": [9, 10], "style": 2, "subarrai": 12, "subplot": [2, 8], "subplot_kw": 2, "subsolar": [9, 10, 11], "successfulli": 12, "suffix": 2, "suggest": 8, "suitabl": 8, "sum": [3, 12], "summat": [1, 9], "suppli": [1, 9], "support": [2, 12], "supposet": 2, "suppress": 8, "surf_level": 8, "surf_op": 8, "surf_step": 8, "surf_var": 8, "surfac": [1, 3, 6, 8, 9, 12], "suspect": 12, "sw": 8, "sw_ave": 2, "swap": 8, "symlog": 8, "symmetr": 8, "syntax": 4, "system": [11, 12], "t": [1, 2, 3, 8, 11, 12], "t01": 11, "t04": 11, "t1": 7, "t2": 7, "t89": 11, "t96": 11, "tab": [2, 7, 8, 12], "tag": 12, "take": 6, "taken": 8, "target": 8, "task": [1, 9], "technic": 11, "temperatur": [7, 8], "tensor": 8, "tesla": [1, 8], "test": [1, 3, 7, 9, 11, 12], "testfil": 2, "text": 8, "than": [2, 12], "thei": [9, 10], "them": [7, 8], "themi": 2, "themis_observation_from_fil": [2, 4], "themis_plot_detector": [2, 4], "themis_plot_phasespace_contour": [2, 4], "themis_plot_phasespace_helistyl": [2, 4], "theoret": [7, 11], "thermal": 2, "theta": [1, 3, 9, 10, 11], "theta_polar": 10, "thi": [0, 1, 2, 3, 4, 7, 8, 9, 10, 11, 12], "thick": 8, "though": 2, "thread": [1, 9], "three": [2, 6, 8, 9, 12], "three_cut": 2, "threshold": [2, 8], "through": [2, 8, 12], "tick": 8, "tickinterv": 8, "tilt": [8, 11], "time": [2, 3, 8, 9, 12], "time_data": 2, "timestep": 8, "titl": 8, "todo": [10, 12], "toler": 11, "tool": 4, "top": 8, "topmost": 8, "total": [2, 8], "touch": 12, "trace": [2, 5, 6, 9, 11], "tracer": 2, "traine": 0, "transform": [2, 3], "translat": 8, "transpar": 8, "transpos": [2, 8], "transvers": 8, "treat": [9, 10], "tri": 8, "triangl": [6, 12], "triangul": 2, "triangular": 12, "trilinear": 2, "trim_arrai": 2, "tripl": 8, "trivial": 2, "true": [2, 8, 11, 12], "truncat": [8, 12], "try": 2, "tsyanenko_open": 11, "tsyganenko": 4, "tsyganenko_b": [9, 11], "tsyganenko_ocb": [9, 11], "tsyganenko_open": [9, 11], "tsyganenko_trac": [9, 11], "tupl": [1, 2, 3, 11, 12], "two": [0, 2, 5, 6, 7, 8, 9, 12], "two_cut": 2, "txx": 11, "type": [1, 2, 8], "typic": 2, "uh": [1, 3, 9], "unchang": 1, "under": [2, 12], "underli": 12, "union": 12, "uniqu": [2, 12], "unit": [1, 2, 8, 12], "unitconvers": 12, "univers": 4, "unless": 8, "unspecifi": 11, "until": 12, "up": [1, 8, 10, 12], "updat": 2, "upon": 12, "upper": 12, "upper_bound": 2, "upsample_fsgrid_subarrai": 12, "us": [1, 2, 3, 4, 8, 9, 10, 11, 12], "usag": [2, 7, 8, 9, 10, 12], "useimshow": 8, "user": [1, 2, 8], "usernam": 2, "usesci": 8, "ut": 11, "utilis": 9, "v": [3, 8, 9, 12], "v1": 6, "v2": 6, "v3": 6, "v4": 6, "v5": 6, "v6": 6, "v7": 6, "v8": 6, "v_phi": 3, "v_r": 3, "v_sw": [9, 10], "v_theta": 3, "va": 8, "vakka": [1, 3, 9], "valu": [1, 2, 7, 8, 11, 12], "var": [8, 12], "var1": 2, "var2": 2, "var3": 2, "vari": 12, "variabl": [1, 2, 7, 8, 9, 12], "variable_valu": 2, "variableinfo": [2, 4, 8, 12], "variables_x_list": 8, "variables_y_list": 8, "variavl": 12, "varibl": 2, "varinfo": [2, 12], "varlist": [2, 12], "varnam": 12, "vcellcoord": 12, "vcellid": 12, "vcut": 2, "vcutmax": 2, "vdf": [2, 8, 12], "vec_len_2d": [1, 9], "vec_unit": [1, 9], "vector": [1, 2, 3, 7, 8, 9, 12], "vectorcolormap": 8, "vectordens": 8, "vectors": 8, "veloc": [2, 7, 8, 11, 12], "velocity_cell_coordin": 12, "velocity_cell_id": 12, "velocity_cell_map": 12, "velocity_cell_valu": 12, "version": [0, 2, 12], "vert": 6, "vertex": [8, 12], "vertic": 12, "vg": [1, 2], "vg_": 1, "vg_b_vol": 2, "vg_j": [1, 9], "vg_x": 1, "vg_y": 1, "vg_z": 1, "via": [2, 4, 12], "view": [2, 8], "viewangl": 8, "viewdir": 8, "viridi": 8, "visualizations_2": 1, "vlasiat": [1, 3, 4, 5, 6, 8, 9, 10, 11, 12], "vlasiatorread": [4, 12], "vlasov": [1, 8, 9, 12], "vlsv": [1, 2, 3, 4, 7, 8, 9, 12], "vlsv_intpol_fil": [2, 4], "vlsv_intpol_point": [2, 4], "vlsvfile": [2, 4, 8], "vlsvobj": [2, 8], "vlsvobj1": 8, "vlsvobj2": 8, "vlsvparticl": [4, 12], "vlsvreader": [1, 2, 4, 7, 9, 10, 12], "vlsvreader_list": 2, "vlsvwriter": [4, 12], "vm": 8, "vmax": [2, 8], "vmin": [2, 8], "volum": [1, 2], "volumetr": 2, "vscale": [2, 8], "vslv": 1, "vspace": 2, "vtk": 7, "vx": [2, 3], "vx1": 7, "vx2": 7, "vx_sw": 11, "vxmax": 12, "vxmin": 12, "vy": [2, 3], "vy1": 7, "vy2": 7, "vymax": 12, "vymin": 12, "vz": 3, "vzmax": 12, "vzmin": 12, "wa": [0, 11, 12], "wai": 2, "want": [1, 2, 8], "wasn": 8, "watermark": 8, "we": 2, "week": 0, "weight": [2, 12], "welcom": 4, "well": [1, 8, 9, 12], "wflux": 8, "whatev": 12, "when": [1, 2, 8, 11], "where": [1, 2, 3, 6, 8, 9, 10, 12], "whether": [2, 11, 12], "which": [1, 2, 7, 8, 12], "white": 8, "whole": [1, 8, 12], "whose": [2, 12], "why": 2, "wind": [9, 10, 11], "window": 8, "wish": 2, "within": [1, 2, 8, 9, 11], "without": 8, "wmark": 8, "wmarkb": 8, "work": [0, 1, 2, 4, 6, 8, 11, 12], "would": [2, 8, 12], "wrapper": [1, 2, 11], "write": [2, 7, 12], "write_vari": 12, "write_variable_info": 12, "write_velocity_spac": 12, "write_vtk_fil": [4, 7], "written": [1, 3, 9, 12], "wrk": [1, 2, 3, 9], "wrt": [9, 10], "x": [1, 2, 3, 7, 8, 9, 10, 11, 12], "x0": [2, 8, 11], "x1": [1, 2, 8], "x2": [1, 2], "x_coord": 6, "xcoordin": 8, "xi": 12, "xij": 6, "xlabel": 2, "xmax": [2, 12], "xmeshxi": 8, "xmin": [2, 12], "xml": 12, "xsize": 8, "xx": 11, "xy": 8, "xyz": 8, "xz": 8, "xzize": 8, "y": [1, 2, 3, 8, 9, 10, 11, 12], "y0": [8, 11], "y1": [1, 2, 8], "y2": [1, 2], "ye": 8, "year": 11, "yet": 8, "yi": 12, "yij": 6, "ylabel": 2, "ymax": [2, 12], "ymeshxi": 8, "ymin": [2, 12], "you": [2, 12], "your": 4, "ysize": 8, "yt": [5, 6, 9], "yy": 11, "yz": [6, 8], "z": [1, 2, 3, 8, 9, 10, 11, 12], "z0": [8, 11], "z1": [1, 2, 8], "z2": [1, 2], "z_extent": 8, "zero": [2, 8, 11], "zi": 12, "zij": 6, "zmax": [2, 12], "zmin": [2, 12], "zoom": 8, "zz": 11}, "titles": ["Credits", "biot_savart", "calculations", "gics", "analysator documentation", "magnetopause2d", "magnetopause3d", "miscellaneous", "plot", "scripts", "shue", "tsyganenko", "vlsvfile"], "titleterms": {"analys": 4, "biot_savart": [1, 9], "calcul": 2, "content": 4, "credit": 0, "document": 4, "gic": [3, 9], "magnetopause2d": [5, 9], "magnetopause3d": [6, 9], "miscellan": 7, "plot": 8, "script": 9, "shue": [9, 10], "tsyganenko": [9, 11], "vlsvfile": 12}}) \ No newline at end of file diff --git a/shue/index.html b/shue/index.html new file mode 100644 index 00000000..ee75e197 --- /dev/null +++ b/shue/index.html @@ -0,0 +1,179 @@ + + + + + + + + + shue — analysator documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

shue

+
+

See Shue et al. (1997): “A new functional form to study the solar wind control of the magnetopause size and shape”

+

They describe a model where the radial magnetopause position r is treated as a function of angle wrt x-GSE axis

+
+

r(theta) = r_0 * (2 / (1+ cos(theta)))^alpha

+
+

r_0 is the subsolar standoff distance [in earth radii], alpha is a dimensionless parameter

+
+
The parameters r_0, alpha depend on the solar wind parameters:

B_z: z-component (GSE) of the magnetic field [nT] +n_p: number density [cm^-3] +v_sw: solar wind speed [km/sec]

+
+
+

Different Vlasiator runs had

+
+

Example usage (plot magnetopause for run ‘EGI’):

+
+

import numpy as np +import matplotlib.pyplot as plt

+

theta = np.linspace(0,np.pi / 2, 1000) +r, r0, alpha = f_shue(theta, run=’EGI’) +x = r*np.cos(theta) +y = r*np.sin(theta) +plt.plot(x,y)

+
+
+
+shue.f_shue(theta_polar, run=None, B_z=None, n_p=None, v_sw=None)
+

Shue et al. (1997): ‘A new functional form to study the solar wind control of the magnetopause size and shape’`

+
+
Inputs:
+
theta_polar: 1D numpy array [radians], angle wrt x-GSE axis

0 < theta_polar < 2pi

+
+
keyword run: string containing Vlasiator run name (e.g. ‘EGI’)

If set, look up the solar wind parameters B_z, n_p, v_sw for this run

+
+
+
+
Output:

magnetopause position r(theta) [R_E]

+
+
+

TODO: instead of using _f_shue_parameters(), use VlsvReader object’s get_config() method to look up parameters.

+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/tsyganenko/index.html b/tsyganenko/index.html new file mode 100644 index 00000000..642d0b3f --- /dev/null +++ b/tsyganenko/index.html @@ -0,0 +1,347 @@ + + + + + + + + + tsyganenko — analysator documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

tsyganenko

+
+
+tsyganenko.spherical_to_cartesian(r, theta, phi)
+

r > 0 +0 < theta < pi +-pi < phi < pi +all are assumed to be numpy arrays of equal dimensions

+

returns: x, y, z [tuple]

+
+ +
+
+tsyganenko.tsyganenko_b(x, y, z, Txx='t01', InternalB='dipole', Dst=-30, Kp=4, Vx_sw=-750.0, N_sw=1.0, Bx_imf=0.0, By_imf=0.0, Bz_imf=-5.0)
+

Wrapper for Geopack’s trace() routine, for tracing field lines along Tsyganenko model

+
+
Inputs:

x0: x-coordinate(s) (GSE) to evaluate the field [R_E] (float) +y0: y-coordinate(s) (GSE) to evaluate the field [R_E] (float) +z0: z-coordinate(s) (GSE) to evaluate the field [R_E] (float)

+

–Keywords–

+
+
Txx: (external) field model, by Tsyganenko publication year. options: ‘t89’, ‘t96’, ‘t01’

Need to test: does ‘t04’ work? Is geomagnetic activity estimated with Kp or Dst in that case?

+
+
+

InternalB: internal model. options: ‘dipole’, ‘igrf’ +Dst: Dst index in nT (geomagnetic activity), used for Txx= ‘t96’, ‘t01’ (‘t04’?) +Kp: Kp index 0-9 (geomagnetic activity), used for Txx=’T89’ +Vx_sw: solar wind x-component of velocity [km/s] (GSE), other components assumed zero +N_sw: solar wind density [cm-3] +Bx_imf: driving solar wind imf Bx [nT] (GSE) +By_imf: driving solar wind GSE imf By [nT] (GSE) +Bz_imf: driving solar wind GSE imf Bz [nT] (GSE) +R_inner: inner radius [R_E] of the tracing, if the tracing goes r<R_inner it stops +R_outer: outer radius [R_E] of the tracing, if the tracing goes r>R_outer it stops

+
+
dir: direction of the tracing relative to the magnetic field direction (parallel: dir= 1, anti-parallel: dir= -1)

If unspecified (dir=None), dir traces against the field when z0>0 with the field when z0<0

+
+
*** this is the opposite convention used by geopack’s trace() function?

From geopack.py docs: “dir: Direction of tracing. dir = -1 for parallel; dir = 1 for anti-parallel.”

+
+
+
+
+
+
Returns:

3-element tuple bx,by,bz +bx: x-component(s) of field [nT] +by: y-component(s) of field [nT] +bz: z-component(s) of field [nT]

+

** All positional inputs can either be single values or numpy arrays (or lists) ** +** Depending on the inputs, the outputs bx, by, bz will either be single numbers or numpy arrays ** +** All inputs and outputs are in GSE coordinate system **

+
+
Example:

bx,by,bz = tsyganenko_b(0,0, 1., Txx = ‘t01’, Dst = -80, Kp = 4, Vx_sw = -750., N_sw = 4., Bx_imf = 0., By_imf = 0., Bz_imf = -10. )

+

bx,by,bz = tsyganenko_b([0,0,0],[0,0,0], [1.,2,3], Txx = ‘t01’, Dst = -80, Kp = 4, Vx_sw = -750., N_sw = 4., Bx_imf = 0., By_imf = 0., Bz_imf = -10. )

+
+
+

Notes:

+
+

Earth’s dipole is assumed to point (~exactly) in the -z GSE direction

+

Default solar wind and IMF parameters are for the EGI Vlasiator run, see Grandin et al. (2022?)

+
+

Other runs:

+
+
EGL (note: pulse arrives at magnetopause at roughly t=857 sec)

(~before pulse arrival): Dst = -30 (Grandin et al. 2022), N_sw = 1, Bz_imf = -5 +(~after pulse arrival): Dst = -80 (Horaites et al.), N_sw = 4, Bz_imf = -10

+
+
+
+

The geopack package doesn’t allow for easy specification of the dipole tilt angle. +Rather, a UT was found when the tilt was nearly zero (see gp.recalc() line below) +The specified UT results in a tilt angle of theta~1e-5 radians, or 6e-4 degrees +Technically, the solutions should be rotated back by theta, to be compared with Vlasiator’s zero-tilt runs +But this small theta is within tolerance for most applications.

+
+
+ +
+
+tsyganenko.tsyganenko_ocb(phi, lat_range=[0, 90], nsteps=10, **kwargs)
+

Find the open/closed field line boundary (OCB) +algorithm uses a binary search within a specified latitude range

+
+
Inputs:

phi: ~longitude, in degrees -180<=phi<=180 +lat_range: 2-element list or numpy array,

+
+

containing min. and max. latidues [degrees] to search within -90<=lat<=90

+
+

kwargs are passed to tsyanenko_open()

+
+
+

Returns:

+
+

Estimate of the OCB latitude at the given phi, in degrees

+
+
+
Notes:

Algorithm assumes OBC latitude is a single-valued function of phi

+

Theoretical accuracy of the OCB determination is ~ (lat_range[1]-lat_range[0]) / 2^nsteps

+
+
+

Example: # dayside (noon) cusp

+
+
+
tsyganenko_ocb(0, lat_range = [60,80], nsteps = 10,

Txx = ‘t01’, Dst = -80, Kp = 4, Vx_sw = -750., N_sw = 4., Bx_imf = 0., By_imf = 0., Bz_imf = -10., +R_inner = 1., R_outer=15., dir = None, maxloop = 10000)

+
+
+
+
+ +
+
+tsyganenko.tsyganenko_open(phi, lat, R_inner=1, R_outer=15, **kwargs)
+

Checks whether the field line starting at radius ~R_inner +will trace out to beyond R_outer. R_outer is chosen to be large, so if +a magnetic field line makes it out this far, it may be assumed to be open +If the tracing crosses R_inner, the field line is closed

+
+
Inputs:

phi: ~longitude, in degrees -180<=phi<=180 +lat: geographic latitude, in degrees -90<=lat<=90

+
+
+
e.g.,

(phi=0, lat = 0) corresponds with subsolar point +(phi=anything, lat = 90) corresponds with geographic north pole

+
+
+
+

R_inner: inner radius [R_E] of the tracing, if the tracing goes r<R_inner it stops +R_outer: outer radius [R_E] of the tracing, if the tracing goes r>R_outer it stops

+

Keywords (and kwargs) all get passed to tsyganenko_trace()

+
+
Returns:
+
Boolean—

True (if open) +False (if closed)

+
+
+
+
Example:

tsyganenko_open(0, 45) # returns False +tsyganenko_open(0, 80) # returns True

+
+
+
+ +
+
+tsyganenko.tsyganenko_trace(x0, y0, z0, Txx='t01', InternalB='dipole', Dst=-30, Kp=4, Vx_sw=-750.0, N_sw=1.0, Bx_imf=0.0, By_imf=0.0, Bz_imf=-5.0, R_inner=0.99, R_outer=4.8, dir=None, maxloop=20000)
+

Wrapper for Geopack’s trace() routine, for tracing field lines along Tsyganenko model

+
+
Inputs:

x0: initial x-coordinate (GSE) of field tracing [R_E] (float) +y0: initial y-coordinate (GSE) of field tracing [R_E] (float) +z0: initial z-coordinate (GSE) of field tracing [R_E] (float)

+

–Keywords–

+
+
Txx:
+
(external) field model, by Tsyganenko publication year. options: ‘t89’, ‘t96’, ‘t01’

Need to test: does ‘t04’ work? Is geomagnetic activity estimated with Kp or Dst in that case?

+
+
+
+
+

InternalB: internal model. options: ‘dipole’, ‘igrf’ +Dst: Dst index in nT (geomagnetic activity), used for Txx= ‘t96’, ‘t01’ (‘t04’?) +Kp: Kp index 0-9 (geomagnetic activity), used for Txx=’T89’ +Vx_sw: solar wind x-component of velocity [km/s] (GSE), other components assumed zero +N_sw: solar wind density [cm-3] +Bx_imf: driving solar wind imf Bx [nT] (GSE) +By_imf: driving solar wind GSE imf By [nT] (GSE) +Bz_imf: driving solar wind GSE imf Bz [nT] (GSE) +R_inner: inner radius [R_E] of the tracing, if the tracing goes r<R_inner it stops +R_outer: outer radius [R_E] of the tracing, if the tracing goes r>R_outer it stops

+
+
dir: direction of the tracing relative to the magnetic field direction (parallel: dir= 1, anti-parallel: dir= -1)

If unspecified (dir=None), dir traces against the field when z0>0 with the field when z0<0

+
+
*** this is the opposite convention used by geopack’s trace() function?

From geopack.py docs: “dir: Direction of tracing. dir = -1 for parallel; dir = 1 for anti-parallel.”

+
+
+
+
+
+
Returns:

6-element tuple x,y,z,xx,yy,zz +x: final x-coordinate(s) of field tracing [R_E] +y: final y-coordinate(s) of field tracing [R_E] +z: final z-coordinate(s) of field tracing [R_E] +xx: numpy array containing the traced field line x-coordinates +yy: numpy array containing the traced field line y-coordinates +zz: numpy array containing the traced field line z-coordinates

+

** All inputs and outputs are in GSE coordinate system **

+
+
Example:

x,y,z,xx,yy,zz = tsyganenko_trace(0,0, 1., Txx = ‘t01’, Dst = -80, Kp = 4, Vx_sw = -750., N_sw = 4., Bx_imf = 0., By_imf = 0., Bz_imf = -10., R_inner = 1., R_outer=5., dir = None, maxloop = 20000 )

+
+
+

Notes:

+
+

Earth’s dipole is assumed to point (~exactly) in the -z GSE direction

+

Default solar wind and IMF parameters are for the EGI Vlasiator run, see Grandin et al. (2022?)

+
+

Other runs:

+
+
EGL (note: pulse arrives at magnetopause at roughly t=857 sec)

(~before pulse arrival): Dst = -30 (Grandin et al. 2022), N_sw = 1, Bz_imf = -5 +(~after pulse arrival): Dst = -80 (Horaites et al.), N_sw = 4, Bz_imf = -10

+
+
+
+

The geopack package doesn’t allow for easy specification of the dipole tilt angle. +Rather, a UT was found when the tilt was nearly zero (see gp.recalc() line below) +The specified UT results in a tilt angle of theta~1e-5 radians, or 6e-4 degrees +Technically, the solutions should be rotated back by theta, to be compared with Vlasiator’s zero-tilt runs +But this small theta is within tolerance for most applications.

+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/vlsvfile/index.html b/vlsvfile/index.html new file mode 100644 index 00000000..408ec9cf --- /dev/null +++ b/vlsvfile/index.html @@ -0,0 +1,1566 @@ + + + + + + + + + vlsvfile — analysator documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

vlsvfile

+

VlsvFile is responsibe for implementing read and write functionality for the vlsv format, as well as defining data reducers and reduction pipelines. Some of this will be likely moved around to be more modular in some indefinite point in the future.

+

The vlsvfile module has all the classes related to reading and writing vlsv files

+
# Example:
+import pytools as pt
+pt.vlsvfile.
+#press [tab] -> get the functions
+
+
+
+
+class pytools.vlsvfile.VlasiatorReader(file_name, fsGridDecomposition=None)
+

Class for reading VLSV files with support for Vlasiator velocity space and structures

+
+ +
+
+class pytools.vlsvfile.VlsvParticles(file_name)
+

Class for reading VLSV files of particle pusher output

+
+
+list()
+

Print out a description of the content of the file. Useful +for interactive usage

+
+ +
+
+read_particles()
+

Read particle pusher data from the open vlsv file. +This routine returns only active particles.

+
+ +
+
+read_particles_all()
+

Read particle pusher data from the open vlsv file. +This routine returns all particles, including inactive ones.

+
+ +
+ +
+
+class pytools.vlsvfile.VlsvReader(file_name, fsGridDecomposition=None)
+

Class for reading VLSV files

+
+
+build_cell_vertices(cid, prune_unique=False)
+

Builds, caches and returns the vertices that lie on the surfaces of CellIDs cid.

+
+
Parameters:
+
    +
  • cid – numpy array of CellIDs

  • +
  • prune_unique – bool [False], if you suspect you might be calling the function many times with the +same CellID in the list, it might be beneficial to enable this and not repeat the operation for duplicate entries.

  • +
+
+
Returns:
+

Dictionary of cell c (int) : set of vertex indices (3-tuple) that touch the cell c.

+
+
+
+ +
+
+cellid_has_vdf(cid, pop='proton') bool
+

Returns whether the cid in question has a vdf or not +:param coords: the cellid to test for +:returns: bool

+
+ +
+
+check_parameter(name)
+

Checks if a given parameter is in the vlsv reader

+
+
Parameters:
+

name – Name of the parameter

+
+
Returns:
+

True if the parameter is in the vlsv file, false if not

+
+
+
+

Note

+

This should be used for checking if a parameter exists, e.g. for different Vlasiator versions and time output

+
+
# Example usage:
+vlsvReader = pt.vlsvfile.VlsvReader("test.vlsv")
+if vlsvReader.check_parameter( "time" ):
+   time = vlsvReader.read_parameter("time")
+elif vlsvReader.check_parameter( "t" ):
+   time = vlsvReader.read_parameter("t")
+else:
+   time = None
+
+
+
+ +
+
+check_population(popname)
+

Checks if a given population is in the vlsv file

+
+
Parameters:
+

name – Name of the population

+
+
Returns:
+

True if the population is in the vlsv file, false if not

+
+
+
# Example usage:
+vlsvReader = pt.vlsvfile.VlsvReader("test.vlsv")
+if vlsvReader.check_population( "avgs" ):
+   plot_population('avgs')
+else:
+   if vlsvReader.check_population( "proton" ):
+      # File is newer with proton population
+      plot_population('proton')
+
+
+
+ +
+
+check_variable(name)
+

Checks if a given variable is in the vlsv reader

+
+
Parameters:
+

name – Name of the variable

+
+
Returns:
+

True if the variable is in the vlsv file, false if not

+
+
+
+

Note

+

This should be used for checking if a variable exists in case a function behaves differently for ex. if B vector is in the vlsv and if not

+
+
# Example usage:
+vlsvReader = pt.vlsvfile.VlsvReader("test.vlsv")
+if vlsvReader.check_variable( "B" ):
+   # Variable can be plotted
+   plot_B()
+else:
+   # Variable not in the vlsv file
+   plot_B_vol()
+
+
+
+ +
+
+construct_velocity_cell_coordinates(blocks)
+

Returns velocity cell coordinates in given blocks

+
+
Parameters:
+

blocks – list of block ids

+
+
Returns:
+

a numpy array containing the velocity cell ids e.g. np.array([4,2,56,44,522, ..])

+
+
+
+ +
+
+construct_velocity_cell_nodes(blocks, pop='proton')
+

Returns velocity cell nodes in given blocks

+
+
Parameters:
+

blocks – list of block ids

+
+
Returns:
+

a numpy array containing velocity cell nodes and the keys for velocity cells

+
+
+
+

Note

+

This is used for constructing velocity space inside the mayavi module

+
+
+

See also

+

grid

+
+
+ +
+
+construct_velocity_cells(blocks)
+

Returns velocity cells in given blocks

+
+
Parameters:
+

blocks – list of block ids

+
+
Returns:
+

a numpy array containing the velocity cell ids e.g. np.array([4,2,56,44,522, ..])

+
+
+
+ +
+
+downsample_fsgrid_subarray(cellid, array)
+

Returns a mean value of fsgrid values underlying the SpatialGrid cellid.

+
+ +
+
+fsgrid_array_to_vg(array)
+

Downsample, via averaging, an fsgrid array to the Vlasov grid +of this reader.

+
+
Parameters:
+

array – array with first three dimensions corresponding to the +dimensions of the fsgrid associated with this reader.

+
+
Returns:
+

Vlasov grid data (in file order) of array averaged to Vlasov Grid.

+
+
+
+ +
+
+get_all_variables()
+

Returns all variables in the vlsv reader and the data reducer +:returns: List of variable is in the vlsv file +.. code-block:: python

+
+

# Example usage: +vlsvReader = pt.vlsvfile.VlsvReader(“test.vlsv”) +vars = vlsvReader.get_variables()

+
+
+ +
+
+get_amr_level(cellid)
+

Returns the AMR level of a given cell defined by its cellid

+
+
Parameters:
+

cellid – The cell’s cellid

+
+
Returns:
+

The cell’s refinement level in the AMR

+
+
+
+ +
+
+get_bbox_fsgrid_slicemap(low, up)
+

Returns a slice tuple of fsgrid indices that are contained in the (low, up) bounding box.

+
+ +
+
+get_bbox_fsgrid_subarray(low, up, array)
+

Returns a subarray of the fsgrid array, corresponding to the (low, up) bounding box.

+
+ +
+
+get_cell_bbox(cellid)
+

Returns the bounding box of a given cell defined by its cellid

+
+
Parameters:
+

cellid – The cell’s cellid

+
+
Returns:
+

The cell’s bbox [xmin,ymin,zmin],[xmax,ymax,zmax]

+
+
+
+ +
+
+get_cell_coordinates(cellids)
+

Returns a given cell’s coordinates as a numpy array

+
+
Parameters:
+

cellids – The array of cell IDs

+
+
Returns:
+

a numpy array with the coordinates

+
+
+
+

See also

+

get_cellid()

+
+
+

Note

+

The cell ids go from 1 .. max not from 0

+
+
+ +
+
+get_cell_corner_vertices(cids)
+

Builds, caches and returns the vertices that lie on the corners of CellIDs cid. +:parameter cid: numpy array of CellIDs

+
+
Returns:
+

Dictionary of cell c (int) : 8-tuple of vertex indices (3-tuples).

+
+
+
+ +
+
+get_cell_dx(cellid)
+

Returns the dx of a given cell defined by its cellid

+
+
Parameters:
+

cellid – The cell’s cellid

+
+
Returns:
+

The cell’s size [dx, dy, dz]

+
+
+
+ +
+
+get_cell_fsgrid(cellid)
+

Returns a slice tuple of fsgrid indices that are contained in the SpatialGrid +cell.

+
+ +
+
+get_cell_fsgrid_slicemap(cellid)
+

Returns a slice tuple of fsgrid indices that are contained in the SpatialGrid +cell.

+
+ +
+
+get_cell_fsgrid_subarray(cellid, array)
+

Returns a subarray of the fsgrid array, corresponding to the fsgrid +covered by the SpatialGrid cellid.

+
+ +
+
+get_cell_indices(cellids, reflevels=None)
+

Returns a given cell’s indices as a numpy array

+
+
Parameters:
+
    +
  • cellid – The cell’s ID, numpy array

  • +
  • reflevel – The cell’s refinement level in the AMR

  • +
+
+
Returns:
+

a numpy array with the coordinates

+
+
+
+

See also

+

get_cellid()

+
+
+

Note

+

The cell ids go from 1 .. max not from 0

+
+
+ +
+
+get_cell_neighbor(cellidss, offsetss, periodic, prune_uniques=False)
+

Returns a given cells neighbor at offset (in indices)

+
+
Parameters:
+
    +
  • cellids – The cell’s ID

  • +
  • offsets – The offset to the neighbor in indices

  • +
  • periodic – For each dimension, is the system periodic

  • +
+
+
Returns:
+

the cellid of the neighbor

+
+
+
+

Note

+

Returns 0 if the offset is out of bounds!

+
+
+ +
+
+get_cellid(coords)
+

Returns the cell ids at given coordinates

+
+
Parameters:
+

coords – The cells’ coordinates

+
+
Returns:
+

the cell ids

+
+
+
+

Note

+

Returns 0 if the cellid is out of bounds!

+
+
+ +
+
+get_cellid_locations()
+

Returns a dictionary with cell id as the key and the index of the cell id as the value. The index is used to locate the cell id’s values in the arrays that this reader returns

+
+ +
+
+get_cellid_with_vdf(coords, pop='proton')
+

Returns the cell ids nearest to test points, that contain VDFs

+
+
Parameters:
+

coords – Test coordinates [meters] of N_in points in ND-dimensional space +array with shape [N_in, ND] or [ND]

+
+
+

Example: cellid = vlsvReader.get_cellid_with_vdf(np.array([1e8, 0, 0])) +:returns: the cell ids

+
+ +
+
+get_config()
+

Gets config information from VLSV file

+
+
:returns a nested dictionary of dictionaries,

where keys (str) are config file group headings (appearing in ‘[]’) +and values are dictionaries which contain (lists of) strings

+
+
+

If the same heading/parameter pair appears >once in the config file, +the different values are appended to the list .

+

EXAMPLE: +if the config contains these lines:

+
+

[proton_precipitation] +nChannels = 9

+
+

then the following returns [‘9’]: +vlsvReader.get_config()[‘proton_precipitation’][‘nChannels’]

+
+ +
+
+get_config_string()
+

Gets config information from VLSV file. +TAG is hardcoded to CONFIG

+

:returns configuration file string if config is found otherwise returns None

+
+ +
+
+get_dual(pts, cellids=None)
+

Find the duals that contain the coordinate points pts. This will call the iterative find_ksi function +to see if the resulting interpolation weights for the coordinate are in the range [0,1]; if not, it will iterate +through neighbouring duals until a dual is found. +:parameter pts: numpy array of coordinates (N,3)

+
+
Returns:
+

duals (numpy array of N 3-tuples), ksis (numpy array of interpolation weights (N, 8))

+
+
+
+ +
+
+get_duals(cids)
+
+
Get the union of dual cells that cover each of CellIDs in cids.

Assumes all required duals are defined! TODO handling of missing duals, do not call separately.

+
+
+
+
Returns:
+

Dict of vertex-indices v (3-tuple) : 8-tuple of cellids (corners of dual cells indexed by v)

+
+
+
+ +
+
+get_fsgrid_cell_size()
+

Read fsgrid cell size

+
+
Returns:
+

Maximum and minimum coordinates of the mesh, [dx, dy, dz]

+
+
+
+ +
+
+get_fsgrid_coordinates(ri)
+

Returns real-space center coordinates of the fsgrid 3-index.

+
+ +
+
+get_fsgrid_indices(coords)
+

Convert spatial coordinates coords to an index array [xi, yi, zi] for fsgrid

+

:returns 3-tuple of integers [xi, yi, zi] corresponding to fsgrid cell containing coords (low-inclusive) +Example: +ii = f.get_fsgrid_mesh_extent(coords) +fsvar_at_coords = fsvar_array.item(ii)

+
+ +
+
+get_fsgrid_mesh_extent()
+

Read fsgrid mesh extent

+
+
Returns:
+

Maximum and minimum coordinates of the mesh, [xmin, ymin, zmin, xmax, ymax, zmax]

+
+
+
+ +
+
+get_fsgrid_mesh_size()
+

Read fsgrid mesh size

+
+
Returns:
+

Size of mesh in number of cells, array with three elements

+
+
+
+ +
+
+get_fsgrid_slice_indices(lower, upper, eps=0.001)
+

Get indices for a subarray of an fsgrid variable, in the cuboid from lower to upper. +This is meant for mapping a set of fsgrid cells to a given SpatialGrid cell. +Shifts the corners (lower, upper) by dx_fsgrid*eps inward, if direct low-inclusive behaviour +is required, set kword eps = 0.

+

:returns two 3-tuples of integers. +Example: +ii = f.get_fsgrid_mesh_extent(coords) +fsvar_at_coords = fsvar_array.item(ii)

+
+ +
+
+get_ionosphere_element_coords()
+

Read coordinates of ionosphere elements (triangle barycenters)

+
+
Returns:
+

[x, y, z] array of ionosphere element barycenter coordinates (in meters).

+
+
+
+ +
+
+get_ionosphere_element_corners()
+

Read ionosphere mesh element corners

+
+
Returns:
+

[c1,c2,c3] array of ionosphere mesh node indices (starting from 0)

+
+
+
+ +
+
+get_ionosphere_latlon_coords()
+

Read ionosphere node coordinates (in magnetic longitude / latitude)

+
+
Returns:
+

[lat,lon] array of ionosphere node coordinates

+
+
+
+ +
+
+get_ionosphere_mesh_area()
+

Read areas of ionosphere elements (triangular mesh)

+
+
Returns:
+

1D array, areas of the triangular elements [m^2]

+
+
+
+ +
+
+get_ionosphere_mesh_size()
+

Read size of the ionosphere mesh, if there is one.

+
+
Returns:
+

Size of the mesh in number of nodes and elements, array with two elements

+
+
+
+ +
+
+get_ionosphere_node_coords()
+

Read ionosphere node coordinates (in cartesian GSM coordinate system).

+
+
Returns:
+

[x,y,z] array of ionosphere node coordinates (in meters)

+
+
+
+ +
+
+get_max_refinement_level()
+

Returns the maximum refinement level of the AMR

+
+ +
+
+get_precipitation_centre_energy(pop='proton')
+

Read precipitation energy bins

+
+
Returns:
+

Array of centre energies

+
+
+
+ +
+
+get_spatial_block_size()
+

Read spatial mesh block size

+
+
Returns:
+

Size of block in number of cells, array with three elements

+
+
+
+ +
+
+get_spatial_mesh_extent()
+

Read spatial mesh extent

+
+
Returns:
+

Maximum and minimum coordinates of the mesh, [xmin, ymin, zmin, xmax, ymax, zmax]

+
+
+
+ +
+
+get_spatial_mesh_size()
+

Read spatial mesh size

+
+
Returns:
+

Size of mesh in number of blocks, array with three elements

+
+
+
+ +
+
+get_unique_cellids(coords)
+
+
Returns a list of cellids containing all the coordinates in coords,

with no duplicate cellids. Relative order of elements is conserved.

+
+
+
+
Parameters:
+

coords – A list of coordinates

+
+
Returns:
+

a list of unique cell ids

+
+
+
+ +
+
+get_velocity_block_coordinates(blocks, pop='proton')
+

Returns the block coordinates of the given blocks in a numpy array

+
+
Parameters:
+

blocks – list of block ids

+
+
Returns:
+

a numpy array containing the block coordinates e.g. np.array([np.array([2,1,3]), np.array([5,6,6]), ..])

+
+
+ +
+ +
+
+get_velocity_block_indices(blocks, pop='proton')
+

Returns the block indices of the given blocks in a numpy array

+
+
Parameters:
+

blocks – list of block ids

+
+
Returns:
+

a numpy array containing the block indices e.g. np.array([np.array([2,1,3]), np.array([5,6,6]), ..])

+
+
+ +
+ +
+
+get_velocity_block_size(pop='proton')
+

Read velocity mesh block size

+
+
Returns:
+

Size of block in number of cells, array with three elements

+
+
+
+ +
+
+get_velocity_blocks(blockCoordinates, pop='proton')
+

Returns the block ids of the given block coordinates in a numpy array form

+
+
Parameters:
+

blockcoordinates – list of block coordinates e.g. np.array([np.array([2,1,3]), np.array([5,6,6]), ..])

+
+
Returns:
+

a numpy array containing the block ids e.g. np.array([4,2,56,44,2, ..])

+
+
+ +
+ +
+
+get_velocity_cell_coordinates(vcellids, pop='proton')
+

Returns a given velocity cell’s coordinates as a numpy array

+

Arguments: +:param vcellids: The velocity cell’s ID +:returns: a numpy array with the coordinates

+ +
+ +
+
+get_velocity_cell_ids(vcellcoord, pop='proton')
+

Returns velocity cell ids of given coordinate

+

Arguments: +:param vcellcoords: One 3d coordinate +:returns: Velocity cell id

+ +
+ +
+
+get_velocity_mesh_dv(pop='proton')
+

Read velocity mesh cell size

+
+
Returns:
+

Velocity mesh cell size, array with three elements [dvx, dvy, dvz]

+
+
+
+ +
+
+get_velocity_mesh_extent(pop='proton')
+

Read velocity mesh extent

+
+
Returns:
+

Maximum and minimum coordinates of the mesh, [vxmin, vymin, vzmin, vxmax, vymax, vzmax]

+
+
+
+ +
+
+get_velocity_mesh_size(pop='proton')
+

Read velocity mesh size

+
+
Returns:
+

Size of mesh in number of blocks, array with three elements

+
+
+
+ +
+
+get_vertex_coordinates_from_indices(indices)
+

Convert vertex indices to physical coordinates. +:param indices: numpy array of vertex indices, either (3,) or (N,3)

+
+
Returns:
+

numpy array of coordinates, with matching shape to indices

+
+
+
+ +
+
+get_vertex_indices(coordinates)
+

Get dual grid vertex indices for all coordinates.

+

Works by truncation to integer indices at fsgrid resolution, for cell low-corners. +:param coordinates: np.array of coordinates, shaped either (3,) or (N,3)

+
+ +
+
+list(parameter=True, variable=True, mesh=False, datareducer=False, operator=False, other=False)
+

Print out a description of the content of the file. Useful +for interactive usage. Default is to list parameters and variables, query selection can be adjusted with keywords:

+

Default and supported keywords:

+

parameter=True +variable=True +mesh=False +datareducer=False +operator=False +other=False

+
+ +
+
+optimize_clear_fileindex_for_cellid()
+

Clears a private variable containing cell ids and their locations

+
+

Note

+

This should only be used for optimization purposes.

+
+
+ +
+
+optimize_clear_fileindex_for_cellid_blocks()
+

Clears a private variable containing number of blocks and offsets for particular cell ids

+
+

Note

+

This should only be used for optimization purposes.

+
+
+ +
+
+optimize_close_file()
+

Closes the vlsv file +Files are opened and closed automatically upon reading and in the case of reading multiple times it will help to keep the file open with this command

+
+

Note

+

This should only be used for optimization purposes.

+
+
+ +
+
+optimize_open_file()
+

Opens the vlsv file for reading +Files are opened and closed automatically upon reading and in the case of reading multiple times it will help to keep the file open with this command

+
+

Note

+

This should only be used for optimization purposes.

+
+
+ +
+
+print_config()
+

Prints config information from VLSV file.

+

:returns True if config is found otherwise returns False

+
+ +
+
+print_version()
+

Prints version information from VLSV file. +TAG is hardcoded to VERSION

+

:returns True if version is found otherwise returns False

+
+ +
+
+read(name='', tag='', mesh='', operator='pass', cellids=-1)
+

Read data from the open vlsv file.

+
+
Parameters:
+
    +
  • name – Name of the data array

  • +
  • tag – Tag of the data array.

  • +
  • mesh – Mesh for the data array

  • +
  • operator – Datareduction operator. “pass” does no operation on data.

  • +
  • cellids – If -1 then all data is read. If nonzero then only the vector +for the specified cell id or cellids is read

  • +
+
+
Returns:
+

numpy array with the data

+
+
+ +
+ +
+
+read_attribute(name='', mesh='', attribute='', tag='')
+

Read data from the open vlsv file.

+
+
Parameters:
+
    +
  • name – Name of the data array

  • +
  • tag – Tag of the data array.

  • +
  • mesh – Mesh for the data array

  • +
  • operator – Datareduction operator. “pass” does no operation on data.

  • +
  • cellids – If -1 then all data is read. If nonzero then only the vector +for the specified cell id or cellids is read

  • +
+
+
Returns:
+

numpy array with the data

+
+
+ +
+ +
+
+read_blocks(cellid, pop='proton')
+

Read raw block data from the open file and return the data along with block ids

+
+
Parameters:
+

cellid – Cell ID of the cell whose velocity blocks are read

+
+
Returns:
+

A numpy array with block ids and data eg [array([2, 5, 6, 234, 21]), array([1.0e-8, 2.1e-8, 2.1e-8, 0, 4.0e-8])]

+
+
+
+

See also

+

read_velocity_cells()

+
+
+ +
+
+read_fsgrid_variable(name, operator='pass')
+

Reads fsgrid variables from the open vlsv file. +Arguments: +:param name: Name of the variable +:param operator: Datareduction operator. “pass” does no operation on data +:returns: ordered numpy array with the data

+

… seealso:: read_variable()

+
+ +
+
+read_fsgrid_variable_cellid(name, cellids=-1, operator='pass')
+

Reads fsgrid variables from the open vlsv file. +Arguments: +:param name: Name of the variable +:param cellids: SpatialGrid cellids for which to fetch data. Default: return full fsgrid data +:param operator: Datareduction operator. “pass” does no operation on data +:returns: ordered list of numpy arrays with the data

+

… seealso:: read_fsgrid_variable()

+
+ +
+
+read_interpolated_fsgrid_variable(name, coordinates, operator='pass', periodic=[True, True, True], method='linear')
+

Read a linearly interpolated FSgrid variable value from the open vlsv file. Feel free to vectorize! +Note that this does not account for varying centerings of fsgrid data. +Arguments: +:param name: Name of the (FSgrid) variable +:param coords: Coordinates from which to read data +:param periodic: Periodicity of the system. Default is periodic in all dimension +:param operator: Datareduction operator. “pass” does no operation on data +:returns: numpy array with the data

+ +
+ +
+
+read_interpolated_ionosphere_variable(name, coordinates, operator='pass', method='linear')
+

Read a linearly interpolated ionosphere variable value from the open vlsv file. +Arguments: +:param name: Name of the (ionosphere) variable +:param coords: Coordinates (x,y,z) from which to read data +:param operator: Datareduction operator. “pass” does no operation on data +:param method: Interpolation method. Not implemented; barycentric interp would fall under linear. +:returns: numpy array with the data

+ +
+ +
+
+read_interpolated_variable(name, coords, operator='pass', periodic=[True, True, True], method='linear')
+

Read a linearly interpolated variable value from the open vlsv file. +Arguments: +:param name: Name of the variable +:param coords: Coordinates from which to read data +:param periodic: Periodicity of the system. Default is periodic in all dimension +:param operator: Datareduction operator. “pass” does no operation on data +:param method: Interpolation method, default “linear”, options: [“nearest”, “linear”]

+
+
Returns:
+

numpy array with the data

+
+
+ +
+ +
+
+read_interpolated_variable_irregular(name, coords, operator='pass', periodic=[True, True, True], method='linear', methodargs={'delaunay': {'qhull_options': 'QJ'}, 'rbf': {'neighbors': 64}})
+

Read a linearly interpolated variable value from the open vlsv file. +Arguments:

+
+
Parameters:
+
    +
  • name – Name of the variable

  • +
  • coords – Coordinates from which to read data

  • +
  • periodic – Periodicity of the system. Default is periodic in all dimension

  • +
  • operator – Datareduction operator. “pass” does no operation on data

  • +
  • method – Method for interpolation, default “linear” (“nearest”, “rbf, “delaunay”)

  • +
  • methodargs

    Dict of dicts to pass kwargs to interpolators. Default values for “rbf”, “delaunay”;

    +

    see scipy.interpolate.RBFInterpolator for rbf and scipy.interpolate.LinearNDInterpolator for delaunay

    +

  • +
+
+
Returns:
+

numpy array with the data

+
+
+ +
+ +
+
+read_ionosphere_node_variable_at_elements(varname)
+

Interpolate an ionospheric node variavle to the element barycenters

+
+
Parameters:
+

varname – string, specifying variable (or data reducer) defined at ionosphere nodes

+
+
Returns:
+

specified variable interpolated to the elements’ barycenters

+

note: linear barycentric interpolation is just the sum of 3 corner values divided by 3!

+

TODO: check behavior for var.ndim>1

+

+
+
+
+ +
+
+read_ionosphere_variable(name, operator='pass')
+

Reads fsgrid variables from the open vlsv file. +Arguments: +:param name: Name of the variable +:param operator: Datareduction operator. “pass” does no operation on data +:returns: numpy array with the data in node order

+

… seealso:: read_variable()

+
+ +
+
+read_metadata(name='', tag='', mesh='')
+

Read variable metadata from the open vlsv file.

+
+
Parameters:
+
    +
  • name – Name of the data array

  • +
  • tag – Tag of the data array.

  • +
  • mesh – Mesh for the data array

  • +
+
+
Returns:
+

four strings: +the unit of the variable as a regular string +the unit of the variable as a LaTeX-formatted string +the description of the variable as a LaTeX-formatted string +the conversion factor to SI units as a string

+
+
+
+ +
+
+read_parameter(name)
+

Read a parameter from the vlsv file

+
+
Parameters:
+

name – Name of the parameter

+
+
Returns:
+

The parameter value

+
+
+ +
+ +
+
+read_variable(name, cellids=-1, operator='pass')
+

Read variables from the open vlsv file. +Arguments: +:param name: Name of the variable +:param cellids: a value of -1 reads all data +:param operator: Datareduction operator. “pass” does no operation on data +:returns: numpy array with the data

+ +
+ +
+
+read_variable_from_cache(name, cellids, operator)
+

Read variable from cache instead of the vlsv file. +:param name: Name of the variable +:param cellids: a value of -1 reads all data +:param operator: Datareduction operator. “pass” does no operation on data +:returns: numpy array with the data, same format as read_variable

+
+

See also

+

read_variable()

+
+
+ +
+
+read_variable_info(name, cellids=-1, operator='pass')
+

Read variables from the open vlsv file and input the data into VariableInfo

+
+
Parameters:
+
    +
  • name – Name of the variable

  • +
  • cellids – a value of -1 reads all data

  • +
  • operator – Datareduction operator. “pass” does no operation on data

  • +
+
+
Returns:
+

numpy array with the data

+
+
+
+

See also

+

read_variable()

+
+
+ +
+
+read_variable_to_cache(name, operator='pass')
+

Read variable from vlsv file to cache, for the whole grid and after applying +operator. +:param name: Name of the variable (or datareducer) +:param operator: Datareduction operator. “pass” does no operation on data.

+
+ +
+
+read_velocity_cells(cellid, pop='proton')
+

Read velocity cells from a spatial cell

+
+
Parameters:
+

cellid – Cell ID of the cell whose velocity cells the function will read

+
+
Returns:
+

Map of velocity cell ids (unique for every velocity cell) and corresponding value

+
+
+

#Example:

+

example_cellid = 1111

+

velocity_cell_map = vlsvReader.read_velocity_cells(example_cellid) +velocity_cell_ids = velocity_cell_map.keys() +velocity_cell_values = velocity_cell_map.values()

+

random_index = 4 # Just some index +random_velocity_cell_id = velocity_cell_ids[random_index]

+

print (“Velocity cell value at velocity cell id “ + str(random_velocity_cell_id) + “: “ + str(velocity_cell_map[random_velocity_cell_id]))

+

# Getting the corresponding coordinates might be more useful than having the velocity cell id so: +velocity_cell_coordinates = vlsvReader.get_velocity_cell_coordinates(velocity_cell_ids) # Get velocity cell coordinates corresponding to each velocity cell id

+

random_velocity_cell_coordinates = velocity_cell_ids[random_index] +print(“Velocity cell value at velocity cell id “ + str(random_velocity_cell_id) + “and coordinates “ + str(random_velocity_cell_coordinates) + “: “ + str(velocity_cell_map[random_velocity_cell_id]))

+
+

See also

+

read_blocks()

+
+
+ +
+
+upsample_fsgrid_subarray(cellid, var, array)
+

Set the elements of the fsgrid array to the value of corresponding SpatialGrid +cellid. Mutator for array.

+
+ +
+ +
+
+class pytools.vlsvfile.VlsvWriter(vlsvReader, file_name, copy_meshes=None, clone=False)
+

Class for reading VLSV files

+
+
+clone_file(vlsvReader, dst)
+

Simply copies overs the file in vlsvReader to a fresh new file +:param vlsvReader: Some open vlsv file +:param dst: Name of output file

+
+ +
+
+copy_variables(vlsvReader, varlist=None)
+

Copies variables from vlsv reader to the file. +varlist = None: list of variables to copy; if no +varlist is provided, copy all variables (default)

+
+ +
+
+copy_variables_list(vlsvReader, vars)
+

Copies variables in the list vars from vlsv reader to the file

+
+ +
+
+write(data, name, tag, mesh, extra_attribs={})
+

Writes an array into the vlsv file

+
+
Parameters:
+
    +
  • name – Name of the data array

  • +
  • tag – Tag of the data array.

  • +
  • mesh – Mesh for the data array

  • +
  • extra_attribs – Dictionary with whatever xml attributes that should be defined in the array that aren’t name, tag, or mesh

  • +
+
+
Returns:
+

True if the data was written successfully

+
+
+
+ +
+
+write_variable(data, name, mesh, units, latex, latexunits, unitConversion, extra_attribs={})
+

Writes an array into the vlsv file as a variable; requires input of metadata required by VlsvReader +:param data: The variable data (array) +:param name: Name of the data array +:param mesh: Mesh for the data array +:param latex: LaTeX string representation of the variable name +:param units: plaintext string representation of the unit +:param latexunits: LaTeX string representation of the unit +:param unitConversion: string representation of the unit conversion to get to SI +:param extra_attribs: Dictionary with whatever xml attributes that should be defined in the array that aren’t name, tag, or mesh.

+
+
Returns:
+

True if the data was written successfully

+
+
+
+ +
+
+write_variable_info(varinfo, mesh, unitConversion, extra_attribs={})
+

Writes an array into the vlsv file as a variable; requires input of metadata required by VlsvReader

+
+
Parameters:
+
    +
  • varinfo – VariableInfo object containing +-data: The variable data (array) +-name: Name of the data array +-latex: LaTeX string representation of the variable name +-units: plaintext string representation of the unit +-latexunits: LaTeX string representation of the unit

  • +
  • mesh – Mesh for the data array

  • +
  • unitConversion – string representation of the unit conversion to get to SI

  • +
  • extra_attribs – Dictionary with whatever xml attributes that should be defined in the array that aren’t name, tag, or mesh, +or contained in varinfo. Can be used to overwrite varinfo values besids name.

  • +
+
+
Returns:
+

True if the data was written successfully

+
+
+
+ +
+
+write_velocity_space(vlsvReader, cellid, blocks_and_values)
+

Writes given velocity space into vlsv file

+
+
Parameters:
+
    +
  • vlsvReader – Some open vlsv reader file with velocity space in the given cell id

  • +
  • cellid – Given cellid

  • +
  • blocks_and_values – Blocks and values in list format e.g. [[block1,block2,..], [block1_values, block2_values,..]] where block1_values are velocity block values (list length 64)

  • +
+
+
+
+ +
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file