From 6a378f396d5817311bb2f6bb071034efe446f938 Mon Sep 17 00:00:00 2001 From: Freddie Akeroyd Date: Sat, 6 Aug 2016 17:23:39 +0100 Subject: [PATCH 0001/1813] Initial Home page --- Home.rest | 1 + 1 file changed, 1 insertion(+) create mode 100644 Home.rest diff --git a/Home.rest b/Home.rest new file mode 100644 index 0000000..41a5585 --- /dev/null +++ b/Home.rest @@ -0,0 +1 @@ +Welcome to the ibex_user_manual wiki! From 46d49d5b738a32938c826137f9d05df9eaadedf1 Mon Sep 17 00:00:00 2001 From: Freddie Akeroyd Date: Sat, 6 Aug 2016 18:05:50 +0100 Subject: [PATCH 0002/1813] Initial commit --- Concepts/Blocks.rest | 16 ++++++++++++ Concepts/ProcessVariables.rest | 32 +++++++++++++++++++++++ Concepts/_Footer.rest | 1 + Home.rest | 11 ++++++++ Introduction/StartingAndStoppingIBEX.rest | 2 ++ Introduction/WhatIsIBEX.rest | 14 ++++++++++ Introduction/_Footer.rest | 1 + 7 files changed, 77 insertions(+) create mode 100644 Concepts/Blocks.rest create mode 100644 Concepts/ProcessVariables.rest create mode 100644 Concepts/_Footer.rest create mode 100644 Introduction/StartingAndStoppingIBEX.rest create mode 100644 Introduction/WhatIsIBEX.rest create mode 100644 Introduction/_Footer.rest diff --git a/Concepts/Blocks.rest b/Concepts/Blocks.rest new file mode 100644 index 0000000..88f5e83 --- /dev/null +++ b/Concepts/Blocks.rest @@ -0,0 +1,16 @@ +Blocks +====== + +The IBEX concept of a block is similar to SECI, in that it is a +relevant piece of information chosen by the scientist that will +be displayed on the instrument dashboard and logged into the +datafile. + +Under the hood, a block is a process variable with a well known +prefix. For example block Chop1Freq on LARMOR would be +the process variable IN:LARMOR:CS:SB:Chop1Freq +Utilities like genie_python know about blocsk and you can use commands such +as cset to access Chop1Freq. However you can access blocks using +the name IN:LARMOR:CS:SB:Chop1Freq with any standard episc tool + + diff --git a/Concepts/ProcessVariables.rest b/Concepts/ProcessVariables.rest new file mode 100644 index 0000000..a80ed3e --- /dev/null +++ b/Concepts/ProcessVariables.rest @@ -0,0 +1,32 @@ +Process Variables +================= + +A key cobncepr in EPICS, and hence IBEX, is the process variable. +In the underlying EPICS framework, a process variable is a named piece of +information that can be read/monitored/changed. Information from hardware +deviecs and elsewhere is exposed as process variables, and devices are +controlled by writing to the appropriate process variables. + +Naming +------ + +Process varuiabkle names are a stribng of alpha-numeric charatceters +with : used to separate sections and certain sections following naming +conventones. + +For an instrument all process variables relevant to that instrument will start with the IN: prefil followed by the instrument name followed by deviec specific details. For example + +IN:LARMOR:DAE:GOODUAH good microams on LARMOR +IN:IMAT:DAE:GOODUAH good microams on LARMOR + +Items not part of an instrument have a differenct to prefix. For example, the accelerator generates values with a top prefix of AC: such as + +AC:TS1:BEAM:CURR TS1 beam current + + +Displaying +---------- + +caget IN:LARMOR:DAE:GOODUAH +camonitor IN:LARMOR:DAE:GOODUAH + diff --git a/Concepts/_Footer.rest b/Concepts/_Footer.rest new file mode 100644 index 0000000..fa134e1 --- /dev/null +++ b/Concepts/_Footer.rest @@ -0,0 +1 @@ +Concepts diff --git a/Home.rest b/Home.rest index 41a5585..83b9bb7 100644 --- a/Home.rest +++ b/Home.rest @@ -1 +1,12 @@ Welcome to the ibex_user_manual wiki! + +.. toctree:: + :maxdepth: 2 + :numbered: + :titlesonly: + :glob: + :hidden: + + Introduction/WhatIsIBEX.rest + Concepts/ProcessVariables.rest + diff --git a/Introduction/StartingAndStoppingIBEX.rest b/Introduction/StartingAndStoppingIBEX.rest new file mode 100644 index 0000000..0f17115 --- /dev/null +++ b/Introduction/StartingAndStoppingIBEX.rest @@ -0,0 +1,2 @@ +Starting and Stopping IBEX +========================== diff --git a/Introduction/WhatIsIBEX.rest b/Introduction/WhatIsIBEX.rest new file mode 100644 index 0000000..32fa82e --- /dev/null +++ b/Introduction/WhatIsIBEX.rest @@ -0,0 +1,14 @@ +What is IBEX +============ + +IBEX is the new instrument control program, it is intended to replace SECI. Most device control is curerntly performed using LabVIEW while LabVIEW will not disappear entirely we will be using EPICS for most deviec control. When LabVIEw is requierd ,i it will be wrapped in EPICS. + +IBEX and SECI Similarities +-------------------------- + +Both IBEX and SECI have block and dashboard + +IBEX and SECI Differences +-------------------------- + +IBEX is client-server based, whihc means that the IBEX GUI is itself not the instrument control program. You can thus close the IBEX GUI without stopping control of devices, and also run multiple instances of the GUI on the same or different computers diff --git a/Introduction/_Footer.rest b/Introduction/_Footer.rest new file mode 100644 index 0000000..e18e026 --- /dev/null +++ b/Introduction/_Footer.rest @@ -0,0 +1 @@ +Introduction From 1d086eb14752d94eb794b032f3a201a67d08305b Mon Sep 17 00:00:00 2001 From: Freddie Akeroyd Date: Sat, 6 Aug 2016 19:03:54 +0100 Subject: [PATCH 0003/1813] Update --- Home.rest | 4 +++- Introduction/WhatIsIBEX.rest | 2 ++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/Home.rest b/Home.rest index 83b9bb7..43144d8 100644 --- a/Home.rest +++ b/Home.rest @@ -1,4 +1,3 @@ -Welcome to the ibex_user_manual wiki! .. toctree:: :maxdepth: 2 @@ -10,3 +9,6 @@ Welcome to the ibex_user_manual wiki! Introduction/WhatIsIBEX.rest Concepts/ProcessVariables.rest +Welcome to the ibex_user_manual wiki! + +:ref:`what_is_ibex` diff --git a/Introduction/WhatIsIBEX.rest b/Introduction/WhatIsIBEX.rest index 32fa82e..f0caea9 100644 --- a/Introduction/WhatIsIBEX.rest +++ b/Introduction/WhatIsIBEX.rest @@ -1,3 +1,5 @@ +.. _what_is_ibex + What is IBEX ============ From 1493ac98831d96c3f00d565432048e8f3e51e9fc Mon Sep 17 00:00:00 2001 From: Freddie Akeroyd Date: Sat, 6 Aug 2016 20:01:48 +0100 Subject: [PATCH 0004/1813] Add sphinx build --- .gitignore | 1 + Home.rest | 17 ++- Introduction/WhatIsIBEX.rest | 2 +- Makefile | 177 ++++++++++++++++++++++++ conf.py | 258 +++++++++++++++++++++++++++++++++++ make.bat | 242 ++++++++++++++++++++++++++++++++ 6 files changed, 692 insertions(+), 5 deletions(-) create mode 100644 .gitignore create mode 100644 Makefile create mode 100644 conf.py create mode 100644 make.bat diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..69fa449 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +_build/ diff --git a/Home.rest b/Home.rest index 43144d8..8b8a036 100644 --- a/Home.rest +++ b/Home.rest @@ -1,14 +1,23 @@ +Welcome to IBEX User Manual's documentation! +============================================ .. toctree:: :maxdepth: 2 :numbered: :titlesonly: - :glob: :hidden: - + Introduction/WhatIsIBEX.rest + Introduction/StartingAndStoppingIBEX.rest Concepts/ProcessVariables.rest - -Welcome to the ibex_user_manual wiki! + Concepts/Blocks.rest :ref:`what_is_ibex` + +Indices and tables +================== + +* :ref:`genindex` +* :ref:`modindex` +* :ref:`search` + diff --git a/Introduction/WhatIsIBEX.rest b/Introduction/WhatIsIBEX.rest index f0caea9..af0a33b 100644 --- a/Introduction/WhatIsIBEX.rest +++ b/Introduction/WhatIsIBEX.rest @@ -1,4 +1,4 @@ -.. _what_is_ibex +.. _what_is_ibex: What is IBEX ============ diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..e26462c --- /dev/null +++ b/Makefile @@ -0,0 +1,177 @@ +# Makefile for Sphinx documentation +# + +# You can set these variables from the command line. +SPHINXOPTS = +SPHINXBUILD = sphinx-build +PAPER = +BUILDDIR = _build + +# User-friendly check for sphinx-build +ifeq ($(shell which $(SPHINXBUILD) >/dev/null 2>&1; echo $$?), 1) +$(error The '$(SPHINXBUILD)' command was not found. Make sure you have Sphinx installed, then set the SPHINXBUILD environment variable to point to the full path of the '$(SPHINXBUILD)' executable. Alternatively you can add the directory with the executable to your PATH. If you don't have Sphinx installed, grab it from http://sphinx-doc.org/) +endif + +# Internal variables. +PAPEROPT_a4 = -D latex_paper_size=a4 +PAPEROPT_letter = -D latex_paper_size=letter +ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . +# the i18n builder cannot share the environment and doctrees with the others +I18NSPHINXOPTS = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . + +.PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest gettext + +help: + @echo "Please use \`make ' where is one of" + @echo " html to make standalone HTML files" + @echo " dirhtml to make HTML files named index.html in directories" + @echo " singlehtml to make a single large HTML file" + @echo " pickle to make pickle files" + @echo " json to make JSON files" + @echo " htmlhelp to make HTML files and a HTML help project" + @echo " qthelp to make HTML files and a qthelp project" + @echo " devhelp to make HTML files and a Devhelp project" + @echo " epub to make an epub" + @echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter" + @echo " latexpdf to make LaTeX files and run them through pdflatex" + @echo " latexpdfja to make LaTeX files and run them through platex/dvipdfmx" + @echo " text to make text files" + @echo " man to make manual pages" + @echo " texinfo to make Texinfo files" + @echo " info to make Texinfo files and run them through makeinfo" + @echo " gettext to make PO message catalogs" + @echo " changes to make an overview of all changed/added/deprecated items" + @echo " xml to make Docutils-native XML files" + @echo " pseudoxml to make pseudoxml-XML files for display purposes" + @echo " linkcheck to check all external links for integrity" + @echo " doctest to run all doctests embedded in the documentation (if enabled)" + +clean: + rm -rf $(BUILDDIR)/* + +html: + $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html + @echo + @echo "Build finished. The HTML pages are in $(BUILDDIR)/html." + +dirhtml: + $(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml + @echo + @echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml." + +singlehtml: + $(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml + @echo + @echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml." + +pickle: + $(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle + @echo + @echo "Build finished; now you can process the pickle files." + +json: + $(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json + @echo + @echo "Build finished; now you can process the JSON files." + +htmlhelp: + $(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp + @echo + @echo "Build finished; now you can run HTML Help Workshop with the" \ + ".hhp project file in $(BUILDDIR)/htmlhelp." + +qthelp: + $(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp + @echo + @echo "Build finished; now you can run "qcollectiongenerator" with the" \ + ".qhcp project file in $(BUILDDIR)/qthelp, like this:" + @echo "# qcollectiongenerator $(BUILDDIR)/qthelp/IBEXUserManual.qhcp" + @echo "To view the help file:" + @echo "# assistant -collectionFile $(BUILDDIR)/qthelp/IBEXUserManual.qhc" + +devhelp: + $(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp + @echo + @echo "Build finished." + @echo "To view the help file:" + @echo "# mkdir -p $$HOME/.local/share/devhelp/IBEXUserManual" + @echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/IBEXUserManual" + @echo "# devhelp" + +epub: + $(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub + @echo + @echo "Build finished. The epub file is in $(BUILDDIR)/epub." + +latex: + $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex + @echo + @echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex." + @echo "Run \`make' in that directory to run these through (pdf)latex" \ + "(use \`make latexpdf' here to do that automatically)." + +latexpdf: + $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex + @echo "Running LaTeX files through pdflatex..." + $(MAKE) -C $(BUILDDIR)/latex all-pdf + @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." + +latexpdfja: + $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex + @echo "Running LaTeX files through platex and dvipdfmx..." + $(MAKE) -C $(BUILDDIR)/latex all-pdf-ja + @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." + +text: + $(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text + @echo + @echo "Build finished. The text files are in $(BUILDDIR)/text." + +man: + $(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man + @echo + @echo "Build finished. The manual pages are in $(BUILDDIR)/man." + +texinfo: + $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo + @echo + @echo "Build finished. The Texinfo files are in $(BUILDDIR)/texinfo." + @echo "Run \`make' in that directory to run these through makeinfo" \ + "(use \`make info' here to do that automatically)." + +info: + $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo + @echo "Running Texinfo files through makeinfo..." + make -C $(BUILDDIR)/texinfo info + @echo "makeinfo finished; the Info files are in $(BUILDDIR)/texinfo." + +gettext: + $(SPHINXBUILD) -b gettext $(I18NSPHINXOPTS) $(BUILDDIR)/locale + @echo + @echo "Build finished. The message catalogs are in $(BUILDDIR)/locale." + +changes: + $(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes + @echo + @echo "The overview file is in $(BUILDDIR)/changes." + +linkcheck: + $(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck + @echo + @echo "Link check complete; look for any errors in the above output " \ + "or in $(BUILDDIR)/linkcheck/output.txt." + +doctest: + $(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest + @echo "Testing of doctests in the sources finished, look at the " \ + "results in $(BUILDDIR)/doctest/output.txt." + +xml: + $(SPHINXBUILD) -b xml $(ALLSPHINXOPTS) $(BUILDDIR)/xml + @echo + @echo "Build finished. The XML files are in $(BUILDDIR)/xml." + +pseudoxml: + $(SPHINXBUILD) -b pseudoxml $(ALLSPHINXOPTS) $(BUILDDIR)/pseudoxml + @echo + @echo "Build finished. The pseudo-XML files are in $(BUILDDIR)/pseudoxml." diff --git a/conf.py b/conf.py new file mode 100644 index 0000000..b05c193 --- /dev/null +++ b/conf.py @@ -0,0 +1,258 @@ +# -*- coding: utf-8 -*- +# +# IBEX User Manual documentation build configuration file, created by +# sphinx-quickstart on Sat Aug 6 19:23:59 2016. +# +# This file is execfile()d with the current directory set to its +# containing dir. +# +# Note that not all possible configuration values are present in this +# autogenerated file. +# +# All configuration values have a default; values that are commented out +# serve to show the default. + +import sys +import os + +# If extensions (or modules to document with autodoc) are in another directory, +# add these directories to sys.path here. If the directory is relative to the +# documentation root, use os.path.abspath to make it absolute, like shown here. +#sys.path.insert(0, os.path.abspath('.')) + +# -- General configuration ------------------------------------------------ + +# If your documentation needs a minimal Sphinx version, state it here. +#needs_sphinx = '1.0' + +# Add any Sphinx extension module names here, as strings. They can be +# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom +# ones. +extensions = [] + +# Add any paths that contain templates here, relative to this directory. +templates_path = ['_templates'] + +# The suffix of source filenames. +source_suffix = '.rest' + +# The encoding of source files. +#source_encoding = 'utf-8-sig' + +# The master toctree document. +master_doc = 'Home' + +# General information about the project. +project = u'IBEX User Manual' +copyright = u'2016, ISIS Computing Group' + +# The version info for the project you're documenting, acts as replacement for +# |version| and |release|, also used in various other places throughout the +# built documents. +# +# The short X.Y version. +version = '1.0' +# The full version, including alpha/beta/rc tags. +release = '1.0' + +# The language for content autogenerated by Sphinx. Refer to documentation +# for a list of supported languages. +#language = None + +# There are two options for replacing |today|: either, you set today to some +# non-false value, then it is used: +#today = '' +# Else, today_fmt is used as the format for a strftime call. +#today_fmt = '%B %d, %Y' + +# List of patterns, relative to source directory, that match files and +# directories to ignore when looking for source files. +exclude_patterns = ['_build'] + +# The reST default role (used for this markup: `text`) to use for all +# documents. +#default_role = None + +# If true, '()' will be appended to :func: etc. cross-reference text. +#add_function_parentheses = True + +# If true, the current module name will be prepended to all description +# unit titles (such as .. function::). +#add_module_names = True + +# If true, sectionauthor and moduleauthor directives will be shown in the +# output. They are ignored by default. +#show_authors = False + +# The name of the Pygments (syntax highlighting) style to use. +pygments_style = 'sphinx' + +# A list of ignored prefixes for module index sorting. +#modindex_common_prefix = [] + +# If true, keep warnings as "system message" paragraphs in the built documents. +#keep_warnings = False + + +# -- Options for HTML output ---------------------------------------------- + +# The theme to use for HTML and HTML Help pages. See the documentation for +# a list of builtin themes. +html_theme = 'default' + +# Theme options are theme-specific and customize the look and feel of a theme +# further. For a list of options available for each theme, see the +# documentation. +#html_theme_options = {} + +# Add any paths that contain custom themes here, relative to this directory. +#html_theme_path = [] + +# The name for this set of Sphinx documents. If None, it defaults to +# " v documentation". +#html_title = None + +# A shorter title for the navigation bar. Default is the same as html_title. +#html_short_title = None + +# The name of an image file (relative to this directory) to place at the top +# of the sidebar. +#html_logo = None + +# The name of an image file (within the static path) to use as favicon of the +# docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32 +# pixels large. +#html_favicon = None + +# Add any paths that contain custom static files (such as style sheets) here, +# relative to this directory. They are copied after the builtin static files, +# so a file named "default.css" will overwrite the builtin "default.css". +html_static_path = ['_static'] + +# Add any extra paths that contain custom files (such as robots.txt or +# .htaccess) here, relative to this directory. These files are copied +# directly to the root of the documentation. +#html_extra_path = [] + +# If not '', a 'Last updated on:' timestamp is inserted at every page bottom, +# using the given strftime format. +#html_last_updated_fmt = '%b %d, %Y' + +# If true, SmartyPants will be used to convert quotes and dashes to +# typographically correct entities. +#html_use_smartypants = True + +# Custom sidebar templates, maps document names to template names. +#html_sidebars = {} + +# Additional templates that should be rendered to pages, maps page names to +# template names. +#html_additional_pages = {} + +# If false, no module index is generated. +#html_domain_indices = True + +# If false, no index is generated. +#html_use_index = True + +# If true, the index is split into individual pages for each letter. +#html_split_index = False + +# If true, links to the reST sources are added to the pages. +#html_show_sourcelink = True + +# If true, "Created using Sphinx" is shown in the HTML footer. Default is True. +#html_show_sphinx = True + +# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True. +#html_show_copyright = True + +# If true, an OpenSearch description file will be output, and all pages will +# contain a tag referring to it. The value of this option must be the +# base URL from which the finished HTML is served. +#html_use_opensearch = '' + +# This is the file name suffix for HTML files (e.g. ".xhtml"). +#html_file_suffix = None + +# Output file base name for HTML help builder. +htmlhelp_basename = 'IBEXUserManualdoc' + + +# -- Options for LaTeX output --------------------------------------------- + +latex_elements = { +# The paper size ('letterpaper' or 'a4paper'). +#'papersize': 'letterpaper', + +# The font size ('10pt', '11pt' or '12pt'). +#'pointsize': '10pt', + +# Additional stuff for the LaTeX preamble. +#'preamble': '', +} + +# Grouping the document tree into LaTeX files. List of tuples +# (source start file, target name, title, +# author, documentclass [howto, manual, or own class]). +latex_documents = [ + ('Home.rest', 'IBEXUserManual.tex', u'IBEX User Manual Documentation', + u'ISIS Computing Group', 'manual'), +] + +# The name of an image file (relative to this directory) to place at the top of +# the title page. +#latex_logo = None + +# For "manual" documents, if this is true, then toplevel headings are parts, +# not chapters. +#latex_use_parts = False + +# If true, show page references after internal links. +#latex_show_pagerefs = False + +# If true, show URL addresses after external links. +#latex_show_urls = False + +# Documents to append as an appendix to all manuals. +#latex_appendices = [] + +# If false, no module index is generated. +#latex_domain_indices = True + + +# -- Options for manual page output --------------------------------------- + +# One entry per manual page. List of tuples +# (source start file, name, description, authors, manual section). +man_pages = [ + ('Home.rest', 'ibexusermanual', u'IBEX User Manual Documentation', + [u'ISIS Computing Group'], 1) +] + +# If true, show URL addresses after external links. +#man_show_urls = False + + +# -- Options for Texinfo output ------------------------------------------- + +# Grouping the document tree into Texinfo files. List of tuples +# (source start file, target name, title, author, +# dir menu entry, description, category) +texinfo_documents = [ + ('Home.rest', 'IBEXUserManual', u'IBEX User Manual Documentation', + u'ISIS Computing Group', 'IBEXUserManual', 'One line description of project.', + 'Miscellaneous'), +] + +# Documents to append as an appendix to all manuals. +#texinfo_appendices = [] + +# If false, no module index is generated. +#texinfo_domain_indices = True + +# How to display URL addresses: 'footnote', 'no', or 'inline'. +#texinfo_show_urls = 'footnote' + +# If true, do not generate a @detailmenu in the "Top" node's menu. +#texinfo_no_detailmenu = False diff --git a/make.bat b/make.bat new file mode 100644 index 0000000..61a019d --- /dev/null +++ b/make.bat @@ -0,0 +1,242 @@ +@ECHO OFF + +REM Command file for Sphinx documentation + +if "%SPHINXBUILD%" == "" ( + set SPHINXBUILD=sphinx-build +) +set BUILDDIR=_build +set ALLSPHINXOPTS=-d %BUILDDIR%/doctrees %SPHINXOPTS% . +set I18NSPHINXOPTS=%SPHINXOPTS% . +if NOT "%PAPER%" == "" ( + set ALLSPHINXOPTS=-D latex_paper_size=%PAPER% %ALLSPHINXOPTS% + set I18NSPHINXOPTS=-D latex_paper_size=%PAPER% %I18NSPHINXOPTS% +) + +if "%1" == "" goto help + +if "%1" == "help" ( + :help + echo.Please use `make ^` where ^ is one of + echo. html to make standalone HTML files + echo. dirhtml to make HTML files named index.html in directories + echo. singlehtml to make a single large HTML file + echo. pickle to make pickle files + echo. json to make JSON files + echo. htmlhelp to make HTML files and a HTML help project + echo. qthelp to make HTML files and a qthelp project + echo. devhelp to make HTML files and a Devhelp project + echo. epub to make an epub + echo. latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter + echo. text to make text files + echo. man to make manual pages + echo. texinfo to make Texinfo files + echo. gettext to make PO message catalogs + echo. changes to make an overview over all changed/added/deprecated items + echo. xml to make Docutils-native XML files + echo. pseudoxml to make pseudoxml-XML files for display purposes + echo. linkcheck to check all external links for integrity + echo. doctest to run all doctests embedded in the documentation if enabled + goto end +) + +if "%1" == "clean" ( + for /d %%i in (%BUILDDIR%\*) do rmdir /q /s %%i + del /q /s %BUILDDIR%\* + goto end +) + + +%SPHINXBUILD% 2> nul +if errorlevel 9009 ( + echo. + echo.The 'sphinx-build' command was not found. Make sure you have Sphinx + echo.installed, then set the SPHINXBUILD environment variable to point + echo.to the full path of the 'sphinx-build' executable. Alternatively you + echo.may add the Sphinx directory to PATH. + echo. + echo.If you don't have Sphinx installed, grab it from + echo.http://sphinx-doc.org/ + exit /b 1 +) + +if "%1" == "html" ( + %SPHINXBUILD% -b html %ALLSPHINXOPTS% %BUILDDIR%/html + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The HTML pages are in %BUILDDIR%/html. + goto end +) + +if "%1" == "dirhtml" ( + %SPHINXBUILD% -b dirhtml %ALLSPHINXOPTS% %BUILDDIR%/dirhtml + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The HTML pages are in %BUILDDIR%/dirhtml. + goto end +) + +if "%1" == "singlehtml" ( + %SPHINXBUILD% -b singlehtml %ALLSPHINXOPTS% %BUILDDIR%/singlehtml + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The HTML pages are in %BUILDDIR%/singlehtml. + goto end +) + +if "%1" == "pickle" ( + %SPHINXBUILD% -b pickle %ALLSPHINXOPTS% %BUILDDIR%/pickle + if errorlevel 1 exit /b 1 + echo. + echo.Build finished; now you can process the pickle files. + goto end +) + +if "%1" == "json" ( + %SPHINXBUILD% -b json %ALLSPHINXOPTS% %BUILDDIR%/json + if errorlevel 1 exit /b 1 + echo. + echo.Build finished; now you can process the JSON files. + goto end +) + +if "%1" == "htmlhelp" ( + %SPHINXBUILD% -b htmlhelp %ALLSPHINXOPTS% %BUILDDIR%/htmlhelp + if errorlevel 1 exit /b 1 + echo. + echo.Build finished; now you can run HTML Help Workshop with the ^ +.hhp project file in %BUILDDIR%/htmlhelp. + goto end +) + +if "%1" == "qthelp" ( + %SPHINXBUILD% -b qthelp %ALLSPHINXOPTS% %BUILDDIR%/qthelp + if errorlevel 1 exit /b 1 + echo. + echo.Build finished; now you can run "qcollectiongenerator" with the ^ +.qhcp project file in %BUILDDIR%/qthelp, like this: + echo.^> qcollectiongenerator %BUILDDIR%\qthelp\IBEXUserManual.qhcp + echo.To view the help file: + echo.^> assistant -collectionFile %BUILDDIR%\qthelp\IBEXUserManual.ghc + goto end +) + +if "%1" == "devhelp" ( + %SPHINXBUILD% -b devhelp %ALLSPHINXOPTS% %BUILDDIR%/devhelp + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. + goto end +) + +if "%1" == "epub" ( + %SPHINXBUILD% -b epub %ALLSPHINXOPTS% %BUILDDIR%/epub + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The epub file is in %BUILDDIR%/epub. + goto end +) + +if "%1" == "latex" ( + %SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex + if errorlevel 1 exit /b 1 + echo. + echo.Build finished; the LaTeX files are in %BUILDDIR%/latex. + goto end +) + +if "%1" == "latexpdf" ( + %SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex + cd %BUILDDIR%/latex + make all-pdf + cd %BUILDDIR%/.. + echo. + echo.Build finished; the PDF files are in %BUILDDIR%/latex. + goto end +) + +if "%1" == "latexpdfja" ( + %SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex + cd %BUILDDIR%/latex + make all-pdf-ja + cd %BUILDDIR%/.. + echo. + echo.Build finished; the PDF files are in %BUILDDIR%/latex. + goto end +) + +if "%1" == "text" ( + %SPHINXBUILD% -b text %ALLSPHINXOPTS% %BUILDDIR%/text + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The text files are in %BUILDDIR%/text. + goto end +) + +if "%1" == "man" ( + %SPHINXBUILD% -b man %ALLSPHINXOPTS% %BUILDDIR%/man + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The manual pages are in %BUILDDIR%/man. + goto end +) + +if "%1" == "texinfo" ( + %SPHINXBUILD% -b texinfo %ALLSPHINXOPTS% %BUILDDIR%/texinfo + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The Texinfo files are in %BUILDDIR%/texinfo. + goto end +) + +if "%1" == "gettext" ( + %SPHINXBUILD% -b gettext %I18NSPHINXOPTS% %BUILDDIR%/locale + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The message catalogs are in %BUILDDIR%/locale. + goto end +) + +if "%1" == "changes" ( + %SPHINXBUILD% -b changes %ALLSPHINXOPTS% %BUILDDIR%/changes + if errorlevel 1 exit /b 1 + echo. + echo.The overview file is in %BUILDDIR%/changes. + goto end +) + +if "%1" == "linkcheck" ( + %SPHINXBUILD% -b linkcheck %ALLSPHINXOPTS% %BUILDDIR%/linkcheck + if errorlevel 1 exit /b 1 + echo. + echo.Link check complete; look for any errors in the above output ^ +or in %BUILDDIR%/linkcheck/output.txt. + goto end +) + +if "%1" == "doctest" ( + %SPHINXBUILD% -b doctest %ALLSPHINXOPTS% %BUILDDIR%/doctest + if errorlevel 1 exit /b 1 + echo. + echo.Testing of doctests in the sources finished, look at the ^ +results in %BUILDDIR%/doctest/output.txt. + goto end +) + +if "%1" == "xml" ( + %SPHINXBUILD% -b xml %ALLSPHINXOPTS% %BUILDDIR%/xml + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The XML files are in %BUILDDIR%/xml. + goto end +) + +if "%1" == "pseudoxml" ( + %SPHINXBUILD% -b pseudoxml %ALLSPHINXOPTS% %BUILDDIR%/pseudoxml + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The pseudo-XML files are in %BUILDDIR%/pseudoxml. + goto end +) + +:end From 0be9266c1bd358927ce24179243f4e483fa90323 Mon Sep 17 00:00:00 2001 From: Freddie Akeroyd Date: Sat, 6 Aug 2016 20:09:46 +0100 Subject: [PATCH 0005/1813] Updated Home (rest) --- Home.rest | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Home.rest b/Home.rest index 8b8a036..e07f531 100644 --- a/Home.rest +++ b/Home.rest @@ -14,6 +14,11 @@ Welcome to IBEX User Manual's documentation! :ref:`what_is_ibex` +* [[WhatIsIBEX]] +* [[StartingAndStoppingIBEX]] +* [[ProcessVariables]] +* [[Blocks]] + Indices and tables ================== From 5e18dda6edf23a3899c149c7a0228aeec05ccbb8 Mon Sep 17 00:00:00 2001 From: Freddie Akeroyd Date: Sat, 6 Aug 2016 20:22:36 +0100 Subject: [PATCH 0006/1813] Update --- Concepts/Blocks.rest | 2 ++ Concepts/ProcessVariables.rest | 2 ++ Concepts/_Sidebar.rest | 2 ++ Home.rest | 10 ++++------ Introduction/StartingAndStoppingIBEX.rest | 2 ++ Introduction/WhatIsIBEX.rest | 2 +- Introduction/_Sidebar.rest | 2 ++ _Sidebar.rest | 4 ++++ 8 files changed, 19 insertions(+), 7 deletions(-) create mode 100644 Concepts/_Sidebar.rest create mode 100644 Introduction/_Sidebar.rest create mode 100644 _Sidebar.rest diff --git a/Concepts/Blocks.rest b/Concepts/Blocks.rest index 88f5e83..dab4d2a 100644 --- a/Concepts/Blocks.rest +++ b/Concepts/Blocks.rest @@ -1,3 +1,5 @@ +.. _Blocks: + Blocks ====== diff --git a/Concepts/ProcessVariables.rest b/Concepts/ProcessVariables.rest index a80ed3e..eb1467d 100644 --- a/Concepts/ProcessVariables.rest +++ b/Concepts/ProcessVariables.rest @@ -1,3 +1,5 @@ +.. _ProcessVariables: + Process Variables ================= diff --git a/Concepts/_Sidebar.rest b/Concepts/_Sidebar.rest new file mode 100644 index 0000000..1c82e11 --- /dev/null +++ b/Concepts/_Sidebar.rest @@ -0,0 +1,2 @@ +* [[ProcessVariables]] +* [[Blocks]] diff --git a/Home.rest b/Home.rest index e07f531..a54e9a7 100644 --- a/Home.rest +++ b/Home.rest @@ -12,12 +12,10 @@ Welcome to IBEX User Manual's documentation! Concepts/ProcessVariables.rest Concepts/Blocks.rest -:ref:`what_is_ibex` - -* [[WhatIsIBEX]] -* [[StartingAndStoppingIBEX]] -* [[ProcessVariables]] -* [[Blocks]] +* :ref:`WhatIsIBEX` +* :ref:`StartingAndStoppingIBEX` +* :ref:`ProcessVariables` +* :ref:`Blocks` Indices and tables ================== diff --git a/Introduction/StartingAndStoppingIBEX.rest b/Introduction/StartingAndStoppingIBEX.rest index 0f17115..9dd2cfb 100644 --- a/Introduction/StartingAndStoppingIBEX.rest +++ b/Introduction/StartingAndStoppingIBEX.rest @@ -1,2 +1,4 @@ +.. _StartingAndStoppingIBEX: + Starting and Stopping IBEX ========================== diff --git a/Introduction/WhatIsIBEX.rest b/Introduction/WhatIsIBEX.rest index af0a33b..f888738 100644 --- a/Introduction/WhatIsIBEX.rest +++ b/Introduction/WhatIsIBEX.rest @@ -1,4 +1,4 @@ -.. _what_is_ibex: +.. _WhatIsIBEX: What is IBEX ============ diff --git a/Introduction/_Sidebar.rest b/Introduction/_Sidebar.rest new file mode 100644 index 0000000..9d4bd94 --- /dev/null +++ b/Introduction/_Sidebar.rest @@ -0,0 +1,2 @@ +* [[WhatIsIBEX]] +* [[StartingAndStoppingIBEX]] diff --git a/_Sidebar.rest b/_Sidebar.rest new file mode 100644 index 0000000..86b8275 --- /dev/null +++ b/_Sidebar.rest @@ -0,0 +1,4 @@ +* [[WhatIsIBEX]] +* [[StartingAndStoppingIBEX]] +* [[ProcessVariables]] +* [[Blocks]] From faf6c3ed17dbc41d4cc9ed69ad68875ea6073835 Mon Sep 17 00:00:00 2001 From: Freddie Akeroyd Date: Sat, 6 Aug 2016 20:45:59 +0100 Subject: [PATCH 0007/1813] Update --- Home.rest | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Home.rest b/Home.rest index a54e9a7..739bf90 100644 --- a/Home.rest +++ b/Home.rest @@ -17,6 +17,9 @@ Welcome to IBEX User Manual's documentation! * :ref:`ProcessVariables` * :ref:`Blocks` +* `test web link `_ +* + Indices and tables ================== From 6d87b803fea3781644a2dfedf30db5d260f3f06d Mon Sep 17 00:00:00 2001 From: Freddie Akeroyd Date: Sat, 6 Aug 2016 20:56:20 +0100 Subject: [PATCH 0008/1813] Update --- Introduction/WhatIsIBEX.rest | 2 ++ conf.py | 6 +++--- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/Introduction/WhatIsIBEX.rest b/Introduction/WhatIsIBEX.rest index f888738..98c8835 100644 --- a/Introduction/WhatIsIBEX.rest +++ b/Introduction/WhatIsIBEX.rest @@ -5,6 +5,8 @@ What is IBEX IBEX is the new instrument control program, it is intended to replace SECI. Most device control is curerntly performed using LabVIEW while LabVIEW will not disappear entirely we will be using EPICS for most deviec control. When LabVIEw is requierd ,i it will be wrapped in EPICS. +`IBEX and SECI Differences`_ + IBEX and SECI Similarities -------------------------- diff --git a/conf.py b/conf.py index b05c193..0fd8097 100644 --- a/conf.py +++ b/conf.py @@ -196,7 +196,7 @@ # (source start file, target name, title, # author, documentclass [howto, manual, or own class]). latex_documents = [ - ('Home.rest', 'IBEXUserManual.tex', u'IBEX User Manual Documentation', + ('Home', 'IBEXUserManual.tex', u'IBEX User Manual Documentation', u'ISIS Computing Group', 'manual'), ] @@ -226,7 +226,7 @@ # One entry per manual page. List of tuples # (source start file, name, description, authors, manual section). man_pages = [ - ('Home.rest', 'ibexusermanual', u'IBEX User Manual Documentation', + ('Home', 'ibexusermanual', u'IBEX User Manual Documentation', [u'ISIS Computing Group'], 1) ] @@ -240,7 +240,7 @@ # (source start file, target name, title, author, # dir menu entry, description, category) texinfo_documents = [ - ('Home.rest', 'IBEXUserManual', u'IBEX User Manual Documentation', + ('Home', 'IBEXUserManual', u'IBEX User Manual Documentation', u'ISIS Computing Group', 'IBEXUserManual', 'One line description of project.', 'Miscellaneous'), ] From 5914ee948994120229402d163908dcb7229eccee Mon Sep 17 00:00:00 2001 From: Freddie Akeroyd Date: Sat, 6 Aug 2016 21:00:07 +0100 Subject: [PATCH 0009/1813] Update --- Concepts/_Footer.rest | 2 +- Introduction/_Footer.rest | 2 +- _Footer.rest | 1 + 3 files changed, 3 insertions(+), 2 deletions(-) create mode 100644 _Footer.rest diff --git a/Concepts/_Footer.rest b/Concepts/_Footer.rest index fa134e1..e3ba8fd 100644 --- a/Concepts/_Footer.rest +++ b/Concepts/_Footer.rest @@ -1 +1 @@ -Concepts +[[Home]] / Concepts diff --git a/Introduction/_Footer.rest b/Introduction/_Footer.rest index e18e026..acdfb7f 100644 --- a/Introduction/_Footer.rest +++ b/Introduction/_Footer.rest @@ -1 +1 @@ -Introduction +[[Home] / Introduction diff --git a/_Footer.rest b/_Footer.rest new file mode 100644 index 0000000..63b5c9b --- /dev/null +++ b/_Footer.rest @@ -0,0 +1 @@ +[[Home]] From 5c3bfa35bcab4d208142bacfe89741ac2b4231f4 Mon Sep 17 00:00:00 2001 From: Freddie Akeroyd Date: Sat, 6 Aug 2016 21:01:57 +0100 Subject: [PATCH 0010/1813] Update --- Introduction/_Footer.rest | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Introduction/_Footer.rest b/Introduction/_Footer.rest index acdfb7f..a32df1e 100644 --- a/Introduction/_Footer.rest +++ b/Introduction/_Footer.rest @@ -1 +1 @@ -[[Home] / Introduction +[[Home]] / Introduction From 0639ea96dc35e9136e58815e181466fda20327e5 Mon Sep 17 00:00:00 2001 From: Gollum Date: Thu, 11 Aug 2016 12:56:00 +0100 Subject: [PATCH 0011/1813] Updated Home (rest) --- Home.rest | 1 + 1 file changed, 1 insertion(+) diff --git a/Home.rest b/Home.rest index 739bf90..c5363f2 100644 --- a/Home.rest +++ b/Home.rest @@ -27,3 +27,4 @@ Indices and tables * :ref:`modindex` * :ref:`search` +test From e4919ed09bb43aa4d366005b1858bde944e430e8 Mon Sep 17 00:00:00 2001 From: Freddie Akeroyd Date: Thu, 11 Aug 2016 12:56:28 +0100 Subject: [PATCH 0012/1813] Updated Home (rest) --- Home.rest | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Home.rest b/Home.rest index c5363f2..b92a4d4 100644 --- a/Home.rest +++ b/Home.rest @@ -27,4 +27,4 @@ Indices and tables * :ref:`modindex` * :ref:`search` -test +test2 From c30825f191ad5dae2e1fdd901dfcb01009c050cc Mon Sep 17 00:00:00 2001 From: Freddie Akeroyd Date: Fri, 12 Aug 2016 11:47:54 +0100 Subject: [PATCH 0013/1813] Updated Home (rest) --- Home.rest | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Home.rest b/Home.rest index b92a4d4..0497d8d 100644 --- a/Home.rest +++ b/Home.rest @@ -28,3 +28,5 @@ Indices and tables * :ref:`search` test2 + +[[What is ibex|Introduction/WhatIsIBEX.rest]] From 2626614d9ac4e3edf71146b7271fdb62aec96150 Mon Sep 17 00:00:00 2001 From: Freddie Akeroyd Date: Fri, 12 Aug 2016 11:48:17 +0100 Subject: [PATCH 0014/1813] Updated Home (rest) --- Home.rest | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Home.rest b/Home.rest index 0497d8d..7601223 100644 --- a/Home.rest +++ b/Home.rest @@ -29,4 +29,4 @@ Indices and tables test2 -[[What is ibex|Introduction/WhatIsIBEX.rest]] +[[What is ibex|Introduction/WhatIsIBEX]] From b7e5eb365d44ffe5be7fde3a31f83ef98d997716 Mon Sep 17 00:00:00 2001 From: Freddie Akeroyd Date: Fri, 12 Aug 2016 11:50:08 +0100 Subject: [PATCH 0015/1813] Updated Home (rest) --- Home.rest | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Home.rest b/Home.rest index 7601223..0c5686e 100644 --- a/Home.rest +++ b/Home.rest @@ -30,3 +30,5 @@ Indices and tables test2 [[What is ibex|Introduction/WhatIsIBEX]] + +[[What is ibex|WhatIsIBEX]] From 3af4076f01bc240fd7c95bedd8cacd7c55ae6795 Mon Sep 17 00:00:00 2001 From: Freddie Akeroyd Date: Fri, 12 Aug 2016 11:56:20 +0100 Subject: [PATCH 0016/1813] Updated Home (rest) --- Home.rest | 1 + 1 file changed, 1 insertion(+) diff --git a/Home.rest b/Home.rest index 0c5686e..02759e0 100644 --- a/Home.rest +++ b/Home.rest @@ -19,6 +19,7 @@ Welcome to IBEX User Manual's documentation! * `test web link `_ * + + `WhatIsIBEX`_ Indices and tables ================== From ce579084c576096dc2b265f839b9b5f2a9a64c7e Mon Sep 17 00:00:00 2001 From: Freddie Akeroyd Date: Sun, 14 Aug 2016 23:24:03 +0100 Subject: [PATCH 0017/1813] Update --- Glossary.rest | 44 ++++++++++++++++++++++++++++++++++++ Home.rest | 26 ++++----------------- Introduction/WhatIsIBEX.rest | 2 -- _Sidebar.rest | 1 + 4 files changed, 50 insertions(+), 23 deletions(-) create mode 100644 Glossary.rest diff --git a/Glossary.rest b/Glossary.rest new file mode 100644 index 0000000..1f3c369 --- /dev/null +++ b/Glossary.rest @@ -0,0 +1,44 @@ +.. _glossary: + +Glossary +======== + +.. glossary:: + + EPICS + EPICS is a software framework for controlling devices and is + the underlying framework for the IBEX server. + See http://www.aps.anl.gov/epics/ + + PV + Process Variable + This is a named piece of information in the EPICS system, such as + a temperature setpoint or readback. A PV will have a name + of the form IN:LARMOR:MOT:MTR0101 for a motor + + Block + This is a named peice of information created by the user as part + of an instrument configuration. Block can have logging enabled and + will then appear in the final data file + + Client + Server + IBEX, like :term:`EPICS`, is a client-server system. In such + systems background processes (servers) provide information for + clients (such as a GUI or command line). Multiple clients + can communicate with a single server process over the network. + + Blockserver + This is a :term:`Server` element of the IBEX control system that + is responsible for managing a :term:`Block` and also a + :term:`Configuration` + + Configuration + This is + + IOC + An IOC (Input Output Controller) is an :term:`EPICS` process that + provides some service, oftem managing a device. For example, access + to a Eurotherm temperature controller is controlled via an IOC + process that provides :term:`Process Variable` for the relevant + control elements diff --git a/Home.rest b/Home.rest index 02759e0..b19881e 100644 --- a/Home.rest +++ b/Home.rest @@ -1,35 +1,19 @@ -Welcome to IBEX User Manual's documentation! -============================================ +IBEX User Manual +================ .. toctree:: :maxdepth: 2 :numbered: - :titlesonly: - :hidden: Introduction/WhatIsIBEX.rest Introduction/StartingAndStoppingIBEX.rest Concepts/ProcessVariables.rest Concepts/Blocks.rest + Glossary.rest -* :ref:`WhatIsIBEX` -* :ref:`StartingAndStoppingIBEX` -* :ref:`ProcessVariables` -* :ref:`Blocks` - -* `test web link `_ -* - + `WhatIsIBEX`_ - -Indices and tables +Indices and Tables ================== * :ref:`genindex` -* :ref:`modindex` * :ref:`search` - -test2 - -[[What is ibex|Introduction/WhatIsIBEX]] - -[[What is ibex|WhatIsIBEX]] +* :ref:`glossary` diff --git a/Introduction/WhatIsIBEX.rest b/Introduction/WhatIsIBEX.rest index 98c8835..f888738 100644 --- a/Introduction/WhatIsIBEX.rest +++ b/Introduction/WhatIsIBEX.rest @@ -5,8 +5,6 @@ What is IBEX IBEX is the new instrument control program, it is intended to replace SECI. Most device control is curerntly performed using LabVIEW while LabVIEW will not disappear entirely we will be using EPICS for most deviec control. When LabVIEw is requierd ,i it will be wrapped in EPICS. -`IBEX and SECI Differences`_ - IBEX and SECI Similarities -------------------------- diff --git a/_Sidebar.rest b/_Sidebar.rest index 86b8275..925b721 100644 --- a/_Sidebar.rest +++ b/_Sidebar.rest @@ -2,3 +2,4 @@ * [[StartingAndStoppingIBEX]] * [[ProcessVariables]] * [[Blocks]] +* [[Glossary]] From 083f103d7f8157e239a0b1a911732033c3fc451b Mon Sep 17 00:00:00 2001 From: kjwoodsISIS Date: Tue, 16 Aug 2016 11:41:42 +0100 Subject: [PATCH 0018/1813] Updated WhatIsIBEX (rest) --- Introduction/WhatIsIBEX.rest | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/Introduction/WhatIsIBEX.rest b/Introduction/WhatIsIBEX.rest index f888738..7ae78eb 100644 --- a/Introduction/WhatIsIBEX.rest +++ b/Introduction/WhatIsIBEX.rest @@ -3,7 +3,9 @@ What is IBEX ============ -IBEX is the new instrument control program, it is intended to replace SECI. Most device control is curerntly performed using LabVIEW while LabVIEW will not disappear entirely we will be using EPICS for most deviec control. When LabVIEw is requierd ,i it will be wrapped in EPICS. +IBEX is the new instrument control program; it is intended to replace SECI. + +Most device control is currently performed using LabVIEW, with SECI providing an integrated view of the various LabVIEW VIs. IBEX, on the other hand, is designed to use EPICS to provide device control. While LabVIEW will not disappear entirely, we will be using EPICS for most device control. When LabVIEW is required, it can be wrapped in EPICS. IBEX and SECI Similarities -------------------------- @@ -13,4 +15,4 @@ Both IBEX and SECI have block and dashboard IBEX and SECI Differences -------------------------- -IBEX is client-server based, whihc means that the IBEX GUI is itself not the instrument control program. You can thus close the IBEX GUI without stopping control of devices, and also run multiple instances of the GUI on the same or different computers +IBEX is a client-server based system. The server components of IBEX run on the instrument control PC and directly control the instrument. The IBEX client is a GUI, which provides an integrated view of the information provided by the server components. The IBEX client typically runs on a separate PC (which could be located in the instrument cabin or pod, or could be located in your office). It is important to realise that the IBEX client is itself not the instrument control program. You can thus close the IBEX client without stopping control of devices; you can even run multiple instances of the client on the same or different computers. You can also run the IBEX client on the instrument control PC. From 5d342fe6295142c1a4738024f340ddfc7b439908 Mon Sep 17 00:00:00 2001 From: kjwoodsISIS Date: Tue, 16 Aug 2016 11:42:51 +0100 Subject: [PATCH 0019/1813] Updated WhatIsIBEX (rest) --- Introduction/WhatIsIBEX.rest | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Introduction/WhatIsIBEX.rest b/Introduction/WhatIsIBEX.rest index 7ae78eb..a3236d5 100644 --- a/Introduction/WhatIsIBEX.rest +++ b/Introduction/WhatIsIBEX.rest @@ -5,7 +5,7 @@ What is IBEX IBEX is the new instrument control program; it is intended to replace SECI. -Most device control is currently performed using LabVIEW, with SECI providing an integrated view of the various LabVIEW VIs. IBEX, on the other hand, is designed to use EPICS to provide device control. While LabVIEW will not disappear entirely, we will be using EPICS for most device control. When LabVIEW is required, it can be wrapped in EPICS. +Most device control is currently performed using LabVIEW, with SECI providing an integrated view of the various LabVIEW VIs. IBEX, on the other hand, is designed to use EPICS to provide device control. LabVIEW will not disappear entirely; when LabVIEW is required, it can be wrapped in EPICS. IBEX and SECI Similarities -------------------------- From a3fc9764756d4c4dc486f5590eebf9d594304209 Mon Sep 17 00:00:00 2001 From: kjwoodsISIS Date: Tue, 16 Aug 2016 13:08:59 +0100 Subject: [PATCH 0020/1813] Updated ProcessVariables (rest) --- Concepts/ProcessVariables.rest | 20 ++++++++------------ 1 file changed, 8 insertions(+), 12 deletions(-) diff --git a/Concepts/ProcessVariables.rest b/Concepts/ProcessVariables.rest index eb1467d..3537b5a 100644 --- a/Concepts/ProcessVariables.rest +++ b/Concepts/ProcessVariables.rest @@ -3,25 +3,21 @@ Process Variables ================= -A key cobncepr in EPICS, and hence IBEX, is the process variable. -In the underlying EPICS framework, a process variable is a named piece of -information that can be read/monitored/changed. Information from hardware -deviecs and elsewhere is exposed as process variables, and devices are -controlled by writing to the appropriate process variables. +A key concept in EPICS, and hence IBEX, is the process variable. +In the underlying EPICS framework, a process variable (usually abbreviated to PV) is a named piece of information that can be read/monitored/changed. Information from hardware devices and elsewhere is exposed as process variables, and devices are controlled by writing to the appropriate process variables. Naming ------ -Process varuiabkle names are a stribng of alpha-numeric charatceters -with : used to separate sections and certain sections following naming -conventones. +A process variable name is simply a string of alpha-numeric characters. However, PV names are usually structured to conform to a naming convention, so that individual PV names are unique. The colon : character is used to separate the different sections of a PV name. At ISIS we use the following convention: -For an instrument all process variables relevant to that instrument will start with the IN: prefil followed by the instrument name followed by deviec specific details. For example +For an instrument all process variables relevant to that instrument will start with the IN: prefix followed by the instrument name followed by device specific details. For example -IN:LARMOR:DAE:GOODUAH good microams on LARMOR -IN:IMAT:DAE:GOODUAH good microams on LARMOR +IN:LARMOR:DAE:GOODUAH good microamps on LARMOR -Items not part of an instrument have a differenct to prefix. For example, the accelerator generates values with a top prefix of AC: such as +IN:IMAT:DAE:GOODUAH good microamps on IMAT + +Items not part of an instrument have a different prefix. For example, the accelerator generates values with a top-level prefix of AC: such as AC:TS1:BEAM:CURR TS1 beam current From d10cf6d168d5726967bab31a78461cc6b03bc21d Mon Sep 17 00:00:00 2001 From: kjwoodsISIS Date: Tue, 16 Aug 2016 13:14:44 +0100 Subject: [PATCH 0021/1813] Updated Blocks (rest) --- Concepts/Blocks.rest | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/Concepts/Blocks.rest b/Concepts/Blocks.rest index dab4d2a..a2aec37 100644 --- a/Concepts/Blocks.rest +++ b/Concepts/Blocks.rest @@ -3,16 +3,8 @@ Blocks ====== -The IBEX concept of a block is similar to SECI, in that it is a -relevant piece of information chosen by the scientist that will -be displayed on the instrument dashboard and logged into the -datafile. +The IBEX concept of a block is similar to SECI, in that it is a relevant piece of information chosen by the scientist that will be displayed on the instrument dashboard and logged into the datafile. -Under the hood, a block is a process variable with a well known -prefix. For example block Chop1Freq on LARMOR would be -the process variable IN:LARMOR:CS:SB:Chop1Freq -Utilities like genie_python know about blocsk and you can use commands such -as cset to access Chop1Freq. However you can access blocks using -the name IN:LARMOR:CS:SB:Chop1Freq with any standard episc tool +In IBEX, a block is, to all intents and purposes, an alias to a process variable. For example, the block Chop1Freq on LARMOR is the process variable IN:LARMOR:CS:SB:Chop1Freq. It is much simpler to refer to a block than to refer to a process variable. Utilities like genie_python know about blocks and you can use commands such as cset to access Chop1Freq. However you can access blocks using the name IN:LARMOR:CS:SB:Chop1Freq with any standard EPICS tool From 4e1a8cdec7e3aa3f8ce5e5bf792f5bd1a28506dd Mon Sep 17 00:00:00 2001 From: kjwoodsISIS Date: Tue, 16 Aug 2016 13:14:51 +0100 Subject: [PATCH 0022/1813] Updated Blocks (rest) --- Concepts/Blocks.rest | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Concepts/Blocks.rest b/Concepts/Blocks.rest index a2aec37..7ccaf98 100644 --- a/Concepts/Blocks.rest +++ b/Concepts/Blocks.rest @@ -5,6 +5,6 @@ Blocks The IBEX concept of a block is similar to SECI, in that it is a relevant piece of information chosen by the scientist that will be displayed on the instrument dashboard and logged into the datafile. -In IBEX, a block is, to all intents and purposes, an alias to a process variable. For example, the block Chop1Freq on LARMOR is the process variable IN:LARMOR:CS:SB:Chop1Freq. It is much simpler to refer to a block than to refer to a process variable. Utilities like genie_python know about blocks and you can use commands such as cset to access Chop1Freq. However you can access blocks using the name IN:LARMOR:CS:SB:Chop1Freq with any standard EPICS tool +In IBEX, a block is, to all intents and purposes, an alias to a process variable. For example, the block Chop1Freq on LARMOR is the process variable IN:LARMOR:CS:SB:Chop1Freq. It is much simpler to refer to a block than to refer to a process variable. Utilities like genie_python know about blocks and you can use commands such as cset to access Chop1Freq. However you can access blocks using the name IN:LARMOR:CS:SB:Chop1Freq with any standard EPICS tool. From b80ceec16d7490c393eceba11dda8f388169ad0e Mon Sep 17 00:00:00 2001 From: kjwoodsISIS Date: Tue, 16 Aug 2016 13:24:26 +0100 Subject: [PATCH 0023/1813] Updated Blocks (rest) --- Concepts/Blocks.rest | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Concepts/Blocks.rest b/Concepts/Blocks.rest index 7ccaf98..a2aa91b 100644 --- a/Concepts/Blocks.rest +++ b/Concepts/Blocks.rest @@ -5,6 +5,6 @@ Blocks The IBEX concept of a block is similar to SECI, in that it is a relevant piece of information chosen by the scientist that will be displayed on the instrument dashboard and logged into the datafile. -In IBEX, a block is, to all intents and purposes, an alias to a process variable. For example, the block Chop1Freq on LARMOR is the process variable IN:LARMOR:CS:SB:Chop1Freq. It is much simpler to refer to a block than to refer to a process variable. Utilities like genie_python know about blocks and you can use commands such as cset to access Chop1Freq. However you can access blocks using the name IN:LARMOR:CS:SB:Chop1Freq with any standard EPICS tool. +In IBEX, a block is, to all intents and purposes, an alias to a process variable. For example, the block ``Chop1Freq`` on LARMOR is the process variable ``IN:LARMOR:CS:SB:Chop1Freq``. It is much simpler to refer to a block than to refer to a process variable. Utilities like genie_python know about blocks and you can use commands such as ``cset`` to access ``Chop1Freq``. However you can access blocks using the name ``IN:LARMOR:CS:SB:Chop1Freq`` with any standard EPICS tool. From d080a9d61424ceb75091ce097cc1e7cd6f07dd28 Mon Sep 17 00:00:00 2001 From: kjwoodsISIS Date: Tue, 16 Aug 2016 13:25:18 +0100 Subject: [PATCH 0024/1813] Updated ProcessVariables (rest) --- Concepts/ProcessVariables.rest | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Concepts/ProcessVariables.rest b/Concepts/ProcessVariables.rest index 3537b5a..a0e34fc 100644 --- a/Concepts/ProcessVariables.rest +++ b/Concepts/ProcessVariables.rest @@ -11,20 +11,20 @@ Naming A process variable name is simply a string of alpha-numeric characters. However, PV names are usually structured to conform to a naming convention, so that individual PV names are unique. The colon : character is used to separate the different sections of a PV name. At ISIS we use the following convention: -For an instrument all process variables relevant to that instrument will start with the IN: prefix followed by the instrument name followed by device specific details. For example +For an instrument all process variables relevant to that instrument will start with the ``IN:`` prefix followed by the instrument name followed by device specific details. For example -IN:LARMOR:DAE:GOODUAH good microamps on LARMOR +``IN:LARMOR:DAE:GOODUAH`` good microamps on LARMOR -IN:IMAT:DAE:GOODUAH good microamps on IMAT +``IN:IMAT:DAE:GOODUAH`` good microamps on IMAT -Items not part of an instrument have a different prefix. For example, the accelerator generates values with a top-level prefix of AC: such as +Items not part of an instrument have a different prefix. For example, the accelerator generates values with a top-level prefix of ``AC:`` such as -AC:TS1:BEAM:CURR TS1 beam current +``AC:TS1:BEAM:CURR`` TS1 beam current Displaying ---------- -caget IN:LARMOR:DAE:GOODUAH -camonitor IN:LARMOR:DAE:GOODUAH +``caget IN:LARMOR:DAE:GOODUAH`` +``camonitor IN:LARMOR:DAE:GOODUAH`` From 79e7cdda9af9194758648acb07a4ba9436cf03bf Mon Sep 17 00:00:00 2001 From: kjwoodsISIS Date: Tue, 16 Aug 2016 13:36:02 +0100 Subject: [PATCH 0025/1813] Updated ProcessVariables (rest) --- Concepts/ProcessVariables.rest | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/Concepts/ProcessVariables.rest b/Concepts/ProcessVariables.rest index a0e34fc..b7e0642 100644 --- a/Concepts/ProcessVariables.rest +++ b/Concepts/ProcessVariables.rest @@ -13,18 +13,19 @@ A process variable name is simply a string of alpha-numeric characters. However For an instrument all process variables relevant to that instrument will start with the ``IN:`` prefix followed by the instrument name followed by device specific details. For example -``IN:LARMOR:DAE:GOODUAH`` good microamps on LARMOR +| ``IN:LARMOR:DAE:GOODUAH`` good microamps on LARMOR + +| ``IN:IMAT:DAE:GOODUAH`` good microamps on IMAT -``IN:IMAT:DAE:GOODUAH`` good microamps on IMAT Items not part of an instrument have a different prefix. For example, the accelerator generates values with a top-level prefix of ``AC:`` such as -``AC:TS1:BEAM:CURR`` TS1 beam current +| ``AC:TS1:BEAM:CURR`` TS1 beam current Displaying ---------- -``caget IN:LARMOR:DAE:GOODUAH`` -``camonitor IN:LARMOR:DAE:GOODUAH`` +| ``caget IN:LARMOR:DAE:GOODUAH`` +| ``camonitor IN:LARMOR:DAE:GOODUAH`` From e19fb694596a7a790633332d78ab3a6d7b8f049c Mon Sep 17 00:00:00 2001 From: kjwoodsISIS Date: Tue, 16 Aug 2016 13:42:25 +0100 Subject: [PATCH 0026/1813] Updated Glossary (rest) --- Glossary.rest | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/Glossary.rest b/Glossary.rest index 1f3c369..cf059c6 100644 --- a/Glossary.rest +++ b/Glossary.rest @@ -3,26 +3,23 @@ Glossary ======== -.. glossary:: - EPICS EPICS is a software framework for controlling devices and is the underlying framework for the IBEX server. See http://www.aps.anl.gov/epics/ - PV - Process Variable + PV (Process Variable) This is a named piece of information in the EPICS system, such as a temperature setpoint or readback. A PV will have a name - of the form IN:LARMOR:MOT:MTR0101 for a motor + of the form ``IN:LARMOR:MOT:MTR0101`` for a motor Block - This is a named peice of information created by the user as part - of an instrument configuration. Block can have logging enabled and - will then appear in the final data file + This is a named piece of information created by the user as part + of an instrument configuration. A block is essentially and alias to + a process variable. A block can have logging enabled and + will then appear in the final data file. - Client - Server + Client Server IBEX, like :term:`EPICS`, is a client-server system. In such systems background processes (servers) provide information for clients (such as a GUI or command line). Multiple clients From 863aa4ed95ba59359c7d367e266a55cb5b026d90 Mon Sep 17 00:00:00 2001 From: kjwoodsISIS Date: Tue, 16 Aug 2016 13:47:35 +0100 Subject: [PATCH 0027/1813] Updated Glossary (rest) --- Glossary.rest | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Glossary.rest b/Glossary.rest index cf059c6..9dc4a54 100644 --- a/Glossary.rest +++ b/Glossary.rest @@ -35,7 +35,7 @@ Glossary IOC An IOC (Input Output Controller) is an :term:`EPICS` process that - provides some service, oftem managing a device. For example, access + provides some service, often managing a device. For example, access to a Eurotherm temperature controller is controlled via an IOC process that provides :term:`Process Variable` for the relevant control elements From cbc8f91ebae2a190e526918f49fa3a2570484992 Mon Sep 17 00:00:00 2001 From: kjwoodsISIS Date: Tue, 16 Aug 2016 13:57:43 +0100 Subject: [PATCH 0028/1813] Updated Home (rest) --- Home.rest | 1 + 1 file changed, 1 insertion(+) diff --git a/Home.rest b/Home.rest index b19881e..b820685 100644 --- a/Home.rest +++ b/Home.rest @@ -7,6 +7,7 @@ IBEX User Manual Introduction/WhatIsIBEX.rest Introduction/StartingAndStoppingIBEX.rest + Introduction/AQuickTourofIBEX.rest Concepts/ProcessVariables.rest Concepts/Blocks.rest Glossary.rest From 494970d8195f8382d9f013fc49aaba6becca9295 Mon Sep 17 00:00:00 2001 From: kjwoodsISIS Date: Tue, 16 Aug 2016 13:58:44 +0100 Subject: [PATCH 0029/1813] Updated Home (rest) --- Home.rest | 1 - 1 file changed, 1 deletion(-) diff --git a/Home.rest b/Home.rest index b820685..b19881e 100644 --- a/Home.rest +++ b/Home.rest @@ -7,7 +7,6 @@ IBEX User Manual Introduction/WhatIsIBEX.rest Introduction/StartingAndStoppingIBEX.rest - Introduction/AQuickTourofIBEX.rest Concepts/ProcessVariables.rest Concepts/Blocks.rest Glossary.rest From ae451ea7c9e75672c97f7d19a13b7b93b59dfe5f Mon Sep 17 00:00:00 2001 From: kjwoodsISIS Date: Tue, 16 Aug 2016 14:00:10 +0100 Subject: [PATCH 0030/1813] Created AQuickTourofIBEX (rest) --- AQuickTourofIBEX.rest | 1 + 1 file changed, 1 insertion(+) create mode 100644 AQuickTourofIBEX.rest diff --git a/AQuickTourofIBEX.rest b/AQuickTourofIBEX.rest new file mode 100644 index 0000000..bd47f06 --- /dev/null +++ b/AQuickTourofIBEX.rest @@ -0,0 +1 @@ +A Quick Tour of IBEX From 493f8a31edcbf9052bee6b38518d34e614c70047 Mon Sep 17 00:00:00 2001 From: kjwoodsISIS Date: Tue, 16 Aug 2016 14:01:58 +0100 Subject: [PATCH 0031/1813] Updated Home (rest) --- Home.rest | 1 + 1 file changed, 1 insertion(+) diff --git a/Home.rest b/Home.rest index b19881e..b820685 100644 --- a/Home.rest +++ b/Home.rest @@ -7,6 +7,7 @@ IBEX User Manual Introduction/WhatIsIBEX.rest Introduction/StartingAndStoppingIBEX.rest + Introduction/AQuickTourofIBEX.rest Concepts/ProcessVariables.rest Concepts/Blocks.rest Glossary.rest From 1c5edd1288a8146022fd1c503bbec38cb854c725 Mon Sep 17 00:00:00 2001 From: kjwoodsISIS Date: Tue, 16 Aug 2016 14:04:16 +0100 Subject: [PATCH 0032/1813] Destroyed AQuickTourofIBEX (rest) --- AQuickTourofIBEX.rest | 1 - 1 file changed, 1 deletion(-) delete mode 100644 AQuickTourofIBEX.rest diff --git a/AQuickTourofIBEX.rest b/AQuickTourofIBEX.rest deleted file mode 100644 index bd47f06..0000000 --- a/AQuickTourofIBEX.rest +++ /dev/null @@ -1 +0,0 @@ -A Quick Tour of IBEX From c0b20544d8ae0d8baadaa8cc49bf450a2df6f60c Mon Sep 17 00:00:00 2001 From: kjwoodsISIS Date: Tue, 16 Aug 2016 14:04:41 +0100 Subject: [PATCH 0033/1813] Created AQuickTourofIBEXGUI (markdown) --- AQuickTourofIBEXGUI.md | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 AQuickTourofIBEXGUI.md diff --git a/AQuickTourofIBEXGUI.md b/AQuickTourofIBEXGUI.md new file mode 100644 index 0000000..774dd8a --- /dev/null +++ b/AQuickTourofIBEXGUI.md @@ -0,0 +1,4 @@ +.. _AQuickTourofIBEXGUI: + +A Quick Tour of the IBEX GUI +============================ \ No newline at end of file From 9c3a46637290c7a5592d78ebfeb26393dca46522 Mon Sep 17 00:00:00 2001 From: kjwoodsISIS Date: Tue, 16 Aug 2016 14:06:37 +0100 Subject: [PATCH 0034/1813] Destroyed AQuickTourofIBEXGUI (markdown) --- AQuickTourofIBEXGUI.md | 4 ---- 1 file changed, 4 deletions(-) delete mode 100644 AQuickTourofIBEXGUI.md diff --git a/AQuickTourofIBEXGUI.md b/AQuickTourofIBEXGUI.md deleted file mode 100644 index 774dd8a..0000000 --- a/AQuickTourofIBEXGUI.md +++ /dev/null @@ -1,4 +0,0 @@ -.. _AQuickTourofIBEXGUI: - -A Quick Tour of the IBEX GUI -============================ \ No newline at end of file From 4f40a278b99c55c73793b26bc9f9683c711782b3 Mon Sep 17 00:00:00 2001 From: kjwoodsISIS Date: Tue, 16 Aug 2016 16:47:50 +0100 Subject: [PATCH 0035/1813] Updated ProcessVariables (rest) --- Concepts/ProcessVariables.rest | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/Concepts/ProcessVariables.rest b/Concepts/ProcessVariables.rest index b7e0642..aea0ac6 100644 --- a/Concepts/ProcessVariables.rest +++ b/Concepts/ProcessVariables.rest @@ -11,7 +11,11 @@ Naming A process variable name is simply a string of alpha-numeric characters. However, PV names are usually structured to conform to a naming convention, so that individual PV names are unique. The colon : character is used to separate the different sections of a PV name. At ISIS we use the following convention: -For an instrument all process variables relevant to that instrument will start with the ``IN:`` prefix followed by the instrument name followed by device specific details. For example + * For an instrument all process variables relevant to that instrument will start with the ``IN:`` prefix, + * followed by the instrument name, + * followed by the device specific details (usually device name and variable name). + +For example | ``IN:LARMOR:DAE:GOODUAH`` good microamps on LARMOR From ce58608754832ec82ec22ec905b01af9959d9859 Mon Sep 17 00:00:00 2001 From: Gollum Date: Wed, 17 Aug 2016 11:05:31 +0100 Subject: [PATCH 0036/1813] Created page (rest) --- test/page.rest | 1 + 1 file changed, 1 insertion(+) create mode 100644 test/page.rest diff --git a/test/page.rest b/test/page.rest new file mode 100644 index 0000000..30d74d2 --- /dev/null +++ b/test/page.rest @@ -0,0 +1 @@ +test \ No newline at end of file From 87f6ccf0e8c1edd8047752ab8a79513c3088f184 Mon Sep 17 00:00:00 2001 From: Gollum Date: Wed, 17 Aug 2016 11:11:17 +0100 Subject: [PATCH 0037/1813] Updated Home (rest) --- _Sidebar.rest | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_Sidebar.rest b/_Sidebar.rest index 925b721..43c98ec 100644 --- a/_Sidebar.rest +++ b/_Sidebar.rest @@ -1,4 +1,4 @@ -* [[WhatIsIBEX]] +* [[Introduction/WhatIsIBEX]] * [[StartingAndStoppingIBEX]] * [[ProcessVariables]] * [[Blocks]] From da136e13540ba732293e98c640cbff26c15079a4 Mon Sep 17 00:00:00 2001 From: Gollum Date: Wed, 17 Aug 2016 11:39:10 +0100 Subject: [PATCH 0038/1813] Updated Home (rest) --- Home.rest | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Home.rest b/Home.rest index b820685..9bc25ca 100644 --- a/Home.rest +++ b/Home.rest @@ -18,3 +18,6 @@ Indices and Tables * :ref:`genindex` * :ref:`search` * :ref:`glossary` + + [[WhatIsIBEX]] + From 67772c83ead9942d4fa4f680b9fe4ddb23ff73da Mon Sep 17 00:00:00 2001 From: Gollum Date: Wed, 17 Aug 2016 11:40:28 +0100 Subject: [PATCH 0039/1813] Updated Home (rest) --- _Sidebar.rest | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/_Sidebar.rest b/_Sidebar.rest index 43c98ec..50d1252 100644 --- a/_Sidebar.rest +++ b/_Sidebar.rest @@ -1,4 +1,6 @@ -* [[Introduction/WhatIsIBEX]] + [[WhatIsIBEX]] + +* [[WhatIsIBEX]] * [[StartingAndStoppingIBEX]] * [[ProcessVariables]] * [[Blocks]] From 0da62924d760dac9e917c7b77ad37b15f860b929 Mon Sep 17 00:00:00 2001 From: Gollum Date: Wed, 17 Aug 2016 11:43:26 +0100 Subject: [PATCH 0040/1813] Updated Home (rest) --- Home.rest | 2 +- _Sidebar.rest | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/Home.rest b/Home.rest index 9bc25ca..1105cd4 100644 --- a/Home.rest +++ b/Home.rest @@ -19,5 +19,5 @@ Indices and Tables * :ref:`search` * :ref:`glossary` - [[WhatIsIBEX]] +[[WhatIsIBEX]] diff --git a/_Sidebar.rest b/_Sidebar.rest index 50d1252..c8e599e 100644 --- a/_Sidebar.rest +++ b/_Sidebar.rest @@ -1,4 +1,3 @@ - [[WhatIsIBEX]] * [[WhatIsIBEX]] * [[StartingAndStoppingIBEX]] From 43a77d75e35744553f27bcf999ff031c3d8fddfd Mon Sep 17 00:00:00 2001 From: Gollum Date: Wed, 17 Aug 2016 11:46:25 +0100 Subject: [PATCH 0041/1813] Updated Home (rest) --- Home.rest | 5 +++++ _Sidebar.rest | 1 - 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/Home.rest b/Home.rest index 1105cd4..5761878 100644 --- a/Home.rest +++ b/Home.rest @@ -21,3 +21,8 @@ Indices and Tables [[WhatIsIBEX]] +[[StartingAndStoppingIBEX]] + +[[Glossary]] + + diff --git a/_Sidebar.rest b/_Sidebar.rest index c8e599e..925b721 100644 --- a/_Sidebar.rest +++ b/_Sidebar.rest @@ -1,4 +1,3 @@ - * [[WhatIsIBEX]] * [[StartingAndStoppingIBEX]] * [[ProcessVariables]] From 02bf6657043f1e20744013395d173be05576fdf2 Mon Sep 17 00:00:00 2001 From: Gollum Date: Wed, 17 Aug 2016 11:47:31 +0100 Subject: [PATCH 0042/1813] Updated _Sidebar (rest) From ece6ea027a9b73fcbb4cc1eeae7eafa18e10a896 Mon Sep 17 00:00:00 2001 From: Gollum Date: Wed, 17 Aug 2016 13:17:46 +0100 Subject: [PATCH 0043/1813] Updated Glossary (rest) --- Glossary.rest | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Glossary.rest b/Glossary.rest index 9dc4a54..f98b521 100644 --- a/Glossary.rest +++ b/Glossary.rest @@ -15,7 +15,7 @@ Glossary Block This is a named piece of information created by the user as part - of an instrument configuration. A block is essentially and alias to + of an instrument configuration. A block is essentially an alias to a process variable. A block can have logging enabled and will then appear in the final data file. From 679f39c3ac238cfa2b553a6b7a37ee2bd37a1590 Mon Sep 17 00:00:00 2001 From: Gollum Date: Wed, 17 Aug 2016 13:59:00 +0100 Subject: [PATCH 0044/1813] Updated Home (rest) --- _Sidebar.rest | 1 + 1 file changed, 1 insertion(+) diff --git a/_Sidebar.rest b/_Sidebar.rest index 925b721..9a99950 100644 --- a/_Sidebar.rest +++ b/_Sidebar.rest @@ -1,5 +1,6 @@ * [[WhatIsIBEX]] * [[StartingAndStoppingIBEX]] +* [[InstallingIBEX]] * [[ProcessVariables]] * [[Blocks]] * [[Glossary]] From c91e069cf9d819667340f4bd4e19c8e80b86e996 Mon Sep 17 00:00:00 2001 From: Gollum Date: Wed, 17 Aug 2016 14:12:41 +0100 Subject: [PATCH 0045/1813] Created InstallingIBEX (rest) --- InstallingIBEX.rest | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 InstallingIBEX.rest diff --git a/InstallingIBEX.rest b/InstallingIBEX.rest new file mode 100644 index 0000000..e5c9877 --- /dev/null +++ b/InstallingIBEX.rest @@ -0,0 +1,18 @@ +.. _InstallingIBEX: + +Installing IBEX +=============== + +Installing IBEX Server +---------------------- + +Installation of IBEX server on an instrument control PC is a moderately complex task, requiring the installation and configuration of several software components. If you need to install IBEX server on your instrument, please contact the Experimental Controls team. + +Installing IBEX Client +---------------------- + +Installation of IBEX client on a PC is simple and straightforward. + +#. Before installing IBEX client, please ensure that you have an up-to-date version of Java on your PC. +#. Open a Windows Explorer window and navigate to XXXX +#. Double-click on XXXX From e2c33c7930799b9737fa541d5d024645e678862f Mon Sep 17 00:00:00 2001 From: Gollum Date: Wed, 17 Aug 2016 14:22:19 +0100 Subject: [PATCH 0046/1813] Updated InstallingIBEX (rest) --- InstallingIBEX.rest | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/InstallingIBEX.rest b/InstallingIBEX.rest index e5c9877..5eeb96e 100644 --- a/InstallingIBEX.rest +++ b/InstallingIBEX.rest @@ -13,6 +13,6 @@ Installing IBEX Client Installation of IBEX client on a PC is simple and straightforward. -#. Before installing IBEX client, please ensure that you have an up-to-date version of Java on your PC. +#. Before installing IBEX client, please ensure that you have an up-to-date version of Java on your PC. If you need to install an up-to-date version of Java, you can obtain a copy from the Java web-site (http://www.java.com/en/). Please be sure to choose the 64-bit version of Java. #. Open a Windows Explorer window and navigate to XXXX #. Double-click on XXXX From 56870ab6f6304d3b1c4bdc769600b67a428c5cb2 Mon Sep 17 00:00:00 2001 From: Gollum Date: Wed, 17 Aug 2016 14:38:35 +0100 Subject: [PATCH 0047/1813] Updated InstallingIBEX (rest) --- InstallingIBEX.rest | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/InstallingIBEX.rest b/InstallingIBEX.rest index 5eeb96e..6189a2d 100644 --- a/InstallingIBEX.rest +++ b/InstallingIBEX.rest @@ -13,6 +13,16 @@ Installing IBEX Client Installation of IBEX client on a PC is simple and straightforward. -#. Before installing IBEX client, please ensure that you have an up-to-date version of Java on your PC. If you need to install an up-to-date version of Java, you can obtain a copy from the Java web-site (http://www.java.com/en/). Please be sure to choose the 64-bit version of Java. +Pre-requisites for running IBEX Client +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +In order to run IBEX client, your PC must meet the following pre-requisites + +#. Your PC must be running Windows 7 (Professional or Enterprise), Service Pack 1 or Windows 10 (Professional or Enterprise), Build 10586. +#. Your PC must also be running an up-to-date version of Java version 8, update 101 (or later). If you need to install an up-to-date version of Java, you can obtain a copy from the Java web-site (http://www.java.com/en/). Please be sure to choose the 64-bit version of Java. + +Installation +~~~~~~~~~~~~ + #. Open a Windows Explorer window and navigate to XXXX #. Double-click on XXXX From edfaad5fe2f3dfba21266f22aeb72c3df153c986 Mon Sep 17 00:00:00 2001 From: Gollum Date: Wed, 17 Aug 2016 14:43:06 +0100 Subject: [PATCH 0048/1813] Updated WhatIsIBEX (rest) --- Introduction/WhatIsIBEX.rest | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/Introduction/WhatIsIBEX.rest b/Introduction/WhatIsIBEX.rest index a3236d5..1d53a81 100644 --- a/Introduction/WhatIsIBEX.rest +++ b/Introduction/WhatIsIBEX.rest @@ -7,6 +7,8 @@ IBEX is the new instrument control program; it is intended to replace SECI. Most device control is currently performed using LabVIEW, with SECI providing an integrated view of the various LabVIEW VIs. IBEX, on the other hand, is designed to use EPICS to provide device control. LabVIEW will not disappear entirely; when LabVIEW is required, it can be wrapped in EPICS. +IBEX also uses genie_python as its scripting language. + IBEX and SECI Similarities -------------------------- @@ -16,3 +18,15 @@ IBEX and SECI Differences -------------------------- IBEX is a client-server based system. The server components of IBEX run on the instrument control PC and directly control the instrument. The IBEX client is a GUI, which provides an integrated view of the information provided by the server components. The IBEX client typically runs on a separate PC (which could be located in the instrument cabin or pod, or could be located in your office). It is important to realise that the IBEX client is itself not the instrument control program. You can thus close the IBEX client without stopping control of devices; you can even run multiple instances of the client on the same or different computers. You can also run the IBEX client on the instrument control PC. + +Introduction to genie_python +------------------------------------------------ + +There is some information about genie_python here: http://shadow.nd.rl.ac.uk/ibex_user_manual_sphinx/. + +Differences between Open Genie and genie_python +------------------------------------------------ + +Open Genie and genie_python are not the same. + + From b8f5b33c497fe1f2e7ddaf4745c117cd97460e91 Mon Sep 17 00:00:00 2001 From: Gollum Date: Wed, 17 Aug 2016 14:45:11 +0100 Subject: [PATCH 0049/1813] Updated WhatIsIBEX (rest) --- Introduction/WhatIsIBEX.rest | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Introduction/WhatIsIBEX.rest b/Introduction/WhatIsIBEX.rest index 1d53a81..413b798 100644 --- a/Introduction/WhatIsIBEX.rest +++ b/Introduction/WhatIsIBEX.rest @@ -22,7 +22,7 @@ IBEX is a client-server based system. The server components of IBEX run on the Introduction to genie_python ------------------------------------------------ -There is some information about genie_python here: http://shadow.nd.rl.ac.uk/ibex_user_manual_sphinx/. +A full reference to genie_python is available here: http://shadow.nd.rl.ac.uk/genie_python/sphinx/genie_python.html. Differences between Open Genie and genie_python ------------------------------------------------ From 7402c79d19214f189a4dba0123b5c308f73c1fb0 Mon Sep 17 00:00:00 2001 From: Gollum Date: Wed, 17 Aug 2016 14:47:37 +0100 Subject: [PATCH 0050/1813] Updated Home (rest) --- Home.rest | 5 ++++- _Sidebar.rest | 1 + 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/Home.rest b/Home.rest index 5761878..483303d 100644 --- a/Home.rest +++ b/Home.rest @@ -7,7 +7,6 @@ IBEX User Manual Introduction/WhatIsIBEX.rest Introduction/StartingAndStoppingIBEX.rest - Introduction/AQuickTourofIBEX.rest Concepts/ProcessVariables.rest Concepts/Blocks.rest Glossary.rest @@ -23,6 +22,10 @@ Indices and Tables [[StartingAndStoppingIBEX]] +[[InstallingIBEX]] + +[[KeyConceptsinIBEX]] + [[Glossary]] diff --git a/_Sidebar.rest b/_Sidebar.rest index 9a99950..68c6017 100644 --- a/_Sidebar.rest +++ b/_Sidebar.rest @@ -1,6 +1,7 @@ * [[WhatIsIBEX]] * [[StartingAndStoppingIBEX]] * [[InstallingIBEX]] +* [[KeyConceptsinIBEX]] * [[ProcessVariables]] * [[Blocks]] * [[Glossary]] From 84516f0d990356537caa8e711e266f9c25e25a66 Mon Sep 17 00:00:00 2001 From: Gollum Date: Wed, 17 Aug 2016 14:50:55 +0100 Subject: [PATCH 0051/1813] Created KeyConceptsinIBEX (rest) --- KeyConceptsinIBEX.rest | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 KeyConceptsinIBEX.rest diff --git a/KeyConceptsinIBEX.rest b/KeyConceptsinIBEX.rest new file mode 100644 index 0000000..e8697eb --- /dev/null +++ b/KeyConceptsinIBEX.rest @@ -0,0 +1,14 @@ +Key Concepts in IBEX +==================== + +It is worth taking a few moments to appreciate some of the key concepts behind IBEX. + +Clients & Servers +----------------- + +IBEX is designed as a client-server system + +Process Variables +----------------- + + From f41cf5479523f50c714b9d2fba7a8a7767cc3606 Mon Sep 17 00:00:00 2001 From: Gollum Date: Wed, 17 Aug 2016 14:53:29 +0100 Subject: [PATCH 0052/1813] Updated KeyConceptsinIBEX (rest) --- KeyConceptsinIBEX.rest | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/KeyConceptsinIBEX.rest b/KeyConceptsinIBEX.rest index e8697eb..0493734 100644 --- a/KeyConceptsinIBEX.rest +++ b/KeyConceptsinIBEX.rest @@ -8,7 +8,12 @@ Clients & Servers IBEX is designed as a client-server system -Process Variables ------------------ +Blocks & Process Variables +-------------------------- + +[[ProcessVariables]] + +[[Blocks]] + From c8199e4d98f4d5f9367900e069ed0aa6c266d8bd Mon Sep 17 00:00:00 2001 From: Gollum Date: Wed, 17 Aug 2016 16:11:12 +0100 Subject: [PATCH 0053/1813] Updated KeyConceptsinIBEX (rest) --- KeyConceptsinIBEX.rest | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/KeyConceptsinIBEX.rest b/KeyConceptsinIBEX.rest index 0493734..e51020a 100644 --- a/KeyConceptsinIBEX.rest +++ b/KeyConceptsinIBEX.rest @@ -6,7 +6,23 @@ It is worth taking a few moments to appreciate some of the key concepts behind I Clients & Servers ----------------- -IBEX is designed as a client-server system +A client-server system is one that employs a distributed application architecture. In a client-server system the workload is partitioned between the providers of information or services (i.e. servers) and requesters or consumers of information or services (i.e. clients). Clients request information or the use of a resource or service from one or more server hosts. Each server host runs one or more server programs which share information or resource with clients when requested to do so. Typically, the server and client run on separate computers connected via a network, but the client and server can also run as separate processes on same computer. + +The design of IBEX follows this model. IBEX consists of a server component, which runs on the instrument control PC, and a client component, which runs on a separate PC (but can also run on the instrument control PC, if necessary). IBEX has been created using the `EPICS `_. framework for creating distributed control systems. + +IBEX Server +~~~~~~~~~~~ + +The IBEX server is not a single component, but a collection of components, which together control the individual devices which comprise a neutron or muon instrument. The primary components of the IBEX server are: + +IBEX Client +~~~~~~~~~~~ + +The IBEX Client is a single application, which functions as a GUI for IBEX. + +genie_python +~~~~~~~~~~~~ +genie_python can also be thought of as a client of IBEX server. It operates as a scripting client, requesting information from the IBEX server and sending requests to change the state of devices attached to the instrument control PC. Blocks & Process Variables -------------------------- From a43399856e65eb2d7d46efee82a1e52827bf7905 Mon Sep 17 00:00:00 2001 From: Gollum Date: Wed, 17 Aug 2016 16:11:55 +0100 Subject: [PATCH 0054/1813] Updated KeyConceptsinIBEX (rest) --- KeyConceptsinIBEX.rest | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/KeyConceptsinIBEX.rest b/KeyConceptsinIBEX.rest index e51020a..6b12689 100644 --- a/KeyConceptsinIBEX.rest +++ b/KeyConceptsinIBEX.rest @@ -8,7 +8,7 @@ Clients & Servers A client-server system is one that employs a distributed application architecture. In a client-server system the workload is partitioned between the providers of information or services (i.e. servers) and requesters or consumers of information or services (i.e. clients). Clients request information or the use of a resource or service from one or more server hosts. Each server host runs one or more server programs which share information or resource with clients when requested to do so. Typically, the server and client run on separate computers connected via a network, but the client and server can also run as separate processes on same computer. -The design of IBEX follows this model. IBEX consists of a server component, which runs on the instrument control PC, and a client component, which runs on a separate PC (but can also run on the instrument control PC, if necessary). IBEX has been created using the `EPICS `_. framework for creating distributed control systems. +The design of IBEX follows this model. IBEX consists of a server component, which runs on the instrument control PC, and a client component, which runs on a separate PC (but can also run on the instrument control PC, if necessary). IBEX has been created using the `EPICS `_ framework for creating distributed control systems. IBEX Server ~~~~~~~~~~~ From b9dc1e824411bdb93c5d88172dc56af66ddd2f2f Mon Sep 17 00:00:00 2001 From: Gollum Date: Wed, 17 Aug 2016 17:02:27 +0100 Subject: [PATCH 0055/1813] Updated KeyConceptsinIBEX (rest) --- KeyConceptsinIBEX.rest | 35 ++++++++++++++++++++++++++++++----- 1 file changed, 30 insertions(+), 5 deletions(-) diff --git a/KeyConceptsinIBEX.rest b/KeyConceptsinIBEX.rest index 6b12689..4b6add9 100644 --- a/KeyConceptsinIBEX.rest +++ b/KeyConceptsinIBEX.rest @@ -10,11 +10,6 @@ A client-server system is one that employs a distributed application architectur The design of IBEX follows this model. IBEX consists of a server component, which runs on the instrument control PC, and a client component, which runs on a separate PC (but can also run on the instrument control PC, if necessary). IBEX has been created using the `EPICS `_ framework for creating distributed control systems. -IBEX Server -~~~~~~~~~~~ - -The IBEX server is not a single component, but a collection of components, which together control the individual devices which comprise a neutron or muon instrument. The primary components of the IBEX server are: - IBEX Client ~~~~~~~~~~~ @@ -24,6 +19,36 @@ genie_python ~~~~~~~~~~~~ genie_python can also be thought of as a client of IBEX server. It operates as a scripting client, requesting information from the IBEX server and sending requests to change the state of devices attached to the instrument control PC. +IBEX Server +~~~~~~~~~~~ + +The IBEX server is not a single component, but a collection of components, which together control the individual devices which comprise a neutron or muon instrument. The primary components of the IBEX server are: + +BlockServer + The core component of the IBEX server. The BlockServer provides the service that + translates [[ProcessVariables]] into [[Blocks]]. It also supports run-control and + serves configuration information. + +Archiver + The Archiver, as its name suggests, archives the values of process variables to a database. + This service supports strip-chart plots of blocks & process variables and can also be used + to inspect the history of process variables for diagnostic purposes. + +IOCs + IOCs (Input/Output Controllers) are processes which control individual devices attached to + the instrument control PC. IOCs are analogous to LabVIEW VIs. IOCs communicate with other + processes (e.g. the BlockServer or other IOCs) via [[ProcessVariables]]. + +Message Server + The Message Server, intercepts console messages written by IOCs and stores them in a database. + It also serves the messages to the IBEX client, so that the message log can be inspected from + the GUI. + +MySQL + MySQL is an open-source relational database system, which provides database services to + the Archiver and the Message Server. + + Blocks & Process Variables -------------------------- From de68890b0b5976a5f71f47ba00f18e7cef6fe397 Mon Sep 17 00:00:00 2001 From: Gollum Date: Wed, 17 Aug 2016 17:03:52 +0100 Subject: [PATCH 0056/1813] Updated ProcessVariables (rest) --- Concepts/ProcessVariables.rest | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Concepts/ProcessVariables.rest b/Concepts/ProcessVariables.rest index aea0ac6..405b849 100644 --- a/Concepts/ProcessVariables.rest +++ b/Concepts/ProcessVariables.rest @@ -4,7 +4,7 @@ Process Variables ================= A key concept in EPICS, and hence IBEX, is the process variable. -In the underlying EPICS framework, a process variable (usually abbreviated to PV) is a named piece of information that can be read/monitored/changed. Information from hardware devices and elsewhere is exposed as process variables, and devices are controlled by writing to the appropriate process variables. +In the underlying `EPICS `_ framework, a process variable (usually abbreviated to PV) is a named piece of information that can be read/monitored/changed. Information from hardware devices and elsewhere is exposed as process variables, and devices are controlled by writing to the appropriate process variables. Naming ------ From e99a8dbb4070e5ee5193d55dfa811ffefb291800 Mon Sep 17 00:00:00 2001 From: Gollum Date: Wed, 17 Aug 2016 17:05:21 +0100 Subject: [PATCH 0057/1813] Updated ProcessVariables (rest) --- Concepts/ProcessVariables.rest | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Concepts/ProcessVariables.rest b/Concepts/ProcessVariables.rest index 405b849..c613ede 100644 --- a/Concepts/ProcessVariables.rest +++ b/Concepts/ProcessVariables.rest @@ -17,14 +17,14 @@ A process variable name is simply a string of alpha-numeric characters. However For example -| ``IN:LARMOR:DAE:GOODUAH`` good microamps on LARMOR +| ``IN:LARMOR:DAE:GOODUAH`` is the PV that holds the good microamps on LARMOR -| ``IN:IMAT:DAE:GOODUAH`` good microamps on IMAT +| ``IN:IMAT:DAE:GOODUAH`` is the PV that holds the good microamps on IMAT Items not part of an instrument have a different prefix. For example, the accelerator generates values with a top-level prefix of ``AC:`` such as -| ``AC:TS1:BEAM:CURR`` TS1 beam current +| ``AC:TS1:BEAM:CURR`` is the PV that holds the TS1 beam current Displaying From 8fff7f0ca998a9d5b0feadf67e6b3bc8b43ffcb0 Mon Sep 17 00:00:00 2001 From: Gollum Date: Wed, 17 Aug 2016 17:07:31 +0100 Subject: [PATCH 0058/1813] Updated ProcessVariables (rest) --- Concepts/ProcessVariables.rest | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/Concepts/ProcessVariables.rest b/Concepts/ProcessVariables.rest index c613ede..d16a6e2 100644 --- a/Concepts/ProcessVariables.rest +++ b/Concepts/ProcessVariables.rest @@ -11,20 +11,18 @@ Naming A process variable name is simply a string of alpha-numeric characters. However, PV names are usually structured to conform to a naming convention, so that individual PV names are unique. The colon : character is used to separate the different sections of a PV name. At ISIS we use the following convention: - * For an instrument all process variables relevant to that instrument will start with the ``IN:`` prefix, - * followed by the instrument name, - * followed by the device specific details (usually device name and variable name). +* For an instrument all process variables relevant to that instrument will start with the ``IN:`` prefix, +* followed by the instrument name, +* followed by the device specific details (usually device name and variable name). For example -| ``IN:LARMOR:DAE:GOODUAH`` is the PV that holds the good microamps on LARMOR - -| ``IN:IMAT:DAE:GOODUAH`` is the PV that holds the good microamps on IMAT - +* ``IN:LARMOR:DAE:GOODUAH`` is the PV that holds the good microamps on LARMOR +* ``IN:IMAT:DAE:GOODUAH`` is the PV that holds the good microamps on IMAT Items not part of an instrument have a different prefix. For example, the accelerator generates values with a top-level prefix of ``AC:`` such as -| ``AC:TS1:BEAM:CURR`` is the PV that holds the TS1 beam current +* ``AC:TS1:BEAM:CURR`` is the PV that holds the TS1 beam current Displaying From 03094b01359ed143b0aac340e7c3695290e3649e Mon Sep 17 00:00:00 2001 From: Gollum Date: Wed, 17 Aug 2016 17:11:11 +0100 Subject: [PATCH 0059/1813] Updated KeyConceptsinIBEX (rest) --- KeyConceptsinIBEX.rest | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/KeyConceptsinIBEX.rest b/KeyConceptsinIBEX.rest index 4b6add9..71fe033 100644 --- a/KeyConceptsinIBEX.rest +++ b/KeyConceptsinIBEX.rest @@ -40,7 +40,7 @@ IOCs processes (e.g. the BlockServer or other IOCs) via [[ProcessVariables]]. Message Server - The Message Server, intercepts console messages written by IOCs and stores them in a database. + The Message Server intercepts console messages written by IOCs and stores them in a database. It also serves the messages to the IBEX client, so that the message log can be inspected from the GUI. From 0a2080e76ff9c2518c5a17593c51955d0af6507c Mon Sep 17 00:00:00 2001 From: Gollum Date: Wed, 17 Aug 2016 17:11:35 +0100 Subject: [PATCH 0060/1813] Updated KeyConceptsinIBEX (rest) --- KeyConceptsinIBEX.rest | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/KeyConceptsinIBEX.rest b/KeyConceptsinIBEX.rest index 71fe033..4c68a39 100644 --- a/KeyConceptsinIBEX.rest +++ b/KeyConceptsinIBEX.rest @@ -41,8 +41,8 @@ IOCs Message Server The Message Server intercepts console messages written by IOCs and stores them in a database. - It also serves the messages to the IBEX client, so that the message log can be inspected from - the GUI. + It also serves the messages to the IBEX client, so that the message log can be inspected and + searched from the GUI. MySQL MySQL is an open-source relational database system, which provides database services to From 41420149c808ec885eea69ca41e37601f335dfbb Mon Sep 17 00:00:00 2001 From: Gollum Date: Wed, 17 Aug 2016 17:16:26 +0100 Subject: [PATCH 0061/1813] Updated KeyConceptsinIBEX (rest) --- KeyConceptsinIBEX.rest | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/KeyConceptsinIBEX.rest b/KeyConceptsinIBEX.rest index 4c68a39..3db3a12 100644 --- a/KeyConceptsinIBEX.rest +++ b/KeyConceptsinIBEX.rest @@ -37,7 +37,8 @@ Archiver IOCs IOCs (Input/Output Controllers) are processes which control individual devices attached to the instrument control PC. IOCs are analogous to LabVIEW VIs. IOCs communicate with other - processes (e.g. the BlockServer or other IOCs) via [[ProcessVariables]]. + processes (e.g. the BlockServer or other IOCs) via [[ProcessVariables]]. Typically, there + is one IOC for each device attached to the instrument control PC. Message Server The Message Server intercepts console messages written by IOCs and stores them in a database. From 0e75741d857c93bcdf53606912000f67d57550f3 Mon Sep 17 00:00:00 2001 From: Gollum Date: Wed, 17 Aug 2016 17:23:27 +0100 Subject: [PATCH 0062/1813] Updated Home (rest) From 1318186d73214353e3ff8d6ff7719319bd853e04 Mon Sep 17 00:00:00 2001 From: Gollum Date: Wed, 17 Aug 2016 17:28:43 +0100 Subject: [PATCH 0063/1813] Updated Home (rest) --- _Sidebar.rest | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/_Sidebar.rest b/_Sidebar.rest index 68c6017..2fef265 100644 --- a/_Sidebar.rest +++ b/_Sidebar.rest @@ -2,6 +2,5 @@ * [[StartingAndStoppingIBEX]] * [[InstallingIBEX]] * [[KeyConceptsinIBEX]] -* [[ProcessVariables]] -* [[Blocks]] +* [[IBEXFeatures]] * [[Glossary]] From 66e96f09f285bc982cd48d15d0596eebd1aa8ca9 Mon Sep 17 00:00:00 2001 From: Gollum Date: Wed, 17 Aug 2016 17:29:08 +0100 Subject: [PATCH 0064/1813] Updated Home (rest) --- Home.rest | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Home.rest b/Home.rest index 483303d..9e73aa2 100644 --- a/Home.rest +++ b/Home.rest @@ -26,6 +26,8 @@ Indices and Tables [[KeyConceptsinIBEX]] +[[IBEXFeatures]] + [[Glossary]] From 78d27c359b78260d158cc2dc24d373e6c110c075 Mon Sep 17 00:00:00 2001 From: Gollum Date: Wed, 17 Aug 2016 17:33:32 +0100 Subject: [PATCH 0065/1813] Created IBEXFeatures (rest) --- IBEXFeatures.rest | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 IBEXFeatures.rest diff --git a/IBEXFeatures.rest b/IBEXFeatures.rest new file mode 100644 index 0000000..07a7a41 --- /dev/null +++ b/IBEXFeatures.rest @@ -0,0 +1,19 @@ +IBEX Features +============= + +This section summarises the main features of IBEX as presented by the IBEX GUI client. + +[[Dashboard]] + +[[BlocksandGroups]] + +[[Configurations]] + +[[Views]] + +[[Alarms]] + +[[AccessandSecurity]] + +[[Archiver]] + From 807d0522842f84e4fce9873d31f47d36630bdc57 Mon Sep 17 00:00:00 2001 From: Gollum Date: Thu, 18 Aug 2016 11:56:42 +0100 Subject: [PATCH 0066/1813] Updated IBEXFeatures (rest) --- IBEXFeatures.rest | 2 ++ 1 file changed, 2 insertions(+) diff --git a/IBEXFeatures.rest b/IBEXFeatures.rest index 07a7a41..d03d09b 100644 --- a/IBEXFeatures.rest +++ b/IBEXFeatures.rest @@ -3,6 +3,8 @@ IBEX Features This section summarises the main features of IBEX as presented by the IBEX GUI client. +You might find it helpful to refer to a `schematic view of the IBEX UI `_. + [[Dashboard]] [[BlocksandGroups]] From 62d8626d00926d82972b5fbebf9297b711d1a2fb Mon Sep 17 00:00:00 2001 From: Gollum Date: Thu, 18 Aug 2016 11:59:07 +0100 Subject: [PATCH 0067/1813] Updated IBEXFeatures (rest) --- IBEXFeatures.rest | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/IBEXFeatures.rest b/IBEXFeatures.rest index d03d09b..ad0f230 100644 --- a/IBEXFeatures.rest +++ b/IBEXFeatures.rest @@ -3,7 +3,7 @@ IBEX Features This section summarises the main features of IBEX as presented by the IBEX GUI client. -You might find it helpful to refer to a `schematic view of the IBEX UI `_. +You might find it helpful to refer to a `schematic view of the IBEX UI `_ while reading this section. [[Dashboard]] From be17fb4ce73846e90dc4d7ae595dccbc9bde1def Mon Sep 17 00:00:00 2001 From: Gollum Date: Thu, 18 Aug 2016 13:55:47 +0100 Subject: [PATCH 0068/1813] Created Dashboard (rest) --- Dashboard.rest | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 Dashboard.rest diff --git a/Dashboard.rest b/Dashboard.rest new file mode 100644 index 0000000..61a36d0 --- /dev/null +++ b/Dashboard.rest @@ -0,0 +1,14 @@ +IBEX Dashboard +============== + +The dashboard occupies the top left-hand corner of the IBEX GUI. It provides a brief summary of the current status of the instrument. + +The top part of the dashboard shows the name of the instrument to which the IBEX GUI is connected and the current state of the instrument, along with the current Run number and the state of the instrument shutter. + +The bottom part of the dashboard summarises the current experiment title and users. At the lower left, the dashboard displays information on good frames vs raw frames, the beam current and monitor counts. At the lower right, the dashboard displays the current instrument time, the length of the current run and the period. + +**Please note:** The instrument time is the date/time measured by the clock on the instrument control PC. It might not be the same as the time displayed on your PC or other electronic devices (e.g. your phone). + + + +You might find it helpful to refer to a `schematic view of the IBEX UI `_ while reading this section. From 8419671d756ae5081c1b1573b0da0da8b17d5922 Mon Sep 17 00:00:00 2001 From: Gollum Date: Thu, 18 Aug 2016 15:08:12 +0100 Subject: [PATCH 0069/1813] Updated Dashboard (rest) --- Dashboard.rest | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/Dashboard.rest b/Dashboard.rest index 61a36d0..cf7465b 100644 --- a/Dashboard.rest +++ b/Dashboard.rest @@ -9,6 +9,19 @@ The bottom part of the dashboard summarises the current experiment title and use **Please note:** The instrument time is the date/time measured by the clock on the instrument control PC. It might not be the same as the time displayed on your PC or other electronic devices (e.g. your phone). +Dashboard States & Colours +-------------------------- +The meanings of the dashboard states and colours are: -You might find it helpful to refer to a `schematic view of the IBEX UI `_ while reading this section. ++------------+------------+-----------+ +| State | Colour | Meaning | ++============+============+===========+ +| SETUP | column 2 | column 3 | ++------------+------------+-----------+ +| RUNNING | column 2 | column 3 | ++------------+------------+-----------+ +| PAUSED | column 2 | column 3 | ++------------+------------+-----------+ +| XXXXXXX | | | ++------------+------------+-----------+ \ No newline at end of file From 403420aa2e262ca000a592ac5cfc47d69072d077 Mon Sep 17 00:00:00 2001 From: Gollum Date: Thu, 18 Aug 2016 16:01:41 +0100 Subject: [PATCH 0070/1813] Updated Dashboard (rest) --- Dashboard.rest | 45 ++++++++++++++++++++++++++++++++++----------- 1 file changed, 34 insertions(+), 11 deletions(-) diff --git a/Dashboard.rest b/Dashboard.rest index cf7465b..0d406ec 100644 --- a/Dashboard.rest +++ b/Dashboard.rest @@ -14,14 +14,37 @@ Dashboard States & Colours The meanings of the dashboard states and colours are: -+------------+------------+-----------+ -| State | Colour | Meaning | -+============+============+===========+ -| SETUP | column 2 | column 3 | -+------------+------------+-----------+ -| RUNNING | column 2 | column 3 | -+------------+------------+-----------+ -| PAUSED | column 2 | column 3 | -+------------+------------+-----------+ -| XXXXXXX | | | -+------------+------------+-----------+ \ No newline at end of file ++------------+-------------+-----------------+ +| State | Colour | Meaning | ++============+=============+=================+ +| PROCESSING | YELLOW | *TODO: meaning* | ++------------+-------------+-----------------+ +| RUNNING | LIGHT_GREEN | *TODO: meaning* | ++------------+-------------+-----------------+ +| SETUP | LIGHT_BLUE | *TODO: meaning* | ++------------+-------------+-----------------+ +| PAUSED | RED | *TODO: meaning* | ++------------+-------------+-----------------+ +| WAITING | GOLDEN_ROD | *TODO: meaning* | ++------------+-------------+-----------------+ +| VETOING | GOLDEN_ROD | *TODO: meaning* | ++------------+-------------+-----------------+ +| ENDING | BLUE | *TODO: meaning* | ++------------+-------------+-----------------+ +| PAUSING | DARK_RED | *TODO: meaning* | ++------------+-------------+-----------------+ +| BEGINNING | GREEN | *TODO: meaning* | ++------------+-------------+-----------------+ +| ABORTING | BLUE | *TODO: meaning* | ++------------+-------------+-----------------+ +| RESUMING | GREEN | *TODO: meaning* | ++------------+-------------+-----------------+ +| UPDATING | YELLOW | *TODO: meaning* | ++------------+-------------+-----------------+ +| STORING | YELLOW | *TODO: meaning* | ++------------+-------------+-----------------+ +| SAVING | YELLOW | *TODO: meaning* | ++------------+-------------+-----------------+ +| UNKNOWN | YELLOW | *TODO: meaning* | ++------------+-------------+-----------------+ + From 1104c3939d48aed1e43968a9a5a6d2b5db779e6c Mon Sep 17 00:00:00 2001 From: Gollum Date: Thu, 18 Aug 2016 16:05:42 +0100 Subject: [PATCH 0071/1813] Updated Dashboard (rest) --- Dashboard.rest | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Dashboard.rest b/Dashboard.rest index 0d406ec..6cfbb58 100644 --- a/Dashboard.rest +++ b/Dashboard.rest @@ -25,9 +25,9 @@ The meanings of the dashboard states and colours are: +------------+-------------+-----------------+ | PAUSED | RED | *TODO: meaning* | +------------+-------------+-----------------+ -| WAITING | GOLDEN_ROD | *TODO: meaning* | +| WAITING | DARK_YELLOW | *TODO: meaning* | +------------+-------------+-----------------+ -| VETOING | GOLDEN_ROD | *TODO: meaning* | +| VETOING | DARK_YELLOW | *TODO: meaning* | +------------+-------------+-----------------+ | ENDING | BLUE | *TODO: meaning* | +------------+-------------+-----------------+ From 3a8c815dececacb204114d8ad77f714fc47d1ca8 Mon Sep 17 00:00:00 2001 From: Gollum Date: Thu, 18 Aug 2016 16:29:07 +0100 Subject: [PATCH 0072/1813] Updated Dashboard (rest) --- Dashboard.rest | 64 +++++++++++++++++++++++++------------------------- 1 file changed, 32 insertions(+), 32 deletions(-) diff --git a/Dashboard.rest b/Dashboard.rest index 6cfbb58..922746e 100644 --- a/Dashboard.rest +++ b/Dashboard.rest @@ -14,37 +14,37 @@ Dashboard States & Colours The meanings of the dashboard states and colours are: -+------------+-------------+-----------------+ -| State | Colour | Meaning | -+============+=============+=================+ -| PROCESSING | YELLOW | *TODO: meaning* | -+------------+-------------+-----------------+ -| RUNNING | LIGHT_GREEN | *TODO: meaning* | -+------------+-------------+-----------------+ -| SETUP | LIGHT_BLUE | *TODO: meaning* | -+------------+-------------+-----------------+ -| PAUSED | RED | *TODO: meaning* | -+------------+-------------+-----------------+ -| WAITING | DARK_YELLOW | *TODO: meaning* | -+------------+-------------+-----------------+ -| VETOING | DARK_YELLOW | *TODO: meaning* | -+------------+-------------+-----------------+ -| ENDING | BLUE | *TODO: meaning* | -+------------+-------------+-----------------+ -| PAUSING | DARK_RED | *TODO: meaning* | -+------------+-------------+-----------------+ ++------------+-------------+------------------------------------------------------------------------------------------+ +| State | Colour | Meaning | ++============+=============+==========================================================================================+ +| RUNNING | LIGHT_GREEN | The DAE is collecting and storing any data it receives | ++------------+-------------+------------------------------------------------------------------------------------------+ +| SETUP | LIGHT_BLUE | The DAE is ready, but is between runs. It is not collecting data. | ++------------+-------------+------------------------------------------------------------------------------------------+ +| PAUSED | RED | The DAE has been instructed to stop collecting data during a run by the user or a script.| ++------------+-------------+------------------------------------------------------------------------------------------+ +| WAITING | DARK_YELLOW | The DAE has been instructed to stop collecting data by IBEX. See[[RunControl]]. | ++------------+-------------+------------------------------------------------------------------------------------------+ +| VETOING | DARK_YELLOW | The DAE has been instructed to stop collecting data by an item of hardware. | ++------------+-------------+------------------------------------------------------------------------------------------+ +| ENDING | BLUE | *TODO: meaning* | ++------------+-------------+------------------------------------------------------------------------------------------+ +| PAUSING | DARK_RED | *TODO: meaning* | ++------------+-------------+------------------------------------------------------------------------------------------+ | BEGINNING | GREEN | *TODO: meaning* | -+------------+-------------+-----------------+ -| ABORTING | BLUE | *TODO: meaning* | -+------------+-------------+-----------------+ -| RESUMING | GREEN | *TODO: meaning* | -+------------+-------------+-----------------+ -| UPDATING | YELLOW | *TODO: meaning* | -+------------+-------------+-----------------+ -| STORING | YELLOW | *TODO: meaning* | -+------------+-------------+-----------------+ -| SAVING | YELLOW | *TODO: meaning* | -+------------+-------------+-----------------+ -| UNKNOWN | YELLOW | *TODO: meaning* | -+------------+-------------+-----------------+ ++------------+-------------+------------------------------------------------------------------------------------------+ +| ABORTING | BLUE | *TODO: meaning* | ++------------+-------------+------------------------------------------------------------------------------------------+ +| RESUMING | GREEN | *TODO: meaning* | ++------------+-------------+------------------------------------------------------------------------------------------+ +| PROCESSING | YELLOW | *TODO: meaning* | ++------------+-------------+------------------------------------------------------------------------------------------+ +| UPDATING | YELLOW | *TODO: meaning* | ++------------+-------------+------------------------------------------------------------------------------------------+ +| STORING | YELLOW | *TODO: meaning* | ++------------+-------------+------------------------------------------------------------------------------------------+ +| SAVING | YELLOW | *TODO: meaning* | ++------------+-------------+------------------------------------------------------------------------------------------+ +| UNKNOWN | YELLOW | *TODO: meaning* | ++------------+-------------+------------------------------------------------------------------------------------------+ From 94af152f0deda5d20c4a461aac9a9c71aa0e8a44 Mon Sep 17 00:00:00 2001 From: Gollum Date: Thu, 18 Aug 2016 16:32:29 +0100 Subject: [PATCH 0073/1813] Updated Dashboard (rest) --- Dashboard.rest | 24 +----------------------- 1 file changed, 1 insertion(+), 23 deletions(-) diff --git a/Dashboard.rest b/Dashboard.rest index 922746e..ba587c3 100644 --- a/Dashboard.rest +++ b/Dashboard.rest @@ -23,28 +23,6 @@ The meanings of the dashboard states and colours are: +------------+-------------+------------------------------------------------------------------------------------------+ | PAUSED | RED | The DAE has been instructed to stop collecting data during a run by the user or a script.| +------------+-------------+------------------------------------------------------------------------------------------+ -| WAITING | DARK_YELLOW | The DAE has been instructed to stop collecting data by IBEX. See[[RunControl]]. | -+------------+-------------+------------------------------------------------------------------------------------------+ -| VETOING | DARK_YELLOW | The DAE has been instructed to stop collecting data by an item of hardware. | -+------------+-------------+------------------------------------------------------------------------------------------+ -| ENDING | BLUE | *TODO: meaning* | -+------------+-------------+------------------------------------------------------------------------------------------+ -| PAUSING | DARK_RED | *TODO: meaning* | -+------------+-------------+------------------------------------------------------------------------------------------+ -| BEGINNING | GREEN | *TODO: meaning* | -+------------+-------------+------------------------------------------------------------------------------------------+ -| ABORTING | BLUE | *TODO: meaning* | -+------------+-------------+------------------------------------------------------------------------------------------+ -| RESUMING | GREEN | *TODO: meaning* | -+------------+-------------+------------------------------------------------------------------------------------------+ -| PROCESSING | YELLOW | *TODO: meaning* | -+------------+-------------+------------------------------------------------------------------------------------------+ -| UPDATING | YELLOW | *TODO: meaning* | -+------------+-------------+------------------------------------------------------------------------------------------+ -| STORING | YELLOW | *TODO: meaning* | -+------------+-------------+------------------------------------------------------------------------------------------+ -| SAVING | YELLOW | *TODO: meaning* | -+------------+-------------+------------------------------------------------------------------------------------------+ -| UNKNOWN | YELLOW | *TODO: meaning* | +| WAITING | DARK_YELLOW | The DAE has been instructed to stop collecting data by IBEX. See [[RunControl]]. | +------------+-------------+------------------------------------------------------------------------------------------+ From ac7dfc3f88d07d214a1c6cf497497a7f582ee366 Mon Sep 17 00:00:00 2001 From: Gollum Date: Thu, 18 Aug 2016 16:36:54 +0100 Subject: [PATCH 0074/1813] Updated Dashboard (rest) --- Dashboard.rest | 45 +++++++++++++++++++++++++++++++++------------ 1 file changed, 33 insertions(+), 12 deletions(-) diff --git a/Dashboard.rest b/Dashboard.rest index ba587c3..066cb3d 100644 --- a/Dashboard.rest +++ b/Dashboard.rest @@ -14,15 +14,36 @@ Dashboard States & Colours The meanings of the dashboard states and colours are: -+------------+-------------+------------------------------------------------------------------------------------------+ -| State | Colour | Meaning | -+============+=============+==========================================================================================+ -| RUNNING | LIGHT_GREEN | The DAE is collecting and storing any data it receives | -+------------+-------------+------------------------------------------------------------------------------------------+ -| SETUP | LIGHT_BLUE | The DAE is ready, but is between runs. It is not collecting data. | -+------------+-------------+------------------------------------------------------------------------------------------+ -| PAUSED | RED | The DAE has been instructed to stop collecting data during a run by the user or a script.| -+------------+-------------+------------------------------------------------------------------------------------------+ -| WAITING | DARK_YELLOW | The DAE has been instructed to stop collecting data by IBEX. See [[RunControl]]. | -+------------+-------------+------------------------------------------------------------------------------------------+ - ++------------+-------------------+ +| State | background Colour | ++============+===================+ +| RUNNING | LIGHT_GREEN | ++------------+-------------------+ +| SETUP | LIGHT_BLUE | ++------------+-------------------+ +| PAUSED | RED | ++------------+-------------------+ +| WAITING | DARK_YELLOW | ++------------+-------------------+ +| VETOING | DARK_YELLOW | ++------------+-------------------+ +| ENDING | BLUE | ++------------+-------------------+ +| PAUSING | DARK_RED | ++------------+-------------------+ +| BEGINNING | GREEN | ++------------+-------------------+ +| ABORTING | BLUE | ++------------+-------------------+ +| RESUMING | GREEN | ++------------+-------------------+ +| PROCESSING | YELLOW | ++------------+-------------------+ +| UPDATING | YELLOW | ++------------+-------------------+ +| STORING | YELLOW | ++------------+-------------------+ +| SAVING | YELLOW | ++------------+-------------------+ +| UNKNOWN | YELLOW | ++------------+-------------------+ From 5a6e7a2ec31863a40c5871e0141972ef761a7f3e Mon Sep 17 00:00:00 2001 From: Gollum Date: Thu, 18 Aug 2016 16:53:21 +0100 Subject: [PATCH 0075/1813] Updated Dashboard (rest) --- Dashboard.rest | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dashboard.rest b/Dashboard.rest index 066cb3d..88f7b10 100644 --- a/Dashboard.rest +++ b/Dashboard.rest @@ -15,7 +15,7 @@ Dashboard States & Colours The meanings of the dashboard states and colours are: +------------+-------------------+ -| State | background Colour | +| State | Background Colour | +============+===================+ | RUNNING | LIGHT_GREEN | +------------+-------------------+ From 7cefc5ae5b8bbcbf4530fb24db158f10824a93b3 Mon Sep 17 00:00:00 2001 From: Gollum Date: Thu, 18 Aug 2016 17:02:54 +0100 Subject: [PATCH 0076/1813] Updated Blocks (rest) --- Concepts/Blocks.rest | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Concepts/Blocks.rest b/Concepts/Blocks.rest index a2aa91b..8990b53 100644 --- a/Concepts/Blocks.rest +++ b/Concepts/Blocks.rest @@ -5,6 +5,6 @@ Blocks The IBEX concept of a block is similar to SECI, in that it is a relevant piece of information chosen by the scientist that will be displayed on the instrument dashboard and logged into the datafile. -In IBEX, a block is, to all intents and purposes, an alias to a process variable. For example, the block ``Chop1Freq`` on LARMOR is the process variable ``IN:LARMOR:CS:SB:Chop1Freq``. It is much simpler to refer to a block than to refer to a process variable. Utilities like genie_python know about blocks and you can use commands such as ``cset`` to access ``Chop1Freq``. However you can access blocks using the name ``IN:LARMOR:CS:SB:Chop1Freq`` with any standard EPICS tool. - +In IBEX, a block is, to all intents and purposes, an alias to a process variable. For example, the block ``Chop1Freq`` on LARMOR is defined to be the process variable ``IN:LARMOR:CS:SB:Chop1Freq``. It is much simpler to refer to a block than to refer to a process variable. Utilities like genie_python know about blocks and you can use commands such as ``cset`` to access ``Chop1Freq``. However you can access blocks using the name ``IN:LARMOR:CS:SB:Chop1Freq`` with any standard EPICS tool. +Process variables are defined in more detail on the [[ProcessVariables]] page. From 99168c717fe5ec4ec20caff95d606cc781b270ac Mon Sep 17 00:00:00 2001 From: Gollum Date: Thu, 18 Aug 2016 17:14:07 +0100 Subject: [PATCH 0077/1813] Created BlocksandGroups (rest) --- BlocksandGroups.rest | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 BlocksandGroups.rest diff --git a/BlocksandGroups.rest b/BlocksandGroups.rest new file mode 100644 index 0000000..7411a06 --- /dev/null +++ b/BlocksandGroups.rest @@ -0,0 +1,14 @@ +Blocks & Groups +=============== + +The blocks & groups area of the IBEX GUI is situated to the right of the [[Dashboard]]. It displays all the blocks defined for the currently loaded instrument configuration. The blocks are arranged in groups. + +Blocks +------ +A block is, in effect, an alias for a process variable. Process variables are defined in more detail on the [[ProcessVariables]] page. Any process variable can be assigned to a block. Blocks are defined in more detail on the [[Blocks]] page. + +A tick mark next to a block, or a coloured box surrounding the block indicates that the block is under run control. Run control is defined in more detail on the [[RunControl]] page. + +Groups +------ +Blocks can be arranged in groups. This provides a convenient way to group related blocks together. You can create as many groups as you need to categorise your blocks. By default, blocks will be assigned to a group called "Other". From d68fbb2a0c7991dd16dfb875807fa41bd2c646cf Mon Sep 17 00:00:00 2001 From: Gollum Date: Thu, 18 Aug 2016 17:14:41 +0100 Subject: [PATCH 0078/1813] Renamed IBEXFeatures to /IBEXGUIFeatures --- IBEXFeatures.rest => IBEXGUIFeatures.rest | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename IBEXFeatures.rest => IBEXGUIFeatures.rest (100%) diff --git a/IBEXFeatures.rest b/IBEXGUIFeatures.rest similarity index 100% rename from IBEXFeatures.rest rename to IBEXGUIFeatures.rest From daed7168af933044723fa5ca3b95bb51898e4b7c Mon Sep 17 00:00:00 2001 From: Gollum Date: Thu, 18 Aug 2016 17:16:40 +0100 Subject: [PATCH 0079/1813] Updated Home (rest) --- Home.rest | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Home.rest b/Home.rest index 9e73aa2..9f5468f 100644 --- a/Home.rest +++ b/Home.rest @@ -26,7 +26,7 @@ Indices and Tables [[KeyConceptsinIBEX]] -[[IBEXFeatures]] +[[IBEXGUIFeatures]] [[Glossary]] From 5d2e5c28304b47808e0b5f294e4873dc70f3881d Mon Sep 17 00:00:00 2001 From: Gollum Date: Thu, 18 Aug 2016 17:17:57 +0100 Subject: [PATCH 0080/1813] Updated IBEXGUIFeatures (rest) --- IBEXGUIFeatures.rest | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/IBEXGUIFeatures.rest b/IBEXGUIFeatures.rest index ad0f230..418ca10 100644 --- a/IBEXGUIFeatures.rest +++ b/IBEXGUIFeatures.rest @@ -1,21 +1,18 @@ -IBEX Features -============= +IBEX GUI Features +================= This section summarises the main features of IBEX as presented by the IBEX GUI client. You might find it helpful to refer to a `schematic view of the IBEX UI `_ while reading this section. +[[MenuBar]] + [[Dashboard]] [[BlocksandGroups]] -[[Configurations]] - [[Views]] -[[Alarms]] - -[[AccessandSecurity]] - -[[Archiver]] +[[NotificationBanner]] +[[StatusBar]] From 15f4ad445ab052113b345f7aab8f437e78dd053a Mon Sep 17 00:00:00 2001 From: Gollum Date: Thu, 18 Aug 2016 17:35:20 +0100 Subject: [PATCH 0081/1813] Created Views (rest) --- Views.rest | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 Views.rest diff --git a/Views.rest b/Views.rest new file mode 100644 index 0000000..2f1b208 --- /dev/null +++ b/Views.rest @@ -0,0 +1,32 @@ +Views & the View Selector +========================= + +The main area of the IBEX GUI is reserved for displaying different types of view. Each displays a different aspect of the instrument. + +View Selector +------------- +The View Selector, situated on the left-hand side of the IBEX GUI, below the [[Dashboard]], is simply a column of buttons. Click on each button to change the view. The currently highlighted button indicates which view is selected. + +Views +------ +Alarms + The Alarms View displays the alarm state of all devices attached to the instrument control PC. +Beam Status + The Beam Status View displays the status of the synchrotron, TS1 and TS2 beams. It also displays MCR news. +DAE + The DAE View allows you to set up and control the DAE. +Experiment Details + The Experiment Details View allows you to look up details of your current experiment using the RB number. +IOC Log + The IOC Log View displays a log of all the messages sent by the IOCs which control the devices attached to the instrument control PC. +Log Plotter + The Log Plotter View alloows you to plot a strip-chart graph of any block of process variable. +Motors + The Motors View displays the status of all motors connected to the instrument control PC. You can also control all motors from this view. The Motors View is most useful for instruments with large numbers of motors. +Scripting + Selecting the Scripting View displays a Python console, allowing you to load and execute Python or genie_python scripts. +Synoptic + The Synoptic View provides a schematic overview of your instrument. It is a convenient way to navigate to any device attached to the instrument control PC. +Web Links + The Web Links View is a collection of convenient web links. + From 13f25f3d2a26a7ec61a14c9748ff7c8ab8c71599 Mon Sep 17 00:00:00 2001 From: Gollum Date: Fri, 19 Aug 2016 12:22:25 +0100 Subject: [PATCH 0082/1813] Updated Views (rest) --- Views.rest | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Views.rest b/Views.rest index 2f1b208..6be04c2 100644 --- a/Views.rest +++ b/Views.rest @@ -20,7 +20,7 @@ Experiment Details IOC Log The IOC Log View displays a log of all the messages sent by the IOCs which control the devices attached to the instrument control PC. Log Plotter - The Log Plotter View alloows you to plot a strip-chart graph of any block of process variable. + The Log Plotter View allows you to plot a strip-chart graph of any block of process variable. Motors The Motors View displays the status of all motors connected to the instrument control PC. You can also control all motors from this view. The Motors View is most useful for instruments with large numbers of motors. Scripting From 84797034dc894f8979dd413d47cc3d5ccfbf648f Mon Sep 17 00:00:00 2001 From: Gollum Date: Fri, 19 Aug 2016 12:23:42 +0100 Subject: [PATCH 0083/1813] Updated Home (rest) --- _Sidebar.rest | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_Sidebar.rest b/_Sidebar.rest index 2fef265..3d1002c 100644 --- a/_Sidebar.rest +++ b/_Sidebar.rest @@ -2,5 +2,5 @@ * [[StartingAndStoppingIBEX]] * [[InstallingIBEX]] * [[KeyConceptsinIBEX]] -* [[IBEXFeatures]] +* [[IBEXGUIFeatures]] * [[Glossary]] From c3060a30edfc9295db87a20bb2342c9b41ac40cd Mon Sep 17 00:00:00 2001 From: Gollum Date: Fri, 19 Aug 2016 13:27:29 +0100 Subject: [PATCH 0084/1813] Created MenuBar (rest) --- MenuBar.rest | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 MenuBar.rest diff --git a/MenuBar.rest b/MenuBar.rest new file mode 100644 index 0000000..04b4d9b --- /dev/null +++ b/MenuBar.rest @@ -0,0 +1,38 @@ +IBEX Menu Bar +============= + +The menu bar on the IBEX GUI provides access to the application features described below. + +IBEX Menu +--------- +Switch Instrument + Select the Switch Instrument menu item to re-direct the IBEX GUI to view a different instrument. +Restore Default View + Selecting the Restore Default View option resets the IBEX GUI display to its startup view. +Exit IBEX Client + Select the Exit IBEX Client menu item to quit. Please note, quitting the IBEX Client does not terminate the IBEX server, which will continue to run on the instrument control PC. + +Configuration Menu +------------------ +Edit Current Configuration + Select the Edit Current Configuration menu item to make changes to the currently loaded instrument configuration. +Configurations + Select the Configuration menu item to perform one of the following actions: + + * New - create a new configuration + * Load - replace the current configuration with a different configuration loaded from a file + * Edit - edit an existing configuration (independently of the current configuration) + * Delete - delete a configuration + +Components + Select the Components menu item to perform one of the following actions: + + * New - create a new component + * Edit - edit an existing component + * Delete - delete a component + +Recent Configurations + Select a recently used configuration and make it the current configuration. + + + From 034867aae0ef8a761a4960eed85c057af7210330 Mon Sep 17 00:00:00 2001 From: Gollum Date: Fri, 19 Aug 2016 13:29:17 +0100 Subject: [PATCH 0085/1813] Updated MenuBar (rest) --- MenuBar.rest | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/MenuBar.rest b/MenuBar.rest index 04b4d9b..00975fd 100644 --- a/MenuBar.rest +++ b/MenuBar.rest @@ -34,5 +34,11 @@ Components Recent Configurations Select a recently used configuration and make it the current configuration. - - +Synoptic Menu +------------- +New + Create a new synoptic. +Edit + Select an existing synoptic and edit it. +Delete + Select an existing synoptic to delete it. From 64e0b6d593a87db86c28df1cbbd08fc015081dff Mon Sep 17 00:00:00 2001 From: Gollum Date: Fri, 19 Aug 2016 13:34:07 +0100 Subject: [PATCH 0086/1813] Updated MenuBar (rest) --- MenuBar.rest | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/MenuBar.rest b/MenuBar.rest index 00975fd..65556d4 100644 --- a/MenuBar.rest +++ b/MenuBar.rest @@ -42,3 +42,13 @@ Edit Select an existing synoptic and edit it. Delete Select an existing synoptic to delete it. + +IOC Menu +-------- +Start/Stop IOCs + Selecting the Start/Stop IOCs menu item displays a dialog allowing you to start an IOC or to stop an IOC that is currently running. + +Run Control Menu +---------------- +View Run Control Settings + Selecting the View Run Control Settings menu item displays a dialog showing you which blocks (if any) are currently under run control. You can also assign new run-control settings to blocks and modify or remove existing run-control settings. From 6d9214e2f1f901db619aae6c391e362e513d3849 Mon Sep 17 00:00:00 2001 From: Gollum Date: Fri, 19 Aug 2016 13:40:02 +0100 Subject: [PATCH 0087/1813] Updated MenuBar (rest) --- MenuBar.rest | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/MenuBar.rest b/MenuBar.rest index 65556d4..59715fd 100644 --- a/MenuBar.rest +++ b/MenuBar.rest @@ -52,3 +52,10 @@ Run Control Menu ---------------- View Run Control Settings Selecting the View Run Control Settings menu item displays a dialog showing you which blocks (if any) are currently under run control. You can also assign new run-control settings to blocks and modify or remove existing run-control settings. + +Help Menu +--------- +About + Selecting the About menu item displays a dialog showing the current version of the IBEX client and the current version of the IBEX server (running on the instrument control PC to which you are currently connected). If you need to report a problem with IBEX, support staff may ask you to look up this information, so that they know which version of the IBEX software you are using. +Console Log + The console log is used by support staff to help them diagnose any problems that IBEX might encounter. From 44d73ee37d4fcd856f1a9b7409dc8af8250644cf Mon Sep 17 00:00:00 2001 From: Gollum Date: Fri, 19 Aug 2016 13:41:55 +0100 Subject: [PATCH 0088/1813] Updated MenuBar (rest) From 5d1fa0bba7915eefcb09e2ede320edd3666c70ea Mon Sep 17 00:00:00 2001 From: Gollum Date: Fri, 19 Aug 2016 13:56:18 +0100 Subject: [PATCH 0089/1813] Created NotificationBanner (markdown) --- NotificationBanner.md | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 NotificationBanner.md diff --git a/NotificationBanner.md b/NotificationBanner.md new file mode 100644 index 0000000..96d9a6b --- /dev/null +++ b/NotificationBanner.md @@ -0,0 +1,8 @@ +Notification Banner +=================== + +The Notification Banner sets just below the dashboard and the blocks & groups area of the IBEX GUI. + +The Notification Banner is used to display important status information about selected devices on an instrument. It is customisable on an instrument by instrument basis. For example, on LARMOR, the Notification Banner is customised to display a message indicating whether any motors are moving and to display a message if the bump strip has been tripped. On IMAT, the Notification Banner is customised to display the current position of the beam attenuator device. + +Please discuss how you would like the Notification Banner to be customised for your instrument with the Experimental Controls team. \ No newline at end of file From c6d0fc5540681e321fc24a4118c23c3d3bfb4deb Mon Sep 17 00:00:00 2001 From: Gollum Date: Fri, 19 Aug 2016 13:57:03 +0100 Subject: [PATCH 0090/1813] Destroyed NotificationBanner (markdown) --- NotificationBanner.md | 8 -------- 1 file changed, 8 deletions(-) delete mode 100644 NotificationBanner.md diff --git a/NotificationBanner.md b/NotificationBanner.md deleted file mode 100644 index 96d9a6b..0000000 --- a/NotificationBanner.md +++ /dev/null @@ -1,8 +0,0 @@ -Notification Banner -=================== - -The Notification Banner sets just below the dashboard and the blocks & groups area of the IBEX GUI. - -The Notification Banner is used to display important status information about selected devices on an instrument. It is customisable on an instrument by instrument basis. For example, on LARMOR, the Notification Banner is customised to display a message indicating whether any motors are moving and to display a message if the bump strip has been tripped. On IMAT, the Notification Banner is customised to display the current position of the beam attenuator device. - -Please discuss how you would like the Notification Banner to be customised for your instrument with the Experimental Controls team. \ No newline at end of file From 3484b56ae2e7a1ff0a70eb0789253a36e8796364 Mon Sep 17 00:00:00 2001 From: Gollum Date: Fri, 19 Aug 2016 13:57:20 +0100 Subject: [PATCH 0091/1813] Created NotificationBanner (rest) --- NotificationBanner.rest | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 NotificationBanner.rest diff --git a/NotificationBanner.rest b/NotificationBanner.rest new file mode 100644 index 0000000..1cd94d3 --- /dev/null +++ b/NotificationBanner.rest @@ -0,0 +1,9 @@ + +Notification Banner +=================== + +The Notification Banner sets just below the dashboard and the blocks & groups area of the IBEX GUI. + +The Notification Banner is used to display important status information about selected devices on an instrument. It is customisable on an instrument by instrument basis. For example, on LARMOR, the Notification Banner is customised to display a message indicating whether any motors are moving and to display a message if the bump strip has been tripped. On IMAT, the Notification Banner is customised to display the current position of the beam attenuator device. + +Please discuss how you would like the Notification Banner to be customised for your instrument with the Experimental Controls team. From 84715ee042bbef09037cc6d516e9552552e527da Mon Sep 17 00:00:00 2001 From: Gollum Date: Fri, 19 Aug 2016 13:57:32 +0100 Subject: [PATCH 0092/1813] Updated NotificationBanner (rest) --- NotificationBanner.rest | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/NotificationBanner.rest b/NotificationBanner.rest index 1cd94d3..f15ecc2 100644 --- a/NotificationBanner.rest +++ b/NotificationBanner.rest @@ -1,8 +1,7 @@ - Notification Banner =================== -The Notification Banner sets just below the dashboard and the blocks & groups area of the IBEX GUI. +The Notification Banner sits just below the dashboard and the blocks & groups area of the IBEX GUI. The Notification Banner is used to display important status information about selected devices on an instrument. It is customisable on an instrument by instrument basis. For example, on LARMOR, the Notification Banner is customised to display a message indicating whether any motors are moving and to display a message if the bump strip has been tripped. On IMAT, the Notification Banner is customised to display the current position of the beam attenuator device. From c0f4df07e3062a81f3a04fe905c33b1eccea0c46 Mon Sep 17 00:00:00 2001 From: Gollum Date: Fri, 19 Aug 2016 14:00:33 +0100 Subject: [PATCH 0093/1813] Created StatusBar (rest) --- StatusBar.rest | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 StatusBar.rest diff --git a/StatusBar.rest b/StatusBar.rest new file mode 100644 index 0000000..1497077 --- /dev/null +++ b/StatusBar.rest @@ -0,0 +1,7 @@ +Status Bar +========== + +The Status Bar is located at the bottom of the IBEX GUI window. + +The Status Bar displays information about the current status of the IBEX GUI. It is primarily used to display the name of the current configuration. + From 6bcd583add14945c68cd8189c76fab5f85dabeed Mon Sep 17 00:00:00 2001 From: Gollum Date: Fri, 19 Aug 2016 14:02:02 +0100 Subject: [PATCH 0094/1813] Updated NotificationBanner (rest) --- NotificationBanner.rest | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/NotificationBanner.rest b/NotificationBanner.rest index f15ecc2..9f577d4 100644 --- a/NotificationBanner.rest +++ b/NotificationBanner.rest @@ -1,7 +1,7 @@ Notification Banner =================== -The Notification Banner sits just below the dashboard and the blocks & groups area of the IBEX GUI. +The Notification Banner sits just below the [[Dashboard]] and the [[BlocksandGroups]] area of the IBEX GUI. The Notification Banner is used to display important status information about selected devices on an instrument. It is customisable on an instrument by instrument basis. For example, on LARMOR, the Notification Banner is customised to display a message indicating whether any motors are moving and to display a message if the bump strip has been tripped. On IMAT, the Notification Banner is customised to display the current position of the beam attenuator device. From 3d99a38f92e22488d7e1826f8fa846f608fbbf4c Mon Sep 17 00:00:00 2001 From: Gollum Date: Fri, 19 Aug 2016 14:09:46 +0100 Subject: [PATCH 0095/1813] Updated Home (rest) --- Home.rest | 2 ++ _Sidebar.rest | 1 + 2 files changed, 3 insertions(+) diff --git a/Home.rest b/Home.rest index 9f5468f..15bf58b 100644 --- a/Home.rest +++ b/Home.rest @@ -28,6 +28,8 @@ Indices and Tables [[IBEXGUIFeatures]] +[[FAQ]] + [[Glossary]] diff --git a/_Sidebar.rest b/_Sidebar.rest index 3d1002c..9184baf 100644 --- a/_Sidebar.rest +++ b/_Sidebar.rest @@ -3,4 +3,5 @@ * [[InstallingIBEX]] * [[KeyConceptsinIBEX]] * [[IBEXGUIFeatures]] +* [[FAQ]] * [[Glossary]] From 61590b6a0e22eaea73cb85770dceb8136fb92322 Mon Sep 17 00:00:00 2001 From: Gollum Date: Fri, 19 Aug 2016 14:25:17 +0100 Subject: [PATCH 0096/1813] Created FAQ (rest) --- FAQ.rest | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 FAQ.rest diff --git a/FAQ.rest b/FAQ.rest new file mode 100644 index 0000000..ebb515c --- /dev/null +++ b/FAQ.rest @@ -0,0 +1,25 @@ +IBEX FAQ +======== + +In this section of the IBEX user manual we have compiled a list of frequently asked questions. If you have a question about IBEX that is not answered below, please let us (the Experimental Controls team) know. If your question is likely to be asked by others, we'll add it to the list. + +.. _Return_to_Top: + +List of Frequently Asked Questions +---------------------------------- + +#. FAQnumber1_. +#. FAQnumber2_. + + +.. _FAQnumber1: + +This is an example FAQ. + +Return_to_Top_. + +.. _FAQnumber2: + +This is another example FAQ. + +Return_to_Top_. From 7e74efcc7b3d8ce1030a28096bb0fae194424a5a Mon Sep 17 00:00:00 2001 From: Gollum Date: Fri, 19 Aug 2016 15:06:12 +0100 Subject: [PATCH 0097/1813] Updated FAQ (rest) --- FAQ.rest | 68 +++++++++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 62 insertions(+), 6 deletions(-) diff --git a/FAQ.rest b/FAQ.rest index ebb515c..ee290a9 100644 --- a/FAQ.rest +++ b/FAQ.rest @@ -8,18 +8,74 @@ In this section of the IBEX user manual we have compiled a list of frequently as List of Frequently Asked Questions ---------------------------------- -#. FAQnumber1_. -#. FAQnumber2_. +#. FAQ1001_ This is the first question +#. FAQ1002_ This is the second question +#. FAQ1003_ This is the third question +#. FAQ1004_ This is the fourth question +#. FAQ1005_ This is the fifth question +#. FAQ1006_ This is the sixth question +#. FAQ1007_ This is the seventh question +#. FAQ1008_ This is the eighth question +#. FAQ1009_ This is the ninth question +#. FAQ1010_ This is the tenth question -.. _FAQnumber1: +.. _FAQ1001: -This is an example FAQ. +This is the first answer. Return_to_Top_. -.. _FAQnumber2: +.. _FAQ1002: -This is another example FAQ. +This is the second answer. + +Return_to_Top_. + +.. _FAQ1003: + +This is the third answer. + +Return_to_Top_. + +.. _FAQ1004: + +This is the fourth answer. + +Return_to_Top_. + +.. _FAQ1005: + +This is the fifth answer. + +Return_to_Top_. + +.. _FAQ1006: + +This is the sixth answer. + +Return_to_Top_. + +.. _FAQ1007: + +This is the seventh answer. + +Return_to_Top_. + +.. _FAQ1008: + +This is the eighth answer. + +Return_to_Top_. + +.. _FAQ1009: + +This is the ninth answer. + +Return_to_Top_. + +.. _FAQ1010: + +This is the tenth answer. Return_to_Top_. From 7fca73b697723078c064ee395819b9c106a37a73 Mon Sep 17 00:00:00 2001 From: Gollum Date: Fri, 19 Aug 2016 15:07:54 +0100 Subject: [PATCH 0098/1813] Updated FAQ (rest) --- FAQ.rest | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/FAQ.rest b/FAQ.rest index ee290a9..7ce0a68 100644 --- a/FAQ.rest +++ b/FAQ.rest @@ -3,7 +3,7 @@ IBEX FAQ In this section of the IBEX user manual we have compiled a list of frequently asked questions. If you have a question about IBEX that is not answered below, please let us (the Experimental Controls team) know. If your question is likely to be asked by others, we'll add it to the list. -.. _Return_to_Top: +.. _Return: List of Frequently Asked Questions ---------------------------------- @@ -24,58 +24,58 @@ List of Frequently Asked Questions This is the first answer. -Return_to_Top_. +Return_ .. _FAQ1002: This is the second answer. -Return_to_Top_. +Return_ .. _FAQ1003: This is the third answer. -Return_to_Top_. +Return_ .. _FAQ1004: This is the fourth answer. -Return_to_Top_. +Return_ .. _FAQ1005: This is the fifth answer. -Return_to_Top_. +Return_ .. _FAQ1006: This is the sixth answer. -Return_to_Top_. +Return_ .. _FAQ1007: This is the seventh answer. -Return_to_Top_. +Return_ .. _FAQ1008: This is the eighth answer. -Return_to_Top_. +Return_ .. _FAQ1009: This is the ninth answer. -Return_to_Top_. +Return_ .. _FAQ1010: This is the tenth answer. -Return_to_Top_. +Return_ From 5b086ecae9a374103dac0988649a501e4118aa49 Mon Sep 17 00:00:00 2001 From: Gollum Date: Fri, 19 Aug 2016 15:13:52 +0100 Subject: [PATCH 0099/1813] Updated FAQ (rest) --- FAQ.rest | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/FAQ.rest b/FAQ.rest index 7ce0a68..157eede 100644 --- a/FAQ.rest +++ b/FAQ.rest @@ -3,11 +3,11 @@ IBEX FAQ In this section of the IBEX user manual we have compiled a list of frequently asked questions. If you have a question about IBEX that is not answered below, please let us (the Experimental Controls team) know. If your question is likely to be asked by others, we'll add it to the list. -.. _Return: - List of Frequently Asked Questions ---------------------------------- +.. _Return: + #. FAQ1001_ This is the first question #. FAQ1002_ This is the second question #. FAQ1003_ This is the third question From 558fa4b398bc5a862517c6773fafe4cca70eae33 Mon Sep 17 00:00:00 2001 From: Gollum Date: Fri, 19 Aug 2016 15:38:19 +0100 Subject: [PATCH 0100/1813] Updated FAQ (rest) --- FAQ.rest | 41 +++++++++++++++++++++-------------------- 1 file changed, 21 insertions(+), 20 deletions(-) diff --git a/FAQ.rest b/FAQ.rest index 157eede..8916283 100644 --- a/FAQ.rest +++ b/FAQ.rest @@ -8,73 +8,74 @@ List of Frequently Asked Questions .. _Return: -#. FAQ1001_ This is the first question -#. FAQ1002_ This is the second question -#. FAQ1003_ This is the third question -#. FAQ1004_ This is the fourth question -#. FAQ1005_ This is the fifth question -#. FAQ1006_ This is the sixth question -#. FAQ1007_ This is the seventh question -#. FAQ1008_ This is the eighth question -#. FAQ1009_ This is the ninth question -#. FAQ1010_ This is the tenth question +#. `This is the first question`_ +#. `This is the second question`_ +#. `This is the third question`_ +#. `This is the fourth question`_ +#. `This is the fifth question`_ +#. `This is the sixth question`_ +#. `This is the seventh question`_ +#. `This is the eighth question`_ +#. `This is the ninth question`_ +#. `This is the tenth question`_ -.. _FAQ1001: +.. _`This is the first question`: +This is the first question. This is the first answer. Return_ -.. _FAQ1002: +.. _`This is the second question`: This is the second answer. Return_ -.. _FAQ1003: +.. _`This is the third question`: This is the third answer. Return_ -.. _FAQ1004: +.. _`This is the fourth question`: This is the fourth answer. Return_ -.. _FAQ1005: +.. _`This is the fifth question`: This is the fifth answer. Return_ -.. _FAQ1006: +.. _`This is the sixth question`: This is the sixth answer. Return_ -.. _FAQ1007: +.. _`This is the seventh question`: This is the seventh answer. Return_ -.. _FAQ1008: +.. _`This is the eighth question`: This is the eighth answer. Return_ -.. _FAQ1009: +.. _`This is the ninth question`: This is the ninth answer. Return_ -.. _FAQ1010: +.. _`This is the tenth question`: This is the tenth answer. From 4ef1ae833c925ac7532c25f245959f8e4eaf263d Mon Sep 17 00:00:00 2001 From: Gollum Date: Mon, 22 Aug 2016 10:48:00 +0100 Subject: [PATCH 0101/1813] Updated StartingAndStoppingIBEX (rest) --- Introduction/StartingAndStoppingIBEX.rest | 32 +++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/Introduction/StartingAndStoppingIBEX.rest b/Introduction/StartingAndStoppingIBEX.rest index 9dd2cfb..f2d2875 100644 --- a/Introduction/StartingAndStoppingIBEX.rest +++ b/Introduction/StartingAndStoppingIBEX.rest @@ -2,3 +2,35 @@ Starting and Stopping IBEX ========================== + +Starting and Stopping IBEX Client +--------------------------------- + +Starting IBEX Client +~~~~~~~~~~~~~~~~~~~~ + +To start IBEX Client simply select IBEX from the Start icon on the taskbar of your Windows PC. If you use IBEX regularly, it will appear in the menu of frequently used programs as soon as you click on the Start icon. + +If you have not used IBEX for some time, it might not appear on the list of frequently used programs. In this case, you can navigate to IBEX by using the Search box on the Start menu. + +Alternatively, if you created a desktop short-cut to the IBEX client, simply double-click on the icon. + +Stopping IBEX Client +~~~~~~~~~~~~~~~~~~~~ + +To stop the IBEX client, select `Exit IBEX Client` from the `IBEX` menu. IBEX will prompt you to confirm that you are sure you wish to exit. Simply confirm that you wish to exit and the IBEX client will shut down. + +** Please Note:** Stopping the IBEX client does not stop the IBEX server. The IBEX server will continue to run after you have stopped the IBEX client. You can re-connect to the IBEX server the next time to start the IBEX client. + +Starting and Stopping IBEX Server +--------------------------------- + +Starting IBEX Server +~~~~~~~~~~~~~~~~~~~~ + +To start IBEX Client simply select IBEX from the Start icon on the taskbar of your Windows PC. If you use IBEX regularly, it will appear in the menu of frequently used programs as soon as you click on the Start icon. + +Stopping IBEX Server +~~~~~~~~~~~~~~~~~~~~ + + From 10b3788ccccd5a497ac7d43524b33e82c8f31e2c Mon Sep 17 00:00:00 2001 From: Gollum Date: Mon, 22 Aug 2016 10:48:55 +0100 Subject: [PATCH 0102/1813] Updated ProcessVariables (rest) --- Concepts/ProcessVariables.rest | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Concepts/ProcessVariables.rest b/Concepts/ProcessVariables.rest index d16a6e2..4f62d60 100644 --- a/Concepts/ProcessVariables.rest +++ b/Concepts/ProcessVariables.rest @@ -18,7 +18,7 @@ A process variable name is simply a string of alpha-numeric characters. However For example * ``IN:LARMOR:DAE:GOODUAH`` is the PV that holds the good microamps on LARMOR -* ``IN:IMAT:DAE:GOODUAH`` is the PV that holds the good microamps on IMAT +* ``IN:IMAT:DAE:GOODUAH`` is the PV that holds the good microamps on IMAT Items not part of an instrument have a different prefix. For example, the accelerator generates values with a top-level prefix of ``AC:`` such as From ad707fb87a9777e578b083f4e81aa4dc3b5dda30 Mon Sep 17 00:00:00 2001 From: Gollum Date: Mon, 22 Aug 2016 10:58:07 +0100 Subject: [PATCH 0103/1813] Updated StartingAndStoppingIBEX (rest) --- Introduction/StartingAndStoppingIBEX.rest | 27 ++++++++++++++++++++--- 1 file changed, 24 insertions(+), 3 deletions(-) diff --git a/Introduction/StartingAndStoppingIBEX.rest b/Introduction/StartingAndStoppingIBEX.rest index f2d2875..6cf6b83 100644 --- a/Introduction/StartingAndStoppingIBEX.rest +++ b/Introduction/StartingAndStoppingIBEX.rest @@ -18,19 +18,40 @@ Alternatively, if you created a desktop short-cut to the IBEX client, simply dou Stopping IBEX Client ~~~~~~~~~~~~~~~~~~~~ -To stop the IBEX client, select `Exit IBEX Client` from the `IBEX` menu. IBEX will prompt you to confirm that you are sure you wish to exit. Simply confirm that you wish to exit and the IBEX client will shut down. +To stop the IBEX client, select ``Exit IBEX Client`` from the ``IBEX`` menu. IBEX will prompt you to confirm that you are sure you wish to exit. Simply confirm that you wish to exit and the IBEX client will shut down. -** Please Note:** Stopping the IBEX client does not stop the IBEX server. The IBEX server will continue to run after you have stopped the IBEX client. You can re-connect to the IBEX server the next time to start the IBEX client. +**Please Note:** Stopping the IBEX client does not stop the IBEX server. The IBEX server will continue to run after you have stopped the IBEX client. You can re-connect to the IBEX server the next time to start the IBEX client. Starting and Stopping IBEX Server --------------------------------- +The IBEX Server is designed to run continuously. There is no particular need for it to be started and stopped on a regular basis. The IBEX Server is actually a collection of mutually cooperating processes. In order to start and stop the IBEX Server, these processes need to be started and stopped in the correct order. There are scripts to start and stop IBEX Server. If you need to start or stop IBEX Server, please use the appropriate script (as described below). + Starting IBEX Server ~~~~~~~~~~~~~~~~~~~~ -To start IBEX Client simply select IBEX from the Start icon on the taskbar of your Windows PC. If you use IBEX regularly, it will appear in the menu of frequently used programs as soon as you click on the Start icon. +To start IBEX Server, proceed as follows: + +#. Use Windows Remote Desktop Connection to login to your instrument +#. Open a command window +#. At the command prompt type the following: + + cd c:\Instrument\Apps\EPICS + start_inst + +#. Allow the `start_inst` script a few moments to complete before starting the IBEX client. Stopping IBEX Server ~~~~~~~~~~~~~~~~~~~~ +#. Use Windows Remote Desktop Connection to login to your instrument +#. Open a command window +#. At the command prompt type the following: + + cd c:\Instrument\Apps\EPICS + stop_inst + +#. Allow the `stop_inst` script a few moments to complete before starting the IBEX client. + + From d98c0484de7fc3a0be78bdfe8448f4408c5a3191 Mon Sep 17 00:00:00 2001 From: Gollum Date: Mon, 22 Aug 2016 11:06:48 +0100 Subject: [PATCH 0104/1813] Updated StartingAndStoppingIBEX (rest) --- Introduction/StartingAndStoppingIBEX.rest | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/Introduction/StartingAndStoppingIBEX.rest b/Introduction/StartingAndStoppingIBEX.rest index 6cf6b83..25604e0 100644 --- a/Introduction/StartingAndStoppingIBEX.rest +++ b/Introduction/StartingAndStoppingIBEX.rest @@ -32,26 +32,24 @@ Starting IBEX Server To start IBEX Server, proceed as follows: -#. Use Windows Remote Desktop Connection to login to your instrument +#. Use Windows Remote Desktop Connection to login to your instrument control PC #. Open a command window -#. At the command prompt type the following: +#. At the command prompt type the following:: cd c:\Instrument\Apps\EPICS start_inst -#. Allow the `start_inst` script a few moments to complete before starting the IBEX client. +#. Allow the ``start_inst`` script a few moments to complete before starting the IBEX client. Stopping IBEX Server ~~~~~~~~~~~~~~~~~~~~ -#. Use Windows Remote Desktop Connection to login to your instrument +#. If you are running the IBEX Client, exit from the IBEX Client before stopping IBEX Server. +#. Use Windows Remote Desktop Connection to login to your instrument control PC #. Open a command window -#. At the command prompt type the following: +#. At the command prompt type the following:: cd c:\Instrument\Apps\EPICS stop_inst -#. Allow the `stop_inst` script a few moments to complete before starting the IBEX client. - - - +#. Allow the ``stop_inst`` script a few moments to complete. From 9117845a0b4b6907734f26f665adac096c6e0622 Mon Sep 17 00:00:00 2001 From: Gollum Date: Mon, 22 Aug 2016 11:09:32 +0100 Subject: [PATCH 0105/1813] Updated StartingAndStoppingIBEX (rest) --- Introduction/StartingAndStoppingIBEX.rest | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Introduction/StartingAndStoppingIBEX.rest b/Introduction/StartingAndStoppingIBEX.rest index 25604e0..8466ac9 100644 --- a/Introduction/StartingAndStoppingIBEX.rest +++ b/Introduction/StartingAndStoppingIBEX.rest @@ -39,12 +39,12 @@ To start IBEX Server, proceed as follows: cd c:\Instrument\Apps\EPICS start_inst -#. Allow the ``start_inst`` script a few moments to complete before starting the IBEX client. +#. Allow the ``start_inst`` script a few moments to complete. Stopping IBEX Server ~~~~~~~~~~~~~~~~~~~~ -#. If you are running the IBEX Client, exit from the IBEX Client before stopping IBEX Server. +#. If you are running the IBEX Client, exit before stopping IBEX Server. #. Use Windows Remote Desktop Connection to login to your instrument control PC #. Open a command window #. At the command prompt type the following:: From e274db80b25aa94ee644fc95f24cca1e08f8becb Mon Sep 17 00:00:00 2001 From: Gollum Date: Mon, 22 Aug 2016 11:12:48 +0100 Subject: [PATCH 0106/1813] Updated StartingAndStoppingIBEX (rest) --- Introduction/StartingAndStoppingIBEX.rest | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Introduction/StartingAndStoppingIBEX.rest b/Introduction/StartingAndStoppingIBEX.rest index 8466ac9..d02c1b1 100644 --- a/Introduction/StartingAndStoppingIBEX.rest +++ b/Introduction/StartingAndStoppingIBEX.rest @@ -37,9 +37,9 @@ To start IBEX Server, proceed as follows: #. At the command prompt type the following:: cd c:\Instrument\Apps\EPICS - start_inst + start_ibex_server -#. Allow the ``start_inst`` script a few moments to complete. +#. Allow the ``start_ibex_server`` script a few moments to complete. Stopping IBEX Server ~~~~~~~~~~~~~~~~~~~~ @@ -50,6 +50,6 @@ Stopping IBEX Server #. At the command prompt type the following:: cd c:\Instrument\Apps\EPICS - stop_inst + stop_ibex_server -#. Allow the ``stop_inst`` script a few moments to complete. +#. Allow the ``stop_ibex_server`` script a few moments to complete. From 69225682e1f13630a1d1db8bc0bb958c859fd473 Mon Sep 17 00:00:00 2001 From: Gollum Date: Mon, 22 Aug 2016 11:13:24 +0100 Subject: [PATCH 0107/1813] Updated StartingAndStoppingIBEX (rest) --- Introduction/StartingAndStoppingIBEX.rest | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Introduction/StartingAndStoppingIBEX.rest b/Introduction/StartingAndStoppingIBEX.rest index d02c1b1..ad33a4c 100644 --- a/Introduction/StartingAndStoppingIBEX.rest +++ b/Introduction/StartingAndStoppingIBEX.rest @@ -25,7 +25,9 @@ To stop the IBEX client, select ``Exit IBEX Client`` from the ``IBEX`` menu. IB Starting and Stopping IBEX Server --------------------------------- -The IBEX Server is designed to run continuously. There is no particular need for it to be started and stopped on a regular basis. The IBEX Server is actually a collection of mutually cooperating processes. In order to start and stop the IBEX Server, these processes need to be started and stopped in the correct order. There are scripts to start and stop IBEX Server. If you need to start or stop IBEX Server, please use the appropriate script (as described below). +The IBEX Server is designed to run continuously. There is no particular need for it to be started and stopped on a regular basis. + +The IBEX Server is actually a collection of mutually cooperating processes. In order to start and stop the IBEX Server, these processes need to be started and stopped in the correct order. There are scripts to start and stop IBEX Server. If you need to start or stop IBEX Server, please use the appropriate script (as described below). Starting IBEX Server ~~~~~~~~~~~~~~~~~~~~ From 595da7624dd629684e301277a7d6f263f4dc282f Mon Sep 17 00:00:00 2001 From: Gollum Date: Mon, 22 Aug 2016 11:16:33 +0100 Subject: [PATCH 0108/1813] Updated StartingAndStoppingIBEX (rest) --- Introduction/StartingAndStoppingIBEX.rest | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Introduction/StartingAndStoppingIBEX.rest b/Introduction/StartingAndStoppingIBEX.rest index ad33a4c..08c2c03 100644 --- a/Introduction/StartingAndStoppingIBEX.rest +++ b/Introduction/StartingAndStoppingIBEX.rest @@ -27,7 +27,7 @@ Starting and Stopping IBEX Server The IBEX Server is designed to run continuously. There is no particular need for it to be started and stopped on a regular basis. -The IBEX Server is actually a collection of mutually cooperating processes. In order to start and stop the IBEX Server, these processes need to be started and stopped in the correct order. There are scripts to start and stop IBEX Server. If you need to start or stop IBEX Server, please use the appropriate script (as described below). +The IBEX Server is actually a collection of mutually cooperating processes. In order to start and stop the IBEX Server, these processes need to be started and stopped in the correct order - there are scripts which ensure that these processes are started and stopped correctly. Please use the appropriate script (as described below) to start and stop IBEX Server. Starting IBEX Server ~~~~~~~~~~~~~~~~~~~~ From f5429d0517e39a19545cebde6d372c0a9a0a0551 Mon Sep 17 00:00:00 2001 From: Gollum Date: Mon, 22 Aug 2016 11:19:48 +0100 Subject: [PATCH 0109/1813] Updated StartingAndStoppingIBEX (rest) --- Introduction/StartingAndStoppingIBEX.rest | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Introduction/StartingAndStoppingIBEX.rest b/Introduction/StartingAndStoppingIBEX.rest index 08c2c03..4b5caba 100644 --- a/Introduction/StartingAndStoppingIBEX.rest +++ b/Introduction/StartingAndStoppingIBEX.rest @@ -46,6 +46,8 @@ To start IBEX Server, proceed as follows: Stopping IBEX Server ~~~~~~~~~~~~~~~~~~~~ +To stop IBEX Server, proceed as follows: + #. If you are running the IBEX Client, exit before stopping IBEX Server. #. Use Windows Remote Desktop Connection to login to your instrument control PC #. Open a command window From 3334c2f3e22f68f7e41faca73c7efac02743e0f1 Mon Sep 17 00:00:00 2001 From: Gollum Date: Mon, 22 Aug 2016 11:21:13 +0100 Subject: [PATCH 0110/1813] Updated StartingAndStoppingIBEX (rest) --- Introduction/StartingAndStoppingIBEX.rest | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Introduction/StartingAndStoppingIBEX.rest b/Introduction/StartingAndStoppingIBEX.rest index 4b5caba..c3b392d 100644 --- a/Introduction/StartingAndStoppingIBEX.rest +++ b/Introduction/StartingAndStoppingIBEX.rest @@ -43,6 +43,8 @@ To start IBEX Server, proceed as follows: #. Allow the ``start_ibex_server`` script a few moments to complete. +You should wait until the ``start_ibex_server`` script has completed before starting IBEX Client. + Stopping IBEX Server ~~~~~~~~~~~~~~~~~~~~ From d38aafb01653ab39d7c904c24baba179593a3fdf Mon Sep 17 00:00:00 2001 From: Gollum Date: Mon, 22 Aug 2016 11:25:31 +0100 Subject: [PATCH 0111/1813] Updated FAQ (rest) --- FAQ.rest | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/FAQ.rest b/FAQ.rest index 8916283..c7f4145 100644 --- a/FAQ.rest +++ b/FAQ.rest @@ -8,8 +8,8 @@ List of Frequently Asked Questions .. _Return: -#. `This is the first question`_ -#. `This is the second question`_ +#. `How do I start IBEX Server?`_ +#. `How do I stop IBEX Server?`_ #. `This is the third question`_ #. `This is the fourth question`_ #. `This is the fifth question`_ @@ -20,16 +20,19 @@ List of Frequently Asked Questions #. `This is the tenth question`_ -.. _`This is the first question`: +.. _`How do I start IBEX Server?`: -This is the first question. -This is the first answer. +**Q: How do I start IBEX Server?** + +**A:** To start IBEX Server - see [[StartingAndStoppingIBEX]] Return_ -.. _`This is the second question`: +.. _`How do I stop IBEX Server?`: + +**Q: How do I stop IBEX Server?** -This is the second answer. +**A:** To stop IBEX Server - see [[StartingAndStoppingIBEX]] Return_ From e6126c3570df9d9cd5a7ca34d0a2a64eb92eeed4 Mon Sep 17 00:00:00 2001 From: Gollum Date: Mon, 22 Aug 2016 11:42:11 +0100 Subject: [PATCH 0112/1813] Updated FAQ (rest) --- FAQ.rest | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/FAQ.rest b/FAQ.rest index c7f4145..8e09d28 100644 --- a/FAQ.rest +++ b/FAQ.rest @@ -8,9 +8,9 @@ List of Frequently Asked Questions .. _Return: +#. `How do I report a problem with IBEX?`_ #. `How do I start IBEX Server?`_ #. `How do I stop IBEX Server?`_ -#. `This is the third question`_ #. `This is the fourth question`_ #. `This is the fifth question`_ #. `This is the sixth question`_ @@ -19,6 +19,13 @@ List of Frequently Asked Questions #. `This is the ninth question`_ #. `This is the tenth question`_ +.. _`How do I report a problem with IBEX?`: + +**Q: How do I report a problem with IBEX?** + +**A:** To report a problem with IBEX (Client or Server), please use the `Instrument Problem/Bug Report `_ page. Using this page helps to ensure that your problem report gets routed to the right person as quickly as possible. When reporting a problem, it is helpful to include the version numbers of your IBEX Client and Server in your report. To view the version numbers select ``Help > About`` from the IBEX menu. + +Return_ .. _`How do I start IBEX Server?`: @@ -36,12 +43,6 @@ Return_ Return_ -.. _`This is the third question`: - -This is the third answer. - -Return_ - .. _`This is the fourth question`: This is the fourth answer. From d8b9a49f0ad3c71c0883ede80224dc0f05516e99 Mon Sep 17 00:00:00 2001 From: Gollum Date: Mon, 22 Aug 2016 11:42:32 +0100 Subject: [PATCH 0113/1813] Updated KeyConceptsinIBEX (rest) From 79ca3ad7cf15ed78f48f9692231a65f6f0cfa57d Mon Sep 17 00:00:00 2001 From: Gollum Date: Mon, 22 Aug 2016 11:43:35 +0100 Subject: [PATCH 0114/1813] Updated FAQ (rest) --- FAQ.rest | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/FAQ.rest b/FAQ.rest index 8e09d28..432b583 100644 --- a/FAQ.rest +++ b/FAQ.rest @@ -23,7 +23,7 @@ List of Frequently Asked Questions **Q: How do I report a problem with IBEX?** -**A:** To report a problem with IBEX (Client or Server), please use the `Instrument Problem/Bug Report `_ page. Using this page helps to ensure that your problem report gets routed to the right person as quickly as possible. When reporting a problem, it is helpful to include the version numbers of your IBEX Client and Server in your report. To view the version numbers select ``Help > About`` from the IBEX menu. +**A:** To report a problem with IBEX (Client or Server), please use the `Instrument Problem/Bug Report `_ page. Using this page helps to ensure that your problem report gets routed to the right person as quickly as possible. When reporting a problem, it is helpful to include the version numbers of your IBEX Client and Server in your report. To view the version numbers select ``Help > About`` from the menu bar in the IBEX Client. Return_ From eaf3260e23b5cb3bd7fe83c7b1f6de10fa900b8e Mon Sep 17 00:00:00 2001 From: Gollum Date: Mon, 22 Aug 2016 11:46:40 +0100 Subject: [PATCH 0115/1813] Updated Home (rest) --- Home.rest | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Home.rest b/Home.rest index 15bf58b..39d910f 100644 --- a/Home.rest +++ b/Home.rest @@ -20,10 +20,10 @@ Indices and Tables [[WhatIsIBEX]] -[[StartingAndStoppingIBEX]] - [[InstallingIBEX]] +[[StartingAndStoppingIBEX]] + [[KeyConceptsinIBEX]] [[IBEXGUIFeatures]] From e114c1ad6f8dfd77d56dc81a6ed99873d50039e3 Mon Sep 17 00:00:00 2001 From: Gollum Date: Mon, 22 Aug 2016 11:47:00 +0100 Subject: [PATCH 0116/1813] Updated Home (rest) --- _Sidebar.rest | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_Sidebar.rest b/_Sidebar.rest index 9184baf..48f01e8 100644 --- a/_Sidebar.rest +++ b/_Sidebar.rest @@ -1,6 +1,6 @@ * [[WhatIsIBEX]] -* [[StartingAndStoppingIBEX]] * [[InstallingIBEX]] +* [[StartingAndStoppingIBEX]] * [[KeyConceptsinIBEX]] * [[IBEXGUIFeatures]] * [[FAQ]] From 2692321204720fc9f4a7424d76f1cdd088a646ba Mon Sep 17 00:00:00 2001 From: Gollum Date: Mon, 22 Aug 2016 11:55:55 +0100 Subject: [PATCH 0117/1813] Updated ProcessVariables (rest) --- Concepts/ProcessVariables.rest | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Concepts/ProcessVariables.rest b/Concepts/ProcessVariables.rest index 4f62d60..51a0294 100644 --- a/Concepts/ProcessVariables.rest +++ b/Concepts/ProcessVariables.rest @@ -19,8 +19,9 @@ For example * ``IN:LARMOR:DAE:GOODUAH`` is the PV that holds the good microamps on LARMOR * ``IN:IMAT:DAE:GOODUAH`` is the PV that holds the good microamps on IMAT +* ``IN:LARMOR:MK3CHOPPER_01:CH1:FREQ`` is the PV that holds the frequency of the Mk3 Chopper on LARMOR -Items not part of an instrument have a different prefix. For example, the accelerator generates values with a top-level prefix of ``AC:`` such as +Not all PVs belong to an instrument. Items not part of an instrument have a different prefix. For example, the accelerator generates values with a top-level prefix of ``AC:`` such as * ``AC:TS1:BEAM:CURR`` is the PV that holds the TS1 beam current From 1b5bd8890ffb73ae59d71c8341d0e3be49571b4f Mon Sep 17 00:00:00 2001 From: Gollum Date: Mon, 22 Aug 2016 12:10:16 +0100 Subject: [PATCH 0118/1813] Updated Views (rest) --- Views.rest | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Views.rest b/Views.rest index 6be04c2..75018ae 100644 --- a/Views.rest +++ b/Views.rest @@ -20,7 +20,7 @@ Experiment Details IOC Log The IOC Log View displays a log of all the messages sent by the IOCs which control the devices attached to the instrument control PC. Log Plotter - The Log Plotter View allows you to plot a strip-chart graph of any block of process variable. + The Log Plotter View allows you to plot a strip-chart graph of any block or process variable. Motors The Motors View displays the status of all motors connected to the instrument control PC. You can also control all motors from this view. The Motors View is most useful for instruments with large numbers of motors. Scripting From e1aad110a0a291baaf0cc05996033ce0ff7a2a26 Mon Sep 17 00:00:00 2001 From: Gollum Date: Mon, 22 Aug 2016 12:12:10 +0100 Subject: [PATCH 0119/1813] Updated Home (rest) --- Home.rest | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Home.rest b/Home.rest index 39d910f..3cfeba6 100644 --- a/Home.rest +++ b/Home.rest @@ -28,6 +28,8 @@ Indices and Tables [[IBEXGUIFeatures]] +[[HowToDoThingsInIBEX]] + [[FAQ]] [[Glossary]] From ae62ebd56208b871fc9af45956ab6eafa440b874 Mon Sep 17 00:00:00 2001 From: Gollum Date: Mon, 22 Aug 2016 12:19:30 +0100 Subject: [PATCH 0120/1813] Created HowToDoThingsInIBEX (markdown) --- HowToDoThingsInIBEX.md | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 HowToDoThingsInIBEX.md diff --git a/HowToDoThingsInIBEX.md b/HowToDoThingsInIBEX.md new file mode 100644 index 0000000..2f9d33b --- /dev/null +++ b/HowToDoThingsInIBEX.md @@ -0,0 +1,18 @@ +.. _HowToDoThingsInIBEX: + +How To Do Things In IBEX +======================== + +In this section of the IBEX User Manual, we describe how to do the most common and important tasks. + +[[CreateandManageConfigurations]] + +[[CreateandManageComponents]] + +[[StartandStopIOCs]] + +[[CreateandManageSynoptics]] + +[[CreateandManageScripts]] + +[[ManagetheDAE]] From 18cc331161d7c246c54383893a846a9d6c424cbd Mon Sep 17 00:00:00 2001 From: Gollum Date: Mon, 22 Aug 2016 12:19:57 +0100 Subject: [PATCH 0121/1813] Updated HowToDoThingsInIBEX (rest) --- HowToDoThingsInIBEX.md => HowToDoThingsInIBEX.rest | 1 + 1 file changed, 1 insertion(+) rename HowToDoThingsInIBEX.md => HowToDoThingsInIBEX.rest (99%) diff --git a/HowToDoThingsInIBEX.md b/HowToDoThingsInIBEX.rest similarity index 99% rename from HowToDoThingsInIBEX.md rename to HowToDoThingsInIBEX.rest index 2f9d33b..146c1ce 100644 --- a/HowToDoThingsInIBEX.md +++ b/HowToDoThingsInIBEX.rest @@ -1,3 +1,4 @@ + .. _HowToDoThingsInIBEX: How To Do Things In IBEX From 31308aa49e1d1da4f4e90a4992c340cda8d4e974 Mon Sep 17 00:00:00 2001 From: Gollum Date: Mon, 22 Aug 2016 12:29:28 +0100 Subject: [PATCH 0122/1813] Created StartandStopIOCs (rest) --- StartandStopIOCs.rest | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 StartandStopIOCs.rest diff --git a/StartandStopIOCs.rest b/StartandStopIOCs.rest new file mode 100644 index 0000000..766873b --- /dev/null +++ b/StartandStopIOCs.rest @@ -0,0 +1,20 @@ + +.. _StartandStopIOCs: + +Starting and Stopping IOCs +========================== + +In EPICS an IOC is a component which controls hardware devices. In IBEX, we use IOCs to control sample environment devices attached to instruments. The acronym IOC stands for Input/Output Controller. As the name suggests, an IOC controls the communication between a hardware device and other parts of IBEX. + +In order to communicate with a hardware device, the corresponding IOC must be running. The ``IOC`` menu in IBEX provides the means to start IOCs (and to stop IOCs, when they are no longer required). + +Starting an IOC +--------------- +To start an IOC: + + +Stopping an IOC +--------------- +To stop an IOC: + + From 040a73ab70c1bd55dc1e729ae12505016d39088f Mon Sep 17 00:00:00 2001 From: Gollum Date: Mon, 22 Aug 2016 13:28:27 +0100 Subject: [PATCH 0123/1813] Updated StartandStopIOCs (rest) --- StartandStopIOCs.rest | 23 ++++++++++++++++------- 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/StartandStopIOCs.rest b/StartandStopIOCs.rest index 766873b..298ccf9 100644 --- a/StartandStopIOCs.rest +++ b/StartandStopIOCs.rest @@ -1,4 +1,3 @@ - .. _StartandStopIOCs: Starting and Stopping IOCs @@ -8,13 +7,23 @@ In EPICS an IOC is a component which controls hardware devices. In IBEX, we use In order to communicate with a hardware device, the corresponding IOC must be running. The ``IOC`` menu in IBEX provides the means to start IOCs (and to stop IOCs, when they are no longer required). -Starting an IOC ---------------- -To start an IOC: +Starting or Stopping an IOC +--------------------------- +To start or stop an IOC: + +#. Select ``Stat/Stop IOCs`` from the ``IOC`` menu. +#. IBEX displays a dialog containing two panes. + + #. The first pane is a list of all the IOCs available on the instrument. The list shows whether each IOC is running or stopped. + #. The second pane, below the list, allows you to start, stop or restart the selected IOC. +#. Scroll down the list until you find the IOC you wish to start or stop. Select the IOC by clicking on it once. +#. The selected IOC is highlighted in the list and lower pane activates. +#. Click on -Stopping an IOC ---------------- -To stop an IOC: + #. the ``Start`` button to start an IOC that is currently stopped + #. the ``Stop`` button to stop an IOC that is currently running + #. the ``Restart`` button to restart an IOC that is currently running +It may take a few moments from pressing the button for the selected IOC to start or stop. You might also see a number of messages written to the [[IOC Log]] as the IOC starts itself up or shuts itself down. From 73c1fb686ae62f7b6e444bd056ca6936bc79c348 Mon Sep 17 00:00:00 2001 From: Gollum Date: Mon, 22 Aug 2016 13:28:44 +0100 Subject: [PATCH 0124/1813] Updated StartandStopIOCs (rest) --- StartandStopIOCs.rest | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/StartandStopIOCs.rest b/StartandStopIOCs.rest index 298ccf9..50bd4fd 100644 --- a/StartandStopIOCs.rest +++ b/StartandStopIOCs.rest @@ -25,5 +25,5 @@ To start or stop an IOC: #. the ``Stop`` button to stop an IOC that is currently running #. the ``Restart`` button to restart an IOC that is currently running -It may take a few moments from pressing the button for the selected IOC to start or stop. You might also see a number of messages written to the [[IOC Log]] as the IOC starts itself up or shuts itself down. +It may take a few moments from pressing the button for the selected IOC to start or stop. You might also see a number of messages written to the [[IOCLog]] as the IOC starts itself up or shuts itself down. From 8934dea994c68d8a358595f73fb3ad2c8d9db86d Mon Sep 17 00:00:00 2001 From: Gollum Date: Mon, 22 Aug 2016 13:29:34 +0100 Subject: [PATCH 0125/1813] Updated StartandStopIOCs (rest) --- StartandStopIOCs.rest | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/StartandStopIOCs.rest b/StartandStopIOCs.rest index 50bd4fd..dad65a7 100644 --- a/StartandStopIOCs.rest +++ b/StartandStopIOCs.rest @@ -3,7 +3,7 @@ Starting and Stopping IOCs ========================== -In EPICS an IOC is a component which controls hardware devices. In IBEX, we use IOCs to control sample environment devices attached to instruments. The acronym IOC stands for Input/Output Controller. As the name suggests, an IOC controls the communication between a hardware device and other parts of IBEX. +In `EPICS `_ an IOC is a component which controls hardware devices. In IBEX, we use IOCs to control sample environment devices attached to instruments. The acronym IOC stands for Input/Output Controller. As the name suggests, an IOC controls the communication between a hardware device and other parts of IBEX. In order to communicate with a hardware device, the corresponding IOC must be running. The ``IOC`` menu in IBEX provides the means to start IOCs (and to stop IOCs, when they are no longer required). From 241eccf733684b50604030aca581840ff29585ee Mon Sep 17 00:00:00 2001 From: Gollum Date: Mon, 22 Aug 2016 13:33:47 +0100 Subject: [PATCH 0126/1813] Updated StartandStopIOCs (rest) --- StartandStopIOCs.rest | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/StartandStopIOCs.rest b/StartandStopIOCs.rest index dad65a7..1a8c908 100644 --- a/StartandStopIOCs.rest +++ b/StartandStopIOCs.rest @@ -25,5 +25,5 @@ To start or stop an IOC: #. the ``Stop`` button to stop an IOC that is currently running #. the ``Restart`` button to restart an IOC that is currently running -It may take a few moments from pressing the button for the selected IOC to start or stop. You might also see a number of messages written to the [[IOCLog]] as the IOC starts itself up or shuts itself down. +It might take a few moments from pressing the button for the selected IOC to start or stop. You might also see a number of messages written to the [[IOCLog]] as the IOC starts itself up or shuts itself down. From f8f287e9623afb482fec485f591aac8eb9d823b6 Mon Sep 17 00:00:00 2001 From: Gollum Date: Mon, 22 Aug 2016 13:34:19 +0100 Subject: [PATCH 0127/1813] Updated Home (rest) --- _Sidebar.rest | 1 + 1 file changed, 1 insertion(+) diff --git a/_Sidebar.rest b/_Sidebar.rest index 48f01e8..0232209 100644 --- a/_Sidebar.rest +++ b/_Sidebar.rest @@ -3,5 +3,6 @@ * [[StartingAndStoppingIBEX]] * [[KeyConceptsinIBEX]] * [[IBEXGUIFeatures]] +* [[HowToDoThingsInIBEX]] * [[FAQ]] * [[Glossary]] From cd06ded3b2f2fee07acaafbe7d1406b6c22a5cba Mon Sep 17 00:00:00 2001 From: Gollum Date: Mon, 22 Aug 2016 14:58:56 +0100 Subject: [PATCH 0128/1813] Created CreateandManageConfigurations (rest) --- CreateandManageConfigurations.rest | 58 ++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) create mode 100644 CreateandManageConfigurations.rest diff --git a/CreateandManageConfigurations.rest b/CreateandManageConfigurations.rest new file mode 100644 index 0000000..1a7ceb3 --- /dev/null +++ b/CreateandManageConfigurations.rest @@ -0,0 +1,58 @@ +.. _CreateandManageConfigurations: + +Create & Manage Configurations +================================ + +A configuration is the means by which an instrument is described and defined to IBEX. A configuration defines the blocks, IOCs, components, macros and other items which IBEX needs to use in order to control the instrument. You can create multiple configurations for an instrument, to describe and define how the instrument has been set up for different experiments. + +**Please note:** An IBEX configuration is **not** the same as a Mantid configuration. IBEX and Mantid view instruments in fundamentally different ways, which means that their respective configurations are not interchangeable. + +Creating a Configuration +------------------------ + +To create a configuration: + +#. Select ``Configurations > New`` from the ``Configuration`` menu. +#. IBEX displays a dialog containing eight tabs. + + #. IOCs + #. Blocks + #. Groups + #. Components + #. IOC Macros + #. IOC PV Values + #. IOC PV Sets + #. Summary + +We'll describe each of these in turn. + +IOCs Tab +~~~~~~~~ +The IOCs tab lists all the IOCs available on the instrument. In general, you will only wish to include a sub-set of these in your configuration (i.e. those that correspond to devices on your instrument). + +To include an IOC in your configuration, scroll down the list until you find the appropriate IOC and select the Auto-Start or Auto-Restart check-boxes (or select both). By selecting these check-boxes, IBEX will automatically start (or restart) to chosen IOCs each time your configuration is loaded into IBEX. + +**Note:** The list of IOCs in the IOC tab also includes a column headed Sim. level. This column is used to indicate whether the IOC should run in simulation mode. By default, the Sim. level file is set to NONE, meaning that the IOC will not run in simulation mode. + +Blocks Tab +~~~~~~~~~~ +The Blocks tab lists all the blocks that have been defined for the current configuration. When creating a new configuration, the list of blocks will be empty. A block is, essentially, an alias to a PV ([[ProcessVariable]]). + +To create a new block, click on the ``Add Block`` button. IBEX displays a dialog to allow you to define the new block. By default, the new block is given the name ``NEW_BLOCK``. Below the block name field is the PV address field. Click on the ``Select PV`` button next to the PV address field to choose a PV to be aliased by the block name. + +On clicking the ``Select PV`` button, IBEX will display a list of PVs available on your instrument. There can be a very large number of PVs on an instrument, so the dialog provides a number of filters to help you narrow your search. Choose: + +PVs from + ``All IOCs`` to see PVs from all IOCs on your instrument (this can result in a very long list of PVs). + ``Active IOCs`` to see PVs only from IOcs that are currently running on your instrument. + ``Config IOCs`` to see PVs only from IOCs that are included in the current configuration. + +Interest Level + ``High`` to see PVs considered to be of high interest to scientists + ``Medium`` to see PVs considered to be of medium interest to scientists (many PVs in this category will be of more interest to technicians and support staff, rather than scientists) + ``Facility`` to see PVs that relate to facility, rather than instrument, devices (PVs in this category typically include PVs relating to the accelerator, target stations, shared beamlines and instrument shutters). + ``All`` to see all PVs from your selected category of IOCs (again, this can generate a very long list of PVs). + + + + From 0713598fd4ba330ba76ed7879409e9594189db4a Mon Sep 17 00:00:00 2001 From: Gollum Date: Mon, 22 Aug 2016 15:02:59 +0100 Subject: [PATCH 0129/1813] Updated CreateandManageConfigurations (rest) --- CreateandManageConfigurations.rest | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/CreateandManageConfigurations.rest b/CreateandManageConfigurations.rest index 1a7ceb3..a20a096 100644 --- a/CreateandManageConfigurations.rest +++ b/CreateandManageConfigurations.rest @@ -44,15 +44,23 @@ On clicking the ``Select PV`` button, IBEX will display a list of PVs available PVs from ``All IOCs`` to see PVs from all IOCs on your instrument (this can result in a very long list of PVs). + ``Active IOCs`` to see PVs only from IOcs that are currently running on your instrument. + ``Config IOCs`` to see PVs only from IOCs that are included in the current configuration. Interest Level ``High`` to see PVs considered to be of high interest to scientists + ``Medium`` to see PVs considered to be of medium interest to scientists (many PVs in this category will be of more interest to technicians and support staff, rather than scientists) + ``Facility`` to see PVs that relate to facility, rather than instrument, devices (PVs in this category typically include PVs relating to the accelerator, target stations, shared beamlines and instrument shutters). + ``All`` to see all PVs from your selected category of IOCs (again, this can generate a very long list of PVs). +Scroll down the list of PVs until you find the one you want. Click on it, to select it and then click on the OK button to return to the Add Block dialog. + + From f578d1bddfbaa140aa7f31c3ad56f35069d8c677 Mon Sep 17 00:00:00 2001 From: Gollum Date: Mon, 22 Aug 2016 15:23:00 +0100 Subject: [PATCH 0130/1813] Created PVNamingConventions (rest) --- Concepts/PVNamingConventions.rest | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 Concepts/PVNamingConventions.rest diff --git a/Concepts/PVNamingConventions.rest b/Concepts/PVNamingConventions.rest new file mode 100644 index 0000000..6e97a26 --- /dev/null +++ b/Concepts/PVNamingConventions.rest @@ -0,0 +1,21 @@ +.. _PVNamingConventions: + +PV Naming Conventions +===================== + +Facilities running `EPICS `_ usually adopt a convention for naming PVs [[ProcessVariables]]. ISIS is no exception. + +The purpose of the naming convention is to +a. provide a systematic means of describing the PV +b. ensure that the name of the PV is unique (within the facility). + +ISIS Naming Convention +---------------------- + +At ISIS, PV names are chosen to describe function, not hardware/technology - the PV name is the purpose of a channel and is abstracted from the underlying hardware; the name of the IOC (to which the PV belongs) can however reflect technology/hardware/implementation. + +The essential format of the ISIS naming convention is ``DOMAIN:SUBDOMAIN:TECHNICALAREA:DEVICE:SUBDEVICE:SIGNAL`` + +PV names should contain only the following characters ``A-Z``, ``0-9``, ``_``, ``:``, ``*``. Notice that lowercase characters are not allowed. The colon character ``:`` is used to separate different elements of the PV name; therefore, do not use the ``:`` for other purposes (e.g. as part of an IOC name). To break up individual components of a PV name into readable segments, use the underscore, ``_`` character. + +In addition, PV names must start with a letter and must not end with ``_``. From 7f00072988c6570e7afe223eb7a7906a3e2124bf Mon Sep 17 00:00:00 2001 From: Gollum Date: Mon, 22 Aug 2016 15:47:25 +0100 Subject: [PATCH 0131/1813] Updated PVNamingConventions (rest) --- Concepts/PVNamingConventions.rest | 32 +++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/Concepts/PVNamingConventions.rest b/Concepts/PVNamingConventions.rest index 6e97a26..934d352 100644 --- a/Concepts/PVNamingConventions.rest +++ b/Concepts/PVNamingConventions.rest @@ -19,3 +19,35 @@ The essential format of the ISIS naming convention is ``DOMAIN:SUBDOMAIN:TECHNIC PV names should contain only the following characters ``A-Z``, ``0-9``, ``_``, ``:``, ``*``. Notice that lowercase characters are not allowed. The colon character ``:`` is used to separate different elements of the PV name; therefore, do not use the ``:`` for other purposes (e.g. as part of an IOC name). To break up individual components of a PV name into readable segments, use the underscore, ``_`` character. In addition, PV names must start with a letter and must not end with ``_``. + +Domain & Subdomain Names +~~~~~~~~~~~~~~~~~~~~~~~~ + +Names appearing in the domain & subdomain levels include: + ++------+--------------------------------------------------------------------------------------------------------+ +| Name | Description | ++======+========================================================================================================+ +| AC | ISIS Accelerator/synchrotron related parameter | ++------+--------------------------------------------------------------------------------------------------------+ +| TG | ISIS Target related parameter | ++------+--------------------------------------------------------------------------------------------------------+ +| IN | Instrument related parameter | ++------+--------------------------------------------------------------------------------------------------------+ +| BL | Beamline – used if multiple instruments are sharing a common set of equipment; e.g, the muon beamlines | ++------+--------------------------------------------------------------------------------------------------------+ +| TE | Testing domain, used by local EPICS developers | ++------+--------------------------------------------------------------------------------------------------------+ + +In the instrument domain, the sub-domain is the full instrument name. For example: ``IN:GEM`` or ``IN:POLREF``. + +Technical Area and Device Names +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Technical Area and Device Names reflect the nature of the device that owns the PV in question. For example: + +* ``IN:GEM:MOT`` relates to PVs associated with motion control equipment on GEM. +* ``IN:ZOOM:VAC`` relates to PVs associated with vacuum equipment equipment on ZOOM +* ``IN:LARMOR:DAE`` relates to PVs associated with the DAE on LARMOR + + From 336dfb45539bc0fad15ab7e2347d761fe91af40d Mon Sep 17 00:00:00 2001 From: Gollum Date: Mon, 22 Aug 2016 15:49:19 +0100 Subject: [PATCH 0132/1813] Updated PVNamingConventions (rest) --- Concepts/_Sidebar.rest | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Concepts/_Sidebar.rest b/Concepts/_Sidebar.rest index 1c82e11..f120fb1 100644 --- a/Concepts/_Sidebar.rest +++ b/Concepts/_Sidebar.rest @@ -1,2 +1,3 @@ -* [[ProcessVariables]] * [[Blocks]] +* [[ProcessVariables]] +* [[PVNamingConventions]] \ No newline at end of file From 6d0567c67e56f976555742377f091321b77f8481 Mon Sep 17 00:00:00 2001 From: Gollum Date: Mon, 22 Aug 2016 16:10:55 +0100 Subject: [PATCH 0133/1813] Updated PVNamingConventions (rest) --- Concepts/PVNamingConventions.rest | 51 +++++++++++++++++++++++++++++-- 1 file changed, 48 insertions(+), 3 deletions(-) diff --git a/Concepts/PVNamingConventions.rest b/Concepts/PVNamingConventions.rest index 934d352..dce8eb7 100644 --- a/Concepts/PVNamingConventions.rest +++ b/Concepts/PVNamingConventions.rest @@ -48,6 +48,51 @@ Technical Area and Device Names reflect the nature of the device that owns the P * ``IN:GEM:MOT`` relates to PVs associated with motion control equipment on GEM. * ``IN:ZOOM:VAC`` relates to PVs associated with vacuum equipment equipment on ZOOM -* ``IN:LARMOR:DAE`` relates to PVs associated with the DAE on LARMOR - - +* ``IN:IRIS:DAE`` relates to PVs associated with the DAE on IRIS +* ``IN:IMAT:MOT:MTRccmm`` relates to EPICS motor records on IMAT for a motor on controller number cc, motor number mm. These numbers are zero padded to two digits and start from 1 (e.g. MTR0101 is the first motor on the first controller). +* ``IN:LARMOR:MOT:JAWSmm`` mm-th set of jaws on LARMOR (e.g. JAWS01 is the first set of jaws, etc.). + +Signal Names +~~~~~~~~~~~~ + +Standard signal names include: + ++-------------+-------------------------+----------------------------------------------------------------------------------------------+ +| Signal Name | Meaning | Valid Units | ++=============+=========================+==============================================================================================+ +| POS | Position | M, mm, cm | ++-------------+-------------------------+----------------------------------------------------------------------------------------------+ +| STAT | Status, State | Open, Closed, On, Off, Ok, Error | ++-------------+-------------------------+----------------------------------------------------------------------------------------------+ +| CURR | Current | A, mA, uA | ++-------------+-------------------------+----------------------------------------------------------------------------------------------+ +| VOLT | Voltage | kV, V | ++-------------+-------------------------+----------------------------------------------------------------------------------------------+ +| CMD | Device command | e.g. write to this to perform an action, such as start/stop a run | ++-------------+-------------------------+----------------------------------------------------------------------------------------------+ +| SEL | Select mode or position | | ++-------------+-------------------------+----------------------------------------------------------------------------------------------+ +| TEMP | Temperature | K | ++-------------+-------------------------+----------------------------------------------------------------------------------------------+ +| COUNT | Counter value | neutron counts | ++-------------+-------------------------+----------------------------------------------------------------------------------------------+ +| COUNTD | Counter value | as a distribution, i.e. divided by bin width - so neutron counts per microsecond for example | ++-------------+-------------------------+----------------------------------------------------------------------------------------------+ +| P, I, D | P, I, D values | e.g. on a Eurotherm | ++-------------+-------------------------+----------------------------------------------------------------------------------------------+ +| TOF | Time of flight | | ++-------------+-------------------------+----------------------------------------------------------------------------------------------+ +| TIME | An absolute timestamp | preferably in ISO8601 format | ++-------------+-------------------------+----------------------------------------------------------------------------------------------+ +| FIELD | Magnetic field | | ++-------------+-------------------------+----------------------------------------------------------------------------------------------+ + +If a value can fluctuate, these refer to the current measured value of a quantity and the signal qualifiers SP and RBV are used to indicated the desired value software requested (setpoint) and the desired value being used in the hardware (RBV) + +For example, for a TEMP signal + +* ``...:HEATER:TEMP`` Current temperature +* ``...:HEATER:TEMP:SP`` Temperature set point (requested value) – this is the value that was input in software and sent to the equipment. Writing to this PV will cause the setpoint to change +* ``...:HEATER:TEMP:SP:RBV`` This is the setpoint “readback” from hardware, which may differ from SP sent above if e.g. the hardware was unable to exactly match the requested value. By definition, a readback PV is read-only. Also if the SP was changed by some other mechanism (e.g. manually on the hardware) `:SP` would not reflect this, but `:SP:RBV` would. + +**Note:** The RBV suffix can be used more generally e.g. For P,I,D values you could have `...:P` and `...:P:RBV` From 1729fe2c38024c81951a94467551bf1b6111c81c Mon Sep 17 00:00:00 2001 From: Gollum Date: Mon, 22 Aug 2016 16:12:09 +0100 Subject: [PATCH 0134/1813] Updated PVNamingConventions (rest) --- Concepts/PVNamingConventions.rest | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Concepts/PVNamingConventions.rest b/Concepts/PVNamingConventions.rest index dce8eb7..412f8d7 100644 --- a/Concepts/PVNamingConventions.rest +++ b/Concepts/PVNamingConventions.rest @@ -93,6 +93,6 @@ For example, for a TEMP signal * ``...:HEATER:TEMP`` Current temperature * ``...:HEATER:TEMP:SP`` Temperature set point (requested value) – this is the value that was input in software and sent to the equipment. Writing to this PV will cause the setpoint to change -* ``...:HEATER:TEMP:SP:RBV`` This is the setpoint “readback” from hardware, which may differ from SP sent above if e.g. the hardware was unable to exactly match the requested value. By definition, a readback PV is read-only. Also if the SP was changed by some other mechanism (e.g. manually on the hardware) `:SP` would not reflect this, but `:SP:RBV` would. +* ``...:HEATER:TEMP:SP:RBV`` This is the setpoint “readback” from hardware, which may differ from SP sent above if, for example, the hardware was unable to exactly match the requested value. By definition, a readback PV is read-only. Also if the SP was changed by some other mechanism (e.g. manually on the hardware) ``:SP`` would not reflect this, but ``:SP:RBV`` would. -**Note:** The RBV suffix can be used more generally e.g. For P,I,D values you could have `...:P` and `...:P:RBV` +**Note:** The RBV suffix can be used more generally e.g. For P,I,D values you could have ``...:P`` and ``...:P:RBV`` From f67b717db5672dbd36a6c919625807de6cf74f77 Mon Sep 17 00:00:00 2001 From: Gollum Date: Mon, 22 Aug 2016 16:20:54 +0100 Subject: [PATCH 0135/1813] Updated CreateandManageConfigurations (rest) --- CreateandManageConfigurations.rest | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/CreateandManageConfigurations.rest b/CreateandManageConfigurations.rest index a20a096..197f6cf 100644 --- a/CreateandManageConfigurations.rest +++ b/CreateandManageConfigurations.rest @@ -38,7 +38,9 @@ Blocks Tab ~~~~~~~~~~ The Blocks tab lists all the blocks that have been defined for the current configuration. When creating a new configuration, the list of blocks will be empty. A block is, essentially, an alias to a PV ([[ProcessVariable]]). -To create a new block, click on the ``Add Block`` button. IBEX displays a dialog to allow you to define the new block. By default, the new block is given the name ``NEW_BLOCK``. Below the block name field is the PV address field. Click on the ``Select PV`` button next to the PV address field to choose a PV to be aliased by the block name. +To create a new block, click on the ``Add Block`` button. IBEX displays a dialog to allow you to define the new block. By default, the new block is given the name ``NEW_BLOCK``. You can give the block any name you like, provided the name starts with a character and contains only the characters a-z and A-Z, the digits 0-9 and the underscore character. + +Below the block name field is the PV address field. Click on the ``Select PV`` button next to the PV address field to choose a PV to be aliased by the block name. On clicking the ``Select PV`` button, IBEX will display a list of PVs available on your instrument. There can be a very large number of PVs on an instrument, so the dialog provides a number of filters to help you narrow your search. Choose: From b1cc08c8824feb93f5c9d4b5f142791b70606374 Mon Sep 17 00:00:00 2001 From: Gollum Date: Mon, 22 Aug 2016 16:52:07 +0100 Subject: [PATCH 0136/1813] Updated CreateandManageConfigurations (rest) --- CreateandManageConfigurations.rest | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/CreateandManageConfigurations.rest b/CreateandManageConfigurations.rest index 197f6cf..6efdc8e 100644 --- a/CreateandManageConfigurations.rest +++ b/CreateandManageConfigurations.rest @@ -62,7 +62,15 @@ Interest Level Scroll down the list of PVs until you find the one you want. Click on it, to select it and then click on the OK button to return to the Add Block dialog. +On the Add Block dialog you can also choose to +Visible/Local + Toggle the``Visible`` check-box to make the block visible or hidden. By default, blocks are always visible. This feature is useful, for example, if you need to see blocks while setting up an experiment, but don't need to see them once the experiment is running. +Toggle the``Local`` check-box to make . +Run-Control Settings + Toggle the``Enabled`` check-box to enable run-control on this block. Use the Low Limit and High Limit fields to define the run-control range (i.e. data is collected only when the block lies within the range) . +Logging Settings + By default (Logging Settings is disabled), the block is logged whenever its value changes. Toggle the``Enabled`` check-box to change the way the block is logged. You can set the block to logged periodically (i.e. every N seconds), or you can set a "deadband" - the block will only be logged if its value falls outside +/- the limit defined by the deadband value. From dae9e34511ef3337f7ced890fd8d00fd82743549 Mon Sep 17 00:00:00 2001 From: Gollum Date: Mon, 22 Aug 2016 16:52:47 +0100 Subject: [PATCH 0137/1813] Updated CreateandManageConfigurations (rest) From 330002eb85096c99c0418440d7e3b84ad3159268 Mon Sep 17 00:00:00 2001 From: Gollum Date: Mon, 22 Aug 2016 16:53:30 +0100 Subject: [PATCH 0138/1813] Updated CreateandManageConfigurations (rest) --- CreateandManageConfigurations.rest | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/CreateandManageConfigurations.rest b/CreateandManageConfigurations.rest index 6efdc8e..f79fdef 100644 --- a/CreateandManageConfigurations.rest +++ b/CreateandManageConfigurations.rest @@ -65,12 +65,12 @@ Scroll down the list of PVs until you find the one you want. Click on it, to se On the Add Block dialog you can also choose to Visible/Local - Toggle the``Visible`` check-box to make the block visible or hidden. By default, blocks are always visible. This feature is useful, for example, if you need to see blocks while setting up an experiment, but don't need to see them once the experiment is running. + Toggle the ``Visible`` check-box to make the block visible or hidden. By default, blocks are always visible. This feature is useful, for example, if you need to see blocks while setting up an experiment, but don't need to see them once the experiment is running. -Toggle the``Local`` check-box to make . +Toggle the ``Local`` check-box to make . Run-Control Settings - Toggle the``Enabled`` check-box to enable run-control on this block. Use the Low Limit and High Limit fields to define the run-control range (i.e. data is collected only when the block lies within the range) . + Toggle the ``Enabled`` check-box to enable run-control on this block. Use the Low Limit and High Limit fields to define the run-control range (i.e. data is collected only when the block lies within the range) . Logging Settings - By default (Logging Settings is disabled), the block is logged whenever its value changes. Toggle the``Enabled`` check-box to change the way the block is logged. You can set the block to logged periodically (i.e. every N seconds), or you can set a "deadband" - the block will only be logged if its value falls outside +/- the limit defined by the deadband value. + By default (Logging Settings is disabled), the block is logged whenever its value changes. Toggle the ``Enabled`` check-box to change the way the block is logged. You can set the block to logged periodically (i.e. every N seconds), or you can set a "deadband" - the block will only be logged if its value falls outside +/- the limit defined by the deadband value. From 5aac67e6c46e21e42f00eadfe84596d73fe60b5d Mon Sep 17 00:00:00 2001 From: Gollum Date: Mon, 22 Aug 2016 17:17:26 +0100 Subject: [PATCH 0139/1813] Updated CreateandManageConfigurations (rest) --- CreateandManageConfigurations.rest | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CreateandManageConfigurations.rest b/CreateandManageConfigurations.rest index f79fdef..2497bb0 100644 --- a/CreateandManageConfigurations.rest +++ b/CreateandManageConfigurations.rest @@ -67,7 +67,7 @@ On the Add Block dialog you can also choose to Visible/Local Toggle the ``Visible`` check-box to make the block visible or hidden. By default, blocks are always visible. This feature is useful, for example, if you need to see blocks while setting up an experiment, but don't need to see them once the experiment is running. -Toggle the ``Local`` check-box to make . + The ``Local`` check-box is used when you need to view PVs from another instrument as blocks. In most circumstances, you will not need to view PVs belonging to another instrument, so you should leave the ``Local`` check-box checked. Facility PVs are an exception to this rule, but IBEX knows about facility PVs and defaults the ``Local`` check-box to unchecked. If you do need to view PVs belonging another instrument, please consult with the Experiment Controls team. Run-Control Settings Toggle the ``Enabled`` check-box to enable run-control on this block. Use the Low Limit and High Limit fields to define the run-control range (i.e. data is collected only when the block lies within the range) . From fbf6c189b8aea82557e71de7b58a33ecab18a5e8 Mon Sep 17 00:00:00 2001 From: Gollum Date: Mon, 22 Aug 2016 17:20:09 +0100 Subject: [PATCH 0140/1813] Updated CreateandManageConfigurations (rest) --- CreateandManageConfigurations.rest | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CreateandManageConfigurations.rest b/CreateandManageConfigurations.rest index 2497bb0..a434f74 100644 --- a/CreateandManageConfigurations.rest +++ b/CreateandManageConfigurations.rest @@ -67,7 +67,7 @@ On the Add Block dialog you can also choose to Visible/Local Toggle the ``Visible`` check-box to make the block visible or hidden. By default, blocks are always visible. This feature is useful, for example, if you need to see blocks while setting up an experiment, but don't need to see them once the experiment is running. - The ``Local`` check-box is used when you need to view PVs from another instrument as blocks. In most circumstances, you will not need to view PVs belonging to another instrument, so you should leave the ``Local`` check-box checked. Facility PVs are an exception to this rule, but IBEX knows about facility PVs and defaults the ``Local`` check-box to unchecked. If you do need to view PVs belonging another instrument, please consult with the Experiment Controls team. + The ``Local`` check-box is used when you need to view PVs from another instrument as blocks. In most circumstances, you will not need to view PVs belonging to another instrument, so you should leave the ``Local`` check-box checked. Facility PVs are an exception to this rule, but IBEX knows about facility PVs and, in this case, automatically sets the ``Local`` check-box to unchecked. If you do need to view PVs belonging another instrument, please consult with the Experiment Controls team. Run-Control Settings Toggle the ``Enabled`` check-box to enable run-control on this block. Use the Low Limit and High Limit fields to define the run-control range (i.e. data is collected only when the block lies within the range) . From fdeb7a593d25a4f40c3d14b719f842f429821265 Mon Sep 17 00:00:00 2001 From: Gollum Date: Mon, 22 Aug 2016 17:38:37 +0100 Subject: [PATCH 0141/1813] Updated CreateandManageConfigurations (rest) --- CreateandManageConfigurations.rest | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/CreateandManageConfigurations.rest b/CreateandManageConfigurations.rest index a434f74..40bb04b 100644 --- a/CreateandManageConfigurations.rest +++ b/CreateandManageConfigurations.rest @@ -36,7 +36,7 @@ To include an IOC in your configuration, scroll down the list until you find the Blocks Tab ~~~~~~~~~~ -The Blocks tab lists all the blocks that have been defined for the current configuration. When creating a new configuration, the list of blocks will be empty. A block is, essentially, an alias to a PV ([[ProcessVariable]]). +The Blocks tab lists all the blocks that have been defined for the current configuration. When creating a new configuration, the list of blocks will be empty. A block is, essentially, an alias to a PV ([[ProcessVariables]]). To create a new block, click on the ``Add Block`` button. IBEX displays a dialog to allow you to define the new block. By default, the new block is given the name ``NEW_BLOCK``. You can give the block any name you like, provided the name starts with a character and contains only the characters a-z and A-Z, the digits 0-9 and the underscore character. @@ -74,3 +74,18 @@ Run-Control Settings Logging Settings By default (Logging Settings is disabled), the block is logged whenever its value changes. Toggle the ``Enabled`` check-box to change the way the block is logged. You can set the block to logged periodically (i.e. every N seconds), or you can set a "deadband" - the block will only be logged if its value falls outside +/- the limit defined by the deadband value. + +Groups Tab +~~~~~~~~~~ +Use the Groups tab to arrange your blocks into convenient groups. You can define as many groups as you wish and you can place as many blocks in each group as you wish, although a block can only appear in one group. + +By default, all blocks are assigned to an automatic group called "Other". By creating new groups, you have the opportunity to override the default assignment and assign blocks to groups of your choosing. + +To create a new group, select the Groups tab and click on the ``Add`` button. IBEX displays a dialog to allow you to define a new group. By default, the new block is given the name ``NEW_GROUP``. You can give the block any name you like, provided the name starts with a character and contains only the characters a-z and A-Z, the digits 0-9 and the underscore character. When you click on the ``Add`` button, the dialog displays which blocks are available to be assigned to the new group (i.e. blocks in the "Other" group). + +Use the buttons with the Up and Down arrows to control the ordering of the groups and the order of the blocks within the groups. + +Components Tab +~~~~~~~~~~~~~~ + +Components are, in essence, sub-configurations. From 0f8944f9fb92fca489ee98c7ac630c775701a5de Mon Sep 17 00:00:00 2001 From: Gollum Date: Tue, 23 Aug 2016 11:24:45 +0100 Subject: [PATCH 0142/1813] Updated CreateandManageConfigurations (rest) --- CreateandManageConfigurations.rest | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/CreateandManageConfigurations.rest b/CreateandManageConfigurations.rest index 40bb04b..6ce6ebc 100644 --- a/CreateandManageConfigurations.rest +++ b/CreateandManageConfigurations.rest @@ -89,3 +89,30 @@ Components Tab ~~~~~~~~~~~~~~ Components are, in essence, sub-configurations. + +IOC Macros +~~~~~~~~~~ + +IOC Macros are configurable values that IBEX can supply to the IOC when the IOC is started. For example, if the IOC is controlling a serial device attached to a COM port, you can use an macro to identify the appropriate port to the IOC. This is especially useful if the device moves between instruments and may be attached to different COM ports on different instruments. + +To set an IOC macro: + +#. Select the IOC Macros tab and choose an IOC from the drop-down menu list of IOCs. If the IOC has any configurable macro parameters, they will be displayed in the list below. The list contains four columns: + + #. Macro Name: the name of the macro (e.g. ``PORT``) + #. Value: the current value of the macro (e.g. ``COM3``) + #. Description: a short description of the macro's purpose + #. Pattern: macros need to be specified correctly. IBEX uses the pattern to validate the macro value. (For those familiar with such things, the pattern is expressed as a "regular expression"). + +#. Choose a macro from the list. The ``Name:`` field (read-only) is populated with the macro name and the ``Value:`` field is populated with the current value of the macro. + +#. Edit the ``Value:`` field to change the macro value. Please note that the value you enter will be validated against the pattern. If the macro does not conform to the pattern, IBEX will display a warning message. + +IOC PV Values +~~~~~~~~~~~~~ + +IOC PV Sets +~~~~~~~~~~~ + +Summary +~~~~~~~ From 0cea73d2b2d6e8279e5cee96b5211d85b1f29ea1 Mon Sep 17 00:00:00 2001 From: Gollum Date: Tue, 23 Aug 2016 11:35:37 +0100 Subject: [PATCH 0143/1813] Updated CreateandManageConfigurations (rest) --- CreateandManageConfigurations.rest | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/CreateandManageConfigurations.rest b/CreateandManageConfigurations.rest index 6ce6ebc..92d34fc 100644 --- a/CreateandManageConfigurations.rest +++ b/CreateandManageConfigurations.rest @@ -93,21 +93,24 @@ Components are, in essence, sub-configurations. IOC Macros ~~~~~~~~~~ -IOC Macros are configurable values that IBEX can supply to the IOC when the IOC is started. For example, if the IOC is controlling a serial device attached to a COM port, you can use an macro to identify the appropriate port to the IOC. This is especially useful if the device moves between instruments and may be attached to different COM ports on different instruments. +IOC Macros are configurable values that IBEX can supply to the IOC when the IOC is started. For example, if the IOC is controlling a serial device attached to a COM port, you can use an macro to identify the appropriate port to the IOC. This is especially useful if the device moves between instruments and may be attached to different COM ports on different instruments. Another example of an IOC macro might be the name of a calibration file. To set an IOC macro: -#. Select the IOC Macros tab and choose an IOC from the drop-down menu list of IOCs. If the IOC has any configurable macro parameters, they will be displayed in the list below. The list contains four columns: +#. Select the IOC Macros tab and choose an IOC from the drop-down menu list of IOCs. If the IOC has any configurable macro parameters, they will be displayed in the table below. The table contains four columns: - #. Macro Name: the name of the macro (e.g. ``PORT``) - #. Value: the current value of the macro (e.g. ``COM3``) + #. Macro Name: the name of the macro (e.g. ``PORT``, ``BAUD`` or ``IPADDRESS``) + #. Value: the current value of the macro (e.g. ``COM3``, ``9600`` or ``192.83.42.106``) #. Description: a short description of the macro's purpose #. Pattern: macros need to be specified correctly. IBEX uses the pattern to validate the macro value. (For those familiar with such things, the pattern is expressed as a "regular expression"). -#. Choose a macro from the list. The ``Name:`` field (read-only) is populated with the macro name and the ``Value:`` field is populated with the current value of the macro. +#. Choose a macro from the table. The ``Name:`` field (read-only) is populated with the macro name and the ``Value:`` field is populated with the current value of the macro. #. Edit the ``Value:`` field to change the macro value. Please note that the value you enter will be validated against the pattern. If the macro does not conform to the pattern, IBEX will display a warning message. +#. Click on the ``Set Macro`` button to set the macro value. The table of macros will be updated with the new value. You can also use the ``Clear macro`` button to clear the contents of the ``Value:`` field. + + IOC PV Values ~~~~~~~~~~~~~ From 80d9219d09f22de98eb72f14114bbdc1d18bb3e8 Mon Sep 17 00:00:00 2001 From: Gollum Date: Tue, 23 Aug 2016 14:06:48 +0100 Subject: [PATCH 0144/1813] Updated CreateandManageConfigurations (rest) --- CreateandManageConfigurations.rest | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/CreateandManageConfigurations.rest b/CreateandManageConfigurations.rest index 92d34fc..d463451 100644 --- a/CreateandManageConfigurations.rest +++ b/CreateandManageConfigurations.rest @@ -102,14 +102,15 @@ To set an IOC macro: #. Macro Name: the name of the macro (e.g. ``PORT``, ``BAUD`` or ``IPADDRESS``) #. Value: the current value of the macro (e.g. ``COM3``, ``9600`` or ``192.83.42.106``) #. Description: a short description of the macro's purpose - #. Pattern: macros need to be specified correctly. IBEX uses the pattern to validate the macro value. (For those familiar with such things, the pattern is expressed as a "regular expression"). + #. Pattern: macro values need to be defined correctly. IBEX uses the pattern to validate the macro value. (For those familiar with such things, the pattern is expressed as a "regular expression"). #. Choose a macro from the table. The ``Name:`` field (read-only) is populated with the macro name and the ``Value:`` field is populated with the current value of the macro. -#. Edit the ``Value:`` field to change the macro value. Please note that the value you enter will be validated against the pattern. If the macro does not conform to the pattern, IBEX will display a warning message. +#. Edit the ``Value:`` field to change the macro value. Please note that the value you enter will be validated against the pattern. If the macro does not conform to the pattern, IBEX will display a warning message. IBEX will refuse to accept any values that do not conform to the pattern. -#. Click on the ``Set Macro`` button to set the macro value. The table of macros will be updated with the new value. You can also use the ``Clear macro`` button to clear the contents of the ``Value:`` field. +#. Click on the ``Set Macro`` button to set the macro value. The table of macros will be updated with the new value. You can also use the ``Clear Macro`` button to clear the contents of the ``Value:`` field. +If you are not sure about how to correctly configure macro values for a device, please consult with the Experimental Controls team. IOC PV Values ~~~~~~~~~~~~~ @@ -119,3 +120,17 @@ IOC PV Sets Summary ~~~~~~~ + +The Summary tab allows you to create a short description for your configuration. It also allows you to associate a default synoptic view with your configuration. + +When you click on the Summary tab, IBEX displays the following fields: + +Name + This is a read-only field. It is defined when you save the configuration. When you are creating a new configuration, the ``Name:`` field will be empty. + +Description + Provide a short description of your configuration. Configuration names can sometime be a little cryptic; a short description will help you to better remember the purpose of the configuration. + +Synoptic + IBEX allows you to create different synoptic views for use with different configurations. Therefore, it is convenient to associate a synoptic view with a configuration - it saves you from having to remember the association. Your chosen synoptic will be used as the default synoptic whenever you use this configuration. + From 22bc6f70458c8b73d8a0be5d1273b550356bb0fa Mon Sep 17 00:00:00 2001 From: Gollum Date: Tue, 23 Aug 2016 14:10:42 +0100 Subject: [PATCH 0145/1813] Updated CreateandManageConfigurations (rest) --- CreateandManageConfigurations.rest | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CreateandManageConfigurations.rest b/CreateandManageConfigurations.rest index d463451..30218c0 100644 --- a/CreateandManageConfigurations.rest +++ b/CreateandManageConfigurations.rest @@ -90,6 +90,8 @@ Components Tab Components are, in essence, sub-configurations. +**TO DO** + IOC Macros ~~~~~~~~~~ @@ -115,9 +117,13 @@ If you are not sure about how to correctly configure macro values for a device, IOC PV Values ~~~~~~~~~~~~~ +**TO DO** + IOC PV Sets ~~~~~~~~~~~ +**TO DO** + Summary ~~~~~~~ From b08a70ebd92d1bcc341855403b907182897dbbcc Mon Sep 17 00:00:00 2001 From: Gollum Date: Tue, 23 Aug 2016 14:33:50 +0100 Subject: [PATCH 0146/1813] Created CreateandManageSynoptics (markdown) --- CreateandManageSynoptics.md | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 CreateandManageSynoptics.md diff --git a/CreateandManageSynoptics.md b/CreateandManageSynoptics.md new file mode 100644 index 0000000..1a8b929 --- /dev/null +++ b/CreateandManageSynoptics.md @@ -0,0 +1,28 @@ + +.. _CreateandManageSynoptics: + +Create & Manage Synoptic Views +============================== + +In IBEX, synoptic views provide you with interactive, schematic views of your instrument. Each icon on a synoptic view represents a device attached to your instrument. You can tailor the synoptic view to display key PVs next to the device icons. By double-clicking on an item, you can drill down to see more detail. + +You can define as many synoptic views as you wish for your instrument. Each synoptic need not encompass the whole instrument. You can define synoptic views that focus on specific aspects of your instrument - for example, just the beam optics, or just the sample stack and equipment mounted on the sample stack. + +You can also associate a synoptic view with a particular configuration, so that, in effect, the synoptic becomes the default synoptic for that configuration. + +Creating a Synoptic View +------------------------ + +To create a synoptic view: + +#. Select ``New`` from the ``Synoptic menu. +#. IBEX displays a dialog divided into four panes. + + #. Instrument Tree + #. Component Details + #. Component Target Details + #. PV Details + +We'll describe each of these in turn. + + From 9b1f8eef7c178f68441eae077e7e32baabfc617d Mon Sep 17 00:00:00 2001 From: Gollum Date: Tue, 23 Aug 2016 14:34:06 +0100 Subject: [PATCH 0147/1813] Updated CreateandManageSynoptics (markdown) --- CreateandManageSynoptics.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/CreateandManageSynoptics.md b/CreateandManageSynoptics.md index 1a8b929..0d83e91 100644 --- a/CreateandManageSynoptics.md +++ b/CreateandManageSynoptics.md @@ -1,4 +1,3 @@ - .. _CreateandManageSynoptics: Create & Manage Synoptic Views @@ -15,7 +14,7 @@ Creating a Synoptic View To create a synoptic view: -#. Select ``New`` from the ``Synoptic menu. +#. Select ``New`` from the ``Synoptic`` menu. #. IBEX displays a dialog divided into four panes. #. Instrument Tree From 1220b3151dd42e7507a020864685fe820ff1e65b Mon Sep 17 00:00:00 2001 From: Gollum Date: Tue, 23 Aug 2016 14:36:22 +0100 Subject: [PATCH 0148/1813] Updated CreateandManageSynoptics (rest) --- ...eandManageSynoptics.md => CreateandManageSynoptics.rest | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) rename CreateandManageSynoptics.md => CreateandManageSynoptics.rest (91%) diff --git a/CreateandManageSynoptics.md b/CreateandManageSynoptics.rest similarity index 91% rename from CreateandManageSynoptics.md rename to CreateandManageSynoptics.rest index 0d83e91..a440a1d 100644 --- a/CreateandManageSynoptics.md +++ b/CreateandManageSynoptics.rest @@ -14,8 +14,9 @@ Creating a Synoptic View To create a synoptic view: -#. Select ``New`` from the ``Synoptic`` menu. -#. IBEX displays a dialog divided into four panes. +Select ``New`` from the ``Synoptic`` menu. + +IBEX displays a dialog divided into four panes. #. Instrument Tree #. Component Details @@ -23,5 +24,3 @@ To create a synoptic view: #. PV Details We'll describe each of these in turn. - - From b1d31e3773eae59c4f97b10209fe403eed469cef Mon Sep 17 00:00:00 2001 From: Gollum Date: Tue, 23 Aug 2016 14:45:56 +0100 Subject: [PATCH 0149/1813] Updated CreateandManageSynoptics (rest) --- CreateandManageSynoptics.rest | 33 +++++++++++++++++++++++++++++---- 1 file changed, 29 insertions(+), 4 deletions(-) diff --git a/CreateandManageSynoptics.rest b/CreateandManageSynoptics.rest index a440a1d..19c4ddd 100644 --- a/CreateandManageSynoptics.rest +++ b/CreateandManageSynoptics.rest @@ -14,13 +14,38 @@ Creating a Synoptic View To create a synoptic view: -Select ``New`` from the ``Synoptic`` menu. - -IBEX displays a dialog divided into four panes. +#. Select ``New`` from the ``Synoptic`` menu. +#. IBEX displays the Synoptic editor dialog, which is divided into four panes. #. Instrument Tree #. Component Details #. Component Target Details #. PV Details -We'll describe each of these in turn. +#. At the bottom of the dialog are three buttons + +Synoptic Preview + Click on the ``Synoptic Preview`` button to get a preview of how your synoptic will appear. You can click on the ``Synoptic Preview`` button at any time. + +Save as... + Click on the ``Save as...`` button to save your changes. You must provide a name for the synoptic view. The name of the synoptic can contain only the characters a-z, A-Z, 0-9 and _ (underscore). The name must also start with a character. + +Cancel + Click on the ``Cancel`` button to exit the dialog without saving your changes. + +We'll describe each of four panes in turn. + +Instrument Tree +~~~~~~~~~~~~~~~ + +Component Details +~~~~~~~~~~~~~~~~~ + +Component Target Details +~~~~~~~~~~~~~~~~~~~~~~~~~ + +PV Details +~~~~~~~~~~ + + + From 81e08decf5f35f0eb6556c54b1699de74bacacc4 Mon Sep 17 00:00:00 2001 From: Gollum Date: Tue, 23 Aug 2016 14:56:37 +0100 Subject: [PATCH 0150/1813] Updated CreateandManageConfigurations (rest) --- CreateandManageConfigurations.rest | 29 +++++++++++++++++++++++++++-- 1 file changed, 27 insertions(+), 2 deletions(-) diff --git a/CreateandManageConfigurations.rest b/CreateandManageConfigurations.rest index 30218c0..8c036be 100644 --- a/CreateandManageConfigurations.rest +++ b/CreateandManageConfigurations.rest @@ -13,7 +13,7 @@ Creating a Configuration To create a configuration: #. Select ``Configurations > New`` from the ``Configuration`` menu. -#. IBEX displays a dialog containing eight tabs. +#. IBEX displays the Edit Configuration dialog, which contains eight tabs. #. IOCs #. Blocks @@ -24,7 +24,15 @@ To create a configuration: #. IOC PV Sets #. Summary -We'll describe each of these in turn. +#. At the bottom of the dialog are two buttons + +Save as... + Click on the ``Save as...`` button to save your changes. The Save as... dialog prompts you to provide a name and description for your configuration. You must provide a name for the configuration. The name of the configuration can contain only the characters a-z, A-Z, 0-9 and _ (underscore). The name must also start with a character. + +Cancel + Click on the ``Cancel`` button to exit the Edit Configuration dialog without saving your changes. + +We'll describe each of the Edit Configuration dialog tabs in turn. IOCs Tab ~~~~~~~~ @@ -140,3 +148,20 @@ Description Synoptic IBEX allows you to create different synoptic views for use with different configurations. Therefore, it is convenient to associate a synoptic view with a configuration - it saves you from having to remember the association. Your chosen synoptic will be used as the default synoptic whenever you use this configuration. +Editing a Configuration +----------------------- + +To edit a configuration: + +#. Select ``Configurations > Edit`` from the ``Configuration`` menu. +#. IBEX displays the Edit Configuration dialog (described above). +#. This time the Edit Configuration dialog has three buttons at the bottom of the dialog + +Save + Clicking on the ``Save`` button immediately saves your changes without any further prompting. + +Save as... + Clicking on the ``Save as...`` button operates as described in the previous section. You can use the ``Save as...`` button to save the configuration with a new name, prior to making further changes. + +Cancel + Click on the ``Cancel`` button to exit the Edit Configuration dialog without saving your changes. \ No newline at end of file From ed463cf2fc16b621ed1ea9cdded59231369c0a96 Mon Sep 17 00:00:00 2001 From: Gollum Date: Tue, 23 Aug 2016 15:16:56 +0100 Subject: [PATCH 0151/1813] Updated CreateandManageConfigurations (rest) --- CreateandManageConfigurations.rest | 26 +++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/CreateandManageConfigurations.rest b/CreateandManageConfigurations.rest index 8c036be..2dea0a3 100644 --- a/CreateandManageConfigurations.rest +++ b/CreateandManageConfigurations.rest @@ -164,4 +164,28 @@ Save as... Clicking on the ``Save as...`` button operates as described in the previous section. You can use the ``Save as...`` button to save the configuration with a new name, prior to making further changes. Cancel - Click on the ``Cancel`` button to exit the Edit Configuration dialog without saving your changes. \ No newline at end of file + Click on the ``Cancel`` button to exit the Edit Configuration dialog without saving your changes. + +Load a Configuration +----------------------- + +To load a configuration: + +#. Select ``Configurations > Load`` from the ``Configuration`` menu. +#. IBEX displays the Load Configuration dialog, which list all the configurations defined for your instrument. +#. Select a configuration from the list and press the ``OK`` button +#. IBEX discards the currently loaded configuration and loads the selected configuration. The discarded configuration is not lost - it still exists as a saved configuration and can be re-loaded later, if you wish. + +Delete a Configuration +----------------------- + +To delete a configuration: + +#. Select ``Configurations > Delete`` from the ``Configuration`` menu. +#. IBEX displays the Delete Configuration dialog, which list all the configurations defined for your instrument. +#. Select a configuration from the list and press the ``OK`` button +#. IBEX deletes the selected configuration. + +**Note 1:** If you try to delete the currently loaded configuration, IBEX will do nothing. It will not delete the current configuration, because that would leave IBEX unable to communicate with the instrument. If you want to delete the current configuration, load a different configuration, then delete the previously loaded configuration. + +**Note 2:** When you delete a configuration it really is deleted. It is no longer available to be used by IBEX. Before deleting a configuration, please be sure that you really do want to delete it. If you unintentionally delete a configuration, please contact the Experimental Controls team - it may be possible to recover the deleted configuration. \ No newline at end of file From a07caccf66501b39eada2fb6be04647be7e55bb6 Mon Sep 17 00:00:00 2001 From: Gollum Date: Tue, 23 Aug 2016 15:39:36 +0100 Subject: [PATCH 0152/1813] Updated CreateandManageConfigurations (rest) --- CreateandManageConfigurations.rest | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/CreateandManageConfigurations.rest b/CreateandManageConfigurations.rest index 2dea0a3..68faa84 100644 --- a/CreateandManageConfigurations.rest +++ b/CreateandManageConfigurations.rest @@ -154,7 +154,7 @@ Editing a Configuration To edit a configuration: #. Select ``Configurations > Edit`` from the ``Configuration`` menu. -#. IBEX displays the Edit Configuration dialog (described above). +#. IBEX displays the Edit Configuration dialog (as described in `Creating a Configuration`_). #. This time the Edit Configuration dialog has three buttons at the bottom of the dialog Save @@ -166,6 +166,11 @@ Save as... Cancel Click on the ``Cancel`` button to exit the Edit Configuration dialog without saving your changes. +Edit Current Configuration ... +------------------------------ + +To edit the current configuration simply select ``Edit Current Configuration ...`` from the ``Configuration`` menu. This avoids the need to select the current configuration from a list of configurations. Otherwise, this option behaves in the same way as `Editing a Configuration`_. + Load a Configuration ----------------------- From d6c0cd79493205c9c2ac69fb859dc3da7f74c7ea Mon Sep 17 00:00:00 2001 From: Gollum Date: Tue, 23 Aug 2016 16:21:09 +0100 Subject: [PATCH 0153/1813] Updated CreateandManageSynoptics (rest) --- CreateandManageSynoptics.rest | 24 +++++++++++++++--------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/CreateandManageSynoptics.rest b/CreateandManageSynoptics.rest index 19c4ddd..5ccbce9 100644 --- a/CreateandManageSynoptics.rest +++ b/CreateandManageSynoptics.rest @@ -33,19 +33,25 @@ Save as... Cancel Click on the ``Cancel`` button to exit the dialog without saving your changes. -We'll describe each of four panes in turn. +Use the Synoptic editor as follows: -Instrument Tree -~~~~~~~~~~~~~~~ +#. Click on the ``Add Component`` button to add a new component to the Instrument Tree. -Component Details -~~~~~~~~~~~~~~~~~ + #. When you add a new component, its details are shown in the Component Details pane. It is given the default name ``New Component`` and a default type of ``UNKNOWN``. + #. In the Component Details pane, you can adjust the properties of the component. -Component Target Details -~~~~~~~~~~~~~~~~~~~~~~~~~ + * Give it a suitable name + * Select the type of device it represents + * Add associated PVs to be displayed below the component in the synoptic view (``Add New PV`` button). + * Remove associated PVs -PV Details -~~~~~~~~~~ + #. If you add an associated PV (using the ``Add New PV`` button), its details appear in the PV Details pane. Use the the ``Select Block`` or ``Select PV`` buttons to choose a block or PV. + #. Use the Component Target Details pane to **DO SOMETHING**. +#. Click on the ``Copy Component`` button to duplicate the currently selected component. If no component is selected, the ``Copy Component`` button is inactive. + +#. Click on the ``Delete Component`` button to delete the currently selected component. If no component is selected, the ``Copy Component`` button is inactive. + +#. Toggle the ``Show Beam`` check-box to show or hide the schematic representation of the beam in the synoptic view. By default, the beam will be shown. From b4c31cf1c5c7a34ec10a3b79f31a7813b2dd3ff5 Mon Sep 17 00:00:00 2001 From: Gollum Date: Tue, 23 Aug 2016 16:22:48 +0100 Subject: [PATCH 0154/1813] Updated CreateandManageSynoptics (rest) --- CreateandManageSynoptics.rest | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CreateandManageSynoptics.rest b/CreateandManageSynoptics.rest index 5ccbce9..05dd10a 100644 --- a/CreateandManageSynoptics.rest +++ b/CreateandManageSynoptics.rest @@ -41,7 +41,7 @@ Use the Synoptic editor as follows: #. In the Component Details pane, you can adjust the properties of the component. * Give it a suitable name - * Select the type of device it represents + * Select the type of device it represents. Click on the drop-down menu to select the device type. * Add associated PVs to be displayed below the component in the synoptic view (``Add New PV`` button). * Remove associated PVs From 8297f7cab4f1e4db7363726399e1495899b5117a Mon Sep 17 00:00:00 2001 From: Gollum Date: Tue, 23 Aug 2016 16:33:42 +0100 Subject: [PATCH 0155/1813] Updated CreateandManageSynoptics (rest) --- CreateandManageSynoptics.rest | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CreateandManageSynoptics.rest b/CreateandManageSynoptics.rest index 05dd10a..cc46b55 100644 --- a/CreateandManageSynoptics.rest +++ b/CreateandManageSynoptics.rest @@ -7,7 +7,7 @@ In IBEX, synoptic views provide you with interactive, schematic views of your in You can define as many synoptic views as you wish for your instrument. Each synoptic need not encompass the whole instrument. You can define synoptic views that focus on specific aspects of your instrument - for example, just the beam optics, or just the sample stack and equipment mounted on the sample stack. -You can also associate a synoptic view with a particular configuration, so that, in effect, the synoptic becomes the default synoptic for that configuration. +You can also associate a synoptic view with a particular configuration, so that, in effect, the chosen synoptic becomes the default synoptic for that configuration. Creating a Synoptic View ------------------------ From d1c56525a6769cbb297a041cb2ad1862ea029238 Mon Sep 17 00:00:00 2001 From: Gollum Date: Tue, 23 Aug 2016 16:34:28 +0100 Subject: [PATCH 0156/1813] Updated CreateandManageSynoptics (rest) --- CreateandManageSynoptics.rest | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CreateandManageSynoptics.rest b/CreateandManageSynoptics.rest index cc46b55..1853749 100644 --- a/CreateandManageSynoptics.rest +++ b/CreateandManageSynoptics.rest @@ -51,7 +51,7 @@ Use the Synoptic editor as follows: #. Click on the ``Copy Component`` button to duplicate the currently selected component. If no component is selected, the ``Copy Component`` button is inactive. -#. Click on the ``Delete Component`` button to delete the currently selected component. If no component is selected, the ``Copy Component`` button is inactive. +#. Click on the ``Delete Component`` button to delete the currently selected component. If no component is selected, the ``Delete Component`` button is inactive. #. Toggle the ``Show Beam`` check-box to show or hide the schematic representation of the beam in the synoptic view. By default, the beam will be shown. From a9eab041ba896b7ec88175460686f07819cf2c2d Mon Sep 17 00:00:00 2001 From: Gollum Date: Tue, 23 Aug 2016 17:16:34 +0100 Subject: [PATCH 0157/1813] Created CreateandManageScripts (rest) --- CreateandManageScripts.rest | 40 +++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 CreateandManageScripts.rest diff --git a/CreateandManageScripts.rest b/CreateandManageScripts.rest new file mode 100644 index 0000000..21836e3 --- /dev/null +++ b/CreateandManageScripts.rest @@ -0,0 +1,40 @@ +.. _CreateandManageScripts: + +Create & Manage Scripts +======================= + +In IBEX, the scripting language is Python, augmented by the genie_python library. This means that you have the full facilities of the Python language available to write scripts, plus a library of commands designed to work with IBEX on instruments at ISIS. + +The genie_python library replicates the command set in the existing Open-Genie command environment used with the SECI instrument control system. This make it relatively easy to migrate existing Open-Genie scripts to the Python/genie_python environment. + +There are two ways to run scripts on IBEX: + +#. `Running Scripts via the IBEX Client`_ +#. `Running Scripts via a Command Window`_ + +You can choose whichever method you prefer. + +Running Scripts via the IBEX Client +----------------------------------- + +In IBEX, the Scripting View provides you with an interactive Python scripting environment. To view the Scripting View simply click on the ``Scripting`` button in the View Selector. + +The first time you use the Scripting View in an IBEX session, IBEX will need to load the Python scripting environment. This might take a few moments. Please wait while the environment is loaded. + +Once the environment has loaded, you can load and run scripts. + +**Please note:** When you are running scripts, the script is being executed on the instrument control PC. This means that the script itself has to be stored on the instrument control PC. It also means that any path names in your scripts refer to locations on the instrument control PC (unless you are referring to network drives). + +Running Scripts via a Command Window +------------------------------------ +To run scripts via a command window, you must first log into you the control server PC of your instrument using Remote Desktop Connection or VNC. + +**Please note:** When you are running scripts, the script is being executed on the instrument control PC. This means that the script itself has to be stored on the instrument control PC. It also means that any path names in your scripts refer to locations on the instrument control PC (unless you are referring to network drives). + +Creating Scripts +---------------- + +You can create Python scripts to run on IBEX using your favourite text editor. + + + From be94d9d314ce614fa22f9498f2eb3b14c1aabd50 Mon Sep 17 00:00:00 2001 From: Gollum Date: Wed, 24 Aug 2016 08:35:07 +0100 Subject: [PATCH 0158/1813] Updated CreateandManageScripts (rest) --- CreateandManageScripts.rest | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/CreateandManageScripts.rest b/CreateandManageScripts.rest index 21836e3..a3843dd 100644 --- a/CreateandManageScripts.rest +++ b/CreateandManageScripts.rest @@ -5,7 +5,7 @@ Create & Manage Scripts In IBEX, the scripting language is Python, augmented by the genie_python library. This means that you have the full facilities of the Python language available to write scripts, plus a library of commands designed to work with IBEX on instruments at ISIS. -The genie_python library replicates the command set in the existing Open-Genie command environment used with the SECI instrument control system. This make it relatively easy to migrate existing Open-Genie scripts to the Python/genie_python environment. +The `genie_python Library`_ replicates the command set in the existing Open-Genie command environment used with the SECI instrument control system. This make it relatively easy to migrate existing Open-Genie scripts to the Python/genie_python environment. There are two ways to run scripts on IBEX: @@ -14,6 +14,17 @@ There are two ways to run scripts on IBEX: You can choose whichever method you prefer. +Creating Scripts +---------------- + +You can create Python scripts to run on IBEX using your favourite text editor or Python programming environment. + +genie_python Library +-------------------- + +The `genie_python Reference +`_ describes the full capabilitioes of the genie_python library. + Running Scripts via the IBEX Client ----------------------------------- @@ -31,10 +42,3 @@ To run scripts via a command window, you must first log into you the control ser **Please note:** When you are running scripts, the script is being executed on the instrument control PC. This means that the script itself has to be stored on the instrument control PC. It also means that any path names in your scripts refer to locations on the instrument control PC (unless you are referring to network drives). -Creating Scripts ----------------- - -You can create Python scripts to run on IBEX using your favourite text editor. - - - From e27f89edc13d27b03115eb385c17d3f34a5da1c1 Mon Sep 17 00:00:00 2001 From: Gollum Date: Wed, 24 Aug 2016 09:25:06 +0100 Subject: [PATCH 0159/1813] Updated BlocksandGroups (rest) --- BlocksandGroups.rest | 31 ++++++++++++++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-) diff --git a/BlocksandGroups.rest b/BlocksandGroups.rest index 7411a06..85590bc 100644 --- a/BlocksandGroups.rest +++ b/BlocksandGroups.rest @@ -7,7 +7,36 @@ Blocks ------ A block is, in effect, an alias for a process variable. Process variables are defined in more detail on the [[ProcessVariables]] page. Any process variable can be assigned to a block. Blocks are defined in more detail on the [[Blocks]] page. -A tick mark next to a block, or a coloured box surrounding the block indicates that the block is under run control. Run control is defined in more detail on the [[RunControl]] page. +Run Control Indicators +~~~~~~~~~~~~~~~~~~~~~~ + +A tick mark or an X mark next to a block indicates that the block is under run control. + +* An unadorned block (i.e. no symbol next to the value of the block) means the block is not under run control. +* A green check icon next to the value means the block is under run control and within its limits. +* A red X icon next to the value means is under run control and outside its limits. + +Alarm State Indicators +~~~~~~~~~~~~~~~~~~~~~~ + +A coloured box surrounding the block indicates that the block is in an alarm state (or, more correctly, that the underlying PV is in an alarm state). + +* No border means the block is connected and is not in an alarm state. +* An orange border around the block value means the block is under minor alarm. +* A red border around the block value means the block is under major alarm. +* A purple border around the block value means the block is disconnected. + +If a block is in an alarm state, you should check the Alarms View to find out why an alarm has been raised. + +If a block is flagged as being disconnected, it typically means there is a problem with the IOC which controls the device which provides the value of the block, or with the device itself: + +#. the IOC is not running. +#. the IOC has not been correctly configured and is not communicating correctly with the device. +#. the device is not connected to the instrument control PC (e.g. a cable is disconnected). +#. the device is not switched on. +#. there is a fault with the device which provides the value of the block. + +The last of these possibilities is the least likely to occur. It is good practice to rule out the other possibilities before concluding that there is a fault with the device. Groups ------ From fe6ab500f32838f6df9dd7af772fc7f15e3b4b37 Mon Sep 17 00:00:00 2001 From: Gollum Date: Wed, 24 Aug 2016 09:49:40 +0100 Subject: [PATCH 0160/1813] Updated BlocksandGroups (rest) --- BlocksandGroups.rest | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/BlocksandGroups.rest b/BlocksandGroups.rest index 85590bc..87598c1 100644 --- a/BlocksandGroups.rest +++ b/BlocksandGroups.rest @@ -40,4 +40,6 @@ The last of these possibilities is the least likely to occur. It is good practi Groups ------ -Blocks can be arranged in groups. This provides a convenient way to group related blocks together. You can create as many groups as you need to categorise your blocks. By default, blocks will be assigned to a group called "Other". +Blocks can be arranged in groups. This provides a convenient way to group related blocks together. You can create as many groups as you need to categorise your blocks. + +If you do not explicitly assign a block to a group, it will, by default, be assigned to a group called "Other". From 2fd3b6d4b5d936b2e1300b5de8bb9318f04a5854 Mon Sep 17 00:00:00 2001 From: Gollum Date: Wed, 24 Aug 2016 09:54:21 +0100 Subject: [PATCH 0161/1813] Updated BlocksandGroups (rest) --- BlocksandGroups.rest | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/BlocksandGroups.rest b/BlocksandGroups.rest index 87598c1..045fec1 100644 --- a/BlocksandGroups.rest +++ b/BlocksandGroups.rest @@ -28,13 +28,13 @@ A coloured box surrounding the block indicates that the block is in an alarm sta If a block is in an alarm state, you should check the Alarms View to find out why an alarm has been raised. -If a block is flagged as being disconnected, it typically means there is a problem with the IOC which controls the device which provides the value of the block, or with the device itself: +If a block is flagged as being disconnected, it typically means there is a problem with the device which provides the value of the block or with the IOC which controls the device: #. the IOC is not running. -#. the IOC has not been correctly configured and is not communicating correctly with the device. +#. the IOC has not been correctly configured and, therefore, is not communicating correctly with the device. #. the device is not connected to the instrument control PC (e.g. a cable is disconnected). -#. the device is not switched on. -#. there is a fault with the device which provides the value of the block. +#. the device is switched off. +#. there is a fault with the device. The last of these possibilities is the least likely to occur. It is good practice to rule out the other possibilities before concluding that there is a fault with the device. From adc9383adc39814daf00d9cb65b8bef136fd9ad8 Mon Sep 17 00:00:00 2001 From: Gollum Date: Wed, 24 Aug 2016 10:37:26 +0100 Subject: [PATCH 0162/1813] Updated CreateandManageConfigurations (rest) --- CreateandManageConfigurations.rest | 23 +++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/CreateandManageConfigurations.rest b/CreateandManageConfigurations.rest index 68faa84..6a46b0c 100644 --- a/CreateandManageConfigurations.rest +++ b/CreateandManageConfigurations.rest @@ -7,6 +7,25 @@ A configuration is the means by which an instrument is described and defined to **Please note:** An IBEX configuration is **not** the same as a Mantid configuration. IBEX and Mantid view instruments in fundamentally different ways, which means that their respective configurations are not interchangeable. +Contents +-------- + +#. `Creating a Configuration`_ + + #. `IOCs Tab`_ + #. `Blocks Tab`_ + #. `Groups Tab`_ + #. `Components Tab`_ + #. `IOC Macros`_ + #. `IOC PV Values`_ + #. `IOC PV Sets`_ + #. `Summary`_ + +#. `Editing a Configuration`_ +#. `Edit Current Configuration ...`_ +#. `Load a Configuration`_ +#. `Delete a Configuration`_ + Creating a Configuration ------------------------ @@ -172,7 +191,7 @@ Edit Current Configuration ... To edit the current configuration simply select ``Edit Current Configuration ...`` from the ``Configuration`` menu. This avoids the need to select the current configuration from a list of configurations. Otherwise, this option behaves in the same way as `Editing a Configuration`_. Load a Configuration ------------------------ +-------------------- To load a configuration: @@ -182,7 +201,7 @@ To load a configuration: #. IBEX discards the currently loaded configuration and loads the selected configuration. The discarded configuration is not lost - it still exists as a saved configuration and can be re-loaded later, if you wish. Delete a Configuration ------------------------ +---------------------- To delete a configuration: From e2cc9438e7451d3157031613124bba99b11d5bbf Mon Sep 17 00:00:00 2001 From: Gollum Date: Wed, 24 Aug 2016 10:41:57 +0100 Subject: [PATCH 0163/1813] Updated CreateandManageConfigurations (rest) --- CreateandManageConfigurations.rest | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CreateandManageConfigurations.rest b/CreateandManageConfigurations.rest index 6a46b0c..a962961 100644 --- a/CreateandManageConfigurations.rest +++ b/CreateandManageConfigurations.rest @@ -59,7 +59,7 @@ The IOCs tab lists all the IOCs available on the instrument. In general, you wi To include an IOC in your configuration, scroll down the list until you find the appropriate IOC and select the Auto-Start or Auto-Restart check-boxes (or select both). By selecting these check-boxes, IBEX will automatically start (or restart) to chosen IOCs each time your configuration is loaded into IBEX. -**Note:** The list of IOCs in the IOC tab also includes a column headed Sim. level. This column is used to indicate whether the IOC should run in simulation mode. By default, the Sim. level file is set to NONE, meaning that the IOC will not run in simulation mode. +**Note:** The list of IOCs in the IOC tab also includes a column headed Sim. level. This column is used to indicate whether the IOC should run in simulation mode. By default, the Sim. level file is set to NONE, meaning that the IOC will not run in simulation mode. Under normal circumstances, you should not change the default setting. Blocks Tab ~~~~~~~~~~ From bcabc2dd25ba43abca17e72b3df2aacd7e3547dd Mon Sep 17 00:00:00 2001 From: Gollum Date: Wed, 24 Aug 2016 11:08:49 +0100 Subject: [PATCH 0164/1813] Created CreateandManageComponents (rest) --- CreateandManageComponents.rest | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 CreateandManageComponents.rest diff --git a/CreateandManageComponents.rest b/CreateandManageComponents.rest new file mode 100644 index 0000000..2078274 --- /dev/null +++ b/CreateandManageComponents.rest @@ -0,0 +1,20 @@ +.. _CreateandManageComponents: + +Create & Manage Components +========================== + +Many instrument configurations feature a number of devices and settings in common. A component is a mini configuration (or sub-configuration) which provides a means of defining a selection of IOCs, Blocks, Groups, etc. that can be treated as a single object. Other configurations can then include the component which means that common IOCs, Block and other settings do not have to be repeatedly added to each configuration. It also means that changes need only be made to a single object - if a component is changed the changes will propagate to all the configurations that use that component. + +Contents +-------- + +#. `Creating a Component`_ +#. `Editing a Configuration`_ +#. `Edit Current Configuration ...`_ +#. `Load a Configuration`_ +#. `Delete a Configuration`_ + +Creating a Component +-------------------- + +There are several ways to create a component: From d962a7ef10721ab1d6fe8c1302b1d9e2c955d6d4 Mon Sep 17 00:00:00 2001 From: Gollum Date: Wed, 24 Aug 2016 11:27:54 +0100 Subject: [PATCH 0165/1813] Updated CreateandManageComponents (rest) --- CreateandManageComponents.rest | 26 ++++++++++++++++++++++---- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/CreateandManageComponents.rest b/CreateandManageComponents.rest index 2078274..509e771 100644 --- a/CreateandManageComponents.rest +++ b/CreateandManageComponents.rest @@ -9,12 +9,30 @@ Contents -------- #. `Creating a Component`_ -#. `Editing a Configuration`_ -#. `Edit Current Configuration ...`_ -#. `Load a Configuration`_ -#. `Delete a Configuration`_ +#. `Editing a Component`_ +#. `Delete a Component`_ Creating a Component -------------------- There are several ways to create a component: + +Save an existing Configuration as a Component + You can save an existing configuration as a component. When you click on the ``Save as...`` button on the Edit Configuration dialog (see [[CreateandManageConfigurations]]) there is a check-box labelled ``Save the configuration as a component``. By default, this check-box is unchecked. Click on the ``Save the configuration as a component`` and then click the ``OK`` button to save the configuration as a component. + + Once you have saved the configuration as a component, you can edit it as a component. + +Create a New Component + You can create a new component directly from the ``Configuration`` menu. Simply select ``Configurations > New`` from the ``Configuration`` menu. IBEX will then display the New Configuration dialog. + + The process of defining is the same as the process of defining a configuration - the New Component dialog is identical to the New Configuration dialog. Refer to [[CreateandManageConfigurations]] for a full description of how use the various tabs on the New Component dialog. + +Editing a Component +------------------- + +To edit a component: + +#. Select ``Components> Edit`` from the ``Configuration`` menu. +#. IBEX displays the Edit Component dialog which is is identical to the New Component dialog. Refer to [[CreateandManageConfigurations]] for a full description of how use the various tabs on the New Component dialog.(as described in `Creating a Component`_). + + From 479f73eb38800b7550183c8f8a6b34698f6840fc Mon Sep 17 00:00:00 2001 From: Gollum Date: Wed, 24 Aug 2016 11:31:43 +0100 Subject: [PATCH 0166/1813] Updated CreateandManageComponents (rest) --- CreateandManageComponents.rest | 26 ++++++++++++++++++-------- 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/CreateandManageComponents.rest b/CreateandManageComponents.rest index 509e771..bf513bd 100644 --- a/CreateandManageComponents.rest +++ b/CreateandManageComponents.rest @@ -8,12 +8,12 @@ Many instrument configurations feature a number of devices and settings in commo Contents -------- -#. `Creating a Component`_ -#. `Editing a Component`_ +#. `Create a Component`_ +#. `Edit a Component`_ #. `Delete a Component`_ -Creating a Component --------------------- +Create a Component +------------------ There are several ways to create a component: @@ -27,12 +27,22 @@ Create a New Component The process of defining is the same as the process of defining a configuration - the New Component dialog is identical to the New Configuration dialog. Refer to [[CreateandManageConfigurations]] for a full description of how use the various tabs on the New Component dialog. -Editing a Component -------------------- +Edit a Component +---------------- To edit a component: -#. Select ``Components> Edit`` from the ``Configuration`` menu. -#. IBEX displays the Edit Component dialog which is is identical to the New Component dialog. Refer to [[CreateandManageConfigurations]] for a full description of how use the various tabs on the New Component dialog.(as described in `Creating a Component`_). +#. Select ``Components > Edit`` from the ``Configuration`` menu. +#. IBEX displays the Edit Component dialog which is is identical to the New Component dialog. Refer to [[CreateandManageConfigurations]] for a full description of how use the various tabs on the Edit Component dialog (as described in `Create a Component`_). + +Delete a Component +------------------ + +To delete a component: + +#. Select ``Components > Delete`` from the ``Configuration`` menu. +#. IBEX displays the Delete Component dialog, which list all the components defined for your instrument. +#. Select a component from the list and press the ``OK`` button +#. IBEX deletes the selected component. From 92da71e1fbd870ca698aebfe368a025f90b4874f Mon Sep 17 00:00:00 2001 From: Gollum Date: Wed, 24 Aug 2016 11:32:03 +0100 Subject: [PATCH 0167/1813] Updated CreateandManageConfigurations (rest) --- CreateandManageConfigurations.rest | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CreateandManageConfigurations.rest b/CreateandManageConfigurations.rest index a962961..dd6a87a 100644 --- a/CreateandManageConfigurations.rest +++ b/CreateandManageConfigurations.rest @@ -206,7 +206,7 @@ Delete a Configuration To delete a configuration: #. Select ``Configurations > Delete`` from the ``Configuration`` menu. -#. IBEX displays the Delete Configuration dialog, which list all the configurations defined for your instrument. +#. IBEX displays the Delete Configuration dialog, which lists all the configurations defined for your instrument. #. Select a configuration from the list and press the ``OK`` button #. IBEX deletes the selected configuration. From cdc06a9851ddd393c351c4923f1b1d246546663c Mon Sep 17 00:00:00 2001 From: Gollum Date: Wed, 24 Aug 2016 11:32:17 +0100 Subject: [PATCH 0168/1813] Updated CreateandManageComponents (rest) --- CreateandManageComponents.rest | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CreateandManageComponents.rest b/CreateandManageComponents.rest index bf513bd..c822dfd 100644 --- a/CreateandManageComponents.rest +++ b/CreateandManageComponents.rest @@ -41,7 +41,7 @@ Delete a Component To delete a component: #. Select ``Components > Delete`` from the ``Configuration`` menu. -#. IBEX displays the Delete Component dialog, which list all the components defined for your instrument. +#. IBEX displays the Delete Component dialog, which lists all the components defined for your instrument. #. Select a component from the list and press the ``OK`` button #. IBEX deletes the selected component. From 95acd12dc0f40428f5561d64fbbd19068ea2260a Mon Sep 17 00:00:00 2001 From: Gollum Date: Wed, 24 Aug 2016 11:35:18 +0100 Subject: [PATCH 0169/1813] Updated CreateandManageComponents (rest) --- CreateandManageComponents.rest | 1 + 1 file changed, 1 insertion(+) diff --git a/CreateandManageComponents.rest b/CreateandManageComponents.rest index c822dfd..3f561e7 100644 --- a/CreateandManageComponents.rest +++ b/CreateandManageComponents.rest @@ -45,4 +45,5 @@ To delete a component: #. Select a component from the list and press the ``OK`` button #. IBEX deletes the selected component. +**Note:** When you delete a component it really is deleted. It is no longer available to be used by IBEX. Before deleting a component, please be sure that you really do want to delete it. If you unintentionally delete a component, please contact the Experimental Controls team - it may be possible to recover the deleted component. From c17954b2429110c60254311ca788c5aee6129c61 Mon Sep 17 00:00:00 2001 From: Gollum Date: Wed, 24 Aug 2016 11:57:44 +0100 Subject: [PATCH 0170/1813] Updated CreateandManageConfigurations (rest) --- CreateandManageConfigurations.rest | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/CreateandManageConfigurations.rest b/CreateandManageConfigurations.rest index dd6a87a..fafb23d 100644 --- a/CreateandManageConfigurations.rest +++ b/CreateandManageConfigurations.rest @@ -115,9 +115,11 @@ Use the buttons with the Up and Down arrows to control the ordering of the group Components Tab ~~~~~~~~~~~~~~ -Components are, in essence, sub-configurations. +Components are, in essence, mini configurations. You can use components to "pre-configure" a device (or group of devices) and then include the components in a configuration. The process of creating and managing components is described in [[CreateandManageComponents]]. -**TO DO** +The Components tab displays two lists of components. The left hand list shows which components are available to be included in your configuration. The right hand list shows which components are already included in your configuration. You can only include a component once in a configuration. + +Use the arrow buttons to move components between the two lists. IOC Macros ~~~~~~~~~~ From 32e1a9bc6260051aa5e4c2eff2707be52efba10a Mon Sep 17 00:00:00 2001 From: Gollum Date: Wed, 24 Aug 2016 13:17:36 +0100 Subject: [PATCH 0171/1813] Created ManagetheDAE (rest) --- ManagetheDAE.rest | 46 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 ManagetheDAE.rest diff --git a/ManagetheDAE.rest b/ManagetheDAE.rest new file mode 100644 index 0000000..40b26b3 --- /dev/null +++ b/ManagetheDAE.rest @@ -0,0 +1,46 @@ +Manage the DAE +============== + +The DAE view provides the means for controlling the Data Acquisition Electronics (DAE). + +Contents +-------- + +#. `Run Summary`_ +#. `Experiment Setup`_ + + #. `Time Channels`_ + #. `Data Acquisition`_ + #. `Periods`_ + +#. `Run Information`_ +#. `Spectra Plots`_ +#. `Diagnostics`_ +#. `Vetos`_ + +Run Summary +-------- + +Experiment Setup +-------- + +Time Channels +~~~~~~~~~~~~~ + +Data Acquisition +~~~~~~~~~~~~~ + +Periods +~~~~~~~~~~~~~ + +Run Information +-------- + +Spectra Plots +-------- + +Diagnostics +-------- + +Vetos +-------- From 51bad522df9601433cdd49e71efa08a89c0c85b0 Mon Sep 17 00:00:00 2001 From: Gollum Date: Wed, 24 Aug 2016 13:37:22 +0100 Subject: [PATCH 0172/1813] Updated KeyConceptsinIBEX (rest) --- KeyConceptsinIBEX.rest | 3 +++ 1 file changed, 3 insertions(+) diff --git a/KeyConceptsinIBEX.rest b/KeyConceptsinIBEX.rest index 3db3a12..31d7c56 100644 --- a/KeyConceptsinIBEX.rest +++ b/KeyConceptsinIBEX.rest @@ -29,6 +29,9 @@ BlockServer translates [[ProcessVariables]] into [[Blocks]]. It also supports run-control and serves configuration information. +ICP + The ICP (Instrument Control Program) is the process which controls the DAE (Data Acquisition Electronics). The ICP tells the DAE when to start and stop collecting data from the instrument detectors. The ICP is also responsible for combining the detector data with logged sample environment data and for transferring the final dataset to a data file. + Archiver The Archiver, as its name suggests, archives the values of process variables to a database. This service supports strip-chart plots of blocks & process variables and can also be used From efb6d2781bcd422bde86c46dd5db2b0c10006355 Mon Sep 17 00:00:00 2001 From: Gollum Date: Wed, 24 Aug 2016 13:57:16 +0100 Subject: [PATCH 0173/1813] Updated ManagetheDAE (rest) --- ManagetheDAE.rest | 63 ++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 54 insertions(+), 9 deletions(-) diff --git a/ManagetheDAE.rest b/ManagetheDAE.rest index 40b26b3..8deb83d 100644 --- a/ManagetheDAE.rest +++ b/ManagetheDAE.rest @@ -1,7 +1,11 @@ +.. _ManagetheDAE: + Manage the DAE ============== -The DAE view provides the means for controlling the Data Acquisition Electronics (DAE). +The Data Acquisition Electronics (DAE) is the hardware where the neutron or muon data is collected. The DAE is controlled by the ICP, which informs the DAE when to start and stop collecting data from the instrument detectors. The ICP also receives sample environment information and combines it with the detector data and is responsible for transferring the final combined dataset to a data file. + +The DAE view communicates with the ICP to control the DAE. Contents -------- @@ -19,28 +23,69 @@ Contents #. `Vetos`_ Run Summary --------- +----------- + +The Run Summary tab displays some summary information about the current run and displays any log messages received from the ICP. + +Run Summary Fields +~~~~~~~~~~~~~~~~~~ + +* ``Instrument``: (read-only) records the instrument on which the current run is being performed +* ``Run Status``: (read-only) records status of the current run +* ``Run Number``: (read-only) records the current run number +* ``ISIS Cycle``: (read-only) records the current ISIS cycle +* ``Title``: you can proviode a short description of the current run in the ``Title`` field. Click on the ``Set`` button to commit the change (i.e. send it to the ICP, so that it gets included in the data file). + +Message Log +~~~~~~~~~~~ +The message log area lets you view any messages issued by the ICP. The message log area is the same as the main Log Messages view, filtered to show only messages from the ICP. + +The Run Summary tab also provides a number of buttons to control the acquisition of data. + +Begin Run + Click on the ``BEGIN RUN`` button to start a new run. + +End Run + Click on the ``END RUN`` button to terminate the current run. + +Pause Run + Click on the ``PAUSE RUN`` button to temporarily halt the current run. + +Resume Run + Click on the ``RESUME RUN`` button to resume a previously paused run. + +Abort Run + Click on the ``ABORT RUN`` button to abort the current run. + +Cancel Abort + Click on the ``CANCEL ABORT`` button to cancel the abort process. + +Save Run + Click on the ``SAVE RUN`` button to save the current run. + Experiment Setup --------- +---------------- Time Channels ~~~~~~~~~~~~~ Data Acquisition -~~~~~~~~~~~~~ +~~~~~~~~~~~~~~~~ Periods -~~~~~~~~~~~~~ +~~~~~~~ Run Information --------- +--------------- Spectra Plots --------- +------------- Diagnostics --------- +----------- Vetos --------- +----- + +Some stuff here ... From ea306e3744878f23158e48a49a5ec5acbc5887f3 Mon Sep 17 00:00:00 2001 From: Gollum Date: Wed, 24 Aug 2016 13:58:11 +0100 Subject: [PATCH 0174/1813] Updated KeyConceptsinIBEX (rest) --- KeyConceptsinIBEX.rest | 2 ++ 1 file changed, 2 insertions(+) diff --git a/KeyConceptsinIBEX.rest b/KeyConceptsinIBEX.rest index 31d7c56..1b352cd 100644 --- a/KeyConceptsinIBEX.rest +++ b/KeyConceptsinIBEX.rest @@ -1,3 +1,5 @@ +.. _KeyConceptsinIBEX: + Key Concepts in IBEX ==================== From b36e151bec32a2994799e0a31535d558cbd01e27 Mon Sep 17 00:00:00 2001 From: Gollum Date: Wed, 24 Aug 2016 13:58:17 +0100 Subject: [PATCH 0175/1813] Updated ManagetheDAE (rest) From 6f3ca87759857fed557c2fcb822f6161f3751c75 Mon Sep 17 00:00:00 2001 From: Gollum Date: Wed, 24 Aug 2016 14:12:56 +0100 Subject: [PATCH 0176/1813] Updated ManagetheDAE (rest) --- ManagetheDAE.rest | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/ManagetheDAE.rest b/ManagetheDAE.rest index 8deb83d..92fcc7b 100644 --- a/ManagetheDAE.rest +++ b/ManagetheDAE.rest @@ -43,19 +43,19 @@ The message log area lets you view any messages issued by the ICP. The message The Run Summary tab also provides a number of buttons to control the acquisition of data. Begin Run - Click on the ``BEGIN RUN`` button to start a new run. + Click on the ``BEGIN RUN`` button to start a new run. Beginning a run instructs the ICP to tell the DAE to start collecting data. The DAE’s run status will change to RUNNING (which is reflected in the ``Run Status`` field and in the IBEX [[Dashboard]]. End Run - Click on the ``END RUN`` button to terminate the current run. + Click on the ``END RUN`` button to terminate the current run. Ending a run instructs the ICP to tell the DAE to stop collecting data. It also instructs the ICP to write the data collected during the run to a file. The DAE’s run status will change to SETUP. Pause Run - Click on the ``PAUSE RUN`` button to temporarily halt the current run. + Click on the ``PAUSE RUN`` button to halt (but not end) the current run. Pausing a run instructs the ICP to tell the DAE to pause data collection indefinitely. The DAE’s run status will change to PAUSED. The DAE's status will remain PAUSED until it is instructed to RESUME. Resume Run - Click on the ``RESUME RUN`` button to resume a previously paused run. + Click on the ``RESUME RUN`` button to resume a previously paused run. Resuming a run instructs the ICP to tell the DAE to resume data collection after it has been paused. The DAE’s run status will return to RUNNING. Abort Run - Click on the ``ABORT RUN`` button to abort the current run. + Click on the ``ABORT RUN`` button to abort the current run. Aborting a run instructs the ICP to tell the DAE to stop data collection as for END. However, the data that has been collected is not written to a file; if a new run is started, then any data that has been collected will be lost. The DAE’s run status will change to SETUP. Cancel Abort Click on the ``CANCEL ABORT`` button to cancel the abort process. From e55aaa5c4635359f7aaecc15eb85d0e425422ef8 Mon Sep 17 00:00:00 2001 From: Gollum Date: Wed, 24 Aug 2016 14:13:45 +0100 Subject: [PATCH 0177/1813] Updated ManagetheDAE (rest) --- ManagetheDAE.rest | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ManagetheDAE.rest b/ManagetheDAE.rest index 92fcc7b..d7e1cea 100644 --- a/ManagetheDAE.rest +++ b/ManagetheDAE.rest @@ -55,7 +55,7 @@ Resume Run Click on the ``RESUME RUN`` button to resume a previously paused run. Resuming a run instructs the ICP to tell the DAE to resume data collection after it has been paused. The DAE’s run status will return to RUNNING. Abort Run - Click on the ``ABORT RUN`` button to abort the current run. Aborting a run instructs the ICP to tell the DAE to stop data collection as for END. However, the data that has been collected is not written to a file; if a new run is started, then any data that has been collected will be lost. The DAE’s run status will change to SETUP. + Click on the ``ABORT RUN`` button to abort the current run. Aborting a run instructs the ICP to tell the DAE to stop data collection (as for END). However, the data that has been collected is not written to a file; if a new run is started, then any data that has been collected will be lost. The DAE’s run status will change to SETUP. Cancel Abort Click on the ``CANCEL ABORT`` button to cancel the abort process. From 2561aa93098ff9c48a1dd30f5adce98e33b08fb8 Mon Sep 17 00:00:00 2001 From: Gollum Date: Wed, 24 Aug 2016 14:24:12 +0100 Subject: [PATCH 0178/1813] Updated ManagetheDAE (rest) --- ManagetheDAE.rest | 2 ++ 1 file changed, 2 insertions(+) diff --git a/ManagetheDAE.rest b/ManagetheDAE.rest index d7e1cea..ee46e79 100644 --- a/ManagetheDAE.rest +++ b/ManagetheDAE.rest @@ -79,6 +79,8 @@ Periods Run Information --------------- +The Run Information Tab provides a more compete summary of the DAE setup than the Run Summary tab. All the fields on this tab are read-only. + Spectra Plots ------------- From f0c78b93c634dfa076ef9c70373b44da9bd1156e Mon Sep 17 00:00:00 2001 From: Gollum Date: Wed, 24 Aug 2016 14:27:54 +0100 Subject: [PATCH 0179/1813] Updated ManagetheDAE (rest) --- ManagetheDAE.rest | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ManagetheDAE.rest b/ManagetheDAE.rest index ee46e79..f23f4bb 100644 --- a/ManagetheDAE.rest +++ b/ManagetheDAE.rest @@ -34,7 +34,7 @@ Run Summary Fields * ``Run Status``: (read-only) records status of the current run * ``Run Number``: (read-only) records the current run number * ``ISIS Cycle``: (read-only) records the current ISIS cycle -* ``Title``: you can proviode a short description of the current run in the ``Title`` field. Click on the ``Set`` button to commit the change (i.e. send it to the ICP, so that it gets included in the data file). +* ``Title``: you can provide a short description of the current run in the ``Title`` field. Click on the ``Set`` button to commit the change (i.e. send it to the ICP, so that it gets included in the data file). Message Log ~~~~~~~~~~~ From 973f6b58d3f1ba64774845144e8881a14f6bc9ec Mon Sep 17 00:00:00 2001 From: Gollum Date: Wed, 24 Aug 2016 15:40:46 +0100 Subject: [PATCH 0180/1813] Updated Blocks (rest) --- Concepts/Blocks.rest | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Concepts/Blocks.rest b/Concepts/Blocks.rest index 8990b53..6235bea 100644 --- a/Concepts/Blocks.rest +++ b/Concepts/Blocks.rest @@ -3,7 +3,7 @@ Blocks ====== -The IBEX concept of a block is similar to SECI, in that it is a relevant piece of information chosen by the scientist that will be displayed on the instrument dashboard and logged into the datafile. +The IBEX concept of a block is similar to SECI, in that it is a relevant piece of information chosen by the scientist that will be displayed on the instrument dashboard and, if required, can be logged into the datafile. In IBEX, a block is, to all intents and purposes, an alias to a process variable. For example, the block ``Chop1Freq`` on LARMOR is defined to be the process variable ``IN:LARMOR:CS:SB:Chop1Freq``. It is much simpler to refer to a block than to refer to a process variable. Utilities like genie_python know about blocks and you can use commands such as ``cset`` to access ``Chop1Freq``. However you can access blocks using the name ``IN:LARMOR:CS:SB:Chop1Freq`` with any standard EPICS tool. From a9d6919cb172b3a09fee7abfd9f956cf03696b56 Mon Sep 17 00:00:00 2001 From: Gollum Date: Wed, 24 Aug 2016 15:54:58 +0100 Subject: [PATCH 0181/1813] Updated CreateandManageConfigurations (rest) --- CreateandManageConfigurations.rest | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/CreateandManageConfigurations.rest b/CreateandManageConfigurations.rest index fafb23d..b039e83 100644 --- a/CreateandManageConfigurations.rest +++ b/CreateandManageConfigurations.rest @@ -100,7 +100,12 @@ Run-Control Settings Toggle the ``Enabled`` check-box to enable run-control on this block. Use the Low Limit and High Limit fields to define the run-control range (i.e. data is collected only when the block lies within the range) . Logging Settings - By default (Logging Settings is disabled), the block is logged whenever its value changes. Toggle the ``Enabled`` check-box to change the way the block is logged. You can set the block to logged periodically (i.e. every N seconds), or you can set a "deadband" - the block will only be logged if its value falls outside +/- the limit defined by the deadband value. + Use the Logging Settings section of the Configure Block dialog to control how the value of the block is logged. + + * **Note:** By default logging is disabled (i.e. changes in the value of the block will not be logged). + * Click on the ``Enabled`` check-box to change the way the block is logged. If the ``Enabled`` check-box is checked, then logging is enabled. + * You can choose to log the block value periodically (the default period is every 30 seconds). + * Alternatively, you can set a "deadband" - the block will only be logged if its value falls outside +/- the limit defined by the deadband value. Groups Tab ~~~~~~~~~~ From 6431192b30d6286c6b809e28f52726199f568332 Mon Sep 17 00:00:00 2001 From: Gollum Date: Wed, 24 Aug 2016 16:01:25 +0100 Subject: [PATCH 0182/1813] Updated CreateandManageConfigurations (rest) --- CreateandManageConfigurations.rest | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CreateandManageConfigurations.rest b/CreateandManageConfigurations.rest index b039e83..e40c831 100644 --- a/CreateandManageConfigurations.rest +++ b/CreateandManageConfigurations.rest @@ -57,6 +57,8 @@ IOCs Tab ~~~~~~~~ The IOCs tab lists all the IOCs available on the instrument. In general, you will only wish to include a sub-set of these in your configuration (i.e. those that correspond to devices on your instrument). +The [[KeyConceptsinIBEX]] page describes what an IOC is. + To include an IOC in your configuration, scroll down the list until you find the appropriate IOC and select the Auto-Start or Auto-Restart check-boxes (or select both). By selecting these check-boxes, IBEX will automatically start (or restart) to chosen IOCs each time your configuration is loaded into IBEX. **Note:** The list of IOCs in the IOC tab also includes a column headed Sim. level. This column is used to indicate whether the IOC should run in simulation mode. By default, the Sim. level file is set to NONE, meaning that the IOC will not run in simulation mode. Under normal circumstances, you should not change the default setting. From c0893e06ac9899925f5f78cc4c8bf91c6b4be0ec Mon Sep 17 00:00:00 2001 From: Gollum Date: Wed, 24 Aug 2016 16:03:42 +0100 Subject: [PATCH 0183/1813] Updated CreateandManageConfigurations (rest) --- CreateandManageConfigurations.rest | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/CreateandManageConfigurations.rest b/CreateandManageConfigurations.rest index e40c831..a498a5b 100644 --- a/CreateandManageConfigurations.rest +++ b/CreateandManageConfigurations.rest @@ -46,7 +46,12 @@ To create a configuration: #. At the bottom of the dialog are two buttons Save as... - Click on the ``Save as...`` button to save your changes. The Save as... dialog prompts you to provide a name and description for your configuration. You must provide a name for the configuration. The name of the configuration can contain only the characters a-z, A-Z, 0-9 and _ (underscore). The name must also start with a character. + Click on the ``Save as...`` button to save your changes. The Save as... dialog prompts you to provide a name and description for your configuration. + + * You must provide a name for the configuration. + * The name of the configuration can contain only the characters a-z, A-Z, 0-9 and _ (underscore). + * The name must also start with a character. + * The name of the configuration must be unique (on your instrument). Cancel Click on the ``Cancel`` button to exit the Edit Configuration dialog without saving your changes. From d171e853d4caac02594b933409f6c2f81cd38509 Mon Sep 17 00:00:00 2001 From: Gollum Date: Wed, 24 Aug 2016 16:06:33 +0100 Subject: [PATCH 0184/1813] Updated CreateandManageConfigurations (rest) --- CreateandManageConfigurations.rest | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/CreateandManageConfigurations.rest b/CreateandManageConfigurations.rest index a498a5b..452ee35 100644 --- a/CreateandManageConfigurations.rest +++ b/CreateandManageConfigurations.rest @@ -72,7 +72,11 @@ Blocks Tab ~~~~~~~~~~ The Blocks tab lists all the blocks that have been defined for the current configuration. When creating a new configuration, the list of blocks will be empty. A block is, essentially, an alias to a PV ([[ProcessVariables]]). -To create a new block, click on the ``Add Block`` button. IBEX displays a dialog to allow you to define the new block. By default, the new block is given the name ``NEW_BLOCK``. You can give the block any name you like, provided the name starts with a character and contains only the characters a-z and A-Z, the digits 0-9 and the underscore character. +To create a new block, click on the ``Add Block`` button. IBEX displays a dialog to allow you to define the new block. By default, the new block is given the name ``NEW_BLOCK``. You can give the block any name you like, provided the name of the block + + * contains only the characters a-z, A-Z, 0-9 and _ (underscore). + * starts with a character. + * is unique (on your instrument). Below the block name field is the PV address field. Click on the ``Select PV`` button next to the PV address field to choose a PV to be aliased by the block name. From 0bb5cc8ca64653fe90f0afd76f71bdf2169646f6 Mon Sep 17 00:00:00 2001 From: Gollum Date: Wed, 24 Aug 2016 16:07:04 +0100 Subject: [PATCH 0185/1813] Updated CreateandManageConfigurations (rest) --- CreateandManageConfigurations.rest | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/CreateandManageConfigurations.rest b/CreateandManageConfigurations.rest index 452ee35..07375c1 100644 --- a/CreateandManageConfigurations.rest +++ b/CreateandManageConfigurations.rest @@ -74,9 +74,9 @@ The Blocks tab lists all the blocks that have been defined for the current confi To create a new block, click on the ``Add Block`` button. IBEX displays a dialog to allow you to define the new block. By default, the new block is given the name ``NEW_BLOCK``. You can give the block any name you like, provided the name of the block - * contains only the characters a-z, A-Z, 0-9 and _ (underscore). - * starts with a character. - * is unique (on your instrument). +* contains only the characters a-z, A-Z, 0-9 and _ (underscore). +* starts with a character. +* is unique (on your instrument). Below the block name field is the PV address field. Click on the ``Select PV`` button next to the PV address field to choose a PV to be aliased by the block name. From 466b131e14fa9ec8aed9b13454bf8a33c915267b Mon Sep 17 00:00:00 2001 From: Gollum Date: Wed, 24 Aug 2016 16:13:15 +0100 Subject: [PATCH 0186/1813] Updated CreateandManageConfigurations (rest) --- CreateandManageConfigurations.rest | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CreateandManageConfigurations.rest b/CreateandManageConfigurations.rest index 07375c1..525bcc3 100644 --- a/CreateandManageConfigurations.rest +++ b/CreateandManageConfigurations.rest @@ -98,8 +98,11 @@ Interest Level ``All`` to see all PVs from your selected category of IOCs (again, this can generate a very long list of PVs). +You can also narrow down the list of PVs by typing the start of the PV name in the ``PV address`` field. For example, if you type ``IN:IRIS:EURO`` you will see only PVs whose address starts with those characters. This is useful if you already know which PV you are looking for. + Scroll down the list of PVs until you find the one you want. Click on it, to select it and then click on the OK button to return to the Add Block dialog. + On the Add Block dialog you can also choose to Visible/Local From 714f85f6a992774d20c8542b7c8171003e1fc467 Mon Sep 17 00:00:00 2001 From: Gollum Date: Wed, 24 Aug 2016 16:15:19 +0100 Subject: [PATCH 0187/1813] Updated CreateandManageConfigurations (rest) --- CreateandManageConfigurations.rest | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/CreateandManageConfigurations.rest b/CreateandManageConfigurations.rest index 525bcc3..b50d6d1 100644 --- a/CreateandManageConfigurations.rest +++ b/CreateandManageConfigurations.rest @@ -127,7 +127,13 @@ Use the Groups tab to arrange your blocks into convenient groups. You can defin By default, all blocks are assigned to an automatic group called "Other". By creating new groups, you have the opportunity to override the default assignment and assign blocks to groups of your choosing. -To create a new group, select the Groups tab and click on the ``Add`` button. IBEX displays a dialog to allow you to define a new group. By default, the new block is given the name ``NEW_GROUP``. You can give the block any name you like, provided the name starts with a character and contains only the characters a-z and A-Z, the digits 0-9 and the underscore character. When you click on the ``Add`` button, the dialog displays which blocks are available to be assigned to the new group (i.e. blocks in the "Other" group). +To create a new group, select the Groups tab and click on the ``Add`` button. IBEX displays a dialog to allow you to define a new group. By default, the new block is given the name ``NEW_GROUP``. You can give the block any name you like, provided the name of the group + +* contains only the characters a-z, A-Z, 0-9 and _ (underscore). +* starts with a character. +* is unique (on your instrument). + +When you click on the ``Add`` button, the dialog displays which blocks are available to be assigned to the new group (i.e. blocks in the "Other" group). Use the buttons with the Up and Down arrows to control the ordering of the groups and the order of the blocks within the groups. From 130288ee595afe43401ad15e30f142cb46cb0351 Mon Sep 17 00:00:00 2001 From: Gollum Date: Wed, 24 Aug 2016 16:16:53 +0100 Subject: [PATCH 0188/1813] Updated CreateandManageConfigurations (rest) --- CreateandManageConfigurations.rest | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CreateandManageConfigurations.rest b/CreateandManageConfigurations.rest index b50d6d1..3438df8 100644 --- a/CreateandManageConfigurations.rest +++ b/CreateandManageConfigurations.rest @@ -72,7 +72,7 @@ Blocks Tab ~~~~~~~~~~ The Blocks tab lists all the blocks that have been defined for the current configuration. When creating a new configuration, the list of blocks will be empty. A block is, essentially, an alias to a PV ([[ProcessVariables]]). -To create a new block, click on the ``Add Block`` button. IBEX displays a dialog to allow you to define the new block. By default, the new block is given the name ``NEW_BLOCK``. You can give the block any name you like, provided the name of the block +To create a new block, click on the ``Add Block`` button. IBEX displays a dialog to allow you to define the new block. By default, the new block is given the name ``NEW_BLOCK``. You can give the block any name you like, provided the name * contains only the characters a-z, A-Z, 0-9 and _ (underscore). * starts with a character. @@ -127,7 +127,7 @@ Use the Groups tab to arrange your blocks into convenient groups. You can defin By default, all blocks are assigned to an automatic group called "Other". By creating new groups, you have the opportunity to override the default assignment and assign blocks to groups of your choosing. -To create a new group, select the Groups tab and click on the ``Add`` button. IBEX displays a dialog to allow you to define a new group. By default, the new block is given the name ``NEW_GROUP``. You can give the block any name you like, provided the name of the group +To create a new group, select the Groups tab and click on the ``Add`` button. IBEX displays a dialog to allow you to define a new group. By default, the new group is given the name ``NEW_GROUP``. You can give the group any name you like, provided the name * contains only the characters a-z, A-Z, 0-9 and _ (underscore). * starts with a character. From 503606645889666751446c534f1ed412fac3b9c2 Mon Sep 17 00:00:00 2001 From: Gollum Date: Wed, 24 Aug 2016 16:41:24 +0100 Subject: [PATCH 0189/1813] Updated CreateandManageConfigurations (rest) --- CreateandManageConfigurations.rest | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/CreateandManageConfigurations.rest b/CreateandManageConfigurations.rest index 3438df8..b239054 100644 --- a/CreateandManageConfigurations.rest +++ b/CreateandManageConfigurations.rest @@ -53,6 +53,8 @@ Save as... * The name must also start with a character. * The name of the configuration must be unique (on your instrument). + The Save as... dialog also includes an option to save a configuration as a component. This option is described in more detail in the [[CreateandManageComponents]] page. + Cancel Click on the ``Cancel`` button to exit the Edit Configuration dialog without saving your changes. @@ -102,7 +104,6 @@ You can also narrow down the list of PVs by typing the start of the PV name in t Scroll down the list of PVs until you find the one you want. Click on it, to select it and then click on the OK button to return to the Add Block dialog. - On the Add Block dialog you can also choose to Visible/Local @@ -121,6 +122,8 @@ Logging Settings * You can choose to log the block value periodically (the default period is every 30 seconds). * Alternatively, you can set a "deadband" - the block will only be logged if its value falls outside +/- the limit defined by the deadband value. +**Note:** Blocks that have been inherited from component will be shown, but cannot be cannot be modified, in the Edit Configuration dialog (the blocks will be shown as "greyed-out"). To modify inherited blocks you need to use the Edit Component dialog (see [[CreateandManageComponents]]). + Groups Tab ~~~~~~~~~~ Use the Groups tab to arrange your blocks into convenient groups. You can define as many groups as you wish and you can place as many blocks in each group as you wish, although a block can only appear in one group. @@ -137,6 +140,10 @@ When you click on the ``Add`` button, the dialog displays which blocks are avail Use the buttons with the Up and Down arrows to control the ordering of the groups and the order of the blocks within the groups. +You can select multiple blocks to be added (or removed) from a group using the ``Shift`` and/or Ctrl`` keys on your keyboard. + +**Note:** Groups that have been inherited from component will be shown, but cannot be cannot be modified, in the Edit Configuration dialog (the blocks in an inherited group as shown as "greyed-out"). To modify inherited groups you need to use the Edit Component dialog (see [[CreateandManageComponents]]). + Components Tab ~~~~~~~~~~~~~~ @@ -217,6 +224,8 @@ Edit Current Configuration ... To edit the current configuration simply select ``Edit Current Configuration ...`` from the ``Configuration`` menu. This avoids the need to select the current configuration from a list of configurations. Otherwise, this option behaves in the same way as `Editing a Configuration`_. +**Note:** When you click on the ``Save`` button when editing the current configuration, the changes you make are applied immediately. There will be a short pause while IBEX re-loads the current configuration and refreshes the display. + Load a Configuration -------------------- From d8ca0cfddcc16668058846bb1affc05b88d1e407 Mon Sep 17 00:00:00 2001 From: Gollum Date: Wed, 24 Aug 2016 16:42:50 +0100 Subject: [PATCH 0190/1813] Updated CreateandManageComponents (rest) --- CreateandManageComponents.rest | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CreateandManageComponents.rest b/CreateandManageComponents.rest index 3f561e7..9b7ece8 100644 --- a/CreateandManageComponents.rest +++ b/CreateandManageComponents.rest @@ -18,7 +18,7 @@ Create a Component There are several ways to create a component: Save an existing Configuration as a Component - You can save an existing configuration as a component. When you click on the ``Save as...`` button on the Edit Configuration dialog (see [[CreateandManageConfigurations]]) there is a check-box labelled ``Save the configuration as a component``. By default, this check-box is unchecked. Click on the ``Save the configuration as a component`` and then click the ``OK`` button to save the configuration as a component. + You can save an existing configuration as a component. When you click on the ``Save as...`` button on the Edit Configuration dialog (see [[CreateandManageConfigurations]]) the resulting Save As... dialog contains a check-box labelled ``Save the configuration as a component``. By default, this check-box is unchecked. Click on the ``Save the configuration as a component`` and then click the ``OK`` button to save the configuration as a component. Once you have saved the configuration as a component, you can edit it as a component. From a42733bc545181fc529bcaecba9f74018fa439c2 Mon Sep 17 00:00:00 2001 From: Gollum Date: Wed, 24 Aug 2016 16:43:50 +0100 Subject: [PATCH 0191/1813] Updated CreateandManageComponents (rest) --- CreateandManageComponents.rest | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CreateandManageComponents.rest b/CreateandManageComponents.rest index 9b7ece8..9f87b5a 100644 --- a/CreateandManageComponents.rest +++ b/CreateandManageComponents.rest @@ -18,7 +18,7 @@ Create a Component There are several ways to create a component: Save an existing Configuration as a Component - You can save an existing configuration as a component. When you click on the ``Save as...`` button on the Edit Configuration dialog (see [[CreateandManageConfigurations]]) the resulting Save As... dialog contains a check-box labelled ``Save the configuration as a component``. By default, this check-box is unchecked. Click on the ``Save the configuration as a component`` and then click the ``OK`` button to save the configuration as a component. + You can save an existing configuration as a component. When you click on the ``Save as...`` button on the Edit Configuration dialog (see [[CreateandManageConfigurations]]) the resulting Save As... dialog contains a check-box labelled ``Save the configuration as a component``. By default, this check-box is unchecked. Click on the ``Save the configuration as a component`` check-box and then click the ``OK`` button to save the configuration as a component. Once you have saved the configuration as a component, you can edit it as a component. From 0cf763fde1bf0308587b4a5c57f548de875fb444 Mon Sep 17 00:00:00 2001 From: Gollum Date: Wed, 24 Aug 2016 16:51:11 +0100 Subject: [PATCH 0192/1813] Updated CreateandManageConfigurations (rest) --- CreateandManageConfigurations.rest | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CreateandManageConfigurations.rest b/CreateandManageConfigurations.rest index b239054..fee945b 100644 --- a/CreateandManageConfigurations.rest +++ b/CreateandManageConfigurations.rest @@ -165,7 +165,7 @@ To set an IOC macro: #. Macro Name: the name of the macro (e.g. ``PORT``, ``BAUD`` or ``IPADDRESS``) #. Value: the current value of the macro (e.g. ``COM3``, ``9600`` or ``192.83.42.106``) #. Description: a short description of the macro's purpose - #. Pattern: macro values need to be defined correctly. IBEX uses the pattern to validate the macro value. (For those familiar with such things, the pattern is expressed as a "regular expression"). + #. Pattern: macro values need to be defined correctly. IBEX uses the pattern to validate the macro value. (For those familiar with such things, the pattern is in the form of a "regular expression"). #. Choose a macro from the table. The ``Name:`` field (read-only) is populated with the macro name and the ``Value:`` field is populated with the current value of the macro. From 2739237a453db23b30bb07429b131e7da96ecd96 Mon Sep 17 00:00:00 2001 From: Gollum Date: Wed, 24 Aug 2016 16:59:52 +0100 Subject: [PATCH 0193/1813] Updated CreateandManageComponents (rest) --- CreateandManageComponents.rest | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/CreateandManageComponents.rest b/CreateandManageComponents.rest index 9f87b5a..a37b7e0 100644 --- a/CreateandManageComponents.rest +++ b/CreateandManageComponents.rest @@ -3,7 +3,9 @@ Create & Manage Components ========================== -Many instrument configurations feature a number of devices and settings in common. A component is a mini configuration (or sub-configuration) which provides a means of defining a selection of IOCs, Blocks, Groups, etc. that can be treated as a single object. Other configurations can then include the component which means that common IOCs, Block and other settings do not have to be repeatedly added to each configuration. It also means that changes need only be made to a single object - if a component is changed the changes will propagate to all the configurations that use that component. +Many instrument configurations feature a number of devices and settings in common. A component is a mini configuration (or sub-configuration) which provides a means of defining a selection of IOCs, Blocks, Groups, etc. that can be treated as a single object. Other configurations can then include the component which means that common IOCs, Block and other settings do not have to be repeatedly added to each configuration. It also means that changes need only be made to a single object - if a component is changed the changes will be inherited by all the configurations that use that component. + +One of the most common and useful ways to use a component, is to create a "baseline" component. A "baseline" component defines a configuration for all the devices permanently attached to an instrument. Any new configuration can then include the "baseline" component and inherit all the IOCs, blocks, groups, macros, etc. associated with the permanent devices. Contents -------- From 0810a234906b340104331d0e5d44b8665b7d61fb Mon Sep 17 00:00:00 2001 From: Gollum Date: Wed, 24 Aug 2016 17:01:10 +0100 Subject: [PATCH 0194/1813] Updated CreateandManageComponents (rest) --- CreateandManageComponents.rest | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CreateandManageComponents.rest b/CreateandManageComponents.rest index a37b7e0..e487e80 100644 --- a/CreateandManageComponents.rest +++ b/CreateandManageComponents.rest @@ -5,7 +5,7 @@ Create & Manage Components Many instrument configurations feature a number of devices and settings in common. A component is a mini configuration (or sub-configuration) which provides a means of defining a selection of IOCs, Blocks, Groups, etc. that can be treated as a single object. Other configurations can then include the component which means that common IOCs, Block and other settings do not have to be repeatedly added to each configuration. It also means that changes need only be made to a single object - if a component is changed the changes will be inherited by all the configurations that use that component. -One of the most common and useful ways to use a component, is to create a "baseline" component. A "baseline" component defines a configuration for all the devices permanently attached to an instrument. Any new configuration can then include the "baseline" component and inherit all the IOCs, blocks, groups, macros, etc. associated with the permanent devices. +One of the most common and useful ways to use a component, is to create a "base" component. A "base" component defines a configuration for all the devices permanently attached to an instrument. Any new configuration can then include the "base" component and inherit all the IOCs, blocks, groups, macros, etc. associated with the permanent devices. Contents -------- From ec7647e9a3364d0ba79f3814d68e8d2bdb5ebc46 Mon Sep 17 00:00:00 2001 From: Gollum Date: Wed, 24 Aug 2016 17:03:42 +0100 Subject: [PATCH 0195/1813] Updated CreateandManageComponents (rest) --- CreateandManageComponents.rest | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CreateandManageComponents.rest b/CreateandManageComponents.rest index e487e80..aa8457f 100644 --- a/CreateandManageComponents.rest +++ b/CreateandManageComponents.rest @@ -27,7 +27,7 @@ Save an existing Configuration as a Component Create a New Component You can create a new component directly from the ``Configuration`` menu. Simply select ``Configurations > New`` from the ``Configuration`` menu. IBEX will then display the New Configuration dialog. - The process of defining is the same as the process of defining a configuration - the New Component dialog is identical to the New Configuration dialog. Refer to [[CreateandManageConfigurations]] for a full description of how use the various tabs on the New Component dialog. + The process of defining a component is essentially the same as the process of defining a configuration - the New Component dialog is identical to the New Configuration dialog. Refer to [[CreateandManageConfigurations]] for a full description of how use the various tabs on the New Component dialog. Edit a Component ---------------- From 4fcaafb8479ddfa34b7d5a538f660b3f8565b2cb Mon Sep 17 00:00:00 2001 From: Gollum Date: Thu, 25 Aug 2016 12:03:32 +0100 Subject: [PATCH 0196/1813] Updated InstallingIBEX (rest) --- InstallingIBEX.rest | 26 ++++++++++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git a/InstallingIBEX.rest b/InstallingIBEX.rest index 6189a2d..57fa44e 100644 --- a/InstallingIBEX.rest +++ b/InstallingIBEX.rest @@ -24,5 +24,27 @@ In order to run IBEX client, your PC must meet the following pre-requisites Installation ~~~~~~~~~~~~ -#. Open a Windows Explorer window and navigate to XXXX -#. Double-click on XXXX +1. Open a command window on your PC and use the following commands to create the + following folders on your ``C:`` drive: + +:: + + mkdir C:\Instrument\Apps\Client + mkdir C:\Instrument\Apps\Python + cd C:\Instrument + +2. In the command window type the following (if your command prompt doesn't support UNC paths, + use ``pushd`` instead of ``cd``): + +:: + + cd \\isis\inst$\Kits$\CompGroup\ICP\Releases + +3. Inside this folder you will see folders with names of the form ``BUILDmmm``, where ``mmm`` is a + three-digit number and folders with names of the form ``BUILD-nnnn``, where ``nnnn`` is a four-digit + number. Change directory to the folder ``BUILDmmm`` with the highest value of ``mmm``. + +4. Run the command ``install_client.bat``. This will copy the contents of the above directory + to ``C:\Instrument\Apps\Client``. It will also install genie_python. + +5. You might find it convenient to create a desktop shortcut to use to launch the IBEX client. From 2e47ffc2bf01371704d5e653cb3c481bc8b4b23b Mon Sep 17 00:00:00 2001 From: Gollum Date: Thu, 25 Aug 2016 12:06:20 +0100 Subject: [PATCH 0197/1813] Updated InstallingIBEX (rest) --- InstallingIBEX.rest | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/InstallingIBEX.rest b/InstallingIBEX.rest index 57fa44e..9d485a1 100644 --- a/InstallingIBEX.rest +++ b/InstallingIBEX.rest @@ -18,7 +18,7 @@ Pre-requisites for running IBEX Client In order to run IBEX client, your PC must meet the following pre-requisites -#. Your PC must be running Windows 7 (Professional or Enterprise), Service Pack 1 or Windows 10 (Professional or Enterprise), Build 10586. +#. Your PC must be running Windows 7 (Professional or Enterprise), Service Pack 1 (or higher), or Windows 10 (Professional or Enterprise), Build 10586 (or higher). #. Your PC must also be running an up-to-date version of Java version 8, update 101 (or later). If you need to install an up-to-date version of Java, you can obtain a copy from the Java web-site (http://www.java.com/en/). Please be sure to choose the 64-bit version of Java. Installation @@ -47,4 +47,4 @@ Installation 4. Run the command ``install_client.bat``. This will copy the contents of the above directory to ``C:\Instrument\Apps\Client``. It will also install genie_python. -5. You might find it convenient to create a desktop shortcut to use to launch the IBEX client. +5. You might find it convenient to create a desktop shortcut to use to launch the IBEX client. The path to the IBEX Client executable is ``C:\Instrument\Apps\Client\ibex-client.exe``. From 6c4f18cd4c4dcd095bb91995845a6fc763c09187 Mon Sep 17 00:00:00 2001 From: Gollum Date: Thu, 25 Aug 2016 12:11:10 +0100 Subject: [PATCH 0198/1813] Updated InstallingIBEX (rest) From 39c452967022a82fa359ce5aac17625a2974405e Mon Sep 17 00:00:00 2001 From: kjwoodsISIS Date: Fri, 26 Aug 2016 14:05:45 +0100 Subject: [PATCH 0199/1813] Updated CreateandManageConfigurations (rest) --- CreateandManageConfigurations.rest | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CreateandManageConfigurations.rest b/CreateandManageConfigurations.rest index fee945b..7bcb8a4 100644 --- a/CreateandManageConfigurations.rest +++ b/CreateandManageConfigurations.rest @@ -224,6 +224,8 @@ Edit Current Configuration ... To edit the current configuration simply select ``Edit Current Configuration ...`` from the ``Configuration`` menu. This avoids the need to select the current configuration from a list of configurations. Otherwise, this option behaves in the same way as `Editing a Configuration`_. +It is always a good idea to check the name of the current configuration before you start editing it - just in case you edit the wrong configuration. The name of the current configuration is displayed in the [[StatusBar]]. + **Note:** When you click on the ``Save`` button when editing the current configuration, the changes you make are applied immediately. There will be a short pause while IBEX re-loads the current configuration and refreshes the display. Load a Configuration From c930e74aa9b88a524d2d93ba0df99071b18b8994 Mon Sep 17 00:00:00 2001 From: kjwoodsISIS Date: Fri, 26 Aug 2016 14:53:30 +0100 Subject: [PATCH 0200/1813] Updated CreateandManageConfigurations (rest) --- CreateandManageConfigurations.rest | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CreateandManageConfigurations.rest b/CreateandManageConfigurations.rest index 7bcb8a4..c8d5907 100644 --- a/CreateandManageConfigurations.rest +++ b/CreateandManageConfigurations.rest @@ -224,7 +224,7 @@ Edit Current Configuration ... To edit the current configuration simply select ``Edit Current Configuration ...`` from the ``Configuration`` menu. This avoids the need to select the current configuration from a list of configurations. Otherwise, this option behaves in the same way as `Editing a Configuration`_. -It is always a good idea to check the name of the current configuration before you start editing it - just in case you edit the wrong configuration. The name of the current configuration is displayed in the [[StatusBar]]. +It is always a good idea to check the name of the current configuration before you start editing it - to be sure that you are about to edit the configuration you intended to edit. The name of the current configuration is displayed in the [[StatusBar]]. **Note:** When you click on the ``Save`` button when editing the current configuration, the changes you make are applied immediately. There will be a short pause while IBEX re-loads the current configuration and refreshes the display. From 63b8d0e1bf5e1c2c8d6011834a27476c81f5497b Mon Sep 17 00:00:00 2001 From: kjwoodsISIS Date: Fri, 26 Aug 2016 14:55:38 +0100 Subject: [PATCH 0201/1813] Updated Glossary (rest) --- Glossary.rest | 70 +++++++++++++++++++++++++-------------------------- 1 file changed, 34 insertions(+), 36 deletions(-) diff --git a/Glossary.rest b/Glossary.rest index f98b521..14a5942 100644 --- a/Glossary.rest +++ b/Glossary.rest @@ -3,39 +3,37 @@ Glossary ======== - EPICS - EPICS is a software framework for controlling devices and is - the underlying framework for the IBEX server. - See http://www.aps.anl.gov/epics/ - - PV (Process Variable) - This is a named piece of information in the EPICS system, such as - a temperature setpoint or readback. A PV will have a name - of the form ``IN:LARMOR:MOT:MTR0101`` for a motor - - Block - This is a named piece of information created by the user as part - of an instrument configuration. A block is essentially an alias to - a process variable. A block can have logging enabled and - will then appear in the final data file. - - Client Server - IBEX, like :term:`EPICS`, is a client-server system. In such - systems background processes (servers) provide information for - clients (such as a GUI or command line). Multiple clients - can communicate with a single server process over the network. - - Blockserver - This is a :term:`Server` element of the IBEX control system that - is responsible for managing a :term:`Block` and also a - :term:`Configuration` - - Configuration - This is - - IOC - An IOC (Input Output Controller) is an :term:`EPICS` process that - provides some service, often managing a device. For example, access - to a Eurotherm temperature controller is controlled via an IOC - process that provides :term:`Process Variable` for the relevant - control elements +EPICS + EPICS is a software framework for controlling devices and is + the underlying framework for the IBEX server. + See http://www.aps.anl.gov/epics/ + +PV (Process Variable) + This is a named piece of information in the EPICS system, such as + a temperature setpoint or readback. A PV will have a name + of the form ``IN:LARMOR:MOT:MTR0101`` for a motor + +Block + This is a named piece of information created by the user as part + of an instrument configuration. A block is essentially an alias to + a process variable. A block can have logging enabled and + will then appear in the final data file. + +Client Server + IBEX, like :term:`EPICS`, is a client-server system. In such + systems background processes (servers) provide information for + clients (such as a GUI or command line). Multiple clients + can communicate with a single server process over the network. + +Blockserver + This is a :term:`Server` element of the IBEX control system that is responsible for managing + a :term:`Block` and also a :term:`Configuration` + +Configuration + A configuration defines the blocks, IOCs, macros and other items needed to control the instrument. + More specifically, a configuration is an information structure which defines and describes an instrument to IBEX. + +IOC + An IOC (Input/Output Controller) is an :term:`EPICS` process that provides some service, often managing a device. + For example, access to a Eurotherm temperature controller is controlled via an IOC process that provides + :term:`Process Variable` for the relevant control elements From 5f0ef9754e78c4eb97d1df323bfae73237d9f055 Mon Sep 17 00:00:00 2001 From: kjwoodsISIS Date: Fri, 26 Aug 2016 15:45:07 +0100 Subject: [PATCH 0202/1813] Updated Glossary (rest) --- Glossary.rest | 41 ++++++++++++++++++++++------------------- 1 file changed, 22 insertions(+), 19 deletions(-) diff --git a/Glossary.rest b/Glossary.rest index 14a5942..1958702 100644 --- a/Glossary.rest +++ b/Glossary.rest @@ -3,37 +3,40 @@ Glossary ======== -EPICS - EPICS is a software framework for controlling devices and is - the underlying framework for the IBEX server. - See http://www.aps.anl.gov/epics/ - -PV (Process Variable) - This is a named piece of information in the EPICS system, such as - a temperature setpoint or readback. A PV will have a name - of the form ``IN:LARMOR:MOT:MTR0101`` for a motor - Block - This is a named piece of information created by the user as part - of an instrument configuration. A block is essentially an alias to - a process variable. A block can have logging enabled and + This is a named piece of information created by the user as part of an instrument configuration. + A block is essentially an alias to a process variable. A block can have logging enabled and will then appear in the final data file. -Client Server - IBEX, like :term:`EPICS`, is a client-server system. In such - systems background processes (servers) provide information for - clients (such as a GUI or command line). Multiple clients - can communicate with a single server process over the network. - Blockserver This is a :term:`Server` element of the IBEX control system that is responsible for managing a :term:`Block` and also a :term:`Configuration` +Client Server + IBEX, like :term:`EPICS`, is a client-server system. In such systems background processes (servers) + provide information for clients (such as a GUI or command line). Multiple clients can + communicate with a single server process over the network. + +Component + A component in IBEX is, essentially, a mini-configuration. It can be used to create a configuration for a sub-set + of devices attached to an instrument. When the component is included in a configuration, the configuration "inherits" + all the definitions from the component. + Configuration A configuration defines the blocks, IOCs, macros and other items needed to control the instrument. More specifically, a configuration is an information structure which defines and describes an instrument to IBEX. +EPICS + `EPICS `_ is an open-source software framework for creating distruibuted + control systems (i.e. for controlling devices which may be distributed across a network). EPICS is + the underlying framework used to create IBEX. + IOC An IOC (Input/Output Controller) is an :term:`EPICS` process that provides some service, often managing a device. For example, access to a Eurotherm temperature controller is controlled via an IOC process that provides :term:`Process Variable` for the relevant control elements + +PV (Process Variable) + This is a named piece of information in the EPICS system, such as a temperature setpoint or readback. + A PV has structured name that uniquely identifies it on the network. An example of such a name, in + this case for a motor, is: ``IN:LARMOR:MOT:MTR0101`` From d84d3ab4e01bb1f4868beace9576b3f0ddb625e8 Mon Sep 17 00:00:00 2001 From: kjwoodsISIS Date: Fri, 26 Aug 2016 15:54:30 +0100 Subject: [PATCH 0203/1813] Updated CreateandManageComponents (rest) --- CreateandManageComponents.rest | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CreateandManageComponents.rest b/CreateandManageComponents.rest index aa8457f..c8091f9 100644 --- a/CreateandManageComponents.rest +++ b/CreateandManageComponents.rest @@ -7,6 +7,8 @@ Many instrument configurations feature a number of devices and settings in commo One of the most common and useful ways to use a component, is to create a "base" component. A "base" component defines a configuration for all the devices permanently attached to an instrument. Any new configuration can then include the "base" component and inherit all the IOCs, blocks, groups, macros, etc. associated with the permanent devices. +Components are also frequently used to describe equipment (either a single device or a group of devices) that move between different instruments (e.g. a cryostat and associated temperature controllers). By defining a component to describe the equipment on the first instrument, the component can be copied across to the second instrument at the same time as the equipment is moved. This saves having to re-define all the relevant blocks, groups, etc. in a new configuration on the second instrument. + Contents -------- From 27536a2eb518032683938ff1b50ee1a29375dc6d Mon Sep 17 00:00:00 2001 From: kjwoodsISIS Date: Fri, 26 Aug 2016 16:03:35 +0100 Subject: [PATCH 0204/1813] Updated Glossary (rest) --- Glossary.rest | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/Glossary.rest b/Glossary.rest index 1958702..dd2089d 100644 --- a/Glossary.rest +++ b/Glossary.rest @@ -26,6 +26,14 @@ Configuration A configuration defines the blocks, IOCs, macros and other items needed to control the instrument. More specifically, a configuration is an information structure which defines and describes an instrument to IBEX. +DAE (Data Acquisition Electronics) + The DAE is a set of electronic cards housed in a VXI/VME crate located in the instrument cabin/pod and + maintained by ISIS electronics group. The DAE contains two types of card: + +#. Detector cards (many): these cards record neutron counts +#. Environment/period card (only one): this card distributes timing signals etc. and maintains global + counters (e.g. number of ISIS pulses, proton charge delivered (PPP)) + EPICS `EPICS `_ is an open-source software framework for creating distruibuted control systems (i.e. for controlling devices which may be distributed across a network). EPICS is From 4a0fb1cac57eec124f5168bb01171bc4270ff23c Mon Sep 17 00:00:00 2001 From: kjwoodsISIS Date: Fri, 26 Aug 2016 16:06:19 +0100 Subject: [PATCH 0205/1813] Updated Glossary (rest) --- Glossary.rest | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Glossary.rest b/Glossary.rest index dd2089d..09dea46 100644 --- a/Glossary.rest +++ b/Glossary.rest @@ -39,6 +39,11 @@ EPICS control systems (i.e. for controlling devices which may be distributed across a network). EPICS is the underlying framework used to create IBEX. +ICP (Instrument Control Program) + The ICP (sometimes called the ISIS ICP) is a :term:`Server` element of the IBEX control system that controls + communication with the DAE. the ICP is also responsible for writing the RAW experiement data file at the + end of a run or experiment. + IOC An IOC (Input/Output Controller) is an :term:`EPICS` process that provides some service, often managing a device. For example, access to a Eurotherm temperature controller is controlled via an IOC process that provides From 8dcace72ab23a4e38f26bd7ab5d7fdc68ef789ec Mon Sep 17 00:00:00 2001 From: kjwoodsISIS Date: Fri, 26 Aug 2016 16:07:51 +0100 Subject: [PATCH 0206/1813] Updated Glossary (rest) --- Glossary.rest | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Glossary.rest b/Glossary.rest index 09dea46..97281c1 100644 --- a/Glossary.rest +++ b/Glossary.rest @@ -41,7 +41,7 @@ EPICS ICP (Instrument Control Program) The ICP (sometimes called the ISIS ICP) is a :term:`Server` element of the IBEX control system that controls - communication with the DAE. the ICP is also responsible for writing the RAW experiement data file at the + communication with the DAE. The ICP is also responsible for writing the RAW experiement data file at the end of a run or experiment. IOC From 111e686d6d532ed11e06191f2d1ffdb98009be04 Mon Sep 17 00:00:00 2001 From: kjwoodsISIS Date: Fri, 26 Aug 2016 16:44:29 +0100 Subject: [PATCH 0207/1813] Updated KeyConceptsinIBEX (rest) --- KeyConceptsinIBEX.rest | 59 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) diff --git a/KeyConceptsinIBEX.rest b/KeyConceptsinIBEX.rest index 1b352cd..c43ce90 100644 --- a/KeyConceptsinIBEX.rest +++ b/KeyConceptsinIBEX.rest @@ -19,6 +19,7 @@ The IBEX Client is a single application, which functions as a GUI for IBEX. genie_python ~~~~~~~~~~~~ + genie_python can also be thought of as a client of IBEX server. It operates as a scripting client, requesting information from the IBEX server and sending requests to change the state of devices attached to the instrument control PC. IBEX Server @@ -62,5 +63,63 @@ Blocks & Process Variables [[Blocks]] +DAE (Data Acquisition Electronics) +---------------------------------- + +The DAE is a collection of electronic cards housed in a VXI/VME crate, which is located in the instrument cabin or pod. The DAE is maintained by the ISIS electronics group. There are two types of card in the DAE: + +Detector Cards + The DAE contains many detector cards, which are connected to the instrument detectors, and record neutron counts. + +Environment/Period Card + The DAE contains a single environment/period card, which distributes timing signals etc. and maintains global + counters (e.g. number of ISIS pulses, proton charge delivered (PPP)) + +The DAE is usually connected to the instrument control PC via a USB or MXI-2 cable. + +What does the DAE do? +~~~~~~~~~~~~~~~~~~~~~ +The DAE: + +* Records the arrival time of neutrons at detectors relative to the ISIS pulse +* Histograms the neutron counts based on their time of arrival into “bins” chosen by scientists +* If desired, groups (gangs) detectors together +* If necessary, rejects (vetoes) data based on pre-defined criteria +* Saves all of this in “detector card memory” to be later read by the PC + +GOOD Frames and RAW Frames +~~~~~~~~~~~~~~~~~~~~~~~~~~ +The DAE will only record data if it receives a “start pulse” signal. + +RAW Frame + A RAW Frame means the DAE received a “start pulse” signal, but data may or may not have been saved to the detector card. + +GOOD Frame + A GOOD Frame is a RAW frame where data was histogrammed and written to the detector card. + +RAW frames that do not become GOOD frames are called VETOED frames + +Vetoes +~~~~~~ +A veto is a hardware signal that can, on a frame by frame basis, tell the DAE not to collect data. + +* The DAE supports four user defined external vetoes (labelled VT0 -> VT3 on crate), which can be connected to choppers, moderator, etc. +* Internal (FIFO) veto – triggered if too many counts in a single frame on any card +* SMP veto – triggered if chopper timing signal out of phase with ISIS +* Fermi chopper veto: checks for the arrival of a chopper signal within a given window on inelastic chopper spectrometers + + * Used on MERLIN, MAPS, MARI. On LET handled by chopper crate and so just an external veto. + +* ISIS 50Hz veto: vetoes frames when accelerator not running at 50Hz (e.g. during beam run up or diagnostics) + + * Used on IRIS/OSIRIS, but they also use ISISFREQ SECI block + +DAE Timing Sources +~~~~~~~~~~~~~~~~~~ +The DAE can use one of three timing sources: + +* ISIS: uses the ISIS accelerator pulse from the cable plugged into the TOF socket +* SMP: uses the “secondary master pulse”, usually a chopper plugged into the SMP socket +* First TS1: uses the first ISIS pulse after the missing TS2 pulse (so 10Hz on TS1). From 280f1d5446d8650d5a1a74aac8f1d74c7137d0d7 Mon Sep 17 00:00:00 2001 From: kjwoodsISIS Date: Fri, 26 Aug 2016 16:56:59 +0100 Subject: [PATCH 0208/1813] Updated KeyConceptsinIBEX (rest) --- KeyConceptsinIBEX.rest | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/KeyConceptsinIBEX.rest b/KeyConceptsinIBEX.rest index c43ce90..1c3f189 100644 --- a/KeyConceptsinIBEX.rest +++ b/KeyConceptsinIBEX.rest @@ -121,5 +121,22 @@ The DAE can use one of three timing sources: * ISIS: uses the ISIS accelerator pulse from the cable plugged into the TOF socket * SMP: uses the “secondary master pulse”, usually a chopper plugged into the SMP socket * First TS1: uses the first ISIS pulse after the missing TS2 pulse (so 10Hz on TS1). +* Internal Test Clock: 50Hz timing signal provided internally by DAE + + * Used for quiet counts out of cycle + * Need to turn off SMP veto as test clock is not synchronised to anything + +TS1, 50Hz running +^^^^^^^^^^^^^^^^^ +* Can choose either ISIS or SMP – however they differ in what happens if beam goes off +* ISIS: beam off -> no signal and so no RAW frame +* SMP: if chopper continues to run -> RAW frame, which will be vetoed by the SMP veto as + there is no corresponding ISIS TOF pulse. + +TS1, 25Hz running +^^^^^^^^^^^^^^^^^ +* Must choose SMP (chopper) timing as this signal is the one at 25Hz +* If beam off, chopper continues to run -> RAW frame, but vetoed by SMP veto as no corresponding ISIS pulse +* Dashboard beam current calculated from DAE pulses, so 25Hz -> half ISIS beam current From f07fd0af73a24bb1249288cda62786db4e56d6b0 Mon Sep 17 00:00:00 2001 From: kjwoodsISIS Date: Tue, 30 Aug 2016 09:55:18 +0100 Subject: [PATCH 0209/1813] Updated ManagetheDAE (rest) --- ManagetheDAE.rest | 2 ++ 1 file changed, 2 insertions(+) diff --git a/ManagetheDAE.rest b/ManagetheDAE.rest index f23f4bb..225afea 100644 --- a/ManagetheDAE.rest +++ b/ManagetheDAE.rest @@ -36,6 +36,8 @@ Run Summary Fields * ``ISIS Cycle``: (read-only) records the current ISIS cycle * ``Title``: you can provide a short description of the current run in the ``Title`` field. Click on the ``Set`` button to commit the change (i.e. send it to the ICP, so that it gets included in the data file). +Return to `Contents`_. + Message Log ~~~~~~~~~~~ The message log area lets you view any messages issued by the ICP. The message log area is the same as the main Log Messages view, filtered to show only messages from the ICP. From 2f14bc861930ed77d38f780d5faaf61aba35be33 Mon Sep 17 00:00:00 2001 From: kjwoodsISIS Date: Tue, 30 Aug 2016 09:57:39 +0100 Subject: [PATCH 0210/1813] Updated ManagetheDAE (rest) --- ManagetheDAE.rest | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/ManagetheDAE.rest b/ManagetheDAE.rest index 225afea..a666c7c 100644 --- a/ManagetheDAE.rest +++ b/ManagetheDAE.rest @@ -65,6 +65,8 @@ Cancel Abort Save Run Click on the ``SAVE RUN`` button to save the current run. +Return to `Contents`_. + Experiment Setup ---------------- @@ -72,24 +74,36 @@ Experiment Setup Time Channels ~~~~~~~~~~~~~ +Return to `Contents`_. + Data Acquisition ~~~~~~~~~~~~~~~~ +Return to `Contents`_. + Periods ~~~~~~~ +Return to `Contents`_. + Run Information --------------- The Run Information Tab provides a more compete summary of the DAE setup than the Run Summary tab. All the fields on this tab are read-only. +Return to `Contents`_. + Spectra Plots ------------- +Return to `Contents`_. + Diagnostics ----------- +Return to `Contents`_. + Vetos ----- -Some stuff here ... +Return to `Contents`_. From d64edf303021678d219c58ebd64eebaea5da31d2 Mon Sep 17 00:00:00 2001 From: kjwoodsISIS Date: Tue, 30 Aug 2016 10:12:12 +0100 Subject: [PATCH 0211/1813] Updated ManagetheDAE (rest) --- ManagetheDAE.rest | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/ManagetheDAE.rest b/ManagetheDAE.rest index a666c7c..6933812 100644 --- a/ManagetheDAE.rest +++ b/ManagetheDAE.rest @@ -3,7 +3,7 @@ Manage the DAE ============== -The Data Acquisition Electronics (DAE) is the hardware where the neutron or muon data is collected. The DAE is controlled by the ICP, which informs the DAE when to start and stop collecting data from the instrument detectors. The ICP also receives sample environment information and combines it with the detector data and is responsible for transferring the final combined dataset to a data file. +The Data Acquisition Electronics (DAE) is the hardware where the neutron or muon data is collected. The DAE is controlled by the ICP (see [[KeyConceptsinIBEX]]), which informs the DAE when to start and stop collecting data from the instrument detectors. The ICP also receives sample environment information and combines it with the detector data and is responsible for transferring the final combined dataset to a data file. The DAE view communicates with the ICP to control the DAE. @@ -71,6 +71,8 @@ Return to `Contents`_. Experiment Setup ---------------- +The Experiment Setup comprises three sub-tabs. Each of these 3 sub-tabs will have been configured by an ISIS Instrument Scientist. Please do not modify the contents of these 3 tabs without consulting with the instrument scientist. + Time Channels ~~~~~~~~~~~~~ @@ -96,6 +98,9 @@ Return to `Contents`_. Spectra Plots ------------- +The Spectra Plots Tab displays up to 4 spectra plots. You can choose which spectra are plotted bu using the ``Spectrum:`` and ``Period:`` fields for each plot. Click on the ``Set Plot`` button (positioned at the top right of each plot) to update the plot after changing the ``Spectrum:`` or ``Period:`` fields. + + Return to `Contents`_. Diagnostics From 3c17df7d43337658c9a434931074a6a1d472dc94 Mon Sep 17 00:00:00 2001 From: kjwoodsISIS Date: Tue, 30 Aug 2016 10:24:50 +0100 Subject: [PATCH 0212/1813] Updated ManagetheDAE (rest) --- ManagetheDAE.rest | 2 ++ 1 file changed, 2 insertions(+) diff --git a/ManagetheDAE.rest b/ManagetheDAE.rest index 6933812..0e78129 100644 --- a/ManagetheDAE.rest +++ b/ManagetheDAE.rest @@ -111,4 +111,6 @@ Return to `Contents`_. Vetos ----- +The Vetos tab shows a summary of the vetoes that are in force for the current run. This information is read-only. Vetoes can only be changed prior to the start of a run, via the `Data Acquisition`_ sub-tab on the `Experiment Setup`_ tab. + Return to `Contents`_. From b96801c022f57dadd6b3c52deba64cff83458a47 Mon Sep 17 00:00:00 2001 From: kjwoodsISIS Date: Tue, 30 Aug 2016 10:36:58 +0100 Subject: [PATCH 0213/1813] Updated KeyConceptsinIBEX (rest) --- KeyConceptsinIBEX.rest | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/KeyConceptsinIBEX.rest b/KeyConceptsinIBEX.rest index 1c3f189..61cbeb7 100644 --- a/KeyConceptsinIBEX.rest +++ b/KeyConceptsinIBEX.rest @@ -5,6 +5,18 @@ Key Concepts in IBEX It is worth taking a few moments to appreciate some of the key concepts behind IBEX. +Contents +-------- + +#. `Clients & Servers`_ + + #. `IBEX Client`_ + #. `genie_python`_ + #. `IBEX Server`_ + +#. `Blocks & Process Variables`_ +#. `DAE (Data Acquisition Electronics)`_ + Clients & Servers ----------------- @@ -33,7 +45,7 @@ BlockServer serves configuration information. ICP - The ICP (Instrument Control Program) is the process which controls the DAE (Data Acquisition Electronics). The ICP tells the DAE when to start and stop collecting data from the instrument detectors. The ICP is also responsible for combining the detector data with logged sample environment data and for transferring the final dataset to a data file. + The ICP (Instrument Control Program) is the process which controls the `DAE (Data Acquisition Electronics)`_. The ICP tells the DAE when to start and stop collecting data from the instrument detectors. The ICP is also responsible for combining the detector data with logged sample environment data and for transferring the final dataset to a data file. Archiver The Archiver, as its name suggests, archives the values of process variables to a database. From fbb4935a6e08258dabc689b165ea2ed8df1b9a1b Mon Sep 17 00:00:00 2001 From: kjwoodsISIS Date: Tue, 30 Aug 2016 10:38:39 +0100 Subject: [PATCH 0214/1813] Updated KeyConceptsinIBEX (rest) --- KeyConceptsinIBEX.rest | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/KeyConceptsinIBEX.rest b/KeyConceptsinIBEX.rest index 61cbeb7..924869b 100644 --- a/KeyConceptsinIBEX.rest +++ b/KeyConceptsinIBEX.rest @@ -24,16 +24,22 @@ A client-server system is one that employs a distributed application architectur The design of IBEX follows this model. IBEX consists of a server component, which runs on the instrument control PC, and a client component, which runs on a separate PC (but can also run on the instrument control PC, if necessary). IBEX has been created using the `EPICS `_ framework for creating distributed control systems. +Return to `Contents`_. + IBEX Client ~~~~~~~~~~~ The IBEX Client is a single application, which functions as a GUI for IBEX. +Return to `Contents`_. + genie_python ~~~~~~~~~~~~ genie_python can also be thought of as a client of IBEX server. It operates as a scripting client, requesting information from the IBEX server and sending requests to change the state of devices attached to the instrument control PC. +Return to `Contents`_. + IBEX Server ~~~~~~~~~~~ @@ -67,6 +73,7 @@ MySQL MySQL is an open-source relational database system, which provides database services to the Archiver and the Message Server. +Return to `Contents`_. Blocks & Process Variables -------------------------- @@ -75,6 +82,8 @@ Blocks & Process Variables [[Blocks]] +Return to `Contents`_. + DAE (Data Acquisition Electronics) ---------------------------------- @@ -151,4 +160,5 @@ TS1, 25Hz running * If beam off, chopper continues to run -> RAW frame, but vetoed by SMP veto as no corresponding ISIS pulse * Dashboard beam current calculated from DAE pulses, so 25Hz -> half ISIS beam current +Return to `Contents`_. From 7e0e59a85940998b8f6dfd8d4485c78c52ad179a Mon Sep 17 00:00:00 2001 From: kjwoodsISIS Date: Tue, 30 Aug 2016 10:41:47 +0100 Subject: [PATCH 0215/1813] Updated CreateandManageConfigurations (rest) --- CreateandManageConfigurations.rest | 28 +++++++++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/CreateandManageConfigurations.rest b/CreateandManageConfigurations.rest index c8d5907..c3325a2 100644 --- a/CreateandManageConfigurations.rest +++ b/CreateandManageConfigurations.rest @@ -58,6 +58,8 @@ Save as... Cancel Click on the ``Cancel`` button to exit the Edit Configuration dialog without saving your changes. +Return to `Contents`_. + We'll describe each of the Edit Configuration dialog tabs in turn. IOCs Tab @@ -70,6 +72,8 @@ To include an IOC in your configuration, scroll down the list until you find the **Note:** The list of IOCs in the IOC tab also includes a column headed Sim. level. This column is used to indicate whether the IOC should run in simulation mode. By default, the Sim. level file is set to NONE, meaning that the IOC will not run in simulation mode. Under normal circumstances, you should not change the default setting. +Return to `Contents`_. + Blocks Tab ~~~~~~~~~~ The Blocks tab lists all the blocks that have been defined for the current configuration. When creating a new configuration, the list of blocks will be empty. A block is, essentially, an alias to a PV ([[ProcessVariables]]). @@ -124,6 +128,8 @@ Logging Settings **Note:** Blocks that have been inherited from component will be shown, but cannot be cannot be modified, in the Edit Configuration dialog (the blocks will be shown as "greyed-out"). To modify inherited blocks you need to use the Edit Component dialog (see [[CreateandManageComponents]]). +Return to `Contents`_. + Groups Tab ~~~~~~~~~~ Use the Groups tab to arrange your blocks into convenient groups. You can define as many groups as you wish and you can place as many blocks in each group as you wish, although a block can only appear in one group. @@ -144,6 +150,8 @@ You can select multiple blocks to be added (or removed) from a group using the ` **Note:** Groups that have been inherited from component will be shown, but cannot be cannot be modified, in the Edit Configuration dialog (the blocks in an inherited group as shown as "greyed-out"). To modify inherited groups you need to use the Edit Component dialog (see [[CreateandManageComponents]]). +Return to `Contents`_. + Components Tab ~~~~~~~~~~~~~~ @@ -153,6 +161,8 @@ The Components tab displays two lists of components. The left hand list shows w Use the arrow buttons to move components between the two lists. +Return to `Contents`_. + IOC Macros ~~~~~~~~~~ @@ -175,16 +185,22 @@ To set an IOC macro: If you are not sure about how to correctly configure macro values for a device, please consult with the Experimental Controls team. +Return to `Contents`_. + IOC PV Values ~~~~~~~~~~~~~ **TO DO** +Return to `Contents`_. + IOC PV Sets ~~~~~~~~~~~ **TO DO** +Return to `Contents`_. + Summary ~~~~~~~ @@ -201,6 +217,8 @@ Description Synoptic IBEX allows you to create different synoptic views for use with different configurations. Therefore, it is convenient to associate a synoptic view with a configuration - it saves you from having to remember the association. Your chosen synoptic will be used as the default synoptic whenever you use this configuration. +Return to `Contents`_. + Editing a Configuration ----------------------- @@ -219,6 +237,8 @@ Save as... Cancel Click on the ``Cancel`` button to exit the Edit Configuration dialog without saving your changes. +Return to `Contents`_. + Edit Current Configuration ... ------------------------------ @@ -228,6 +248,8 @@ It is always a good idea to check the name of the current configuration before y **Note:** When you click on the ``Save`` button when editing the current configuration, the changes you make are applied immediately. There will be a short pause while IBEX re-loads the current configuration and refreshes the display. +Return to `Contents`_. + Load a Configuration -------------------- @@ -238,6 +260,8 @@ To load a configuration: #. Select a configuration from the list and press the ``OK`` button #. IBEX discards the currently loaded configuration and loads the selected configuration. The discarded configuration is not lost - it still exists as a saved configuration and can be re-loaded later, if you wish. +Return to `Contents`_. + Delete a Configuration ---------------------- @@ -250,4 +274,6 @@ To delete a configuration: **Note 1:** If you try to delete the currently loaded configuration, IBEX will do nothing. It will not delete the current configuration, because that would leave IBEX unable to communicate with the instrument. If you want to delete the current configuration, load a different configuration, then delete the previously loaded configuration. -**Note 2:** When you delete a configuration it really is deleted. It is no longer available to be used by IBEX. Before deleting a configuration, please be sure that you really do want to delete it. If you unintentionally delete a configuration, please contact the Experimental Controls team - it may be possible to recover the deleted configuration. \ No newline at end of file +**Note 2:** When you delete a configuration it really is deleted. It is no longer available to be used by IBEX. Before deleting a configuration, please be sure that you really do want to delete it. If you unintentionally delete a configuration, please contact the Experimental Controls team - it may be possible to recover the deleted configuration. + +Return to `Contents`_. From 5f2e3dd7bf39b719168a2929ef32afbe28e3aeec Mon Sep 17 00:00:00 2001 From: kjwoodsISIS Date: Tue, 30 Aug 2016 10:43:01 +0100 Subject: [PATCH 0216/1813] Updated CreateandManageConfigurations (rest) --- CreateandManageConfigurations.rest | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CreateandManageConfigurations.rest b/CreateandManageConfigurations.rest index c3325a2..fe2effe 100644 --- a/CreateandManageConfigurations.rest +++ b/CreateandManageConfigurations.rest @@ -126,7 +126,7 @@ Logging Settings * You can choose to log the block value periodically (the default period is every 30 seconds). * Alternatively, you can set a "deadband" - the block will only be logged if its value falls outside +/- the limit defined by the deadband value. -**Note:** Blocks that have been inherited from component will be shown, but cannot be cannot be modified, in the Edit Configuration dialog (the blocks will be shown as "greyed-out"). To modify inherited blocks you need to use the Edit Component dialog (see [[CreateandManageComponents]]). +**Note:** Blocks that have been inherited from a component will be shown, but cannot be cannot be modified, in the Edit Configuration dialog (the blocks will be shown as "greyed-out"). To modify inherited blocks you need to use the Edit Component dialog (see [[CreateandManageComponents]]). Return to `Contents`_. From 99c70517f0eabf27c84d8f63f10c4acae588575d Mon Sep 17 00:00:00 2001 From: kjwoodsISIS Date: Tue, 30 Aug 2016 10:44:35 +0100 Subject: [PATCH 0217/1813] Updated CreateandManageComponents (rest) --- CreateandManageComponents.rest | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/CreateandManageComponents.rest b/CreateandManageComponents.rest index c8091f9..8f73b19 100644 --- a/CreateandManageComponents.rest +++ b/CreateandManageComponents.rest @@ -31,6 +31,8 @@ Create a New Component The process of defining a component is essentially the same as the process of defining a configuration - the New Component dialog is identical to the New Configuration dialog. Refer to [[CreateandManageConfigurations]] for a full description of how use the various tabs on the New Component dialog. +Return to `Contents`_. + Edit a Component ---------------- @@ -39,6 +41,8 @@ To edit a component: #. Select ``Components > Edit`` from the ``Configuration`` menu. #. IBEX displays the Edit Component dialog which is is identical to the New Component dialog. Refer to [[CreateandManageConfigurations]] for a full description of how use the various tabs on the Edit Component dialog (as described in `Create a Component`_). +Return to `Contents`_. + Delete a Component ------------------ @@ -51,3 +55,4 @@ To delete a component: **Note:** When you delete a component it really is deleted. It is no longer available to be used by IBEX. Before deleting a component, please be sure that you really do want to delete it. If you unintentionally delete a component, please contact the Experimental Controls team - it may be possible to recover the deleted component. +Return to `Contents`_. From f961223c2279d2627b15bb5565879ac8a2d3ef43 Mon Sep 17 00:00:00 2001 From: kjwoodsISIS Date: Tue, 30 Aug 2016 10:46:48 +0100 Subject: [PATCH 0218/1813] Updated CreateandManageSynoptics (rest) --- CreateandManageSynoptics.rest | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/CreateandManageSynoptics.rest b/CreateandManageSynoptics.rest index 1853749..5cdff7b 100644 --- a/CreateandManageSynoptics.rest +++ b/CreateandManageSynoptics.rest @@ -5,7 +5,9 @@ Create & Manage Synoptic Views In IBEX, synoptic views provide you with interactive, schematic views of your instrument. Each icon on a synoptic view represents a device attached to your instrument. You can tailor the synoptic view to display key PVs next to the device icons. By double-clicking on an item, you can drill down to see more detail. -You can define as many synoptic views as you wish for your instrument. Each synoptic need not encompass the whole instrument. You can define synoptic views that focus on specific aspects of your instrument - for example, just the beam optics, or just the sample stack and equipment mounted on the sample stack. +You can define as many synoptic views as you wish for your instrument. + +A synoptic need not encompass the whole instrument. You can define synoptic views that focus on specific aspects of your instrument - for example, just the beam optics, or just the sample stack and equipment mounted on the sample stack. You can also associate a synoptic view with a particular configuration, so that, in effect, the chosen synoptic becomes the default synoptic for that configuration. From b830569cdef79b860151a6a618c6ca4d48e731cc Mon Sep 17 00:00:00 2001 From: kjwoodsISIS Date: Tue, 30 Aug 2016 11:06:32 +0100 Subject: [PATCH 0219/1813] Updated CreateandManageSynoptics (rest) --- CreateandManageSynoptics.rest | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/CreateandManageSynoptics.rest b/CreateandManageSynoptics.rest index 5cdff7b..a97a4a5 100644 --- a/CreateandManageSynoptics.rest +++ b/CreateandManageSynoptics.rest @@ -40,7 +40,7 @@ Use the Synoptic editor as follows: #. Click on the ``Add Component`` button to add a new component to the Instrument Tree. #. When you add a new component, its details are shown in the Component Details pane. It is given the default name ``New Component`` and a default type of ``UNKNOWN``. - #. In the Component Details pane, you can adjust the properties of the component. + #. In the Component Details pane, you can adjust the general properties of the component. * Give it a suitable name * Select the type of device it represents. Click on the drop-down menu to select the device type. @@ -49,7 +49,12 @@ Use the Synoptic editor as follows: #. If you add an associated PV (using the ``Add New PV`` button), its details appear in the PV Details pane. Use the the ``Select Block`` or ``Select PV`` buttons to choose a block or PV. - #. Use the Component Target Details pane to **DO SOMETHING**. + #. Use the Component Target Details pane to adjust the specific properties of the component (e.g. which model of device the component represents, which component properties are needed). + + * Give it a suitable name + * Select the type of device it represents. Click on the drop-down menu to select the device type. + * Add associated PVs to be displayed below the component in the synoptic view (``Add New PV`` button). + * Remove associated PVs #. Click on the ``Copy Component`` button to duplicate the currently selected component. If no component is selected, the ``Copy Component`` button is inactive. From 72a10591b613dfaccc5c3445b5591ced5970b9ff Mon Sep 17 00:00:00 2001 From: kjwoodsISIS Date: Tue, 30 Aug 2016 11:27:27 +0100 Subject: [PATCH 0220/1813] Updated CreateandManageSynoptics (rest) --- CreateandManageSynoptics.rest | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/CreateandManageSynoptics.rest b/CreateandManageSynoptics.rest index a97a4a5..161343b 100644 --- a/CreateandManageSynoptics.rest +++ b/CreateandManageSynoptics.rest @@ -51,9 +51,13 @@ Use the Synoptic editor as follows: #. Use the Component Target Details pane to adjust the specific properties of the component (e.g. which model of device the component represents, which component properties are needed). - * Give it a suitable name - * Select the type of device it represents. Click on the drop-down menu to select the device type. - * Add associated PVs to be displayed below the component in the synoptic view (``Add New PV`` button). + * The `name:` field is a drop-down menu. Select the name/model of the device. Some names on the list refer to general classes of device (e.g.`Eurotherm` refers to all Eurotherm temperature controllers); other names refer to specific models (e.g. `Julabo FP300` refers to a specific model of Julabo water bath). Whether a name is general or specific depends on the manufacturer of the device. When you have made your selection, a short description of the component will be displayed in the `Description:` field. + * If you are not sure which name/model to select for the `Name:` field, click on the `Default Target` button. IBEX will then display a list of names/models filtered by the Component Type field (see Component Details pane). This will significantly reduce the size of the list (often there will be only one choice). Choose the most appropriate name/model. + * Clicking on the `Clear Target` button will clear any selection in the `Name:` field. + * Below the `Description:` field is a table of `Properties:`, which lists the properties belonging to the selected component. Each property has a name and a value. Select each property in turn to edit the value. + * On selecting a property, the value of the property will appear `Value:` field. A description of the value is provided in the `Description:` field below the `Value:` field. The default value might be blank. + * Set the property value. + * **Please note:** Component properties are very specific to individual devices - it is impractical to give definitive advice in a user manual as to correct value for a compoenent property . The `Description:` field will generally provide advice on the type of value to be entered in the `Value:` field. If y * Remove associated PVs #. Click on the ``Copy Component`` button to duplicate the currently selected component. If no component is selected, the ``Copy Component`` button is inactive. From cc07e38549971796a5591b546314e0ceb19f49de Mon Sep 17 00:00:00 2001 From: kjwoodsISIS Date: Tue, 30 Aug 2016 11:28:31 +0100 Subject: [PATCH 0221/1813] Updated CreateandManageSynoptics (rest) --- CreateandManageSynoptics.rest | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/CreateandManageSynoptics.rest b/CreateandManageSynoptics.rest index 161343b..26e79fb 100644 --- a/CreateandManageSynoptics.rest +++ b/CreateandManageSynoptics.rest @@ -57,8 +57,7 @@ Use the Synoptic editor as follows: * Below the `Description:` field is a table of `Properties:`, which lists the properties belonging to the selected component. Each property has a name and a value. Select each property in turn to edit the value. * On selecting a property, the value of the property will appear `Value:` field. A description of the value is provided in the `Description:` field below the `Value:` field. The default value might be blank. * Set the property value. - * **Please note:** Component properties are very specific to individual devices - it is impractical to give definitive advice in a user manual as to correct value for a compoenent property . The `Description:` field will generally provide advice on the type of value to be entered in the `Value:` field. If y - * Remove associated PVs + * **Please note:** Component properties are very specific to individual devices - it is impractical to give definitive advice in a user manual as to correct value for a component property. The `Description:` field will generally provide advice on the type of value to be entered in the `Value:` field. If you are unsure about the correct value to choose, please consult with the Experimental Controls team. #. Click on the ``Copy Component`` button to duplicate the currently selected component. If no component is selected, the ``Copy Component`` button is inactive. From b2c7f8be8300d63eaf98eb969b418a1147ae7c69 Mon Sep 17 00:00:00 2001 From: kjwoodsISIS Date: Tue, 30 Aug 2016 11:29:11 +0100 Subject: [PATCH 0222/1813] Updated CreateandManageSynoptics (rest) --- CreateandManageSynoptics.rest | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CreateandManageSynoptics.rest b/CreateandManageSynoptics.rest index 26e79fb..c8f9257 100644 --- a/CreateandManageSynoptics.rest +++ b/CreateandManageSynoptics.rest @@ -57,7 +57,7 @@ Use the Synoptic editor as follows: * Below the `Description:` field is a table of `Properties:`, which lists the properties belonging to the selected component. Each property has a name and a value. Select each property in turn to edit the value. * On selecting a property, the value of the property will appear `Value:` field. A description of the value is provided in the `Description:` field below the `Value:` field. The default value might be blank. * Set the property value. - * **Please note:** Component properties are very specific to individual devices - it is impractical to give definitive advice in a user manual as to correct value for a component property. The `Description:` field will generally provide advice on the type of value to be entered in the `Value:` field. If you are unsure about the correct value to choose, please consult with the Experimental Controls team. + * **Please note:** Component properties are very specific to individual devices - it is impractical to give definitive advice in a user manual on correct value for a component property. The `Description:` field will generally provide advice on the type of value to be entered in the `Value:` field. If you are unsure about the correct value to choose, please consult with the Experimental Controls team. #. Click on the ``Copy Component`` button to duplicate the currently selected component. If no component is selected, the ``Copy Component`` button is inactive. From 61d51306d7b48b6e6ebd83105484479aa51642a8 Mon Sep 17 00:00:00 2001 From: kjwoodsISIS Date: Tue, 30 Aug 2016 11:32:11 +0100 Subject: [PATCH 0223/1813] Updated CreateandManageSynoptics (rest) --- CreateandManageSynoptics.rest | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/CreateandManageSynoptics.rest b/CreateandManageSynoptics.rest index c8f9257..73be93a 100644 --- a/CreateandManageSynoptics.rest +++ b/CreateandManageSynoptics.rest @@ -51,13 +51,13 @@ Use the Synoptic editor as follows: #. Use the Component Target Details pane to adjust the specific properties of the component (e.g. which model of device the component represents, which component properties are needed). - * The `name:` field is a drop-down menu. Select the name/model of the device. Some names on the list refer to general classes of device (e.g.`Eurotherm` refers to all Eurotherm temperature controllers); other names refer to specific models (e.g. `Julabo FP300` refers to a specific model of Julabo water bath). Whether a name is general or specific depends on the manufacturer of the device. When you have made your selection, a short description of the component will be displayed in the `Description:` field. - * If you are not sure which name/model to select for the `Name:` field, click on the `Default Target` button. IBEX will then display a list of names/models filtered by the Component Type field (see Component Details pane). This will significantly reduce the size of the list (often there will be only one choice). Choose the most appropriate name/model. - * Clicking on the `Clear Target` button will clear any selection in the `Name:` field. - * Below the `Description:` field is a table of `Properties:`, which lists the properties belonging to the selected component. Each property has a name and a value. Select each property in turn to edit the value. - * On selecting a property, the value of the property will appear `Value:` field. A description of the value is provided in the `Description:` field below the `Value:` field. The default value might be blank. + * The ``Name:`` field is a drop-down menu. Select the name/model of the device. Some names on the list refer to general classes of device (e.g.``Eurotherm`` refers to all Eurotherm temperature controllers); other names refer to specific models (e.g. ``Julabo FP300`` refers to a specific model of Julabo water bath). Whether a name is general or specific depends on the manufacturer of the device. When you have made your selection, a short description of the component will be displayed in the ``Description:`` field. + * If you are not sure which name/model to select for the ``Name:`` field, click on the ``Default Target`` button. IBEX will then display a list of names/models filtered by the Component Type field (see Component Details pane). This will significantly reduce the size of the list (often there will be only one choice). Choose the most appropriate name/model. + * Clicking on the ``Clear Target`` button will clear any selection in the `Name:` field. + * Below the `Description:` field is a table of ``Properties:``, which lists the properties belonging to the selected component. Each property has a name and a value. Select each property in turn to edit the value. + * On selecting a property, the value of the property will appear ``Value:`` field. A description of the value is provided in the ``Description:`` field below the ``Value:`` field. The default value might be blank. * Set the property value. - * **Please note:** Component properties are very specific to individual devices - it is impractical to give definitive advice in a user manual on correct value for a component property. The `Description:` field will generally provide advice on the type of value to be entered in the `Value:` field. If you are unsure about the correct value to choose, please consult with the Experimental Controls team. + * **Please note:** Component properties are very specific to individual devices - it is impractical to give definitive advice in a user manual on the correct value for a component property. The ``Description:`` field will provide general advice on the type of value to be entered in the ``Value:`` field. If you are unsure about the correct value to choose, please consult with the Experimental Controls team. #. Click on the ``Copy Component`` button to duplicate the currently selected component. If no component is selected, the ``Copy Component`` button is inactive. From 1155e61beebd753ed1dbdc202f23ed3f17c9cb58 Mon Sep 17 00:00:00 2001 From: kjwoodsISIS Date: Tue, 30 Aug 2016 12:08:02 +0100 Subject: [PATCH 0224/1813] Updated CreateandManageSynoptics (rest) --- CreateandManageSynoptics.rest | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CreateandManageSynoptics.rest b/CreateandManageSynoptics.rest index 73be93a..1562a01 100644 --- a/CreateandManageSynoptics.rest +++ b/CreateandManageSynoptics.rest @@ -53,8 +53,8 @@ Use the Synoptic editor as follows: * The ``Name:`` field is a drop-down menu. Select the name/model of the device. Some names on the list refer to general classes of device (e.g.``Eurotherm`` refers to all Eurotherm temperature controllers); other names refer to specific models (e.g. ``Julabo FP300`` refers to a specific model of Julabo water bath). Whether a name is general or specific depends on the manufacturer of the device. When you have made your selection, a short description of the component will be displayed in the ``Description:`` field. * If you are not sure which name/model to select for the ``Name:`` field, click on the ``Default Target`` button. IBEX will then display a list of names/models filtered by the Component Type field (see Component Details pane). This will significantly reduce the size of the list (often there will be only one choice). Choose the most appropriate name/model. - * Clicking on the ``Clear Target`` button will clear any selection in the `Name:` field. - * Below the `Description:` field is a table of ``Properties:``, which lists the properties belonging to the selected component. Each property has a name and a value. Select each property in turn to edit the value. + * Clicking on the ``Clear Target`` button will clear any selection in the ``Name:`` field. + * Below the ``Description:`` field is a table of ``Properties:``, which lists the properties belonging to the selected component. Each property has a name and a value. Select each property in turn to edit the value. * On selecting a property, the value of the property will appear ``Value:`` field. A description of the value is provided in the ``Description:`` field below the ``Value:`` field. The default value might be blank. * Set the property value. * **Please note:** Component properties are very specific to individual devices - it is impractical to give definitive advice in a user manual on the correct value for a component property. The ``Description:`` field will provide general advice on the type of value to be entered in the ``Value:`` field. If you are unsure about the correct value to choose, please consult with the Experimental Controls team. From 10f32bffcb31c22d5869178905569978520af1a8 Mon Sep 17 00:00:00 2001 From: kjwoodsISIS Date: Tue, 30 Aug 2016 12:09:11 +0100 Subject: [PATCH 0225/1813] Updated CreateandManageSynoptics (rest) --- CreateandManageSynoptics.rest | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CreateandManageSynoptics.rest b/CreateandManageSynoptics.rest index 1562a01..c71e066 100644 --- a/CreateandManageSynoptics.rest +++ b/CreateandManageSynoptics.rest @@ -51,7 +51,7 @@ Use the Synoptic editor as follows: #. Use the Component Target Details pane to adjust the specific properties of the component (e.g. which model of device the component represents, which component properties are needed). - * The ``Name:`` field is a drop-down menu. Select the name/model of the device. Some names on the list refer to general classes of device (e.g.``Eurotherm`` refers to all Eurotherm temperature controllers); other names refer to specific models (e.g. ``Julabo FP300`` refers to a specific model of Julabo water bath). Whether a name is general or specific depends on the manufacturer of the device. When you have made your selection, a short description of the component will be displayed in the ``Description:`` field. + * The ``Name:`` field is a drop-down menu. Select the name/model of the device. Some names on the list refer to general classes of device (e.g. ``Eurotherm`` refers to all Eurotherm temperature controllers); other names refer to specific models (e.g. ``Julabo FP300`` refers to a specific model of Julabo water bath). Whether a name is general or specific depends on the manufacturer of the device. When you have made your selection, a short description of the component will be displayed in the ``Description:`` field. * If you are not sure which name/model to select for the ``Name:`` field, click on the ``Default Target`` button. IBEX will then display a list of names/models filtered by the Component Type field (see Component Details pane). This will significantly reduce the size of the list (often there will be only one choice). Choose the most appropriate name/model. * Clicking on the ``Clear Target`` button will clear any selection in the ``Name:`` field. * Below the ``Description:`` field is a table of ``Properties:``, which lists the properties belonging to the selected component. Each property has a name and a value. Select each property in turn to edit the value. From 640e1bc8b21e1a289bb211098a5aa21c9b735d35 Mon Sep 17 00:00:00 2001 From: kjwoodsISIS Date: Tue, 30 Aug 2016 12:11:20 +0100 Subject: [PATCH 0226/1813] Updated CreateandManageSynoptics (rest) --- CreateandManageSynoptics.rest | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CreateandManageSynoptics.rest b/CreateandManageSynoptics.rest index c71e066..54aace4 100644 --- a/CreateandManageSynoptics.rest +++ b/CreateandManageSynoptics.rest @@ -51,7 +51,7 @@ Use the Synoptic editor as follows: #. Use the Component Target Details pane to adjust the specific properties of the component (e.g. which model of device the component represents, which component properties are needed). - * The ``Name:`` field is a drop-down menu. Select the name/model of the device. Some names on the list refer to general classes of device (e.g. ``Eurotherm`` refers to all Eurotherm temperature controllers); other names refer to specific models (e.g. ``Julabo FP300`` refers to a specific model of Julabo water bath). Whether a name is general or specific depends on the manufacturer of the device. When you have made your selection, a short description of the component will be displayed in the ``Description:`` field. + * The ``Name:`` field is a drop-down menu. Select the name/model of the device. Some names on the list refer to general classes of device (e.g. ``Eurotherm`` refers to all Eurotherm temperature controllers); other names refer to specific models (e.g. ``Julabo FP300`` refers to a specific model of Julabo water bath). Whether a name is general or specific depends on whether the manufacturer of the device has chosen a common interface to all models of a device or interfaces that are unique to individual models. When you have made your selection, a short description of the component will be displayed in the ``Description:`` field. * If you are not sure which name/model to select for the ``Name:`` field, click on the ``Default Target`` button. IBEX will then display a list of names/models filtered by the Component Type field (see Component Details pane). This will significantly reduce the size of the list (often there will be only one choice). Choose the most appropriate name/model. * Clicking on the ``Clear Target`` button will clear any selection in the ``Name:`` field. * Below the ``Description:`` field is a table of ``Properties:``, which lists the properties belonging to the selected component. Each property has a name and a value. Select each property in turn to edit the value. From 340f31cc57d1fb380b483dcc6e03b7e7fb4c95fd Mon Sep 17 00:00:00 2001 From: kjwoodsISIS Date: Tue, 30 Aug 2016 12:59:26 +0100 Subject: [PATCH 0227/1813] Updated CreateandManageSynoptics (rest) --- CreateandManageSynoptics.rest | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/CreateandManageSynoptics.rest b/CreateandManageSynoptics.rest index 54aace4..3e0ae17 100644 --- a/CreateandManageSynoptics.rest +++ b/CreateandManageSynoptics.rest @@ -44,10 +44,10 @@ Use the Synoptic editor as follows: * Give it a suitable name * Select the type of device it represents. Click on the drop-down menu to select the device type. - * Add associated PVs to be displayed below the component in the synoptic view (``Add New PV`` button). - * Remove associated PVs + * Click on the ``Add New PV`` button to add blocks or PVs to be associated with the component (remember - blocks are just aliases to PVs). Any blocks or PVs you select will be displayed below the component in the synoptic view. + * Remove any blocks or PVs previously associated with the component. - #. If you add an associated PV (using the ``Add New PV`` button), its details appear in the PV Details pane. Use the the ``Select Block`` or ``Select PV`` buttons to choose a block or PV. + #. If you add an associated block or PV (using the ``Add New PV`` button), its details appear in the PV Details pane. Use the the ``Select Block`` or ``Select PV`` buttons to choose a block or PV. #. Use the Component Target Details pane to adjust the specific properties of the component (e.g. which model of device the component represents, which component properties are needed). From ea8752016d728cbbb067807a6c8004b4a43ab099 Mon Sep 17 00:00:00 2001 From: kjwoodsISIS Date: Tue, 30 Aug 2016 13:01:21 +0100 Subject: [PATCH 0228/1813] Updated CreateandManageSynoptics (rest) --- CreateandManageSynoptics.rest | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CreateandManageSynoptics.rest b/CreateandManageSynoptics.rest index 3e0ae17..1cf7c36 100644 --- a/CreateandManageSynoptics.rest +++ b/CreateandManageSynoptics.rest @@ -47,7 +47,7 @@ Use the Synoptic editor as follows: * Click on the ``Add New PV`` button to add blocks or PVs to be associated with the component (remember - blocks are just aliases to PVs). Any blocks or PVs you select will be displayed below the component in the synoptic view. * Remove any blocks or PVs previously associated with the component. - #. If you add an associated block or PV (using the ``Add New PV`` button), its details appear in the PV Details pane. Use the the ``Select Block`` or ``Select PV`` buttons to choose a block or PV. + #. If you add an associated block or PV (using the ``Add New PV`` button), its details appear in the PV Details pane. Use the the ``Select Block`` or ``Select PV`` buttons to choose a specific block or PV to associated with the component. #. Use the Component Target Details pane to adjust the specific properties of the component (e.g. which model of device the component represents, which component properties are needed). From 14ffd44cbc023f3fc1498486406466ac82d642d2 Mon Sep 17 00:00:00 2001 From: kjwoodsISIS Date: Tue, 30 Aug 2016 13:13:57 +0100 Subject: [PATCH 0229/1813] Updated CreateandManageSynoptics (rest) --- CreateandManageSynoptics.rest | 1 + 1 file changed, 1 insertion(+) diff --git a/CreateandManageSynoptics.rest b/CreateandManageSynoptics.rest index 1cf7c36..8bfa5ff 100644 --- a/CreateandManageSynoptics.rest +++ b/CreateandManageSynoptics.rest @@ -46,6 +46,7 @@ Use the Synoptic editor as follows: * Select the type of device it represents. Click on the drop-down menu to select the device type. * Click on the ``Add New PV`` button to add blocks or PVs to be associated with the component (remember - blocks are just aliases to PVs). Any blocks or PVs you select will be displayed below the component in the synoptic view. * Remove any blocks or PVs previously associated with the component. + * You can change the order of components in the synoptic view by dragging & dropping any component to the desired position. As you drag a component, a black line will appear to indicate the you can drop the component and it will be positioned between the two components immediately above and below the black line. If you drop a component on top of another component, it will be positioned as "sub-component". "Sub-components" are useful if you have several components that are grouped together as a composite unit. #. If you add an associated block or PV (using the ``Add New PV`` button), its details appear in the PV Details pane. Use the the ``Select Block`` or ``Select PV`` buttons to choose a specific block or PV to associated with the component. From e575f4d73ee63d06fba51d2f02ed22a63210cbc4 Mon Sep 17 00:00:00 2001 From: kjwoodsISIS Date: Tue, 30 Aug 2016 13:21:11 +0100 Subject: [PATCH 0230/1813] Updated BlocksandGroups (rest) --- BlocksandGroups.rest | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/BlocksandGroups.rest b/BlocksandGroups.rest index 045fec1..f772c52 100644 --- a/BlocksandGroups.rest +++ b/BlocksandGroups.rest @@ -13,8 +13,8 @@ Run Control Indicators A tick mark or an X mark next to a block indicates that the block is under run control. * An unadorned block (i.e. no symbol next to the value of the block) means the block is not under run control. -* A green check icon next to the value means the block is under run control and within its limits. -* A red X icon next to the value means is under run control and outside its limits. +* An icon featuring a black check mark on a green background next to the value means the block is under run control and within its limits. +* An icon featuring a white X on a red background next to the value means is under run control and outside its limits. Alarm State Indicators ~~~~~~~~~~~~~~~~~~~~~~ From 13531f85c6b54916c3761f593133b477e9050e11 Mon Sep 17 00:00:00 2001 From: kjwoodsISIS Date: Tue, 30 Aug 2016 13:26:06 +0100 Subject: [PATCH 0231/1813] Updated MenuBar (rest) --- MenuBar.rest | 2 ++ 1 file changed, 2 insertions(+) diff --git a/MenuBar.rest b/MenuBar.rest index 59715fd..9385212 100644 --- a/MenuBar.rest +++ b/MenuBar.rest @@ -7,6 +7,8 @@ IBEX Menu --------- Switch Instrument Select the Switch Instrument menu item to re-direct the IBEX GUI to view a different instrument. + + **Please Note:** If you connect to an instrument from outside the instrument's sub-network (i.e. if you are not in the instrument blockhouse or cabin/pod), you will only be able to view the instrument (i.e. you will not be able to make changes to any of the fields). Restore Default View Selecting the Restore Default View option resets the IBEX GUI display to its startup view. Exit IBEX Client From cf01f010984c77146e93c6446346bd3d2329d65a Mon Sep 17 00:00:00 2001 From: kjwoodsISIS Date: Tue, 30 Aug 2016 13:40:39 +0100 Subject: [PATCH 0232/1813] Updated MenuBar (rest) --- MenuBar.rest | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/MenuBar.rest b/MenuBar.rest index 9385212..dfdb7d1 100644 --- a/MenuBar.rest +++ b/MenuBar.rest @@ -50,10 +50,12 @@ IOC Menu Start/Stop IOCs Selecting the Start/Stop IOCs menu item displays a dialog allowing you to start an IOC or to stop an IOC that is currently running. -Run Control Menu +Run-Control Menu ---------------- -View Run Control Settings - Selecting the View Run Control Settings menu item displays a dialog showing you which blocks (if any) are currently under run control. You can also assign new run-control settings to blocks and modify or remove existing run-control settings. +View Run-Control Settings + Selecting the View Run-Control Settings menu item displays a dialog showing you which blocks (if any) are currently under run-control. You can also assign new run-control settings to blocks and modify or remove existing run-control settings. + + The [[BlocksandGroups]] page describes how blocks under run-control are shown in the GUI. Help Menu --------- From ca657ad239e850e63d956bc3f2915a9fafe2d628 Mon Sep 17 00:00:00 2001 From: kjwoodsISIS Date: Tue, 30 Aug 2016 13:46:18 +0100 Subject: [PATCH 0233/1813] Updated StartandStopIOCs (rest) --- StartandStopIOCs.rest | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/StartandStopIOCs.rest b/StartandStopIOCs.rest index 1a8c908..0cee29b 100644 --- a/StartandStopIOCs.rest +++ b/StartandStopIOCs.rest @@ -25,5 +25,5 @@ To start or stop an IOC: #. the ``Stop`` button to stop an IOC that is currently running #. the ``Restart`` button to restart an IOC that is currently running -It might take a few moments from pressing the button for the selected IOC to start or stop. You might also see a number of messages written to the [[IOCLog]] as the IOC starts itself up or shuts itself down. +It might take a few moments from pressing the button for the selected IOC to fully start itself up or fully shut itself down. You might also see a number of messages written to the IOC Log (see [[Views]]) as the IOC starts up or shuts down. From 1980b0f6560de1df43009447a87c9b3616949b69 Mon Sep 17 00:00:00 2001 From: kjwoodsISIS Date: Tue, 30 Aug 2016 13:46:53 +0100 Subject: [PATCH 0234/1813] Updated StartandStopIOCs (rest) --- StartandStopIOCs.rest | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/StartandStopIOCs.rest b/StartandStopIOCs.rest index 0cee29b..773b6be 100644 --- a/StartandStopIOCs.rest +++ b/StartandStopIOCs.rest @@ -11,7 +11,7 @@ Starting or Stopping an IOC --------------------------- To start or stop an IOC: -#. Select ``Stat/Stop IOCs`` from the ``IOC`` menu. +#. Select ``Start/Stop IOCs`` from the ``IOC`` menu. #. IBEX displays a dialog containing two panes. #. The first pane is a list of all the IOCs available on the instrument. The list shows whether each IOC is running or stopped. From a80abe35c7ca4e6b77f111a3df3d97cd459e7180 Mon Sep 17 00:00:00 2001 From: kjwoodsISIS Date: Tue, 30 Aug 2016 14:35:40 +0100 Subject: [PATCH 0235/1813] Updated KeyConceptsinIBEX (rest) --- KeyConceptsinIBEX.rest | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/KeyConceptsinIBEX.rest b/KeyConceptsinIBEX.rest index 924869b..4fda316 100644 --- a/KeyConceptsinIBEX.rest +++ b/KeyConceptsinIBEX.rest @@ -75,6 +75,36 @@ MySQL Return to `Contents`_. +Security +~~~~~~~~ + +A critical aspect of any control system is security: in particular, who has control of an instrument at any point in time. By control, we mean the ability to change PVs or start/stop the collection of data. The security model in IBEX reflects current working practices at ISIS. + +Instrument Sub-Network +^^^^^^^^^^^^^^^^^^^^^^ + +Each instrument controlled by IBEX has its own sub-network. The sub-network is a self-contained, mini-network which connects the instrument blockhouse, the instrument machine room (which houses the instrument control PC and DAE rack) and the instrument cabin/pod. Each instrument sub-network is independent of the sub-network belonging to any other instrument. The instrument sub-network is connected to the wider ISIS network by means of a gateway. In addition, the instrument control PC runs a process called the EPICS Gateway, which controls access to PVs on the instrument sub-network. + +This arrangement means that the devices attached to the instrument control PC are isolated from events elsewhere on the network. For example, should there be a need to shut down a part of the ISIS network (e.g. for maintenance reasons), the instrument sub-network will continue to run without interruption. Many hardware devices are not designed to be connected directly to busy, general purpose networks; by employing a sub-network, we can insulate these devices from the background traffic that exists on the rest of the network. A sub-network arrangement helps to make the instrument more resilient. + +Who has Control? +^^^^^^^^^^^^^^^^ + +In IBEX, only PCs directly connected to the instrument sub-network can control the instrument. In order to control an instrument, your PC must be connected to a network port in the instrument cabin/pod, the instrument machine room or the instrument blockhouse. + +Any request from a PC for access to a PV is checked by the EPICS Gateway. If the request originates from within the instrument sub-network, the EPICS Gateway will allow full (read and write) access to the PV. If the request originates from outside the instrument sub-network, the EPICS Gateway will allow read-only access to the PV. Therefore, if your PC is not directly connected to the instrument sub-network, you can only view the status of an instrument. + +Who can View an Instrument? +^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Anyone on the ISIS network can view an instrument. For example: +* another scientist, using another instrument, can view what is happening on your instrument +* an instrument scientist can view what is happening on your instrument from his or her office +* a technician can use IBEX to view that status of a device +* a support person can use IBEX to check what is happening on your instrument and help you troubleshoot problems + +Return to `Contents`_. + Blocks & Process Variables -------------------------- From 8a14aa13d52b195844b008de0aa532fd1fdf2a44 Mon Sep 17 00:00:00 2001 From: kjwoodsISIS Date: Tue, 30 Aug 2016 14:36:24 +0100 Subject: [PATCH 0236/1813] Updated KeyConceptsinIBEX (rest) --- KeyConceptsinIBEX.rest | 1 + 1 file changed, 1 insertion(+) diff --git a/KeyConceptsinIBEX.rest b/KeyConceptsinIBEX.rest index 4fda316..f4d69eb 100644 --- a/KeyConceptsinIBEX.rest +++ b/KeyConceptsinIBEX.rest @@ -13,6 +13,7 @@ Contents #. `IBEX Client`_ #. `genie_python`_ #. `IBEX Server`_ + #. `Security`_ #. `Blocks & Process Variables`_ #. `DAE (Data Acquisition Electronics)`_ From ad70f6d99317576c35e7c5369afc97d7543d0759 Mon Sep 17 00:00:00 2001 From: kjwoodsISIS Date: Tue, 30 Aug 2016 14:37:29 +0100 Subject: [PATCH 0237/1813] Updated KeyConceptsinIBEX (rest) --- KeyConceptsinIBEX.rest | 1 + 1 file changed, 1 insertion(+) diff --git a/KeyConceptsinIBEX.rest b/KeyConceptsinIBEX.rest index f4d69eb..f5c24b8 100644 --- a/KeyConceptsinIBEX.rest +++ b/KeyConceptsinIBEX.rest @@ -99,6 +99,7 @@ Who can View an Instrument? ^^^^^^^^^^^^^^^^^^^^^^^^^^^ Anyone on the ISIS network can view an instrument. For example: + * another scientist, using another instrument, can view what is happening on your instrument * an instrument scientist can view what is happening on your instrument from his or her office * a technician can use IBEX to view that status of a device From a985d366657dc83e37c3d03c786cf47829227508 Mon Sep 17 00:00:00 2001 From: kjwoodsISIS Date: Tue, 30 Aug 2016 14:39:04 +0100 Subject: [PATCH 0238/1813] Updated KeyConceptsinIBEX (rest) --- KeyConceptsinIBEX.rest | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/KeyConceptsinIBEX.rest b/KeyConceptsinIBEX.rest index f5c24b8..5872df0 100644 --- a/KeyConceptsinIBEX.rest +++ b/KeyConceptsinIBEX.rest @@ -100,9 +100,9 @@ Who can View an Instrument? Anyone on the ISIS network can view an instrument. For example: -* another scientist, using another instrument, can view what is happening on your instrument -* an instrument scientist can view what is happening on your instrument from his or her office -* a technician can use IBEX to view that status of a device +* another scientist, using another instrument, can use IBEX to view what is happening on your instrument +* an instrument scientist can use IBEX to view what is happening on your instrument from his or her office +* a technician can use IBEX to view the status of a device * a support person can use IBEX to check what is happening on your instrument and help you troubleshoot problems Return to `Contents`_. From bdcf2217e412e02368a40e3f0339a03428f86871 Mon Sep 17 00:00:00 2001 From: Gollum Date: Wed, 31 Aug 2016 13:26:09 +0100 Subject: [PATCH 0239/1813] Updated Views (rest) --- Views.rest | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Views.rest b/Views.rest index 75018ae..c3aafe1 100644 --- a/Views.rest +++ b/Views.rest @@ -14,7 +14,7 @@ Alarms Beam Status The Beam Status View displays the status of the synchrotron, TS1 and TS2 beams. It also displays MCR news. DAE - The DAE View allows you to set up and control the DAE. + The DAE View allows you to set up and control the DAE. See [[ManagetheDAE]] for further details. Experiment Details The Experiment Details View allows you to look up details of your current experiment using the RB number. IOC Log From 4557c89fe987b7949c5c4ff569314e47deb0df29 Mon Sep 17 00:00:00 2001 From: Gollum Date: Wed, 31 Aug 2016 13:26:59 +0100 Subject: [PATCH 0240/1813] Updated Views (rest) --- Views.rest | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Views.rest b/Views.rest index c3aafe1..3e05fd8 100644 --- a/Views.rest +++ b/Views.rest @@ -24,7 +24,7 @@ Log Plotter Motors The Motors View displays the status of all motors connected to the instrument control PC. You can also control all motors from this view. The Motors View is most useful for instruments with large numbers of motors. Scripting - Selecting the Scripting View displays a Python console, allowing you to load and execute Python or genie_python scripts. + Selecting the Scripting View displays a Python console, allowing you to load and execute Python or genie_python scripts. See [[CreatandManageScripts]] for further details. Synoptic The Synoptic View provides a schematic overview of your instrument. It is a convenient way to navigate to any device attached to the instrument control PC. Web Links From 70e50dc86aee3a42cbd0ee86175d456b8213899b Mon Sep 17 00:00:00 2001 From: Gollum Date: Wed, 31 Aug 2016 13:29:09 +0100 Subject: [PATCH 0241/1813] Updated Views (rest) --- Views.rest | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Views.rest b/Views.rest index 3e05fd8..2e6749a 100644 --- a/Views.rest +++ b/Views.rest @@ -24,7 +24,7 @@ Log Plotter Motors The Motors View displays the status of all motors connected to the instrument control PC. You can also control all motors from this view. The Motors View is most useful for instruments with large numbers of motors. Scripting - Selecting the Scripting View displays a Python console, allowing you to load and execute Python or genie_python scripts. See [[CreatandManageScripts]] for further details. + Selecting the Scripting View displays a Python console, allowing you to load and execute Python or genie_python scripts. See [[CreateandManageScripts]] for further details. Synoptic The Synoptic View provides a schematic overview of your instrument. It is a convenient way to navigate to any device attached to the instrument control PC. Web Links From 717239223b795bdd857feb81064477dffa9c2153 Mon Sep 17 00:00:00 2001 From: Gollum Date: Wed, 31 Aug 2016 13:30:30 +0100 Subject: [PATCH 0242/1813] Updated Views (rest) --- Views.rest | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Views.rest b/Views.rest index 2e6749a..e168069 100644 --- a/Views.rest +++ b/Views.rest @@ -26,7 +26,7 @@ Motors Scripting Selecting the Scripting View displays a Python console, allowing you to load and execute Python or genie_python scripts. See [[CreateandManageScripts]] for further details. Synoptic - The Synoptic View provides a schematic overview of your instrument. It is a convenient way to navigate to any device attached to the instrument control PC. + The Synoptic View provides a schematic overview of your instrument. It is a convenient way to navigate to any device attached to the instrument control PC. The [[CreateandManageSynoptics]] page provide more detail on how to create and manage synoptics. Web Links The Web Links View is a collection of convenient web links. From cf0eb4555bd3e665602904d2615dd795b88c064d Mon Sep 17 00:00:00 2001 From: Gollum Date: Wed, 31 Aug 2016 13:34:10 +0100 Subject: [PATCH 0243/1813] Updated HowToDoThingsInIBEX (rest) --- HowToDoThingsInIBEX.rest | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/HowToDoThingsInIBEX.rest b/HowToDoThingsInIBEX.rest index 146c1ce..71dd3c0 100644 --- a/HowToDoThingsInIBEX.rest +++ b/HowToDoThingsInIBEX.rest @@ -1,4 +1,3 @@ - .. _HowToDoThingsInIBEX: How To Do Things In IBEX @@ -17,3 +16,5 @@ In this section of the IBEX User Manual, we describe how to do the most common a [[CreateandManageScripts]] [[ManagetheDAE]] + +[[PlotaBlockGraph]] From 368efb87d6a6e6a55b3c48e637ddbb2e372207a9 Mon Sep 17 00:00:00 2001 From: Gollum Date: Wed, 31 Aug 2016 13:52:29 +0100 Subject: [PATCH 0244/1813] Created PlotaBlockGraph (rest) --- PlotaBlockGraph.rest | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 PlotaBlockGraph.rest diff --git a/PlotaBlockGraph.rest b/PlotaBlockGraph.rest new file mode 100644 index 0000000..383ba6a --- /dev/null +++ b/PlotaBlockGraph.rest @@ -0,0 +1,23 @@ +.. _PlotaBlockGraph: + +Plot a Graph of a Block or PV +============================= + +IBEX provides a quick, easy way to plot a graph of a block or PV as a function of time (i.e. a "strip-chart"). + +Plot a Graph of a Block +----------------------- +To plot a graph of a block: + +#. Select ``Log Plotter`` from the ``View Selector`` (see [[Views]]). +#. If you have not previously plotted a block, IBEX displays an empty view, prompting you to select a block. If you have already plotted a block, IBEX restores the graph. +#. To plot a block, simply right-click on a block displayed in the Blocks & Groups view at the top of the IBEX window. +#. Right-clicking displays a pop-up menu. Choose``Display block history`` from the menu. +#. IBEX displays a graph of the selected block as a function of time. + +The graph axes will automatically adjust to the range of values that the selected block has experienced. The graph axes are labelled with the name of the underlying PV (remember, blocks are aliases to PVs). + +Along the top of the graph are a series of buttons which allow you to adjust the appearance of the graph. However the mouse over each button to see its name. + +It might take a few moments from pressing the button for the selected IOC to fully start itself up or fully shut itself down. You might also see a number of messages written to the IOC Log (see [[Views]]) as the IOC starts up or shuts down. + From 987b70211249da35e70a88dd9d8a8f5b07c94b60 Mon Sep 17 00:00:00 2001 From: Gollum Date: Wed, 31 Aug 2016 14:14:59 +0100 Subject: [PATCH 0245/1813] Updated PlotaBlockGraph (rest) --- PlotaBlockGraph.rest | 26 ++++++++++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git a/PlotaBlockGraph.rest b/PlotaBlockGraph.rest index 383ba6a..673fe7e 100644 --- a/PlotaBlockGraph.rest +++ b/PlotaBlockGraph.rest @@ -7,6 +7,7 @@ IBEX provides a quick, easy way to plot a graph of a block or PV as a function o Plot a Graph of a Block ----------------------- + To plot a graph of a block: #. Select ``Log Plotter`` from the ``View Selector`` (see [[Views]]). @@ -17,7 +18,28 @@ To plot a graph of a block: The graph axes will automatically adjust to the range of values that the selected block has experienced. The graph axes are labelled with the name of the underlying PV (remember, blocks are aliases to PVs). -Along the top of the graph are a series of buttons which allow you to adjust the appearance of the graph. However the mouse over each button to see its name. +Along the top of the graph are a series of buttons which allow you to adjust the appearance of the graph. Move the cursor over each button to see its function. The most important buttons are: + +Configure Settings + Allows you to configure the appearance of the graph. You can choose the range of values to be shown on the graph axes, you can choose linear or logarithmic axes, you can choose the style and colour of the trace. + +Show Value Labels + Allows you to toggle the display of labels which report the position of the cursor on the graph. + +Show Axis Trace + Allows you to toggle the display of a cross-hair which shows the position of the cursor on the graph. + +Panning + Allows you to pan the graph left-right and up-down. + +Undo & Redo + Allows you to undo or redo any changes you have made to the way that the graph is displayed. + +Save Snapshot to PNG file + Click on the camera icon to save a snapshot of the plot to a file. The file is saved to a location on the PC that is running the IBEX client. The file is saved as a PNG file, a format which is widely supported by many graphics software packages. + +Plot a Graph of a PV +-------------------- -It might take a few moments from pressing the button for the selected IOC to fully start itself up or fully shut itself down. You might also see a number of messages written to the IOC Log (see [[Views]]) as the IOC starts up or shuts down. +You can choose a PV to be plotted from any OPI, in the same way as choosing a block. Simply right-click on the PV and select ``Display block history`` from the menu. From 27d11f43e4a9b5181534a1b3b12c3bbd2d830028 Mon Sep 17 00:00:00 2001 From: Gollum Date: Wed, 31 Aug 2016 14:20:07 +0100 Subject: [PATCH 0246/1813] Updated Glossary (rest) --- Glossary.rest | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Glossary.rest b/Glossary.rest index 97281c1..22b4b65 100644 --- a/Glossary.rest +++ b/Glossary.rest @@ -49,6 +49,9 @@ IOC For example, access to a Eurotherm temperature controller is controlled via an IOC process that provides :term:`Process Variable` for the relevant control elements +OPI + OPI stands for Operator Interface. An OPI is the user interface for an individual device attached to an instrument. For example, an OPI is displayed when you click on a device icon on a synoptic view. + PV (Process Variable) This is a named piece of information in the EPICS system, such as a temperature setpoint or readback. A PV has structured name that uniquely identifies it on the network. An example of such a name, in From 4243202c8a38f34d54aa9e1b181f7e323b736cb6 Mon Sep 17 00:00:00 2001 From: Gollum Date: Wed, 31 Aug 2016 14:27:19 +0100 Subject: [PATCH 0247/1813] Updated HowToDoThingsInIBEX (rest) --- HowToDoThingsInIBEX.rest | 2 ++ 1 file changed, 2 insertions(+) diff --git a/HowToDoThingsInIBEX.rest b/HowToDoThingsInIBEX.rest index 71dd3c0..666c3c4 100644 --- a/HowToDoThingsInIBEX.rest +++ b/HowToDoThingsInIBEX.rest @@ -11,6 +11,8 @@ In this section of the IBEX User Manual, we describe how to do the most common a [[StartandStopIOCs]] +[[NavigateSynoptics]] + [[CreateandManageSynoptics]] [[CreateandManageScripts]] From 7286403c9b48c9bfec1c5972da7e80b12c69420d Mon Sep 17 00:00:00 2001 From: Gollum Date: Wed, 31 Aug 2016 14:42:44 +0100 Subject: [PATCH 0248/1813] Created NavigateSynoptics (markdown) --- NavigateSynoptics.md | 59 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100644 NavigateSynoptics.md diff --git a/NavigateSynoptics.md b/NavigateSynoptics.md new file mode 100644 index 0000000..4fbd721 --- /dev/null +++ b/NavigateSynoptics.md @@ -0,0 +1,59 @@ +.. _NavigateSynoptics: + +Navigating Synoptic Views +========================= + +In IBEX, synoptic views provide you with interactive, schematic views of your instrument. Each icon on a synoptic view represents a device attached to your instrument. You can tailor the synoptic view to display key PVs next to the device icons. By double-clicking on an item, you can drill down to see more detail. + +The focus of this page is navigating synoptic views. If you wish to create your own synoptic view see [[CreateandManageSynoptics]]. + +Selecting a Synoptic View +------------------------- + +#. To view an instrument synoptic, click on the ``Synoptic`` button on the View Selector (see [[Views]]). +#. If a default synoptic has been defined for your current configuration, IBEX will display it. The name of the synoptic will be displayed in the drop-down menu in the area labelled ``Synoptic Selection`` at the top of the synoptic display area. +#. If no default synoptic has been defined for your current configuration, IBEX will display ``--NONE--`` in the drop-down menu in the area labelled ``Synoptic Selection`` at the top of the synoptic display area and the synoptic display will be blank. +#. You can choose to view any synoptic defined for your instrument by in the drop-down menu in ``Synoptic Selection`` area and choosing any of the synoptics listed. IBEX will refresh the synoptic display to show your chosen synoptic. + + + +Synoptic Preview + Click on the ``Synoptic Preview`` button to get a preview of how your synoptic will appear. You can click on the ``Synoptic Preview`` button at any time. + +Save as... + Click on the ``Save as...`` button to save your changes. You must provide a name for the synoptic view. The name of the synoptic can contain only the characters a-z, A-Z, 0-9 and _ (underscore). The name must also start with a character. + +Cancel + Click on the ``Cancel`` button to exit the dialog without saving your changes. + +Use the Synoptic editor as follows: + +#. Click on the ``Add Component`` button to add a new component to the Instrument Tree. + + #. When you add a new component, its details are shown in the Component Details pane. It is given the default name ``New Component`` and a default type of ``UNKNOWN``. + #. In the Component Details pane, you can adjust the general properties of the component. + + * Give it a suitable name + * Select the type of device it represents. Click on the drop-down menu to select the device type. + * Click on the ``Add New PV`` button to add blocks or PVs to be associated with the component (remember - blocks are just aliases to PVs). Any blocks or PVs you select will be displayed below the component in the synoptic view. + * Remove any blocks or PVs previously associated with the component. + * You can change the order of components in the synoptic view by dragging & dropping any component to the desired position. As you drag a component, a black line will appear to indicate the you can drop the component and it will be positioned between the two components immediately above and below the black line. If you drop a component on top of another component, it will be positioned as "sub-component". "Sub-components" are useful if you have several components that are grouped together as a composite unit. + + #. If you add an associated block or PV (using the ``Add New PV`` button), its details appear in the PV Details pane. Use the the ``Select Block`` or ``Select PV`` buttons to choose a specific block or PV to associated with the component. + + #. Use the Component Target Details pane to adjust the specific properties of the component (e.g. which model of device the component represents, which component properties are needed). + + * The ``Name:`` field is a drop-down menu. Select the name/model of the device. Some names on the list refer to general classes of device (e.g. ``Eurotherm`` refers to all Eurotherm temperature controllers); other names refer to specific models (e.g. ``Julabo FP300`` refers to a specific model of Julabo water bath). Whether a name is general or specific depends on whether the manufacturer of the device has chosen a common interface to all models of a device or interfaces that are unique to individual models. When you have made your selection, a short description of the component will be displayed in the ``Description:`` field. + * If you are not sure which name/model to select for the ``Name:`` field, click on the ``Default Target`` button. IBEX will then display a list of names/models filtered by the Component Type field (see Component Details pane). This will significantly reduce the size of the list (often there will be only one choice). Choose the most appropriate name/model. + * Clicking on the ``Clear Target`` button will clear any selection in the ``Name:`` field. + * Below the ``Description:`` field is a table of ``Properties:``, which lists the properties belonging to the selected component. Each property has a name and a value. Select each property in turn to edit the value. + * On selecting a property, the value of the property will appear ``Value:`` field. A description of the value is provided in the ``Description:`` field below the ``Value:`` field. The default value might be blank. + * Set the property value. + * **Please note:** Component properties are very specific to individual devices - it is impractical to give definitive advice in a user manual on the correct value for a component property. The ``Description:`` field will provide general advice on the type of value to be entered in the ``Value:`` field. If you are unsure about the correct value to choose, please consult with the Experimental Controls team. + +#. Click on the ``Copy Component`` button to duplicate the currently selected component. If no component is selected, the ``Copy Component`` button is inactive. + +#. Click on the ``Delete Component`` button to delete the currently selected component. If no component is selected, the ``Delete Component`` button is inactive. + +#. Toggle the ``Show Beam`` check-box to show or hide the schematic representation of the beam in the synoptic view. By default, the beam will be shown. + From b958c1b771b3c3691a33c3a4775568c140ec6583 Mon Sep 17 00:00:00 2001 From: Gollum Date: Wed, 31 Aug 2016 14:58:49 +0100 Subject: [PATCH 0249/1813] Updated CreateandManageSynoptics (rest) --- CreateandManageSynoptics.rest | 43 +++++++++++++++++++++++++++++++++-- 1 file changed, 41 insertions(+), 2 deletions(-) diff --git a/CreateandManageSynoptics.rest b/CreateandManageSynoptics.rest index 8bfa5ff..cc0751b 100644 --- a/CreateandManageSynoptics.rest +++ b/CreateandManageSynoptics.rest @@ -17,7 +17,7 @@ Creating a Synoptic View To create a synoptic view: #. Select ``New`` from the ``Synoptic`` menu. -#. IBEX displays the Synoptic editor dialog, which is divided into four panes. +#. IBEX displays the New Synoptic dialog, which is divided into four panes. #. Instrument Tree #. Component Details @@ -35,7 +35,9 @@ Save as... Cancel Click on the ``Cancel`` button to exit the dialog without saving your changes. -Use the Synoptic editor as follows: +**Please note:** After exiting the New Synoptic dialog, you will need explicitly select the synoptic you have just created in order to see it displayed in the synoptic display area. + +Use the New Synoptic dialog as follows: #. Click on the ``Add Component`` button to add a new component to the Instrument Tree. @@ -66,3 +68,40 @@ Use the Synoptic editor as follows: #. Toggle the ``Show Beam`` check-box to show or hide the schematic representation of the beam in the synoptic view. By default, the beam will be shown. +Editing a Synoptic View +------------------------ + +Editing a synoptic view is similar to creating a synoptic view, except that you are working from an existing synoptic: + +#. Select ``Edit`` from the ``Synoptic`` menu. +#. IBEX displays the Edit Synoptic dialog, which lists all the synoptics defined for your instrument. +#. Choose a synoptic from the list and press the ``OK`` button. +#. IBEX then displays the Edit Synoptic dialog. +#. This time the Edit Synoptic dialog has three buttons at the bottom of the dialog. + +Save + Clicking on the ``Save`` button immediately saves your changes without any further prompting. + +Save as... + Clicking on the ``Save as...`` button operates as described in the previous section. You can use the ``Save as...`` button to save the synoptic with a new name, prior to making further changes. + +Cancel + Click on the ``Cancel`` button to exit the Edit Synoptic dialog without saving your changes. + +**Please note:** After exiting the Edit Synoptic dialog, you might need to click on the ``Refresh Synoptic`` button at the top of the synoptic display area to see the changes you have made. + +Using the Edit Synoptic dialog is the same as the New Synoptic dialog (as described in `Creating a Synoptic`_). + +Deleting a Synoptic View +------------------------ + +To delete a synoptic: + +#. Select ``Delete`` from the ``Synoptic`` menu. +#. IBEX displays the Delete Synoptic dialog, which lists all the synoptics defined for your instrument. +#. Select a synoptic from the list and press the ``OK`` button +#. IBEX deletes the selected synoptic. + +**Note 1:** If you try to delete the current synoptic, IBEX will indeed delete it (you might have to click the ``Refresh Synoptic`` button to see that IBEX really has deleted the current synoptic). + +**Note 2:** When you delete a synoptic it really is deleted. It is no longer available to be used by IBEX. Before deleting a synoptic , please be sure that you really do want to delete it. If you unintentionally delete a synoptic, please contact the Experimental Controls team - it may be possible to recover the deleted synoptic. \ No newline at end of file From 7a14314634cb2cae3ade0aef9bbccc86d328da53 Mon Sep 17 00:00:00 2001 From: Gollum Date: Wed, 31 Aug 2016 14:59:31 +0100 Subject: [PATCH 0250/1813] Updated CreateandManageSynoptics (rest) --- CreateandManageSynoptics.rest | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CreateandManageSynoptics.rest b/CreateandManageSynoptics.rest index cc0751b..2d86637 100644 --- a/CreateandManageSynoptics.rest +++ b/CreateandManageSynoptics.rest @@ -90,7 +90,8 @@ Cancel **Please note:** After exiting the Edit Synoptic dialog, you might need to click on the ``Refresh Synoptic`` button at the top of the synoptic display area to see the changes you have made. -Using the Edit Synoptic dialog is the same as the New Synoptic dialog (as described in `Creating a Synoptic`_). +Using the Edit Synoptic dialog is the same as the New Synoptic dialog (as described in ` +Creating a Synoptic View`_). Deleting a Synoptic View ------------------------ From 51e95918c18d0588c837439a9cfa787f235d40a1 Mon Sep 17 00:00:00 2001 From: Gollum Date: Wed, 31 Aug 2016 16:08:07 +0100 Subject: [PATCH 0251/1813] Updated CreateandManageSynoptics (rest) --- CreateandManageSynoptics.rest | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CreateandManageSynoptics.rest b/CreateandManageSynoptics.rest index 2d86637..c64d2f4 100644 --- a/CreateandManageSynoptics.rest +++ b/CreateandManageSynoptics.rest @@ -103,6 +103,6 @@ To delete a synoptic: #. Select a synoptic from the list and press the ``OK`` button #. IBEX deletes the selected synoptic. -**Note 1:** If you try to delete the current synoptic, IBEX will indeed delete it (you might have to click the ``Refresh Synoptic`` button to see that IBEX really has deleted the current synoptic). +**Note 1:** If you attempt to delete the current synoptic, IBEX will indeed delete it (you might have to click the ``Refresh Synoptic`` button to see that IBEX really has deleted the current synoptic). -**Note 2:** When you delete a synoptic it really is deleted. It is no longer available to be used by IBEX. Before deleting a synoptic , please be sure that you really do want to delete it. If you unintentionally delete a synoptic, please contact the Experimental Controls team - it may be possible to recover the deleted synoptic. \ No newline at end of file +**Note 2:** When you delete a synoptic it really is deleted. It is no longer available to be used by IBEX. Before deleting a synoptic, please be sure that you really do want to delete it. If you unintentionally delete a synoptic, please contact the Experimental Controls team - it may be possible to recover the deleted synoptic. \ No newline at end of file From 4297478e72585033004db23826e76613fc5678d4 Mon Sep 17 00:00:00 2001 From: Gollum Date: Wed, 31 Aug 2016 16:10:26 +0100 Subject: [PATCH 0252/1813] Updated CreateandManageSynoptics (rest) --- CreateandManageSynoptics.rest | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/CreateandManageSynoptics.rest b/CreateandManageSynoptics.rest index c64d2f4..8b9f8d9 100644 --- a/CreateandManageSynoptics.rest +++ b/CreateandManageSynoptics.rest @@ -11,6 +11,13 @@ A synoptic need not encompass the whole instrument. You can define synoptic vie You can also associate a synoptic view with a particular configuration, so that, in effect, the chosen synoptic becomes the default synoptic for that configuration. +Contents +-------- + +#. `Creating a Synoptic View`_ +#. `Editing a Synoptic View`_ +#. `Deleting a Synoptic View`_ + Creating a Synoptic View ------------------------ @@ -68,6 +75,8 @@ Use the New Synoptic dialog as follows: #. Toggle the ``Show Beam`` check-box to show or hide the schematic representation of the beam in the synoptic view. By default, the beam will be shown. +Return to `Contents`_. + Editing a Synoptic View ------------------------ @@ -90,8 +99,9 @@ Cancel **Please note:** After exiting the Edit Synoptic dialog, you might need to click on the ``Refresh Synoptic`` button at the top of the synoptic display area to see the changes you have made. -Using the Edit Synoptic dialog is the same as the New Synoptic dialog (as described in ` -Creating a Synoptic View`_). +Using the Edit Synoptic dialog is the same as the New Synoptic dialog (as described in `Creating a Synoptic View`_). + +Return to `Contents`_. Deleting a Synoptic View ------------------------ @@ -105,4 +115,6 @@ To delete a synoptic: **Note 1:** If you attempt to delete the current synoptic, IBEX will indeed delete it (you might have to click the ``Refresh Synoptic`` button to see that IBEX really has deleted the current synoptic). -**Note 2:** When you delete a synoptic it really is deleted. It is no longer available to be used by IBEX. Before deleting a synoptic, please be sure that you really do want to delete it. If you unintentionally delete a synoptic, please contact the Experimental Controls team - it may be possible to recover the deleted synoptic. \ No newline at end of file +**Note 2:** When you delete a synoptic it really is deleted. It is no longer available to be used by IBEX. Before deleting a synoptic, please be sure that you really do want to delete it. If you unintentionally delete a synoptic, please contact the Experimental Controls team - it may be possible to recover the deleted synoptic. + +Return to `Contents`_. \ No newline at end of file From 021ceff955a7cc2402faaaa3cf67ebff45e84a12 Mon Sep 17 00:00:00 2001 From: Gollum Date: Wed, 31 Aug 2016 16:11:15 +0100 Subject: [PATCH 0253/1813] Updated NavigateSynoptics (markdown) --- NavigateSynoptics.md | 42 ------------------------------------------ 1 file changed, 42 deletions(-) diff --git a/NavigateSynoptics.md b/NavigateSynoptics.md index 4fbd721..44e6407 100644 --- a/NavigateSynoptics.md +++ b/NavigateSynoptics.md @@ -15,45 +15,3 @@ Selecting a Synoptic View #. If no default synoptic has been defined for your current configuration, IBEX will display ``--NONE--`` in the drop-down menu in the area labelled ``Synoptic Selection`` at the top of the synoptic display area and the synoptic display will be blank. #. You can choose to view any synoptic defined for your instrument by in the drop-down menu in ``Synoptic Selection`` area and choosing any of the synoptics listed. IBEX will refresh the synoptic display to show your chosen synoptic. - - -Synoptic Preview - Click on the ``Synoptic Preview`` button to get a preview of how your synoptic will appear. You can click on the ``Synoptic Preview`` button at any time. - -Save as... - Click on the ``Save as...`` button to save your changes. You must provide a name for the synoptic view. The name of the synoptic can contain only the characters a-z, A-Z, 0-9 and _ (underscore). The name must also start with a character. - -Cancel - Click on the ``Cancel`` button to exit the dialog without saving your changes. - -Use the Synoptic editor as follows: - -#. Click on the ``Add Component`` button to add a new component to the Instrument Tree. - - #. When you add a new component, its details are shown in the Component Details pane. It is given the default name ``New Component`` and a default type of ``UNKNOWN``. - #. In the Component Details pane, you can adjust the general properties of the component. - - * Give it a suitable name - * Select the type of device it represents. Click on the drop-down menu to select the device type. - * Click on the ``Add New PV`` button to add blocks or PVs to be associated with the component (remember - blocks are just aliases to PVs). Any blocks or PVs you select will be displayed below the component in the synoptic view. - * Remove any blocks or PVs previously associated with the component. - * You can change the order of components in the synoptic view by dragging & dropping any component to the desired position. As you drag a component, a black line will appear to indicate the you can drop the component and it will be positioned between the two components immediately above and below the black line. If you drop a component on top of another component, it will be positioned as "sub-component". "Sub-components" are useful if you have several components that are grouped together as a composite unit. - - #. If you add an associated block or PV (using the ``Add New PV`` button), its details appear in the PV Details pane. Use the the ``Select Block`` or ``Select PV`` buttons to choose a specific block or PV to associated with the component. - - #. Use the Component Target Details pane to adjust the specific properties of the component (e.g. which model of device the component represents, which component properties are needed). - - * The ``Name:`` field is a drop-down menu. Select the name/model of the device. Some names on the list refer to general classes of device (e.g. ``Eurotherm`` refers to all Eurotherm temperature controllers); other names refer to specific models (e.g. ``Julabo FP300`` refers to a specific model of Julabo water bath). Whether a name is general or specific depends on whether the manufacturer of the device has chosen a common interface to all models of a device or interfaces that are unique to individual models. When you have made your selection, a short description of the component will be displayed in the ``Description:`` field. - * If you are not sure which name/model to select for the ``Name:`` field, click on the ``Default Target`` button. IBEX will then display a list of names/models filtered by the Component Type field (see Component Details pane). This will significantly reduce the size of the list (often there will be only one choice). Choose the most appropriate name/model. - * Clicking on the ``Clear Target`` button will clear any selection in the ``Name:`` field. - * Below the ``Description:`` field is a table of ``Properties:``, which lists the properties belonging to the selected component. Each property has a name and a value. Select each property in turn to edit the value. - * On selecting a property, the value of the property will appear ``Value:`` field. A description of the value is provided in the ``Description:`` field below the ``Value:`` field. The default value might be blank. - * Set the property value. - * **Please note:** Component properties are very specific to individual devices - it is impractical to give definitive advice in a user manual on the correct value for a component property. The ``Description:`` field will provide general advice on the type of value to be entered in the ``Value:`` field. If you are unsure about the correct value to choose, please consult with the Experimental Controls team. - -#. Click on the ``Copy Component`` button to duplicate the currently selected component. If no component is selected, the ``Copy Component`` button is inactive. - -#. Click on the ``Delete Component`` button to delete the currently selected component. If no component is selected, the ``Delete Component`` button is inactive. - -#. Toggle the ``Show Beam`` check-box to show or hide the schematic representation of the beam in the synoptic view. By default, the beam will be shown. - From ec22ac6f3a09cf8aced11ff3427c8709366dfa6f Mon Sep 17 00:00:00 2001 From: Gollum Date: Wed, 31 Aug 2016 16:11:46 +0100 Subject: [PATCH 0254/1813] Updated NavigateSynoptics (markdown) --- NavigateSynoptics.md | 6 ------ 1 file changed, 6 deletions(-) diff --git a/NavigateSynoptics.md b/NavigateSynoptics.md index 44e6407..24674db 100644 --- a/NavigateSynoptics.md +++ b/NavigateSynoptics.md @@ -9,9 +9,3 @@ The focus of this page is navigating synoptic views. If you wish to create your Selecting a Synoptic View ------------------------- - -#. To view an instrument synoptic, click on the ``Synoptic`` button on the View Selector (see [[Views]]). -#. If a default synoptic has been defined for your current configuration, IBEX will display it. The name of the synoptic will be displayed in the drop-down menu in the area labelled ``Synoptic Selection`` at the top of the synoptic display area. -#. If no default synoptic has been defined for your current configuration, IBEX will display ``--NONE--`` in the drop-down menu in the area labelled ``Synoptic Selection`` at the top of the synoptic display area and the synoptic display will be blank. -#. You can choose to view any synoptic defined for your instrument by in the drop-down menu in ``Synoptic Selection`` area and choosing any of the synoptics listed. IBEX will refresh the synoptic display to show your chosen synoptic. - From eb800694eb9780c198f4dc149867b29b47377e36 Mon Sep 17 00:00:00 2001 From: Gollum Date: Wed, 31 Aug 2016 16:12:42 +0100 Subject: [PATCH 0255/1813] Updated NavigateSynoptics (rest) --- NavigateSynoptics.md => NavigateSynoptics.rest | 4 ++++ 1 file changed, 4 insertions(+) rename NavigateSynoptics.md => NavigateSynoptics.rest (84%) diff --git a/NavigateSynoptics.md b/NavigateSynoptics.rest similarity index 84% rename from NavigateSynoptics.md rename to NavigateSynoptics.rest index 24674db..6323641 100644 --- a/NavigateSynoptics.md +++ b/NavigateSynoptics.rest @@ -9,3 +9,7 @@ The focus of this page is navigating synoptic views. If you wish to create your Selecting a Synoptic View ------------------------- + +#. To view an instrument synoptic, click on the ``Synoptic`` button on the View Selector (see [[Views]]). + + From 35f0a9e11a149fa8522d05c6f0bf6270478688a6 Mon Sep 17 00:00:00 2001 From: Gollum Date: Wed, 31 Aug 2016 16:13:05 +0100 Subject: [PATCH 0256/1813] Updated NavigateSynoptics (rest) --- NavigateSynoptics.rest | 3 +++ 1 file changed, 3 insertions(+) diff --git a/NavigateSynoptics.rest b/NavigateSynoptics.rest index 6323641..a0c10c0 100644 --- a/NavigateSynoptics.rest +++ b/NavigateSynoptics.rest @@ -11,5 +11,8 @@ Selecting a Synoptic View ------------------------- #. To view an instrument synoptic, click on the ``Synoptic`` button on the View Selector (see [[Views]]). +#. If a default synoptic has been defined for your current configuration, IBEX will display it. The name of the synoptic will be displayed in the drop-down menu in the area labelled ``Synoptic Selection`` at the top of the synoptic display area. +#. If no default synoptic has been defined for your current configuration, IBEX will display ``--NONE--`` in the drop-down menu in the area labelled ``Synoptic Selection`` at the top of the synoptic display area and the synoptic display will be blank. +#. You can choose to view any synoptic defined for your instrument by in the drop-down menu in ``Synoptic Selection`` area and choosing any of the synoptics listed. IBEX will refresh the synoptic display to show your chosen synoptic. From e6a7e0c8ebecbb90fca3bdb71bc75ffc208cd55d Mon Sep 17 00:00:00 2001 From: Gollum Date: Wed, 31 Aug 2016 16:21:59 +0100 Subject: [PATCH 0257/1813] Updated NavigateSynoptics (rest) --- NavigateSynoptics.rest | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/NavigateSynoptics.rest b/NavigateSynoptics.rest index a0c10c0..34ab6a5 100644 --- a/NavigateSynoptics.rest +++ b/NavigateSynoptics.rest @@ -7,6 +7,13 @@ In IBEX, synoptic views provide you with interactive, schematic views of your in The focus of this page is navigating synoptic views. If you wish to create your own synoptic view see [[CreateandManageSynoptics]]. + +Contents +-------- + +#. `Selecting a Synoptic View`_ +#. `Navigating a Synoptic View`_ + Selecting a Synoptic View ------------------------- @@ -15,4 +22,10 @@ Selecting a Synoptic View #. If no default synoptic has been defined for your current configuration, IBEX will display ``--NONE--`` in the drop-down menu in the area labelled ``Synoptic Selection`` at the top of the synoptic display area and the synoptic display will be blank. #. You can choose to view any synoptic defined for your instrument by in the drop-down menu in ``Synoptic Selection`` area and choosing any of the synoptics listed. IBEX will refresh the synoptic display to show your chosen synoptic. +Return to `Contents`_. + +Navigating a Synoptic View +-------------------------- + +Return to `Contents`_. From 41e337b9e391ba88ceab8a2bad11e5e1e1a7e964 Mon Sep 17 00:00:00 2001 From: Gollum Date: Wed, 31 Aug 2016 16:35:00 +0100 Subject: [PATCH 0258/1813] Updated Glossary (rest) --- Glossary.rest | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Glossary.rest b/Glossary.rest index 22b4b65..b8deea3 100644 --- a/Glossary.rest +++ b/Glossary.rest @@ -50,7 +50,7 @@ IOC :term:`Process Variable` for the relevant control elements OPI - OPI stands for Operator Interface. An OPI is the user interface for an individual device attached to an instrument. For example, an OPI is displayed when you click on a device icon on a synoptic view. + OPI stands for Operator Interface. An OPI is a user interface element of IBEX. In essence, an OPI is a control panel for an individual device attached to an instrument. For example, an OPI is displayed when you click on a device icon on a synoptic view. PV (Process Variable) This is a named piece of information in the EPICS system, such as a temperature setpoint or readback. From 667c3be8480d2a1de29c650081035a56d0ab74a7 Mon Sep 17 00:00:00 2001 From: Gollum Date: Wed, 31 Aug 2016 16:35:55 +0100 Subject: [PATCH 0259/1813] Updated Glossary (rest) --- Glossary.rest | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Glossary.rest b/Glossary.rest index b8deea3..5ca6939 100644 --- a/Glossary.rest +++ b/Glossary.rest @@ -50,7 +50,7 @@ IOC :term:`Process Variable` for the relevant control elements OPI - OPI stands for Operator Interface. An OPI is a user interface element of IBEX. In essence, an OPI is a control panel for an individual device attached to an instrument. For example, an OPI is displayed when you click on a device icon on a synoptic view. + OPI stands for Operator Interface. An OPI is a user interface element of IBEX. In essence, an OPI is a control panel for an individual device attached to an instrument. It allows you to view and modify the PVs that define the state of the device. For example, an OPI is displayed when you click on a device icon on a synoptic view. PV (Process Variable) This is a named piece of information in the EPICS system, such as a temperature setpoint or readback. From dededb71f7e4b365e2dae50b79aa67f1b8bdb97b Mon Sep 17 00:00:00 2001 From: Gollum Date: Wed, 31 Aug 2016 16:55:13 +0100 Subject: [PATCH 0260/1813] Updated NavigateSynoptics (rest) --- NavigateSynoptics.rest | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/NavigateSynoptics.rest b/NavigateSynoptics.rest index 34ab6a5..2b277ce 100644 --- a/NavigateSynoptics.rest +++ b/NavigateSynoptics.rest @@ -19,7 +19,7 @@ Selecting a Synoptic View #. To view an instrument synoptic, click on the ``Synoptic`` button on the View Selector (see [[Views]]). #. If a default synoptic has been defined for your current configuration, IBEX will display it. The name of the synoptic will be displayed in the drop-down menu in the area labelled ``Synoptic Selection`` at the top of the synoptic display area. -#. If no default synoptic has been defined for your current configuration, IBEX will display ``--NONE--`` in the drop-down menu in the area labelled ``Synoptic Selection`` at the top of the synoptic display area and the synoptic display will be blank. +#. If no default synoptic has been defined for your current configuration, IBEX will display ``--NONE--`` in the drop-down menu in the ``Synoptic Selection`` area and the synoptic display will be blank. #. You can choose to view any synoptic defined for your instrument by in the drop-down menu in ``Synoptic Selection`` area and choosing any of the synoptics listed. IBEX will refresh the synoptic display to show your chosen synoptic. Return to `Contents`_. @@ -27,5 +27,15 @@ Return to `Contents`_. Navigating a Synoptic View -------------------------- +The synoptic view represents an instrument in a simplified, schematic form - as a linear sequence of devices. Each device is represented by an icon. Below each icon is an optional set of PVs, which allow you to monitor and/or control aspects of the device represented by the icon. + +If the synoptic is too long to fit in the display area, IBEX will activate a scroll bar at the bottom of the display, to allow you to scroll left and right. + +Clicking on an icon displays a control panel (or OPI) for the device represented by the icon. The device control panel is displayed in a tab on the right-hand side of the IBEX window. Screen space limitations make it impossible to show the full synoptic view alongside a device control panel so, when viewing device control panels, the display area of the synoptic view is reduced, but the left-right scroll bar is activated. + +If you click on a second icon, the control panel for the second device is displayed in a new tab alongside the tab for the first device control panel. You can repeat this action to view the controls panels for further devices. + +When you no longer need to view a control panel, click on the "X" icon at the top right-hand corner of the tab. + Return to `Contents`_. From cc5fb22b0db76dbf7d923d5225c50897340add6c Mon Sep 17 00:00:00 2001 From: Gollum Date: Wed, 31 Aug 2016 17:10:54 +0100 Subject: [PATCH 0261/1813] Updated CreateandManageSynoptics (rest) --- CreateandManageSynoptics.rest | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CreateandManageSynoptics.rest b/CreateandManageSynoptics.rest index 8b9f8d9..cca8973 100644 --- a/CreateandManageSynoptics.rest +++ b/CreateandManageSynoptics.rest @@ -55,7 +55,8 @@ Use the New Synoptic dialog as follows: * Select the type of device it represents. Click on the drop-down menu to select the device type. * Click on the ``Add New PV`` button to add blocks or PVs to be associated with the component (remember - blocks are just aliases to PVs). Any blocks or PVs you select will be displayed below the component in the synoptic view. * Remove any blocks or PVs previously associated with the component. - * You can change the order of components in the synoptic view by dragging & dropping any component to the desired position. As you drag a component, a black line will appear to indicate the you can drop the component and it will be positioned between the two components immediately above and below the black line. If you drop a component on top of another component, it will be positioned as "sub-component". "Sub-components" are useful if you have several components that are grouped together as a composite unit. + * You can change the order of components in the synoptic view by dragging & dropping any component to the desired position. As you drag a component, a black line will appear to indicate the you can drop the component and it will be positioned between the two components immediately above and below the black line. + * If you drop a component on top of another component, it will be positioned as "sub-component". "Sub-components" are useful if you have several components that can usefully be grouped together as a composite unit. "Sub-components" are also useful if you have a complex instrument; you can use "sub-components" to create a degree of hierarchy in the synoptic. #. If you add an associated block or PV (using the ``Add New PV`` button), its details appear in the PV Details pane. Use the the ``Select Block`` or ``Select PV`` buttons to choose a specific block or PV to associated with the component. From 3c3ed606d08dd5e7199bf3c6b32d44c71b68120e Mon Sep 17 00:00:00 2001 From: Gollum Date: Wed, 31 Aug 2016 17:13:59 +0100 Subject: [PATCH 0262/1813] Updated NavigateSynoptics (rest) --- NavigateSynoptics.rest | 2 ++ 1 file changed, 2 insertions(+) diff --git a/NavigateSynoptics.rest b/NavigateSynoptics.rest index 2b277ce..e927ed4 100644 --- a/NavigateSynoptics.rest +++ b/NavigateSynoptics.rest @@ -35,6 +35,8 @@ Clicking on an icon displays a control panel (or OPI) for the device represented If you click on a second icon, the control panel for the second device is displayed in a new tab alongside the tab for the first device control panel. You can repeat this action to view the controls panels for further devices. +You can also display a device control panel by using the drop-down menu in the area labelled ``Synoptic Navigation`` at the top of the synoptic display area. This is a convenient way of displaying a device control panel on large synoptics without having to scroll to find the appropriate device icon. + When you no longer need to view a control panel, click on the "X" icon at the top right-hand corner of the tab. Return to `Contents`_. From de5c33f12c8f919bfd2b2ca01f74c82d933a5ac0 Mon Sep 17 00:00:00 2001 From: Gollum Date: Wed, 31 Aug 2016 17:17:17 +0100 Subject: [PATCH 0263/1813] Updated KeyConceptsinIBEX (rest) --- KeyConceptsinIBEX.rest | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/KeyConceptsinIBEX.rest b/KeyConceptsinIBEX.rest index 5872df0..c4c6a62 100644 --- a/KeyConceptsinIBEX.rest +++ b/KeyConceptsinIBEX.rest @@ -100,10 +100,10 @@ Who can View an Instrument? Anyone on the ISIS network can view an instrument. For example: -* another scientist, using another instrument, can use IBEX to view what is happening on your instrument -* an instrument scientist can use IBEX to view what is happening on your instrument from his or her office -* a technician can use IBEX to view the status of a device -* a support person can use IBEX to check what is happening on your instrument and help you troubleshoot problems +* another scientist, using another instrument, can use IBEX to view what is happening on your instrument. This is especially useful when instruments share infrastructure (e.g. the muon beamlines). +* an instrument scientist can use IBEX to view what is happening on your instrument from his or her office. +* a technician can use IBEX to view the status of a device . +* a support person can use IBEX to check what is happening on your instrument and help you troubleshoot problems. Return to `Contents`_. From cafd29b6d20ecaa32c8a8311cc8bccc6f496d980 Mon Sep 17 00:00:00 2001 From: Gollum Date: Wed, 31 Aug 2016 17:22:02 +0100 Subject: [PATCH 0264/1813] Updated NavigateSynoptics (rest) --- NavigateSynoptics.rest | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/NavigateSynoptics.rest b/NavigateSynoptics.rest index e927ed4..ef6f54c 100644 --- a/NavigateSynoptics.rest +++ b/NavigateSynoptics.rest @@ -20,7 +20,7 @@ Selecting a Synoptic View #. To view an instrument synoptic, click on the ``Synoptic`` button on the View Selector (see [[Views]]). #. If a default synoptic has been defined for your current configuration, IBEX will display it. The name of the synoptic will be displayed in the drop-down menu in the area labelled ``Synoptic Selection`` at the top of the synoptic display area. #. If no default synoptic has been defined for your current configuration, IBEX will display ``--NONE--`` in the drop-down menu in the ``Synoptic Selection`` area and the synoptic display will be blank. -#. You can choose to view any synoptic defined for your instrument by in the drop-down menu in ``Synoptic Selection`` area and choosing any of the synoptics listed. IBEX will refresh the synoptic display to show your chosen synoptic. +#. You can choose to view any synoptic defined for your instrument by clicking on the drop-down menu in ``Synoptic Selection`` area and choosing any of the synoptics listed. IBEX will refresh the synoptic display to show your chosen synoptic. Return to `Contents`_. From b83f7a654f0b244934983e6bf7c5359c3c44fa35 Mon Sep 17 00:00:00 2001 From: Gollum Date: Fri, 2 Sep 2016 08:58:53 +0100 Subject: [PATCH 0265/1813] Updated FAQ (rest) --- FAQ.rest | 28 ++++++++++++++++------------ 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/FAQ.rest b/FAQ.rest index 432b583..eabf2ef 100644 --- a/FAQ.rest +++ b/FAQ.rest @@ -9,10 +9,10 @@ List of Frequently Asked Questions .. _Return: #. `How do I report a problem with IBEX?`_ +#. `How do I install IBEX Server`_ +#. `How do I install IBEX Client`_ #. `How do I start IBEX Server?`_ #. `How do I stop IBEX Server?`_ -#. `This is the fourth question`_ -#. `This is the fifth question`_ #. `This is the sixth question`_ #. `This is the seventh question`_ #. `This is the eighth question`_ @@ -27,31 +27,35 @@ List of Frequently Asked Questions Return_ -.. _`How do I start IBEX Server?`: +.. _`How do I install IBEX Server`: -**Q: How do I start IBEX Server?** +**Q: How do I install IBEX Server?** -**A:** To start IBEX Server - see [[StartingAndStoppingIBEX]] +**A:** To install IBEX Server - see [[InstallingIBEX]] Return_ -.. _`How do I stop IBEX Server?`: +.. _`How do I install IBEX Client`: -**Q: How do I stop IBEX Server?** +**Q: How do I install IBEX Client?** -**A:** To stop IBEX Server - see [[StartingAndStoppingIBEX]] +**A:** To install IBEX Client - see [[InstallingIBEX]] Return_ -.. _`This is the fourth question`: +.. _`How do I start IBEX Server?`: + +**Q: How do I start IBEX Server?** -This is the fourth answer. +**A:** To start IBEX Server - see [[StartingAndStoppingIBEX]] Return_ -.. _`This is the fifth question`: +.. _`How do I stop IBEX Server?`: -This is the fifth answer. +**Q: How do I stop IBEX Server?** + +**A:** To stop IBEX Server - see [[StartingAndStoppingIBEX]] Return_ From b99a9c6264330eca5d0f6a90dbaf5f320dcf3efa Mon Sep 17 00:00:00 2001 From: Gollum Date: Fri, 2 Sep 2016 08:59:17 +0100 Subject: [PATCH 0266/1813] Updated FAQ (rest) --- FAQ.rest | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/FAQ.rest b/FAQ.rest index eabf2ef..bf5449f 100644 --- a/FAQ.rest +++ b/FAQ.rest @@ -9,8 +9,8 @@ List of Frequently Asked Questions .. _Return: #. `How do I report a problem with IBEX?`_ -#. `How do I install IBEX Server`_ -#. `How do I install IBEX Client`_ +#. `How do I install IBEX Server?`_ +#. `How do I install IBEX Client?`_ #. `How do I start IBEX Server?`_ #. `How do I stop IBEX Server?`_ #. `This is the sixth question`_ @@ -27,7 +27,7 @@ List of Frequently Asked Questions Return_ -.. _`How do I install IBEX Server`: +.. _`How do I install IBEX Server?`: **Q: How do I install IBEX Server?** @@ -35,7 +35,7 @@ Return_ Return_ -.. _`How do I install IBEX Client`: +.. _`How do I install IBEX Client?`: **Q: How do I install IBEX Client?** From 501412d8cb8f900d9ba1d32c80a2b23261d0b582 Mon Sep 17 00:00:00 2001 From: Gollum Date: Fri, 2 Sep 2016 09:07:35 +0100 Subject: [PATCH 0267/1813] Updated InstallingIBEX (rest) --- InstallingIBEX.rest | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/InstallingIBEX.rest b/InstallingIBEX.rest index 9d485a1..d266f0c 100644 --- a/InstallingIBEX.rest +++ b/InstallingIBEX.rest @@ -6,7 +6,12 @@ Installing IBEX Installing IBEX Server ---------------------- -Installation of IBEX server on an instrument control PC is a moderately complex task, requiring the installation and configuration of several software components. If you need to install IBEX server on your instrument, please contact the Experimental Controls team. +The physical installation of IBEX server on an instrument control PC is a moderately complex task, requiring the installation and configuration of several software components. However, prior to the physical installation, a significant amount of preparation work is required. For example: + +#. for an existing instrument, SECI configs need to be converted to their IBEX equivalents and Open-Genie scripts need to be migrated to genie_python, new IOCs and OPIs may also need to be created. +#. for a new instrument, the design and list of devices needs to be understood, new IOCs and OPIs will need to be created, etc. + +If you want to install IBEX server on your instrument, please contact the Experimental Controls team. Installing IBEX Client ---------------------- From 9a10dcec8ed9cb0c9200a046cabb890d19f5e7fb Mon Sep 17 00:00:00 2001 From: Gollum Date: Fri, 2 Sep 2016 09:14:02 +0100 Subject: [PATCH 0268/1813] Updated InstallingIBEX (rest) --- InstallingIBEX.rest | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/InstallingIBEX.rest b/InstallingIBEX.rest index d266f0c..53def56 100644 --- a/InstallingIBEX.rest +++ b/InstallingIBEX.rest @@ -8,8 +8,8 @@ Installing IBEX Server The physical installation of IBEX server on an instrument control PC is a moderately complex task, requiring the installation and configuration of several software components. However, prior to the physical installation, a significant amount of preparation work is required. For example: -#. for an existing instrument, SECI configs need to be converted to their IBEX equivalents and Open-Genie scripts need to be migrated to genie_python, new IOCs and OPIs may also need to be created. -#. for a new instrument, the design and list of devices needs to be understood, new IOCs and OPIs will need to be created, etc. +* for an existing instrument, SECI configs need to be converted to their IBEX equivalents and Open-Genie scripts need to be migrated to genie_python, new IOCs and OPIs may also need to be created. +* for a new instrument, the design and list of devices needs to be understood, new IOCs and OPIs will need to be created, etc. If you want to install IBEX server on your instrument, please contact the Experimental Controls team. From cccd9cf16258c9d42b0a1df93c0194c76e882cfa Mon Sep 17 00:00:00 2001 From: Gollum Date: Fri, 2 Sep 2016 09:15:46 +0100 Subject: [PATCH 0269/1813] Updated InstallingIBEX (rest) --- InstallingIBEX.rest | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/InstallingIBEX.rest b/InstallingIBEX.rest index 53def56..2685789 100644 --- a/InstallingIBEX.rest +++ b/InstallingIBEX.rest @@ -9,7 +9,7 @@ Installing IBEX Server The physical installation of IBEX server on an instrument control PC is a moderately complex task, requiring the installation and configuration of several software components. However, prior to the physical installation, a significant amount of preparation work is required. For example: * for an existing instrument, SECI configs need to be converted to their IBEX equivalents and Open-Genie scripts need to be migrated to genie_python, new IOCs and OPIs may also need to be created. -* for a new instrument, the design and list of devices needs to be understood, new IOCs and OPIs will need to be created, etc. +* for a new instrument, the list of devices that comprise the instrument needs to be understood, new IOCs and OPIs will need to be created; configs and scripts can be developed during commissioning. If you want to install IBEX server on your instrument, please contact the Experimental Controls team. From 502f59dc9cf3e6539107079c0cb279ee723b5e7d Mon Sep 17 00:00:00 2001 From: Gollum Date: Fri, 2 Sep 2016 09:16:02 +0100 Subject: [PATCH 0270/1813] Updated InstallingIBEX (rest) --- InstallingIBEX.rest | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/InstallingIBEX.rest b/InstallingIBEX.rest index 2685789..3117d5b 100644 --- a/InstallingIBEX.rest +++ b/InstallingIBEX.rest @@ -9,7 +9,7 @@ Installing IBEX Server The physical installation of IBEX server on an instrument control PC is a moderately complex task, requiring the installation and configuration of several software components. However, prior to the physical installation, a significant amount of preparation work is required. For example: * for an existing instrument, SECI configs need to be converted to their IBEX equivalents and Open-Genie scripts need to be migrated to genie_python, new IOCs and OPIs may also need to be created. -* for a new instrument, the list of devices that comprise the instrument needs to be understood, new IOCs and OPIs will need to be created; configs and scripts can be developed during commissioning. +* for a new instrument, the list of devices that comprise the instrument needs to be understood, new IOCs and OPIs will need to be created; configurations and scripts can be developed during commissioning. If you want to install IBEX server on your instrument, please contact the Experimental Controls team. From ccfd1bc45578c92f838dc949bbce307603532be9 Mon Sep 17 00:00:00 2001 From: Gollum Date: Fri, 2 Sep 2016 09:19:09 +0100 Subject: [PATCH 0271/1813] Updated InstallingIBEX (rest) --- InstallingIBEX.rest | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/InstallingIBEX.rest b/InstallingIBEX.rest index 3117d5b..049a96e 100644 --- a/InstallingIBEX.rest +++ b/InstallingIBEX.rest @@ -47,7 +47,8 @@ Installation 3. Inside this folder you will see folders with names of the form ``BUILDmmm``, where ``mmm`` is a three-digit number and folders with names of the form ``BUILD-nnnn``, where ``nnnn`` is a four-digit - number. Change directory to the folder ``BUILDmmm`` with the highest value of ``mmm``. + number. Ignore the folders with names of the form ``BUILD-nnnn``. Change directory to the folder + ``BUILDmmm`` with the highest value of ``mmm``. 4. Run the command ``install_client.bat``. This will copy the contents of the above directory to ``C:\Instrument\Apps\Client``. It will also install genie_python. From 2d361484ba4825617bf1c1bc1ca664d126ff0019 Mon Sep 17 00:00:00 2001 From: Gollum Date: Fri, 2 Sep 2016 10:33:18 +0100 Subject: [PATCH 0272/1813] Updated ManagetheDAE (rest) --- ManagetheDAE.rest | 1 + 1 file changed, 1 insertion(+) diff --git a/ManagetheDAE.rest b/ManagetheDAE.rest index 0e78129..3dabe61 100644 --- a/ManagetheDAE.rest +++ b/ManagetheDAE.rest @@ -35,6 +35,7 @@ Run Summary Fields * ``Run Number``: (read-only) records the current run number * ``ISIS Cycle``: (read-only) records the current ISIS cycle * ``Title``: you can provide a short description of the current run in the ``Title`` field. Click on the ``Set`` button to commit the change (i.e. send it to the ICP, so that it gets included in the data file). +* The ``Show Title in Dataweb Dashboard Page`` check box allows you to toggle the display of the title in the Dataweb dashboard. This checkbox only affects the Dataweb dashboard; it does not affect display of the title in IBEX, or the inclusion of the title in the data file. Return to `Contents`_. From defb48e7ef7e3f7279042a1cc59bf2abce4b17cd Mon Sep 17 00:00:00 2001 From: Gollum Date: Fri, 2 Sep 2016 13:27:39 +0100 Subject: [PATCH 0273/1813] Updated Glossary (rest) --- Glossary.rest | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/Glossary.rest b/Glossary.rest index 5ca6939..3183c7a 100644 --- a/Glossary.rest +++ b/Glossary.rest @@ -53,6 +53,4 @@ OPI OPI stands for Operator Interface. An OPI is a user interface element of IBEX. In essence, an OPI is a control panel for an individual device attached to an instrument. It allows you to view and modify the PVs that define the state of the device. For example, an OPI is displayed when you click on a device icon on a synoptic view. PV (Process Variable) - This is a named piece of information in the EPICS system, such as a temperature setpoint or readback. - A PV has structured name that uniquely identifies it on the network. An example of such a name, in - this case for a motor, is: ``IN:LARMOR:MOT:MTR0101`` + A Process Variable, usually referred to as a PV, is a named piece of information in the EPICS system, such as a temperature setpoint or readback. PVs typically have structured names that uniquely identify them on the network. An example of such a name, in this case for a motor, is: ``IN:LARMOR:MOT:MTR0101`` From 7e1ef98a540d828c3cd18c3d4dbb9f67f0dbc58d Mon Sep 17 00:00:00 2001 From: Gollum Date: Wed, 7 Sep 2016 10:41:22 +0100 Subject: [PATCH 0274/1813] Updated WhatIsIBEX (rest) --- Introduction/WhatIsIBEX.rest | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/Introduction/WhatIsIBEX.rest b/Introduction/WhatIsIBEX.rest index 413b798..e4164d5 100644 --- a/Introduction/WhatIsIBEX.rest +++ b/Introduction/WhatIsIBEX.rest @@ -5,14 +5,16 @@ What is IBEX IBEX is the new instrument control program; it is intended to replace SECI. -Most device control is currently performed using LabVIEW, with SECI providing an integrated view of the various LabVIEW VIs. IBEX, on the other hand, is designed to use EPICS to provide device control. LabVIEW will not disappear entirely; when LabVIEW is required, it can be wrapped in EPICS. +Prior to the development of IBEX, most device control was performed using LabVIEW, with SECI providing an integrated view of the various LabVIEW VIs. IBEX, on the other hand, is designed to use EPICS to provide device control. LabVIEW will not disappear entirely; when LabVIEW is required, it can be wrapped in EPICS. IBEX also uses genie_python as its scripting language. IBEX and SECI Similarities -------------------------- -Both IBEX and SECI have block and dashboard +IBEX and SECI both provide integrated views for controlling neutron & muon instruments. SECI integrates information from LabVIEW VIs; IBEX integrates information from EPICS IOCs. In SECI, it is the LabVIEW VIs that directly control the individual devices attached to an instrument. In IBEX, the EPICS IOCs fulfil the role performed by the LabVIEW VIs. + +IBEX and SECI also share similar UIs, partly because they perform similar functions, but mainly by design - if they behave in similar ways, then it is easier to switch from SECI to IBEX. IBEX and SECI Differences -------------------------- From c8db4bbe1be7fdcb595d75c88a21d1b8ce91fb28 Mon Sep 17 00:00:00 2001 From: Gollum Date: Wed, 7 Sep 2016 11:04:52 +0100 Subject: [PATCH 0275/1813] Updated WhatIsIBEX (rest) --- Introduction/WhatIsIBEX.rest | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/Introduction/WhatIsIBEX.rest b/Introduction/WhatIsIBEX.rest index e4164d5..3fa18d3 100644 --- a/Introduction/WhatIsIBEX.rest +++ b/Introduction/WhatIsIBEX.rest @@ -19,7 +19,13 @@ IBEX and SECI also share similar UIs, partly because they perform similar functi IBEX and SECI Differences -------------------------- -IBEX is a client-server based system. The server components of IBEX run on the instrument control PC and directly control the instrument. The IBEX client is a GUI, which provides an integrated view of the information provided by the server components. The IBEX client typically runs on a separate PC (which could be located in the instrument cabin or pod, or could be located in your office). It is important to realise that the IBEX client is itself not the instrument control program. You can thus close the IBEX client without stopping control of devices; you can even run multiple instances of the client on the same or different computers. You can also run the IBEX client on the instrument control PC. +IBEX is a client-server based system. The server components of IBEX run on the instrument control PC and directly control the instrument. The IBEX client is a GUI, which provides an integrated view of the information provided by the server components. The IBEX client typically runs on a separate PC (which could be located in the instrument cabin or pod, or could be located in your office). + +It is important to realise that the IBEX client is not the instrument control program. The server components of IBEX collectively constitute the instrument control program. The IBEX client provides a convenient way to communicate with the server components. You can thus close the IBEX client without stopping control of devices; you can even run multiple instances of the client on the same or different computers. You can also run the IBEX client on the instrument control PC. + +In SECI, the LabVIEW VIs all run as processes on a single PC - the instrument control PC. By contrast, in IBEX, all the server components (and the IBEX client, for that matter) are independent processes that can run anywhere on the ISIS network. This means that IBEX has a much more flexible architecture - new components can be introduced into the architecture more easily, control processes can be distributed across multiple PCs (if necessary), instruments can more easily share infrastructure. + +In most cases, the IBEX server components will continue to run (as independent processes) on a single control PC. However, depending on individual circumstances, some server components will run on additional control PCs. For example, some devices have their own control PC (e.g. cameras on IMAT). The IBEX architecture provides the flexibility to accommodate such arrangements in a transparent fashion. Introduction to genie_python ------------------------------------------------ From 17dc77ee36f3d274292978461612ff76ccf3dba8 Mon Sep 17 00:00:00 2001 From: Gollum Date: Wed, 7 Sep 2016 11:09:19 +0100 Subject: [PATCH 0276/1813] Updated WhatIsIBEX (rest) --- Introduction/WhatIsIBEX.rest | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Introduction/WhatIsIBEX.rest b/Introduction/WhatIsIBEX.rest index 3fa18d3..b3fef95 100644 --- a/Introduction/WhatIsIBEX.rest +++ b/Introduction/WhatIsIBEX.rest @@ -25,7 +25,7 @@ It is important to realise that the IBEX client is not the instrument control pr In SECI, the LabVIEW VIs all run as processes on a single PC - the instrument control PC. By contrast, in IBEX, all the server components (and the IBEX client, for that matter) are independent processes that can run anywhere on the ISIS network. This means that IBEX has a much more flexible architecture - new components can be introduced into the architecture more easily, control processes can be distributed across multiple PCs (if necessary), instruments can more easily share infrastructure. -In most cases, the IBEX server components will continue to run (as independent processes) on a single control PC. However, depending on individual circumstances, some server components will run on additional control PCs. For example, some devices have their own control PC (e.g. cameras on IMAT). The IBEX architecture provides the flexibility to accommodate such arrangements in a transparent fashion. +In practice, in most cases, the IBEX server components will continue to run (as independent processes) on a single control PC. However, depending on individual circumstances, we will choose to run some server components on additional control PCs. For example, some devices have their own dedicated control PC (e.g. cameras on IMAT). The IBEX architecture provides the flexibility to accommodate such arrangements in a transparent fashion. Introduction to genie_python ------------------------------------------------ From 553ce61380991608a1f6b5ecd7a79f265ed5d20b Mon Sep 17 00:00:00 2001 From: Gollum Date: Wed, 7 Sep 2016 11:25:08 +0100 Subject: [PATCH 0277/1813] Updated WhatIsIBEX (rest) --- Introduction/WhatIsIBEX.rest | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Introduction/WhatIsIBEX.rest b/Introduction/WhatIsIBEX.rest index b3fef95..e52f21f 100644 --- a/Introduction/WhatIsIBEX.rest +++ b/Introduction/WhatIsIBEX.rest @@ -25,7 +25,7 @@ It is important to realise that the IBEX client is not the instrument control pr In SECI, the LabVIEW VIs all run as processes on a single PC - the instrument control PC. By contrast, in IBEX, all the server components (and the IBEX client, for that matter) are independent processes that can run anywhere on the ISIS network. This means that IBEX has a much more flexible architecture - new components can be introduced into the architecture more easily, control processes can be distributed across multiple PCs (if necessary), instruments can more easily share infrastructure. -In practice, in most cases, the IBEX server components will continue to run (as independent processes) on a single control PC. However, depending on individual circumstances, we will choose to run some server components on additional control PCs. For example, some devices have their own dedicated control PC (e.g. cameras on IMAT). The IBEX architecture provides the flexibility to accommodate such arrangements in a transparent fashion. +In practice, in most cases, the IBEX server components will continue to run (as independent processes) on a single control PC. However, depending on individual circumstances, we will choose to run some server components on additional control PCs. For example, some devices have their own dedicated control PC (e.g. cameras on IMAT). By contrast, some instruments (e.g. muon instruments) need to share infrastructure (again, controlled by a dedicated PC). The IBEX architecture provides the flexibility to accommodate both types of arrangement in a transparent fashion. Introduction to genie_python ------------------------------------------------ From 7aa72485a9b85c08f5a8a512da1cc7d38403f29f Mon Sep 17 00:00:00 2001 From: Gollum Date: Thu, 8 Sep 2016 13:13:34 +0100 Subject: [PATCH 0278/1813] Updated CreateandManageScripts (rest) --- CreateandManageScripts.rest | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/CreateandManageScripts.rest b/CreateandManageScripts.rest index a3843dd..ec09694 100644 --- a/CreateandManageScripts.rest +++ b/CreateandManageScripts.rest @@ -17,7 +17,9 @@ You can choose whichever method you prefer. Creating Scripts ---------------- -You can create Python scripts to run on IBEX using your favourite text editor or Python programming environment. +You can create Python scripts to run on IBEX using your favourite text editor (e.g. Notepad++) or Python programming environment. + +**Tip:** Configure your text editor or Python programming environment to replace tabs with spaces. genie_python Library -------------------- From d54f3b01413e5ce8ae9ba4f1a14c6245ee88971d Mon Sep 17 00:00:00 2001 From: Gollum Date: Thu, 8 Sep 2016 13:21:33 +0100 Subject: [PATCH 0279/1813] Updated CreateandManageScripts (rest) --- CreateandManageScripts.rest | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/CreateandManageScripts.rest b/CreateandManageScripts.rest index ec09694..02e2f2a 100644 --- a/CreateandManageScripts.rest +++ b/CreateandManageScripts.rest @@ -44,3 +44,10 @@ To run scripts via a command window, you must first log into you the control ser **Please note:** When you are running scripts, the script is being executed on the instrument control PC. This means that the script itself has to be stored on the instrument control PC. It also means that any path names in your scripts refer to locations on the instrument control PC (unless you are referring to network drives). +Guidance for Writing Scripts +---------------------------- +We have compiled a number of pages providing guidance on writing scripts. + +* [[GeneralScriptGuidance]] +* [[MuonFEScriptGuidance]] + From b538059fd97936330fafefd8472bea26f6646820 Mon Sep 17 00:00:00 2001 From: Gollum Date: Thu, 8 Sep 2016 13:31:24 +0100 Subject: [PATCH 0280/1813] Created MuonFEScriptGuidance (rest) --- MuonFEScriptGuidance.rest | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 MuonFEScriptGuidance.rest diff --git a/MuonFEScriptGuidance.rest b/MuonFEScriptGuidance.rest new file mode 100644 index 0000000..94434b7 --- /dev/null +++ b/MuonFEScriptGuidance.rest @@ -0,0 +1,34 @@ +.. MuonFEScriptGuidance: + +Guidance on Writing Scripts for the Muon Front-End +=================================================== + +This page contains guidance on writing scripts for the Muon Front-End control PC (NDEMUONFE). The information on this page is specific to NDEMUONFE and is not relevant to other control PCs. + +Contents +--------- + +#. `Starting & Stopping Runs Remotely`_ +#. `Using Blocks to Write Tuning Control Scripts`_ +#. `How to Switch between Access Gateway Setups`_ +#. `How to Re-apply Settings`_ + +Starting & Stopping Runs Remotely +--------------------------------- + +Insert documentation explaining how to start/stop runs on each instrument remotely. + +Using Blocks to Write Tuning Control Scripts +-------------------------------------------- + +Insert documentation explaining how to access the blocks on `IN:MUONFE` to write the tuning control scripts via Mantid/Genie Python. + +How to Switch between Access Gateway Setups +------------------------------------------- + +Insert documentation detailing the methods to switch between access gateway setups. + +How to Re-apply Settings +------------------------ + +Insert documentation covering the easy re-apply settings procedure From 181a07979490a0214edeb685eb26f14d4439b188 Mon Sep 17 00:00:00 2001 From: Gollum Date: Thu, 8 Sep 2016 13:32:28 +0100 Subject: [PATCH 0281/1813] Updated MuonFEScriptGuidance (rest) --- MuonFEScriptGuidance.rest | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/MuonFEScriptGuidance.rest b/MuonFEScriptGuidance.rest index 94434b7..f6c6631 100644 --- a/MuonFEScriptGuidance.rest +++ b/MuonFEScriptGuidance.rest @@ -18,17 +18,25 @@ Starting & Stopping Runs Remotely Insert documentation explaining how to start/stop runs on each instrument remotely. +Return to `Contents`_. + Using Blocks to Write Tuning Control Scripts -------------------------------------------- Insert documentation explaining how to access the blocks on `IN:MUONFE` to write the tuning control scripts via Mantid/Genie Python. +Return to `Contents`_. + How to Switch between Access Gateway Setups ------------------------------------------- Insert documentation detailing the methods to switch between access gateway setups. +Return to `Contents`_. + How to Re-apply Settings ------------------------ Insert documentation covering the easy re-apply settings procedure + +Return to `Contents`_. From ec5944ec0adff2565a2d9e28a710803308303208 Mon Sep 17 00:00:00 2001 From: Gollum Date: Thu, 8 Sep 2016 13:35:41 +0100 Subject: [PATCH 0282/1813] Updated CreateandManageScripts (rest) --- CreateandManageScripts.rest | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/CreateandManageScripts.rest b/CreateandManageScripts.rest index 02e2f2a..da93f28 100644 --- a/CreateandManageScripts.rest +++ b/CreateandManageScripts.rest @@ -7,12 +7,15 @@ In IBEX, the scripting language is Python, augmented by the genie_python library The `genie_python Library`_ replicates the command set in the existing Open-Genie command environment used with the SECI instrument control system. This make it relatively easy to migrate existing Open-Genie scripts to the Python/genie_python environment. -There are two ways to run scripts on IBEX: +Contents +-------- +#. `Creating Scripts`_ +#. `genie_python Library`_ #. `Running Scripts via the IBEX Client`_ #. `Running Scripts via a Command Window`_ +#. `Guidance for Writing Scripts`_ -You can choose whichever method you prefer. Creating Scripts ---------------- @@ -21,12 +24,16 @@ You can create Python scripts to run on IBEX using your favourite text editor (e **Tip:** Configure your text editor or Python programming environment to replace tabs with spaces. +Return to `Contents`_. + genie_python Library -------------------- The `genie_python Reference `_ describes the full capabilitioes of the genie_python library. +Return to `Contents`_. + Running Scripts via the IBEX Client ----------------------------------- @@ -38,12 +45,16 @@ Once the environment has loaded, you can load and run scripts. **Please note:** When you are running scripts, the script is being executed on the instrument control PC. This means that the script itself has to be stored on the instrument control PC. It also means that any path names in your scripts refer to locations on the instrument control PC (unless you are referring to network drives). +Return to `Contents`_. + Running Scripts via a Command Window ------------------------------------ To run scripts via a command window, you must first log into you the control server PC of your instrument using Remote Desktop Connection or VNC. **Please note:** When you are running scripts, the script is being executed on the instrument control PC. This means that the script itself has to be stored on the instrument control PC. It also means that any path names in your scripts refer to locations on the instrument control PC (unless you are referring to network drives). +Return to `Contents`_. + Guidance for Writing Scripts ---------------------------- We have compiled a number of pages providing guidance on writing scripts. @@ -51,3 +62,4 @@ We have compiled a number of pages providing guidance on writing scripts. * [[GeneralScriptGuidance]] * [[MuonFEScriptGuidance]] +Return to `Contents`_. From 4984e56240cfe9b3528741a9d35000eac89722c9 Mon Sep 17 00:00:00 2001 From: Gollum Date: Thu, 8 Sep 2016 13:37:00 +0100 Subject: [PATCH 0283/1813] Updated MuonFEScriptGuidance (rest) --- MuonFEScriptGuidance.rest | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MuonFEScriptGuidance.rest b/MuonFEScriptGuidance.rest index f6c6631..16aac06 100644 --- a/MuonFEScriptGuidance.rest +++ b/MuonFEScriptGuidance.rest @@ -23,7 +23,7 @@ Return to `Contents`_. Using Blocks to Write Tuning Control Scripts -------------------------------------------- -Insert documentation explaining how to access the blocks on `IN:MUONFE` to write the tuning control scripts via Mantid/Genie Python. +Insert documentation explaining how to access the blocks on ``IN:MUONFE`` to write the tuning control scripts via Mantid/Genie Python. Return to `Contents`_. From f35fa20308eee3846144a69c67cb93768115bd55 Mon Sep 17 00:00:00 2001 From: Gollum Date: Thu, 8 Sep 2016 13:41:36 +0100 Subject: [PATCH 0284/1813] Updated MuonFEScriptGuidance (rest) --- MuonFEScriptGuidance.rest | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/MuonFEScriptGuidance.rest b/MuonFEScriptGuidance.rest index 16aac06..8dd0631 100644 --- a/MuonFEScriptGuidance.rest +++ b/MuonFEScriptGuidance.rest @@ -18,6 +18,10 @@ Starting & Stopping Runs Remotely Insert documentation explaining how to start/stop runs on each instrument remotely. +:: + + Provide some handy sample code by replacing this text. + Return to `Contents`_. Using Blocks to Write Tuning Control Scripts @@ -25,6 +29,10 @@ Using Blocks to Write Tuning Control Scripts Insert documentation explaining how to access the blocks on ``IN:MUONFE`` to write the tuning control scripts via Mantid/Genie Python. +:: + + Provide some handy sample code by replacing this text. + Return to `Contents`_. How to Switch between Access Gateway Setups @@ -32,6 +40,10 @@ How to Switch between Access Gateway Setups Insert documentation detailing the methods to switch between access gateway setups. +:: + + Provide some handy sample code by replacing this text. + Return to `Contents`_. How to Re-apply Settings @@ -39,4 +51,8 @@ How to Re-apply Settings Insert documentation covering the easy re-apply settings procedure +:: + + Provide some handy sample code by replacing this text. + Return to `Contents`_. From 4ec6dea4bd391fe7e955b3f0b932b4eb90eaaa20 Mon Sep 17 00:00:00 2001 From: Gollum Date: Thu, 8 Sep 2016 15:10:09 +0100 Subject: [PATCH 0285/1813] Updated StartingAndStoppingIBEX (rest) --- Introduction/StartingAndStoppingIBEX.rest | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Introduction/StartingAndStoppingIBEX.rest b/Introduction/StartingAndStoppingIBEX.rest index c3b392d..3996fd2 100644 --- a/Introduction/StartingAndStoppingIBEX.rest +++ b/Introduction/StartingAndStoppingIBEX.rest @@ -15,6 +15,8 @@ If you have not used IBEX for some time, it might not appear on the list of freq Alternatively, if you created a desktop short-cut to the IBEX client, simply double-click on the icon. +**Tip:** If you are using Windows Classic theme on your PC, you might prefer to switch to a more modern theme - IBEX looks much better when running in a modern theme. + Stopping IBEX Client ~~~~~~~~~~~~~~~~~~~~ From 67a3f23c1e521534c83521afab7bd4dbefa254d3 Mon Sep 17 00:00:00 2001 From: Gollum Date: Thu, 8 Sep 2016 16:06:08 +0100 Subject: [PATCH 0286/1813] Added some content about re-applying settings --- MuonFEScriptGuidance.rest | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/MuonFEScriptGuidance.rest b/MuonFEScriptGuidance.rest index 8dd0631..79bab28 100644 --- a/MuonFEScriptGuidance.rest +++ b/MuonFEScriptGuidance.rest @@ -49,7 +49,9 @@ Return to `Contents`_. How to Re-apply Settings ------------------------ -Insert documentation covering the easy re-apply settings procedure +IOCs controlling Power Supply Units have the option to re-apply their set-points (current, voltage, status on/off). +To do this, the configuration in use must be setup in the following way: + :: From b4974398fd20fe49e7400a47ce15954bd54faaab Mon Sep 17 00:00:00 2001 From: Gollum Date: Thu, 8 Sep 2016 16:20:05 +0100 Subject: [PATCH 0287/1813] Updated content for how to re-apply settings --- MuonFEScriptGuidance.rest | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/MuonFEScriptGuidance.rest b/MuonFEScriptGuidance.rest index 79bab28..76744c0 100644 --- a/MuonFEScriptGuidance.rest +++ b/MuonFEScriptGuidance.rest @@ -49,12 +49,17 @@ Return to `Contents`_. How to Re-apply Settings ------------------------ -IOCs controlling Power Supply Units have the option to re-apply their set-points (current, voltage, status on/off). -To do this, the configuration in use must be setup in the following way: +IOCs controlling Power Supply Units have the option to re-apply their set-points (current, voltage, status on/off) the next time they are restarted. +To do this, the relevant configuration must be setup in the following way (through the "Edit Configuration" dialog): +#. In the "IOCs" tab, make sure both the "Auto-start?" and "Auto-restart?" boxes for the IOC are checked +#. In the "IOC Macros" tab, select the correct IOC and set the macro "SP_AT_STARTUP" to "YES" (default is "NO") +The set-points can be re-applied by reloading the current configuration (which will restart the IOCs), with the following genie_python command: :: - Provide some handy sample code by replacing this text. + reload_current_config() + +Note that the set-points can also be re-applied by restarting the IOCs individually in the IBEX GUI (as long as the "SP_AT_STARTUP" macro is set as above). Return to `Contents`_. From 5a5eab273863d5ca576a511a83ea50cc57c94b87 Mon Sep 17 00:00:00 2001 From: Gollum Date: Thu, 8 Sep 2016 16:20:33 +0100 Subject: [PATCH 0288/1813] formatting --- MuonFEScriptGuidance.rest | 2 ++ 1 file changed, 2 insertions(+) diff --git a/MuonFEScriptGuidance.rest b/MuonFEScriptGuidance.rest index 76744c0..e19f48d 100644 --- a/MuonFEScriptGuidance.rest +++ b/MuonFEScriptGuidance.rest @@ -50,7 +50,9 @@ How to Re-apply Settings ------------------------ IOCs controlling Power Supply Units have the option to re-apply their set-points (current, voltage, status on/off) the next time they are restarted. + To do this, the relevant configuration must be setup in the following way (through the "Edit Configuration" dialog): + #. In the "IOCs" tab, make sure both the "Auto-start?" and "Auto-restart?" boxes for the IOC are checked #. In the "IOC Macros" tab, select the correct IOC and set the macro "SP_AT_STARTUP" to "YES" (default is "NO") From b9a8df31e2ae34bace7c42594c9dd88349e3ccb7 Mon Sep 17 00:00:00 2001 From: Gollum Date: Fri, 9 Sep 2016 09:21:14 +0100 Subject: [PATCH 0289/1813] Updated MuonFEScriptGuidance (rest) --- MuonFEScriptGuidance.rest | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/MuonFEScriptGuidance.rest b/MuonFEScriptGuidance.rest index e19f48d..fa4759e 100644 --- a/MuonFEScriptGuidance.rest +++ b/MuonFEScriptGuidance.rest @@ -51,10 +51,11 @@ How to Re-apply Settings IOCs controlling Power Supply Units have the option to re-apply their set-points (current, voltage, status on/off) the next time they are restarted. -To do this, the relevant configuration must be setup in the following way (through the "Edit Configuration" dialog): +To do this, the relevant configuration must be setup in the following way: -#. In the "IOCs" tab, make sure both the "Auto-start?" and "Auto-restart?" boxes for the IOC are checked -#. In the "IOC Macros" tab, select the correct IOC and set the macro "SP_AT_STARTUP" to "YES" (default is "NO") +#. Open the Edit Configuration dialog (by selecting ``Configurations > Edit`` from the ``Configuration`` menu). +#. In the ``IOCs`` tab, locate the correct IOC and make sure both the ``Auto-start?`` and ``Auto-restart?`` boxes for the IOC are checked. +#. In the ``IOC Macros`` tab, select the correct IOC and set the macro ``SP_AT_STARTUP`` to ``YES`` (default is ``NO``). The set-points can be re-applied by reloading the current configuration (which will restart the IOCs), with the following genie_python command: @@ -62,6 +63,6 @@ The set-points can be re-applied by reloading the current configuration (which w reload_current_config() -Note that the set-points can also be re-applied by restarting the IOCs individually in the IBEX GUI (as long as the "SP_AT_STARTUP" macro is set as above). +Note that the set-points can also be re-applied by restarting the IOCs individually in the IBEX GUI (as long as the ``SP_AT_STARTUP`` macro is set as above). Return to `Contents`_. From c6810b8a2331904799c6fe7be488a35d82fc6ee8 Mon Sep 17 00:00:00 2001 From: Gollum Date: Wed, 14 Sep 2016 09:45:57 +0100 Subject: [PATCH 0290/1813] Updated MuonFEScriptGuidance (rest) --- MuonFEScriptGuidance.rest | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/MuonFEScriptGuidance.rest b/MuonFEScriptGuidance.rest index fa4759e..dfa0704 100644 --- a/MuonFEScriptGuidance.rest +++ b/MuonFEScriptGuidance.rest @@ -16,11 +16,27 @@ Contents Starting & Stopping Runs Remotely --------------------------------- +The relevant code can be found in the github repository: + +https://github.com/ISISComputingGroup/mfe_control_scripts + +The code is written in Python and relies on the win32com module. Please ensure this is installed before running. + +There is a file, run_interactively.py, which can be used to interactively trigger commands on multiple machines. It is currently set up to run on the 3 MFE instrument PCs. You can adjust it by changing the list of machine names in the variable MACHINES. To run just launch the script with Python. + +Note that the script relies on the host machine and user having sufficient DCOM permissions to talk to the three instrument machines. At time of writing, there remains some issue here. In the past, establishing a remote desktop connection with the instrument machine has been sufficient to establish the underlying permissions but this no longer appears to be the case. + +To write your own scripts, use the MultipleDaeController class in Python to issue commands to multiple machines simultaneously. The script run_interactively.py provides a good example of how to use it. + Insert documentation explaining how to start/stop runs on each instrument remotely. :: - Provide some handy sample code by replacing this text. + from multiple_dae_controller import MultipleDaeController + controller = MultipleDaeController() + try: + for m in ["NDXHIFI","NDXMUSR","NDXEMU"] + controller.add_machine(m, WAITFOR_TIMEOUT_SECONDS) Return to `Contents`_. From e6dd925a9c0d093e9002a30190720a6abdf625b0 Mon Sep 17 00:00:00 2001 From: Gollum Date: Wed, 14 Sep 2016 09:45:58 +0100 Subject: [PATCH 0291/1813] Updated MuonFEScriptGuidance (rest) --- MuonFEScriptGuidance.rest | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MuonFEScriptGuidance.rest b/MuonFEScriptGuidance.rest index dfa0704..e09b7e1 100644 --- a/MuonFEScriptGuidance.rest +++ b/MuonFEScriptGuidance.rest @@ -35,7 +35,7 @@ Insert documentation explaining how to start/stop runs on each instrument remote from multiple_dae_controller import MultipleDaeController controller = MultipleDaeController() try: - for m in ["NDXHIFI","NDXMUSR","NDXEMU"] + for m in ["NDXHIFI","NDXMUSR","NDXEMU"]: controller.add_machine(m, WAITFOR_TIMEOUT_SECONDS) Return to `Contents`_. From a1ef95607c00111a2fc94024960acd2edfb160a0 Mon Sep 17 00:00:00 2001 From: Gollum Date: Wed, 14 Sep 2016 09:58:18 +0100 Subject: [PATCH 0292/1813] Updated MuonFEScriptGuidance (rest) --- MuonFEScriptGuidance.rest | 26 +++++++++++++++++++++++--- 1 file changed, 23 insertions(+), 3 deletions(-) diff --git a/MuonFEScriptGuidance.rest b/MuonFEScriptGuidance.rest index e09b7e1..bf25df1 100644 --- a/MuonFEScriptGuidance.rest +++ b/MuonFEScriptGuidance.rest @@ -34,9 +34,29 @@ Insert documentation explaining how to start/stop runs on each instrument remote from multiple_dae_controller import MultipleDaeController controller = MultipleDaeController() - try: - for m in ["NDXHIFI","NDXMUSR","NDXEMU"]: - controller.add_machine(m, WAITFOR_TIMEOUT_SECONDS) + waitfor_seconds = 10 + for m in ["NDXHIFI","NDXMUSR","NDXEMU"]: + controller.add_machine(m,waitfor_seconds) + controller.run_on_all("get_run_state") + controller.run_on_machines("end",["NDXHIFI","NDXMUSR"]) + controller.run_on_machine("begin","NDXEMU") + +The following methods are currently supported: + +- begin +- end +- pause +- resume +- abort +- get_run_state +- get_events +- get_frames +- get_counts +- waitfor_counts +- waitfor_frames +- waitfor_events + + Return to `Contents`_. From d76fe14173211b1fef3e07c6f7e2a485ead523cc Mon Sep 17 00:00:00 2001 From: Gollum Date: Wed, 14 Sep 2016 11:19:09 +0100 Subject: [PATCH 0293/1813] Updated MuonFEScriptGuidance (rest) --- MuonFEScriptGuidance.rest | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/MuonFEScriptGuidance.rest b/MuonFEScriptGuidance.rest index bf25df1..99def99 100644 --- a/MuonFEScriptGuidance.rest +++ b/MuonFEScriptGuidance.rest @@ -24,7 +24,15 @@ The code is written in Python and relies on the win32com module. Please ensure t There is a file, run_interactively.py, which can be used to interactively trigger commands on multiple machines. It is currently set up to run on the 3 MFE instrument PCs. You can adjust it by changing the list of machine names in the variable MACHINES. To run just launch the script with Python. -Note that the script relies on the host machine and user having sufficient DCOM permissions to talk to the three instrument machines. At time of writing, there remains some issue here. In the past, establishing a remote desktop connection with the instrument machine has been sufficient to establish the underlying permissions but this no longer appears to be the case. +Note that the script relies on the host machine and user having sufficient DCOM permissions to talk to the three instrument machines. This can be best achieved through the Windows credential manager. + +1. Go to the start menu +2. Type "Credential Manager" and open the Credential Manager +3. You will need credentials for all the machines you want to connect to. The "Persistence" field for the credentials must be "Enterprise" or higher (not "Local machine"). +4. To add a new credential: + 1. Click "Add a Windows credential" + 2. Enter the credentials (e.g. NDXMUSR, NDXMUSR\spudulike, [PASSWORD]) + 3. Click "OK" To write your own scripts, use the MultipleDaeController class in Python to issue commands to multiple machines simultaneously. The script run_interactively.py provides a good example of how to use it. From 1454047c528ef2fb709e2e9eb67cdf856326cbd8 Mon Sep 17 00:00:00 2001 From: Gollum Date: Wed, 14 Sep 2016 11:19:36 +0100 Subject: [PATCH 0294/1813] Updated MuonFEScriptGuidance (rest) --- MuonFEScriptGuidance.rest | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MuonFEScriptGuidance.rest b/MuonFEScriptGuidance.rest index 99def99..d6d080f 100644 --- a/MuonFEScriptGuidance.rest +++ b/MuonFEScriptGuidance.rest @@ -29,7 +29,7 @@ Note that the script relies on the host machine and user having sufficient DCOM 1. Go to the start menu 2. Type "Credential Manager" and open the Credential Manager 3. You will need credentials for all the machines you want to connect to. The "Persistence" field for the credentials must be "Enterprise" or higher (not "Local machine"). -4. To add a new credential: +4. To add a new credential 1. Click "Add a Windows credential" 2. Enter the credentials (e.g. NDXMUSR, NDXMUSR\spudulike, [PASSWORD]) 3. Click "OK" From e2dcad85366ad26b1381c2549fb47e0e6c948740 Mon Sep 17 00:00:00 2001 From: John Holt Date: Wed, 14 Sep 2016 11:51:33 +0100 Subject: [PATCH 0295/1813] Updated Home (rest) --- Home.rest | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/Home.rest b/Home.rest index 3cfeba6..7e89130 100644 --- a/Home.rest +++ b/Home.rest @@ -18,17 +18,17 @@ Indices and Tables * :ref:`search` * :ref:`glossary` -[[WhatIsIBEX]] +[[What Is IBEX|WhatIsIBEX]] -[[InstallingIBEX]] +[[Installing IBEX|InstallingIBEX]] -[[StartingAndStoppingIBEX]] +[[Starting And Stopping IBEX|StartingAndStoppingIBEX]] -[[KeyConceptsinIBEX]] +[[Key Concepts in IBEX|KeyConceptsinIBEX]] -[[IBEXGUIFeatures]] +[[IBEX GUI Features|IBEXGUIFeatures]] -[[HowToDoThingsInIBEX]] +[[How To Do Things In IBEX|HowToDoThingsInIBEX]] [[FAQ]] From b72c405821daf70975aa2a393eb967804b6f489a Mon Sep 17 00:00:00 2001 From: John Holt Date: Wed, 14 Sep 2016 11:52:24 +0100 Subject: [PATCH 0296/1813] Updated Home (rest) --- Home.rest | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Home.rest b/Home.rest index 7e89130..f5d5ea5 100644 --- a/Home.rest +++ b/Home.rest @@ -5,7 +5,7 @@ IBEX User Manual :maxdepth: 2 :numbered: - Introduction/WhatIsIBEX.rest + What Is IBEX|Introduction/WhatIsIBEX.rest Introduction/StartingAndStoppingIBEX.rest Concepts/ProcessVariables.rest Concepts/Blocks.rest From b6f7feb50a3e15ad74f7b0d3e6601000378c7f7b Mon Sep 17 00:00:00 2001 From: John Holt Date: Wed, 14 Sep 2016 11:52:59 +0100 Subject: [PATCH 0297/1813] Updated Home (rest) --- Home.rest | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Home.rest b/Home.rest index f5d5ea5..7e89130 100644 --- a/Home.rest +++ b/Home.rest @@ -5,7 +5,7 @@ IBEX User Manual :maxdepth: 2 :numbered: - What Is IBEX|Introduction/WhatIsIBEX.rest + Introduction/WhatIsIBEX.rest Introduction/StartingAndStoppingIBEX.rest Concepts/ProcessVariables.rest Concepts/Blocks.rest From 273abf4959ed5a861abe216ea4b6f03c711f0354 Mon Sep 17 00:00:00 2001 From: John Holt Date: Wed, 14 Sep 2016 11:54:20 +0100 Subject: [PATCH 0298/1813] Updated WhatIsIBEX (rest) --- Introduction/WhatIsIBEX.rest => What-Is-IBEX.rest | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename Introduction/WhatIsIBEX.rest => What-Is-IBEX.rest (100%) diff --git a/Introduction/WhatIsIBEX.rest b/What-Is-IBEX.rest similarity index 100% rename from Introduction/WhatIsIBEX.rest rename to What-Is-IBEX.rest From 740a64a489073bfbda19cdfa2cbcd029809f7795 Mon Sep 17 00:00:00 2001 From: John Holt Date: Wed, 14 Sep 2016 11:54:31 +0100 Subject: [PATCH 0299/1813] Updated What Is IBEX (rest) --- What-Is-IBEX.rest => WhatIsIBEX.rest | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename What-Is-IBEX.rest => WhatIsIBEX.rest (100%) diff --git a/What-Is-IBEX.rest b/WhatIsIBEX.rest similarity index 100% rename from What-Is-IBEX.rest rename to WhatIsIBEX.rest From 116242d8aaff32e5ac4e188fa43b3332264243f2 Mon Sep 17 00:00:00 2001 From: John Holt Date: Wed, 14 Sep 2016 11:55:53 +0100 Subject: [PATCH 0300/1813] Updated IBEXGUIFeatures (rest) --- IBEXGUIFeatures.rest | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/IBEXGUIFeatures.rest b/IBEXGUIFeatures.rest index 418ca10..dc650e6 100644 --- a/IBEXGUIFeatures.rest +++ b/IBEXGUIFeatures.rest @@ -5,14 +5,14 @@ This section summarises the main features of IBEX as presented by the IBEX GUI c You might find it helpful to refer to a `schematic view of the IBEX UI `_ while reading this section. -[[MenuBar]] +[[Menu Bar|MenuBar]] [[Dashboard]] -[[BlocksandGroups]] +[[Blocks and Groups|BlocksandGroups]] [[Views]] -[[NotificationBanner]] +[[Notification Banner|NotificationBanner]] -[[StatusBar]] +[[Status Bar|StatusBar]] From c2f009bbf1200ec9df219f95294e76bc67714cdc Mon Sep 17 00:00:00 2001 From: John Holt Date: Wed, 14 Sep 2016 11:59:01 +0100 Subject: [PATCH 0301/1813] Updated HowToDoThingsInIBEX (rest) --- HowToDoThingsInIBEX.rest | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/HowToDoThingsInIBEX.rest b/HowToDoThingsInIBEX.rest index 666c3c4..89422cd 100644 --- a/HowToDoThingsInIBEX.rest +++ b/HowToDoThingsInIBEX.rest @@ -5,18 +5,18 @@ How To Do Things In IBEX In this section of the IBEX User Manual, we describe how to do the most common and important tasks. -[[CreateandManageConfigurations]] +[[Create and Manage Configurations|CreateandManageConfigurations]] -[[CreateandManageComponents]] +[[Create and Manage Components|CreateandManageComponents]] -[[StartandStopIOCs]] +[[Start and Stop IOCs|StartandStopIOCs]] -[[NavigateSynoptics]] +[[Navigate Synoptics|NavigateSynoptics]] -[[CreateandManageSynoptics]] +[[Create and Manage Synoptics|CreateandManageSynoptics]] -[[CreateandManageScripts]] +[[Create and Manage Scripts|CreateandManageScripts]] -[[ManagetheDAE]] +[[Manage the DAE|ManagetheDAE]] -[[PlotaBlockGraph]] +[[Plot a Block Graph|PlotaBlockGraph]] From 793c3d6ecce52b7c1defc6884e7cb15605b143f9 Mon Sep 17 00:00:00 2001 From: John Holt Date: Wed, 14 Sep 2016 12:29:28 +0100 Subject: [PATCH 0302/1813] Updated CreateandManageConfigurations (rest) --- CreateandManageConfigurations.rest | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/CreateandManageConfigurations.rest b/CreateandManageConfigurations.rest index fe2effe..e30a6a8 100644 --- a/CreateandManageConfigurations.rest +++ b/CreateandManageConfigurations.rest @@ -190,14 +190,18 @@ Return to `Contents`_. IOC PV Values ~~~~~~~~~~~~~ -**TO DO** +IOC PV Values allows you to set the values of a PV when the configuration is first loaded. For example setting a experimental parameter on first load. + +**Note**: The value of a PV will remain until it is set to something else. So if a configuration sets it loading another configuration will not set it back to what it was before. Return to `Contents`_. IOC PV Sets ~~~~~~~~~~~ -**TO DO** +IOC PV Sets is an experimental feature within IBEX **do not** use this before talking to the IBEX team. It can be used to load in autosaved values from a specific file setup beforehand. + +**Note**: The value of any PVs will remain until it is set to something else. So if a configuration does this auto load then loading another configuration will not set it back to what it was before. Return to `Contents`_. From 158d992ecd5fed545cec9cc3d951932ee8119b1d Mon Sep 17 00:00:00 2001 From: Gollum Date: Mon, 19 Sep 2016 13:15:55 +0100 Subject: [PATCH 0303/1813] Updated FAQ (rest) --- FAQ.rest | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/FAQ.rest b/FAQ.rest index bf5449f..e3d728f 100644 --- a/FAQ.rest +++ b/FAQ.rest @@ -13,7 +13,7 @@ List of Frequently Asked Questions #. `How do I install IBEX Client?`_ #. `How do I start IBEX Server?`_ #. `How do I stop IBEX Server?`_ -#. `This is the sixth question`_ +#. `Can I run IBEX and SECI at the same time?`_ #. `This is the seventh question`_ #. `This is the eighth question`_ #. `This is the ninth question`_ @@ -59,9 +59,11 @@ Return_ Return_ -.. _`This is the sixth question`: +.. _`Can I run IBEX and SECI at the same time?`: -This is the sixth answer. +**Q: Can I run IBEX and SECI at the same time?** + +**A:** In a word - No. Running two control programs on any system is a bad idea - which program has control? If you were to run IBEX and SECI on the same system, the two would contend for control of individual devices. It would not be clear which device was controlled by which program. The results would be unpredictable. Return_ From bcd6ebdcb6b760332afbb344e500c52c50ac6bcd Mon Sep 17 00:00:00 2001 From: Gollum Date: Tue, 20 Sep 2016 14:01:45 +0100 Subject: [PATCH 0304/1813] Updated InstallingIBEX (rest) --- InstallingIBEX.rest | 24 ++++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/InstallingIBEX.rest b/InstallingIBEX.rest index 049a96e..e3dd8d5 100644 --- a/InstallingIBEX.rest +++ b/InstallingIBEX.rest @@ -45,12 +45,24 @@ Installation cd \\isis\inst$\Kits$\CompGroup\ICP\Releases -3. Inside this folder you will see folders with names of the form ``BUILDmmm``, where ``mmm`` is a - three-digit number and folders with names of the form ``BUILD-nnnn``, where ``nnnn`` is a four-digit - number. Ignore the folders with names of the form ``BUILD-nnnn``. Change directory to the folder - ``BUILDmmm`` with the highest value of ``mmm``. +3. Inside this folder you will see a list of folders resembling the following: -4. Run the command ``install_client.bat``. This will copy the contents of the above directory +:: + + 2.0.0 + 2.1.0 + ... + EPICS + genie_python_release + + +Change to the folder with the highest value of ``N.M.O`` (e.g. ``cd 2.1.0`` in the above example). + +4. In the folder ``N.M.O``, change to the Client folder: ``cd Client`` + +5. In the folder ``Client ``, change to the folder named ``BUILDmmm``: ``cd BUILDmmm`` + +6. Run the command ``install_client.bat``. This will copy the contents of the above directory to ``C:\Instrument\Apps\Client``. It will also install genie_python. -5. You might find it convenient to create a desktop shortcut to use to launch the IBEX client. The path to the IBEX Client executable is ``C:\Instrument\Apps\Client\ibex-client.exe``. +7. You might find it convenient to create a desktop shortcut to use to launch the IBEX client. The path to the IBEX Client executable is ``C:\Instrument\Apps\Client\ibex-client.exe``. From b145019a25e9393f1e50c7b1614994ec621b5fd0 Mon Sep 17 00:00:00 2001 From: Gollum Date: Tue, 20 Sep 2016 14:03:04 +0100 Subject: [PATCH 0305/1813] Updated InstallingIBEX (rest) --- InstallingIBEX.rest | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/InstallingIBEX.rest b/InstallingIBEX.rest index e3dd8d5..967cd7e 100644 --- a/InstallingIBEX.rest +++ b/InstallingIBEX.rest @@ -60,7 +60,7 @@ Change to the folder with the highest value of ``N.M.O`` (e.g. ``cd 2.1.0`` in t 4. In the folder ``N.M.O``, change to the Client folder: ``cd Client`` -5. In the folder ``Client ``, change to the folder named ``BUILDmmm``: ``cd BUILDmmm`` +5. In the folder ``Client``, change to the folder named ``BUILDmmm``: ``cd BUILDmmm`` 6. Run the command ``install_client.bat``. This will copy the contents of the above directory to ``C:\Instrument\Apps\Client``. It will also install genie_python. From 214af93270444af22654db2d2506340000e5f1da Mon Sep 17 00:00:00 2001 From: Gollum Date: Mon, 26 Sep 2016 09:57:29 +0100 Subject: [PATCH 0306/1813] Updated MuonFEScriptGuidance (rest) --- MuonFEScriptGuidance.rest | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MuonFEScriptGuidance.rest b/MuonFEScriptGuidance.rest index d6d080f..49a3809 100644 --- a/MuonFEScriptGuidance.rest +++ b/MuonFEScriptGuidance.rest @@ -31,7 +31,7 @@ Note that the script relies on the host machine and user having sufficient DCOM 3. You will need credentials for all the machines you want to connect to. The "Persistence" field for the credentials must be "Enterprise" or higher (not "Local machine"). 4. To add a new credential 1. Click "Add a Windows credential" - 2. Enter the credentials (e.g. NDXMUSR, NDXMUSR\spudulike, [PASSWORD]) + 2. Enter the credentials (e.g. NDXMUSR, NDXMUSR\\spudulike, [PASSWORD]) 3. Click "OK" To write your own scripts, use the MultipleDaeController class in Python to issue commands to multiple machines simultaneously. The script run_interactively.py provides a good example of how to use it. From 2f8dfd7103b7a56458383489854c10f573d391d2 Mon Sep 17 00:00:00 2001 From: Gollum Date: Mon, 26 Sep 2016 13:56:05 +0100 Subject: [PATCH 0307/1813] Updated StartingAndStoppingIBEX (rest) --- Introduction/StartingAndStoppingIBEX.rest | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/Introduction/StartingAndStoppingIBEX.rest b/Introduction/StartingAndStoppingIBEX.rest index 3996fd2..da76d45 100644 --- a/Introduction/StartingAndStoppingIBEX.rest +++ b/Introduction/StartingAndStoppingIBEX.rest @@ -17,6 +17,13 @@ Alternatively, if you created a desktop short-cut to the IBEX client, simply dou **Tip:** If you are using Windows Classic theme on your PC, you might prefer to switch to a more modern theme - IBEX looks much better when running in a modern theme. +**Tip:** If you see the following message on attempting to start the IBEX Client: + +:: +Java was started but returned exit code=13 + +it is because you are running the 32-bit version of Java. You need to install the 64-bit version of Java. + Stopping IBEX Client ~~~~~~~~~~~~~~~~~~~~ From 39d06d06e63de370445fe164a73d46b3d3bf9560 Mon Sep 17 00:00:00 2001 From: Gollum Date: Mon, 26 Sep 2016 13:57:22 +0100 Subject: [PATCH 0308/1813] Updated StartingAndStoppingIBEX (rest) --- Introduction/StartingAndStoppingIBEX.rest | 3 ++- Introduction/_Sidebar.rest | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/Introduction/StartingAndStoppingIBEX.rest b/Introduction/StartingAndStoppingIBEX.rest index da76d45..55ca5d6 100644 --- a/Introduction/StartingAndStoppingIBEX.rest +++ b/Introduction/StartingAndStoppingIBEX.rest @@ -20,9 +20,10 @@ Alternatively, if you created a desktop short-cut to the IBEX client, simply dou **Tip:** If you see the following message on attempting to start the IBEX Client: :: + Java was started but returned exit code=13 -it is because you are running the 32-bit version of Java. You need to install the 64-bit version of Java. +it is because you are running the 32-bit version of Java. You need to install the 64-bit version of Java (see [[InstallingIBEX]]). Stopping IBEX Client ~~~~~~~~~~~~~~~~~~~~ diff --git a/Introduction/_Sidebar.rest b/Introduction/_Sidebar.rest index 9d4bd94..12c3963 100644 --- a/Introduction/_Sidebar.rest +++ b/Introduction/_Sidebar.rest @@ -1,2 +1,3 @@ * [[WhatIsIBEX]] +* [[InstallingIBEX]] * [[StartingAndStoppingIBEX]] From 139f9f91e3369a0c05bb69329f13556fa06df73a Mon Sep 17 00:00:00 2001 From: Gollum Date: Mon, 26 Sep 2016 13:59:18 +0100 Subject: [PATCH 0309/1813] Updated StartingAndStoppingIBEX (rest) --- Introduction/StartingAndStoppingIBEX.rest | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Introduction/StartingAndStoppingIBEX.rest b/Introduction/StartingAndStoppingIBEX.rest index 55ca5d6..a37e12a 100644 --- a/Introduction/StartingAndStoppingIBEX.rest +++ b/Introduction/StartingAndStoppingIBEX.rest @@ -21,7 +21,7 @@ Alternatively, if you created a desktop short-cut to the IBEX client, simply dou :: -Java was started but returned exit code=13 + Java was started but returned exit code=13 it is because you are running the 32-bit version of Java. You need to install the 64-bit version of Java (see [[InstallingIBEX]]). From b591db679df6e1a5e60489f51c65f10ec2108e7d Mon Sep 17 00:00:00 2001 From: Gollum Date: Mon, 26 Sep 2016 22:51:51 +0100 Subject: [PATCH 0310/1813] Updated Home (rest) --- Home.rest | 4 ---- 1 file changed, 4 deletions(-) diff --git a/Home.rest b/Home.rest index 7e89130..6ba24ef 100644 --- a/Home.rest +++ b/Home.rest @@ -1,9 +1,5 @@ IBEX User Manual ================ - -.. toctree:: - :maxdepth: 2 - :numbered: Introduction/WhatIsIBEX.rest Introduction/StartingAndStoppingIBEX.rest From 1f30cfce17737ac61ac1fa555dcad03b525e7bcd Mon Sep 17 00:00:00 2001 From: Gollum Date: Mon, 26 Sep 2016 22:53:05 +0100 Subject: [PATCH 0311/1813] Updated Home (rest) --- Home.rest | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/Home.rest b/Home.rest index 6ba24ef..c30b5a1 100644 --- a/Home.rest +++ b/Home.rest @@ -1,19 +1,3 @@ -IBEX User Manual -================ - - Introduction/WhatIsIBEX.rest - Introduction/StartingAndStoppingIBEX.rest - Concepts/ProcessVariables.rest - Concepts/Blocks.rest - Glossary.rest - -Indices and Tables -================== - -* :ref:`genindex` -* :ref:`search` -* :ref:`glossary` - [[What Is IBEX|WhatIsIBEX]] [[Installing IBEX|InstallingIBEX]] From 4347a6a0074925009ca89c5931ae9a98e520499f Mon Sep 17 00:00:00 2001 From: Gollum Date: Wed, 28 Sep 2016 15:20:59 +0100 Subject: [PATCH 0312/1813] Updated MuonFEScriptGuidance (rest) --- MuonFEScriptGuidance.rest | 39 ++++++++++++++++++++++++++++++++++----- 1 file changed, 34 insertions(+), 5 deletions(-) diff --git a/MuonFEScriptGuidance.rest b/MuonFEScriptGuidance.rest index 49a3809..0e5b8a7 100644 --- a/MuonFEScriptGuidance.rest +++ b/MuonFEScriptGuidance.rest @@ -71,22 +71,51 @@ Return to `Contents`_. Using Blocks to Write Tuning Control Scripts -------------------------------------------- -Insert documentation explaining how to access the blocks on ``IN:MUONFE`` to write the tuning control scripts via Mantid/Genie Python. +A configuration with blocks should be created as for any IBEX instrument on NDEMUONFE. +On an appropriate system, import genie_python to Mantid, and set your instrument to be "MUONFE". :: - Provide some handy sample code by replacing this text. + get_blocks() + +You should now get a list of blocks on the remote system. These can then be used as standard for scripting by simply writing to and from those values. Return to `Contents`_. -How to Switch between Access Gateway Setups +How to alter write access to blocks for each instrument ------------------------------------------- -Insert documentation detailing the methods to switch between access gateway setups. +The initial gateway setup has been undertaken. Should the computers being provided control need to be changed, then the gateway should be restarted at the very least, and it would be wise to consider restarting the whole server. + +For any system in R55 which requires full control of all aspects of NDEMUONFE ensure that there is an entry in globals.txt on NDEMUONFE of the format + +:: + + ACF_IH1=computer_name + +You are able to specify up to four of these. + +Gateway settings have been set up to allow NDX and NDL systems to control each instrument respectively (so the items used by MUSR have write access from MUSR). There are more detailed instructions in how to set up these aspects of the gateway in: + +https://github.com/ISISComputingGroup/ibex_developers_manual/wiki/Access-Gateway + +In order to limit the systems listed in globals.txt to read only then sending the following command should be entered into an EPICS prompt: + +:: + + caput IN:MUONFE:CS:EXCLUSIVE 1 + +There is a similar PV for each instrument, so to limit HIFI to read only: + +:: + + caput IN:MUONFE:CS:EXCLUSIVE:HIFI 1 + +Or to allow for writing to the EMU values: :: - Provide some handy sample code by replacing this text. + caput IN:MUONFE:CS:EXCLUSIVE:EMU 0 Return to `Contents`_. From d39aa37dcf9f3e97aa1a0a831dc981ebafa29255 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Wed, 28 Sep 2016 16:15:43 +0100 Subject: [PATCH 0313/1813] Updated Home (rest) --- Home.rest | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Home.rest b/Home.rest index c30b5a1..b7bd381 100644 --- a/Home.rest +++ b/Home.rest @@ -10,6 +10,8 @@ [[How To Do Things In IBEX|HowToDoThingsInIBEX]] +[[Scripting]] + [[FAQ]] [[Glossary]] From f99518489f56df986a44534c97558ebbb2448cbc Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Wed, 28 Sep 2016 16:16:01 +0100 Subject: [PATCH 0314/1813] Created Scripting (markdown) --- Scripting.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 Scripting.md diff --git a/Scripting.md b/Scripting.md new file mode 100644 index 0000000..e29f0d0 --- /dev/null +++ b/Scripting.md @@ -0,0 +1 @@ +There is no help with scripting... yet. \ No newline at end of file From dd7c1ddef39631dcaf6607def8ce7c36667799e5 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Wed, 28 Sep 2016 17:22:26 +0100 Subject: [PATCH 0315/1813] Updated Scripting (markdown) --- Scripting.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Scripting.md b/Scripting.md index e29f0d0..a9532a7 100644 --- a/Scripting.md +++ b/Scripting.md @@ -1 +1,4 @@ -There is no help with scripting... yet. \ No newline at end of file +Scripting +========= + +Scripting in IBEX is done using genie_python. The [genie_python reference manual] http://shadow.nd.rl.ac.uk/genie_python/sphinx/genie_python.html ) gives a full account of what functions are available in genie_python. This page is intended to give a broad guide to scripting for the beginner and novice user. \ No newline at end of file From 079dae5b5ee6c681e592e5557f6923a646659b78 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Wed, 28 Sep 2016 17:25:38 +0100 Subject: [PATCH 0316/1813] Updated Scripting (markdown) --- Scripting.md | 27 ++++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/Scripting.md b/Scripting.md index a9532a7..a78f8d5 100644 --- a/Scripting.md +++ b/Scripting.md @@ -1,4 +1,29 @@ Scripting ========= -Scripting in IBEX is done using genie_python. The [genie_python reference manual] http://shadow.nd.rl.ac.uk/genie_python/sphinx/genie_python.html ) gives a full account of what functions are available in genie_python. This page is intended to give a broad guide to scripting for the beginner and novice user. \ No newline at end of file +Scripting in IBEX is done using genie_python. The [genie_python reference manual] http://shadow.nd.rl.ac.uk/genie_python/sphinx/genie_python.html ) gives a full account of what functions are available in genie_python. This page is intended to give a broad guide to scripting for the beginner and novice user. + +Running genie commands +====================== + +[TODO] + +Most common genie commands +========================== + +[TODO] + +Converting Open Genie to genie_python +===================================== + +[TODO] + +Creating and running instrument scripts +======================================= + +[TODO] + +Creating and running user scripts +================================= + +[TODO] \ No newline at end of file From 454da41842e9a82b2b02c097570c1215be8fc8ab Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Thu, 29 Sep 2016 09:18:04 +0100 Subject: [PATCH 0317/1813] Updated Scripting (markdown) --- Scripting.md | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/Scripting.md b/Scripting.md index a78f8d5..10bf2f0 100644 --- a/Scripting.md +++ b/Scripting.md @@ -6,7 +6,15 @@ Scripting in IBEX is done using genie_python. The [genie_python reference manual Running genie commands ====================== -[TODO] +When running `genie_python` from an interactive console such as from the GUI or after running `C:\Instrument\Apps\Python\genie_python.bat`, the `genie` module will be aliased to `g`. Genie commands can then be accessed by using the prefix `g.[COMMAND_NAME]`. For example: + +``` +g.start() +g.cset("BLOCK_1",1) +g.abort() +``` + +This is particularly useful from the GUI which will auto-complete commands and provide tool tips describing each function and its arguments. Most common genie commands ========================== From 9bc8291ed55400b9d0eeb3e58b6c63fcdaa65728 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Thu, 29 Sep 2016 09:30:18 +0100 Subject: [PATCH 0318/1813] Updated Scripting (markdown) --- Scripting.md | 48 ++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 46 insertions(+), 2 deletions(-) diff --git a/Scripting.md b/Scripting.md index 10bf2f0..6deb311 100644 --- a/Scripting.md +++ b/Scripting.md @@ -16,7 +16,7 @@ g.abort() This is particularly useful from the GUI which will auto-complete commands and provide tool tips describing each function and its arguments. -Most common genie commands +Common genie commands ========================== [TODO] @@ -34,4 +34,48 @@ Creating and running instrument scripts Creating and running user scripts ================================= -[TODO] \ No newline at end of file +[TODO] + + + +Tips from the developers +============================ + +Argument ordering +----------------- + +As this is Python, `genie_python` conforms to the standard pattern of calling Python functions. The arguments to the function are contained within brackets and the variables passed in as a comma-separated list. Ordering is important but can be overridden by using named variables, for instance: + +``` +g.change_beamline_pars("PAR1",1) +``` + +is the same as: + +``` +g.change_beamline_pars(name="PAR1",value=1) +``` + +as is: + +``` +g.change_beamline_pars(value=1,name="PAR1") +``` + +This can be very useful in avoiding mistakes in scripts, like getting the order of high and low limits the wrong way round. Note that unnamed variables must precede named variables so: + +``` +g.change_beamline_pars("PAR1",value=1) +``` + +would be valid but: + +``` +g.change_beamline_pars(name="PAR1",1) +``` + +nor would changing the order of unnamed variables: + +``` +g.change_beamline_pars(1,"PAR1") +``` \ No newline at end of file From 681b3e028c1f7251e6a931a5c54dd9b0babc498a Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Thu, 29 Sep 2016 09:30:46 +0100 Subject: [PATCH 0319/1813] Updated Scripting (markdown) --- Scripting.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Scripting.md b/Scripting.md index 6deb311..57a703d 100644 --- a/Scripting.md +++ b/Scripting.md @@ -62,7 +62,7 @@ as is: g.change_beamline_pars(value=1,name="PAR1") ``` -This can be very useful in avoiding mistakes in scripts, like getting the order of high and low limits the wrong way round. Note that unnamed variables must precede named variables so: +This can be **very useful in avoiding mistakes** in scripts, like getting the order of high and low limits the wrong way round. Note that unnamed variables must precede named variables so: ``` g.change_beamline_pars("PAR1",value=1) From 54f7ba5214c28c80ee8d76407ca6bb7c48cf7659 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Thu, 29 Sep 2016 09:31:15 +0100 Subject: [PATCH 0320/1813] Updated Scripting (markdown) --- Scripting.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/Scripting.md b/Scripting.md index 57a703d..651c9d2 100644 --- a/Scripting.md +++ b/Scripting.md @@ -62,7 +62,7 @@ as is: g.change_beamline_pars(value=1,name="PAR1") ``` -This can be **very useful in avoiding mistakes** in scripts, like getting the order of high and low limits the wrong way round. Note that unnamed variables must precede named variables so: +Note that unnamed variables must precede named variables so: ``` g.change_beamline_pars("PAR1",value=1) @@ -78,4 +78,6 @@ nor would changing the order of unnamed variables: ``` g.change_beamline_pars(1,"PAR1") -``` \ No newline at end of file +``` + +This can be **very useful in avoiding mistakes** in scripts. For instance, getting the order of high and low limits the wrong way round. \ No newline at end of file From 8ff5bd7850b541155fa3122fbb2b1f66f6e8f583 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Thu, 29 Sep 2016 09:36:27 +0100 Subject: [PATCH 0321/1813] Updated Scripting (markdown) --- Scripting.md | 29 +++++++++++------------------ 1 file changed, 11 insertions(+), 18 deletions(-) diff --git a/Scripting.md b/Scripting.md index 651c9d2..6dd8bf6 100644 --- a/Scripting.md +++ b/Scripting.md @@ -44,40 +44,33 @@ Tips from the developers Argument ordering ----------------- -As this is Python, `genie_python` conforms to the standard pattern of calling Python functions. The arguments to the function are contained within brackets and the variables passed in as a comma-separated list. Ordering is important but can be overridden by using named variables, for instance: +As this is Python, `genie_python` conforms to the standard pattern of calling Python functions. The arguments to the function are contained within brackets and the variables passed in as a comma-separated list. Ordering is important but can be overridden by using named variables, for instance the following are all correct and equivalent: -``` -g.change_beamline_pars("PAR1",1) -``` - -is the same as: ``` +g.change_beamline_pars("PAR1",1) g.change_beamline_pars(name="PAR1",value=1) -``` - -as is: - -``` g.change_beamline_pars(value=1,name="PAR1") +g.change_beamline_pars("PAR1",value=1) ``` -Note that unnamed variables must precede named variables so: +In the last example, named and unnamed variables are mixed. Unnamed variables must precede named variables. The following examples are not valid ``` -g.change_beamline_pars("PAR1",value=1) +g.change_beamline_pars(name="PAR1",1) # Named variable before unnamed +g.change_beamline_pars(1,"PAR1") # Cannot change order of unnamed variables ``` -would be valid but: +Using named variables can be **very useful in avoiding mistakes**. For instance, getting the order of high and low limits the wrong way round: ``` -g.change_beamline_pars(name="PAR1",1) +g.change_monitor(1,10,0) ``` -nor would changing the order of unnamed variables: +you can just write any of: ``` -g.change_beamline_pars(1,"PAR1") +g.change_monitor(1,high=10,low=0) ``` -This can be **very useful in avoiding mistakes** in scripts. For instance, getting the order of high and low limits the wrong way round. \ No newline at end of file +and then it doesn't matter, and it's clear for whoever comes to edit the code in future. \ No newline at end of file From 754978b8a6acbb96d609a9f10cb714030e8a9d2b Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Thu, 29 Sep 2016 09:37:25 +0100 Subject: [PATCH 0322/1813] Updated Scripting (markdown) --- Scripting.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Scripting.md b/Scripting.md index 6dd8bf6..079d958 100644 --- a/Scripting.md +++ b/Scripting.md @@ -61,16 +61,16 @@ g.change_beamline_pars(name="PAR1",1) # Named variable before unnamed g.change_beamline_pars(1,"PAR1") # Cannot change order of unnamed variables ``` -Using named variables can be **very useful in avoiding mistakes**. For instance, getting the order of high and low limits the wrong way round: +Using named variables can be **very useful in avoiding mistakes**. For instance, getting the order of high and low limits the wrong way round. For instance this example: ``` g.change_monitor(1,10,0) ``` -you can just write any of: +is wrong and wouldn't work. Instead, we could have written: ``` g.change_monitor(1,high=10,low=0) ``` -and then it doesn't matter, and it's clear for whoever comes to edit the code in future. \ No newline at end of file +which would have work and makes it clear for whoever comes to edit the code in future. \ No newline at end of file From 92cd04c1e5a8f8d42591c741b41c965c0bfc89d3 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Thu, 29 Sep 2016 09:38:17 +0100 Subject: [PATCH 0323/1813] Updated Scripting (markdown) --- Scripting.md | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/Scripting.md b/Scripting.md index 079d958..22d2bd3 100644 --- a/Scripting.md +++ b/Scripting.md @@ -46,7 +46,6 @@ Argument ordering As this is Python, `genie_python` conforms to the standard pattern of calling Python functions. The arguments to the function are contained within brackets and the variables passed in as a comma-separated list. Ordering is important but can be overridden by using named variables, for instance the following are all correct and equivalent: - ``` g.change_beamline_pars("PAR1",1) g.change_beamline_pars(name="PAR1",value=1) @@ -56,14 +55,14 @@ g.change_beamline_pars("PAR1",value=1) In the last example, named and unnamed variables are mixed. Unnamed variables must precede named variables. The following examples are not valid -``` +:red:``` g.change_beamline_pars(name="PAR1",1) # Named variable before unnamed g.change_beamline_pars(1,"PAR1") # Cannot change order of unnamed variables ``` Using named variables can be **very useful in avoiding mistakes**. For instance, getting the order of high and low limits the wrong way round. For instance this example: -``` +:red:``` g.change_monitor(1,10,0) ``` From f0c9e20ad42986671b07994f2027bc865edc3fe0 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Thu, 29 Sep 2016 09:38:26 +0100 Subject: [PATCH 0324/1813] Updated Scripting (markdown) --- Scripting.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Scripting.md b/Scripting.md index 22d2bd3..9a4e610 100644 --- a/Scripting.md +++ b/Scripting.md @@ -6,7 +6,7 @@ Scripting in IBEX is done using genie_python. The [genie_python reference manual Running genie commands ====================== -When running `genie_python` from an interactive console such as from the GUI or after running `C:\Instrument\Apps\Python\genie_python.bat`, the `genie` module will be aliased to `g`. Genie commands can then be accessed by using the prefix `g.[COMMAND_NAME]`. For example: +When running `genie_python` from an interactive console such as from the GUI or after running :red:`C:\Instrument\Apps\Python\genie_python.bat`, the `genie` module will be aliased to `g`. Genie commands can then be accessed by using the prefix `g.[COMMAND_NAME]`. For example: ``` g.start() From 4e9f9619d73ebb5abe74c6b5693605df513553eb Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Thu, 29 Sep 2016 09:38:50 +0100 Subject: [PATCH 0325/1813] Updated Scripting (markdown) --- Scripting.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Scripting.md b/Scripting.md index 9a4e610..6dbe187 100644 --- a/Scripting.md +++ b/Scripting.md @@ -6,7 +6,7 @@ Scripting in IBEX is done using genie_python. The [genie_python reference manual Running genie commands ====================== -When running `genie_python` from an interactive console such as from the GUI or after running :red:`C:\Instrument\Apps\Python\genie_python.bat`, the `genie` module will be aliased to `g`. Genie commands can then be accessed by using the prefix `g.[COMMAND_NAME]`. For example: +When running `genie_python` from an interactive console such as from the GUI or after running `C:\Instrument\Apps\Python\genie_python.bat`, the `genie` module will be aliased to `g`. Genie commands can then be accessed by using the prefix `g.[COMMAND_NAME]`. For example: ``` g.start() @@ -55,14 +55,14 @@ g.change_beamline_pars("PAR1",value=1) In the last example, named and unnamed variables are mixed. Unnamed variables must precede named variables. The following examples are not valid -:red:``` +``` g.change_beamline_pars(name="PAR1",1) # Named variable before unnamed g.change_beamline_pars(1,"PAR1") # Cannot change order of unnamed variables ``` Using named variables can be **very useful in avoiding mistakes**. For instance, getting the order of high and low limits the wrong way round. For instance this example: -:red:``` +``` g.change_monitor(1,10,0) ``` From 33e44891d81294cbd47e902efd570d54120e7469 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Thu, 29 Sep 2016 09:39:20 +0100 Subject: [PATCH 0326/1813] Updated Scripting (markdown) From 4ff417599869651ea2cf3eb04cc6c8440b3b1d93 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Thu, 29 Sep 2016 09:44:59 +0100 Subject: [PATCH 0327/1813] Updated Scripting (markdown) --- Scripting.md | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/Scripting.md b/Scripting.md index 6dbe187..ca67508 100644 --- a/Scripting.md +++ b/Scripting.md @@ -16,10 +16,18 @@ g.abort() This is particularly useful from the GUI which will auto-complete commands and provide tool tips describing each function and its arguments. +Note that in many cases, arguments will be optional. For instance, `begin` can be used as `g.begin()` despite supporting all of the arguments `period`, `meas_id`, `meas_type`, `meas_subid`, `sample_id`, `delayed`, `quiet`, `paused`, and `verbose`. + Common genie commands ========================== -[TODO] +Many `genie_python` commands share the same name with their Open Genie equivalent so it will often be very straightforward to find the function you're looking for. Still, here is a list of the most commonly used `genie_python` commands + +Starting and stopping a run +--------------------------- + + +g.begin() Converting Open Genie to genie_python ===================================== From c5043bd24ac3da42bba6c3e5f3b321171b18e608 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Thu, 29 Sep 2016 09:48:11 +0100 Subject: [PATCH 0328/1813] Updated Scripting (markdown) --- Scripting.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Scripting.md b/Scripting.md index ca67508..dea8d93 100644 --- a/Scripting.md +++ b/Scripting.md @@ -26,8 +26,9 @@ Many `genie_python` commands share the same name with their Open Genie equivalen Starting and stopping a run --------------------------- - -g.begin() +| Command | Description | Arguments | Example | +|-------|------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-----------| +| begin | Starts a new run | period (int, optional) : the period to begin data collection in meas_id (string, optional) : the measurement id meas_type (string, optional) : the type of measurement meas_subid (string, optional) : the measurement sub-id sample_id (string, optional) : the sample id delayed (bool, optional) : puts the period card to into delayed start mode quiet (bool, optional) : suppress the output to the screen paused (bool, optional) : begin in the paused state verbose (bool, optional) : show the messages from the DAE | g.begin() | Converting Open Genie to genie_python ===================================== From 216d0212cd1f100b0ad9241773ea5fb261d351ba Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Thu, 29 Sep 2016 09:48:33 +0100 Subject: [PATCH 0329/1813] Updated Scripting (markdown) --- Scripting.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Scripting.md b/Scripting.md index dea8d93..41f60ee 100644 --- a/Scripting.md +++ b/Scripting.md @@ -28,7 +28,8 @@ Starting and stopping a run | Command | Description | Arguments | Example | |-------|------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-----------| -| begin | Starts a new run | period (int, optional) : the period to begin data collection in meas_id (string, optional) : the measurement id meas_type (string, optional) : the type of measurement meas_subid (string, optional) : the measurement sub-id sample_id (string, optional) : the sample id delayed (bool, optional) : puts the period card to into delayed start mode quiet (bool, optional) : suppress the output to the screen paused (bool, optional) : begin in the paused state verbose (bool, optional) : show the messages from the DAE | g.begin() | +| begin | Starts a new run | period (int, optional) : the period to begin data collection in + meas_id (string, optional) : the measurement id meas_type (string, optional) : the type of measurement meas_subid (string, optional) : the measurement sub-id sample_id (string, optional) : the sample id delayed (bool, optional) : puts the period card to into delayed start mode quiet (bool, optional) : suppress the output to the screen paused (bool, optional) : begin in the paused state verbose (bool, optional) : show the messages from the DAE | g.begin() | Converting Open Genie to genie_python ===================================== From e4335dc5f4133bc59ba65c58ad05af4784be5f31 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Thu, 29 Sep 2016 09:48:44 +0100 Subject: [PATCH 0330/1813] Updated Scripting (markdown) --- Scripting.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Scripting.md b/Scripting.md index 41f60ee..3ec3c21 100644 --- a/Scripting.md +++ b/Scripting.md @@ -28,8 +28,7 @@ Starting and stopping a run | Command | Description | Arguments | Example | |-------|------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-----------| -| begin | Starts a new run | period (int, optional) : the period to begin data collection in - meas_id (string, optional) : the measurement id meas_type (string, optional) : the type of measurement meas_subid (string, optional) : the measurement sub-id sample_id (string, optional) : the sample id delayed (bool, optional) : puts the period card to into delayed start mode quiet (bool, optional) : suppress the output to the screen paused (bool, optional) : begin in the paused state verbose (bool, optional) : show the messages from the DAE | g.begin() | +| begin | Starts a new run | period (int, optional) : the period to begin data collection in. \n meas_id (string, optional) : the measurement id meas_type (string, optional) : the type of measurement meas_subid (string, optional) : the measurement sub-id sample_id (string, optional) : the sample id delayed (bool, optional) : puts the period card to into delayed start mode quiet (bool, optional) : suppress the output to the screen paused (bool, optional) : begin in the paused state verbose (bool, optional) : show the messages from the DAE | g.begin() | Converting Open Genie to genie_python ===================================== From bb3089e56c4844ec225bc5cf762a626c099c99c0 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Thu, 29 Sep 2016 09:50:05 +0100 Subject: [PATCH 0331/1813] Updated Scripting (markdown) --- Scripting.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Scripting.md b/Scripting.md index 3ec3c21..74f21f2 100644 --- a/Scripting.md +++ b/Scripting.md @@ -28,7 +28,7 @@ Starting and stopping a run | Command | Description | Arguments | Example | |-------|------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-----------| -| begin | Starts a new run | period (int, optional) : the period to begin data collection in. \n meas_id (string, optional) : the measurement id meas_type (string, optional) : the type of measurement meas_subid (string, optional) : the measurement sub-id sample_id (string, optional) : the sample id delayed (bool, optional) : puts the period card to into delayed start mode quiet (bool, optional) : suppress the output to the screen paused (bool, optional) : begin in the paused state verbose (bool, optional) : show the messages from the DAE | g.begin() | +| begin | Starts a new run | period (int, optional) : the period to begin data collection in
meas_id (string, optional) : the measurement id
meas_type (string, optional) : the type of measurement
meas_subid (string, optional) : the measurement sub-id
sample_id (string, optional) : the sample id
delayed (bool, optional) : puts the period card to into delayed start mode
quiet (bool, optional) : suppress the output to the screen
paused (bool, optional) : begin in the paused state
verbose (bool, optional) : show the messages from the DAE | g.begin() | Converting Open Genie to genie_python ===================================== From 06eb7b4bde3f3a7d7bfb13a2f421127034b97511 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Thu, 29 Sep 2016 09:50:47 +0100 Subject: [PATCH 0332/1813] Updated Scripting (markdown) --- Scripting.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Scripting.md b/Scripting.md index 74f21f2..42fd3c5 100644 --- a/Scripting.md +++ b/Scripting.md @@ -28,7 +28,7 @@ Starting and stopping a run | Command | Description | Arguments | Example | |-------|------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-----------| -| begin | Starts a new run | period (int, optional) : the period to begin data collection in
meas_id (string, optional) : the measurement id
meas_type (string, optional) : the type of measurement
meas_subid (string, optional) : the measurement sub-id
sample_id (string, optional) : the sample id
delayed (bool, optional) : puts the period card to into delayed start mode
quiet (bool, optional) : suppress the output to the screen
paused (bool, optional) : begin in the paused state
verbose (bool, optional) : show the messages from the DAE | g.begin() | +| begin | Starts a new run | **period** (int, optional) : the period to begin data collection in
**meas_id** (string, optional) : the measurement id
**meas_type** (string, optional) : the type of measurement
**meas_subid** (string, optional) : the measurement sub-id
**sample_id** (string, optional) : the sample id
**delayed** (bool, optional) : puts the period card to into delayed start mode
**quiet** (bool, optional) : suppress the output to the screen
**paused** (bool, optional) : begin in the paused state
**verbose** (bool, optional) : show the messages from the DAE | g.begin() | Converting Open Genie to genie_python ===================================== From e55ec990493cd960065adb4ae1116dbbadfb3cac Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Thu, 29 Sep 2016 09:51:03 +0100 Subject: [PATCH 0333/1813] Updated Scripting (markdown) --- Scripting.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Scripting.md b/Scripting.md index 42fd3c5..0952c51 100644 --- a/Scripting.md +++ b/Scripting.md @@ -28,7 +28,7 @@ Starting and stopping a run | Command | Description | Arguments | Example | |-------|------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-----------| -| begin | Starts a new run | **period** (int, optional) : the period to begin data collection in
**meas_id** (string, optional) : the measurement id
**meas_type** (string, optional) : the type of measurement
**meas_subid** (string, optional) : the measurement sub-id
**sample_id** (string, optional) : the sample id
**delayed** (bool, optional) : puts the period card to into delayed start mode
**quiet** (bool, optional) : suppress the output to the screen
**paused** (bool, optional) : begin in the paused state
**verbose** (bool, optional) : show the messages from the DAE | g.begin() | +| begin | Starts a new run | - **period** (int, optional) : the period to begin data collection in
- **meas_id** (string, optional) : the measurement id
**meas_type** (string, optional) : the type of measurement
**meas_subid** (string, optional) : the measurement sub-id
**sample_id** (string, optional) : the sample id
**delayed** (bool, optional) : puts the period card to into delayed start mode
**quiet** (bool, optional) : suppress the output to the screen
**paused** (bool, optional) : begin in the paused state
**verbose** (bool, optional) : show the messages from the DAE | g.begin() | Converting Open Genie to genie_python ===================================== From 15ee62864e4b47c71e030cca3f109b6b1038ede8 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Thu, 29 Sep 2016 09:51:32 +0100 Subject: [PATCH 0334/1813] Updated Scripting (markdown) --- Scripting.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Scripting.md b/Scripting.md index 0952c51..bd386d9 100644 --- a/Scripting.md +++ b/Scripting.md @@ -28,7 +28,7 @@ Starting and stopping a run | Command | Description | Arguments | Example | |-------|------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-----------| -| begin | Starts a new run | - **period** (int, optional) : the period to begin data collection in
- **meas_id** (string, optional) : the measurement id
**meas_type** (string, optional) : the type of measurement
**meas_subid** (string, optional) : the measurement sub-id
**sample_id** (string, optional) : the sample id
**delayed** (bool, optional) : puts the period card to into delayed start mode
**quiet** (bool, optional) : suppress the output to the screen
**paused** (bool, optional) : begin in the paused state
**verbose** (bool, optional) : show the messages from the DAE | g.begin() | +| begin | Starts a new run | - **period** (int, optional) : the period to begin data collection in
- **meas_id** (string, optional) : the measurement id
**meas_type** (string, optional) : the type of measurement
- **meas_subid** (string, optional) : the measurement sub-id
- **sample_id** (string, optional) : the sample id
- **delayed** (bool, optional) : puts the period card to into delayed start mode
- **quiet** (bool, optional) : suppress the output to the screen
- **paused** (bool, optional) : begin in the paused state
- **verbose** (bool, optional) : show the messages from the DAE | g.begin() | Converting Open Genie to genie_python ===================================== From 1827266c5b6d60c971eefbc419f84466b3f4dc44 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Thu, 29 Sep 2016 09:54:36 +0100 Subject: [PATCH 0335/1813] Updated Scripting (markdown) --- Scripting.md | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/Scripting.md b/Scripting.md index bd386d9..a513b8a 100644 --- a/Scripting.md +++ b/Scripting.md @@ -21,14 +21,18 @@ Note that in many cases, arguments will be optional. For instance, `begin` can b Common genie commands ========================== -Many `genie_python` commands share the same name with their Open Genie equivalent so it will often be very straightforward to find the function you're looking for. Still, here is a list of the most commonly used `genie_python` commands +Many `genie_python` commands share the same name with their Open Genie equivalent so it will often be very straightforward to find the function you're looking for. Still, here is a list of the most commonly used `genie_python` commands. This is **not a complete list**. For full information, consult the [genie_python reference manual] http://shadow.nd.rl.ac.uk/genie_python/sphinx/genie_python.html ). Starting and stopping a run --------------------------- | Command | Description | Arguments | Example | |-------|------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-----------| -| begin | Starts a new run | - **period** (int, optional) : the period to begin data collection in
- **meas_id** (string, optional) : the measurement id
**meas_type** (string, optional) : the type of measurement
- **meas_subid** (string, optional) : the measurement sub-id
- **sample_id** (string, optional) : the sample id
- **delayed** (bool, optional) : puts the period card to into delayed start mode
- **quiet** (bool, optional) : suppress the output to the screen
- **paused** (bool, optional) : begin in the paused state
- **verbose** (bool, optional) : show the messages from the DAE | g.begin() | +| begin | Starts a new run | - **period** (int, optional) : the period to begin data collection in
- **meas_id** (string, optional) : the measurement id
- **meas_type** (string, optional) : the type of measurement
- **meas_subid** (string, optional) : the measurement sub-id
- **sample_id** (string, optional) : the sample id
- **delayed** (bool, optional) : puts the period card to into delayed start mode
- **quiet** (bool, optional) : suppress the output to the screen
- **paused** (bool, optional) : begin in the paused state
- **verbose** (bool, optional) : show the messages from the DAE | g.begin() | +| end | Ends the current run | - **verbose** (bool, optional) : show the messages from the DAE | g.end() | +| abort | Aborts the current run | - **verbose** (bool, optional) : show the messages from the DAE | g.abort() | +| pause | Pauses the current run | - **verbose** (bool, optional) : show the messages from the DAE | g.pause() | +| resume | Resumes the current run after it has been paused | - **verbose** (bool, optional) : show the messages from the DAE | g.resume() | Converting Open Genie to genie_python ===================================== From 306bc8245a1d6182bf7207119c337282911565f4 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Thu, 29 Sep 2016 09:57:01 +0100 Subject: [PATCH 0336/1813] Updated Scripting (markdown) --- Scripting.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Scripting.md b/Scripting.md index a513b8a..f10735b 100644 --- a/Scripting.md +++ b/Scripting.md @@ -26,13 +26,13 @@ Many `genie_python` commands share the same name with their Open Genie equivalen Starting and stopping a run --------------------------- -| Command | Description | Arguments | Example | -|-------|------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-----------| -| begin | Starts a new run | - **period** (int, optional) : the period to begin data collection in
- **meas_id** (string, optional) : the measurement id
- **meas_type** (string, optional) : the type of measurement
- **meas_subid** (string, optional) : the measurement sub-id
- **sample_id** (string, optional) : the sample id
- **delayed** (bool, optional) : puts the period card to into delayed start mode
- **quiet** (bool, optional) : suppress the output to the screen
- **paused** (bool, optional) : begin in the paused state
- **verbose** (bool, optional) : show the messages from the DAE | g.begin() | -| end | Ends the current run | - **verbose** (bool, optional) : show the messages from the DAE | g.end() | -| abort | Aborts the current run | - **verbose** (bool, optional) : show the messages from the DAE | g.abort() | -| pause | Pauses the current run | - **verbose** (bool, optional) : show the messages from the DAE | g.pause() | -| resume | Resumes the current run after it has been paused | - **verbose** (bool, optional) : show the messages from the DAE | g.resume() | +| Command | Description | Example | +|---------|--------------------------------------------------|------------| +| begin | Starts a new run | g.begin() | +| end | Ends the current run | g.end() | +| abort | Aborts the current run | g.abort() | +| pause | Pauses the current run | g.pause() | +| resume | Resumes the current run after it has been paused | g.resume() | Converting Open Genie to genie_python ===================================== From 9e3dee273feb551fb5f5b6eeb4b6f2b9c39cd578 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Thu, 29 Sep 2016 10:09:41 +0100 Subject: [PATCH 0337/1813] Updated Scripting (markdown) --- Scripting.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Scripting.md b/Scripting.md index f10735b..aaba31e 100644 --- a/Scripting.md +++ b/Scripting.md @@ -1,7 +1,7 @@ Scripting ========= -Scripting in IBEX is done using genie_python. The [genie_python reference manual] http://shadow.nd.rl.ac.uk/genie_python/sphinx/genie_python.html ) gives a full account of what functions are available in genie_python. This page is intended to give a broad guide to scripting for the beginner and novice user. +Scripting in IBEX is done using genie_python. The [genie_python reference manual] (http://shadow.nd.rl.ac.uk/genie_python/sphinx/genie_python.html ) gives a full account of what functions are available in genie_python. This page is intended to give a broad guide to scripting for the beginner and novice user. Running genie commands ====================== @@ -21,7 +21,7 @@ Note that in many cases, arguments will be optional. For instance, `begin` can b Common genie commands ========================== -Many `genie_python` commands share the same name with their Open Genie equivalent so it will often be very straightforward to find the function you're looking for. Still, here is a list of the most commonly used `genie_python` commands. This is **not a complete list**. For full information, consult the [genie_python reference manual] http://shadow.nd.rl.ac.uk/genie_python/sphinx/genie_python.html ). +Many `genie_python` commands share the same name with their Open Genie equivalent so it will often be very straightforward to find the function you're looking for. Still, here is a list of the most commonly used `genie_python` commands. This is **not a complete list**. For full information, consult the [genie_python reference manual] ( http://shadow.nd.rl.ac.uk/genie_python/sphinx/genie_python.html ). Starting and stopping a run --------------------------- From 2f2f63731b1a151c1584311a9583c1bd76cd1cc3 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Thu, 29 Sep 2016 10:16:44 +0100 Subject: [PATCH 0338/1813] Updated Scripting (markdown) --- Scripting.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/Scripting.md b/Scripting.md index aaba31e..6e8fe4f 100644 --- a/Scripting.md +++ b/Scripting.md @@ -34,6 +34,16 @@ Starting and stopping a run | pause | Pauses the current run | g.pause() | | resume | Resumes the current run after it has been paused | g.resume() | +Updating blocks and PVs +----------------------- + +| Command | Description | Example | +|---------|------------------------------------------------------|---------------------------------------| +| cget | Gets the useful values associated with a block | g.cget("NEW_BLOCK") | +| cset | Sets the setpoint and runcontrol settings for blocks | g.cset("NEW_BLOCK",1) | +| get_pv | Get the value for the specified PV | g.get_pv("IN:INSTNAME:IOC_01:STAT") | +| set_pv | Set the value for the specified PV | g.set_pv("IN:INSTNAME:IOC_01:STAT",1) | + Converting Open Genie to genie_python ===================================== From bcf4d74b5b00c420af3ab9e4cd5f16fe91c033be Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Thu, 29 Sep 2016 10:31:25 +0100 Subject: [PATCH 0339/1813] Updated Scripting (markdown) --- Scripting.md | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/Scripting.md b/Scripting.md index 6e8fe4f..4e86373 100644 --- a/Scripting.md +++ b/Scripting.md @@ -44,6 +44,25 @@ Updating blocks and PVs | get_pv | Get the value for the specified PV | g.get_pv("IN:INSTNAME:IOC_01:STAT") | | set_pv | Set the value for the specified PV | g.set_pv("IN:INSTNAME:IOC_01:STAT",1) | + +Run control +---------- + +| Command | Description | Example | +|------------------|---------------------------------------------------------------------------------------|---------------------------------------| +| get_uamps | Get the current number of micro-amp hours | g.get_uamps() | +| get_frames | Gets the current number of good frames | g.get_frames() | +| get_runstate | Get the current status of the instrument as a string | g.get_runstate() | +| get_mevents | Gets the total counts for all the detectors | g.get_mevents() | +| get_totalcounts | Get the total counts for the current run | g.get_totalcounts() | +| waitfor | Interrupts execution until certain conditions are met | g.waitfor("NEW_BLOCK",value=1) | +| waitfor_block | Interrupts execution until block reaches specific value | g.waitfor_block("NEW_BLOCK",1) | +| waitfor_time | Interrupts execution for a specified amount of time | g.waitfor_time(1) | +| waitfor_frames | Interrupts execution to wait for number of total good frames to reach parameter value | g.waitfor_frames(1000) | +| waitfor_uamps | Interrupts execution to wait for a specific total charge | g.waitfor_uamps(9.9) | +| waitfor_runstate | Wait for a particular instrument run state | g.waitfor_runstate("paused") | +| waitfor_move | Wait for all motion or specific motion to complete | g.waitfor_move("NEW_BLOCK") | + Converting Open Genie to genie_python ===================================== From 29f2d769f65e09f8ff043dc6c22b33c0add3ac6b Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Thu, 29 Sep 2016 11:09:00 +0100 Subject: [PATCH 0340/1813] Updated Scripting (markdown) --- Scripting.md | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/Scripting.md b/Scripting.md index 4e86373..9f79f5e 100644 --- a/Scripting.md +++ b/Scripting.md @@ -76,9 +76,25 @@ Creating and running instrument scripts Creating and running user scripts ================================= -[TODO] +Running +------- + +Once you've created your script, it's time to run it. There are a number of ways of launching a Python script. + +From Ibex +------------ + +1. Launch the Ibex GUI +1. Navigate to the scripting perspective +1. Run the command `g.load_script("C:\path\to\script\my_script.py")` where the path and script name are updated appropriately + - Note that if you omit the absolute path to the file (i.e. `C:\path\to\script`) then `genie_python` will look in the current script directory. By default this is `C:\scripts` but can be viewed and set with the commands `g.get_script_dir()` and `g.set_script_dir()` respectively. +1. When the script is loaded, any procedures in the script will be run automatically. If the script contains any function, you will now be able to call them from within the scripting window. +From a genie_python terminal +---------------------------- +1. Launch a `genie_python` terminal from `C:\Instrument\Apps\Python\` by running `genie_python.bat` +1. Follow the above starting at step 3. Tips from the developers ============================ From a9c41befa7080cc07b4a3446942e2c07c6d3d483 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Thu, 29 Sep 2016 11:19:18 +0100 Subject: [PATCH 0341/1813] Updated Scripting (markdown) --- Scripting.md | 24 ++++++++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/Scripting.md b/Scripting.md index 9f79f5e..2c6d634 100644 --- a/Scripting.md +++ b/Scripting.md @@ -76,13 +76,30 @@ Creating and running instrument scripts Creating and running user scripts ================================= +Creating scripts +---------------- + +1. First, we need to create a script file. By default, user scripts should be placed in `C:\scripts`. Navigate to your desired directory and create the script file with extension `.py`. +2. Write some `genie_python`! +3. Save the file + +We have glossed over step 2 because Python is a very powerful scripting language. Combined with Open Genie, the potential scope of a script is enormous, and well beyond the scope of this guide. For example though, here is a simple script that executes a series of runs: + +``` +g.waitfor(seconds=60) +g.change(title="Calibration run 1, 29th September") +g.waitfor(seconds=60) +g.begin() +g.waitfor(uamps=100) +g.end() +``` + Running ------- Once you've created your script, it's time to run it. There are a number of ways of launching a Python script. -From Ibex ------------- +### From Ibex 1. Launch the Ibex GUI 1. Navigate to the scripting perspective @@ -90,8 +107,7 @@ From Ibex - Note that if you omit the absolute path to the file (i.e. `C:\path\to\script`) then `genie_python` will look in the current script directory. By default this is `C:\scripts` but can be viewed and set with the commands `g.get_script_dir()` and `g.set_script_dir()` respectively. 1. When the script is loaded, any procedures in the script will be run automatically. If the script contains any function, you will now be able to call them from within the scripting window. -From a genie_python terminal ----------------------------- +### From a genie_python terminal 1. Launch a `genie_python` terminal from `C:\Instrument\Apps\Python\` by running `genie_python.bat` 1. Follow the above starting at step 3. From 971ce5c9c6415d65f442570daafe8eb865517980 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Thu, 29 Sep 2016 11:19:46 +0100 Subject: [PATCH 0342/1813] Updated Scripting (markdown) --- Scripting.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Scripting.md b/Scripting.md index 2c6d634..fd1a1df 100644 --- a/Scripting.md +++ b/Scripting.md @@ -83,7 +83,7 @@ Creating scripts 2. Write some `genie_python`! 3. Save the file -We have glossed over step 2 because Python is a very powerful scripting language. Combined with Open Genie, the potential scope of a script is enormous, and well beyond the scope of this guide. For example though, here is a simple script that executes a series of runs: +We have glossed over step 2 because Python is a very powerful scripting language. Combined with Open Genie, the potential scope of a script is enormous, and well beyond the scope of this guide. For example though, here is a simple script that executes a simple calibration run. ``` g.waitfor(seconds=60) From 4ab3474771d7dee742eb942d99c00e1d7b7318b1 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Thu, 29 Sep 2016 11:20:51 +0100 Subject: [PATCH 0343/1813] Updated Scripting (markdown) --- Scripting.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Scripting.md b/Scripting.md index fd1a1df..0616523 100644 --- a/Scripting.md +++ b/Scripting.md @@ -83,7 +83,7 @@ Creating scripts 2. Write some `genie_python`! 3. Save the file -We have glossed over step 2 because Python is a very powerful scripting language. Combined with Open Genie, the potential scope of a script is enormous, and well beyond the scope of this guide. For example though, here is a simple script that executes a simple calibration run. +We have glossed over step 2 because Python is a very powerful scripting language. Combined with Open Genie, the potential scope of a script is enormous, and well beyond the scope of this guide. For example though, here is a simple script that executes a calibration run. ``` g.waitfor(seconds=60) From a7f6ac466cabce0f8239f4b3cc8e6263bf612024 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Thu, 29 Sep 2016 11:23:28 +0100 Subject: [PATCH 0344/1813] Updated Scripting (markdown) --- Scripting.md | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/Scripting.md b/Scripting.md index 0616523..f4e6b88 100644 --- a/Scripting.md +++ b/Scripting.md @@ -86,12 +86,20 @@ Creating scripts We have glossed over step 2 because Python is a very powerful scripting language. Combined with Open Genie, the potential scope of a script is enormous, and well beyond the scope of this guide. For example though, here is a simple script that executes a calibration run. ``` -g.waitfor(seconds=60) -g.change(title="Calibration run 1, 29th September") -g.waitfor(seconds=60) +# Change the title +calibration_run_title = "Calibration run 1, 29th September" +g.change(title=calibration_run_title) + +# Begin the run +print "Beginning calibration run : " + calibration_run_title g.begin() + +# Wait for 100 uamps g.waitfor(uamps=100) + +# End the run g.end() +print "Calibration run finished successfully" ``` Running From 0aae7d88503d78327661aaf5f60ab68b02353c2b Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Thu, 29 Sep 2016 11:26:35 +0100 Subject: [PATCH 0345/1813] Updated Scripting (markdown) --- Scripting.md | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/Scripting.md b/Scripting.md index f4e6b88..29784f3 100644 --- a/Scripting.md +++ b/Scripting.md @@ -3,6 +3,13 @@ Scripting Scripting in IBEX is done using genie_python. The [genie_python reference manual] (http://shadow.nd.rl.ac.uk/genie_python/sphinx/genie_python.html ) gives a full account of what functions are available in genie_python. This page is intended to give a broad guide to scripting for the beginner and novice user. +- [Running genie commands](#running-genie-commands) +- [Common genie commands](#common-genie-commands) +- [Converting Open Genie to `genie_python`](#converting-open-genie-to-genie-python) +- [Creating and running instrument scripts](#creating-and-running-instrument-scripts) +- [Creating and running user scripts](#creating-and-running-user-scripts) +- [Tips from the developers](#tips-from-the-developers) + Running genie commands ====================== @@ -19,7 +26,7 @@ This is particularly useful from the GUI which will auto-complete commands and p Note that in many cases, arguments will be optional. For instance, `begin` can be used as `g.begin()` despite supporting all of the arguments `period`, `meas_id`, `meas_type`, `meas_subid`, `sample_id`, `delayed`, `quiet`, `paused`, and `verbose`. Common genie commands -========================== +===================== Many `genie_python` commands share the same name with their Open Genie equivalent so it will often be very straightforward to find the function you're looking for. Still, here is a list of the most commonly used `genie_python` commands. This is **not a complete list**. For full information, consult the [genie_python reference manual] ( http://shadow.nd.rl.ac.uk/genie_python/sphinx/genie_python.html ). @@ -121,7 +128,7 @@ Once you've created your script, it's time to run it. There are a number of ways 1. Follow the above starting at step 3. Tips from the developers -============================ +======================== Argument ordering ----------------- From ac1d60fcdf00f6b7e3aa2fc478301209e8e8874d Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Thu, 29 Sep 2016 11:27:04 +0100 Subject: [PATCH 0346/1813] Updated Scripting (markdown) --- Scripting.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Scripting.md b/Scripting.md index 29784f3..abb7683 100644 --- a/Scripting.md +++ b/Scripting.md @@ -5,7 +5,7 @@ Scripting in IBEX is done using genie_python. The [genie_python reference manual - [Running genie commands](#running-genie-commands) - [Common genie commands](#common-genie-commands) -- [Converting Open Genie to `genie_python`](#converting-open-genie-to-genie-python) +- [Converting Open Genie to `genie_python`](#converting-open-genie-to-genie_python) - [Creating and running instrument scripts](#creating-and-running-instrument-scripts) - [Creating and running user scripts](#creating-and-running-user-scripts) - [Tips from the developers](#tips-from-the-developers) From 49e074aab58d38b3a20163354c95cb0ddc8e374c Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Thu, 29 Sep 2016 11:46:44 +0100 Subject: [PATCH 0347/1813] Updated Scripting (markdown) --- Scripting.md | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/Scripting.md b/Scripting.md index abb7683..f159791 100644 --- a/Scripting.md +++ b/Scripting.md @@ -73,7 +73,28 @@ Run control Converting Open Genie to genie_python ===================================== -[TODO] +If you know a little bit of Python already, converting Open Genie scripts to `genie_python` is very often straightforward. Even if you're new to Python, once you know a few simple pieces of syntax, you'll be able to convert many scripts without issue. + +One thing we can't cover here is **indentation**. In Python, different code blocks are identified by their indentation level. In many programming languages, code blocks are encased in curly braces (`{...}`), but Python uses indentation. For example: + +``` +print "This has no indentation" +def my_func(): + print "The first line of the function is indented" + if True: + print "Having a 2nd level indent shows this line is within the if clause" + print "So is this one" + print "This line isn't within the if clause" +print "This line is outside of the function" +``` + +| Open Genie syntax | `genie_python` syntax | Comments | +|-------------------|-----------------------|----------| +| PROCEDURE my_func | +My Open Genie Script Notes My equivalent_genie_python Script +My_Instrument_Script It is fine to give your new genie_python script the same name as the original Open Genie script. My_Instrument_Script () +/* some comment */ Do_something arg1 arg2 In python, function calls have ( )s round the list of arguments. #some comment Do_something (arg1, arg2) +/* another comment */ Do_something_else arg3 ... #another comment Do_something_else (arg3) Creating and running instrument scripts ======================================= From 2898a2ec9559169cad49ab09d7c4077135df2973 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Thu, 29 Sep 2016 11:48:12 +0100 Subject: [PATCH 0348/1813] Updated Scripting (markdown) --- Scripting.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/Scripting.md b/Scripting.md index f159791..ba10bb0 100644 --- a/Scripting.md +++ b/Scripting.md @@ -78,14 +78,14 @@ If you know a little bit of Python already, converting Open Genie scripts to `ge One thing we can't cover here is **indentation**. In Python, different code blocks are identified by their indentation level. In many programming languages, code blocks are encased in curly braces (`{...}`), but Python uses indentation. For example: ``` -print "This has no indentation" +print "No indent" def my_func(): - print "The first line of the function is indented" + print "1 indent. Inside the function" if True: - print "Having a 2nd level indent shows this line is within the if clause" - print "So is this one" - print "This line isn't within the if clause" -print "This line is outside of the function" + print "2 indents. Inside the if clause" + print "2 indents. Still inside the if clause" + print "1 indent. In the function but not the if clause" +print "No indent. Outside the function" ``` | Open Genie syntax | `genie_python` syntax | Comments | From d9e62ee8c8458880a2634e87158ab2af35c4ef13 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Thu, 29 Sep 2016 11:58:12 +0100 Subject: [PATCH 0349/1813] Updated Scripting (markdown) --- Scripting.md | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/Scripting.md b/Scripting.md index ba10bb0..4a4f8db 100644 --- a/Scripting.md +++ b/Scripting.md @@ -75,7 +75,10 @@ Converting Open Genie to genie_python If you know a little bit of Python already, converting Open Genie scripts to `genie_python` is very often straightforward. Even if you're new to Python, once you know a few simple pieces of syntax, you'll be able to convert many scripts without issue. -One thing we can't cover here is **indentation**. In Python, different code blocks are identified by their indentation level. In many programming languages, code blocks are encased in curly braces (`{...}`), but Python uses indentation. For example: +Indentation +----------- + +One thing where there is no direct comparison is with **indentation**. In Python, different code blocks are identified by their indentation level. In many programming languages, code blocks are encased in curly braces (`{...}`), but Python uses indentation. For example: ``` print "No indent" @@ -88,13 +91,19 @@ def my_func(): print "No indent. Outside the function" ``` +Typically an `indent` is 3 or 4 spaces. Tabs can be used too, but Python won't recognise that a tab is the same as 4 spaces so can lead to problems. It's often best to avoid them. This might be a new concept if you've only ever written Open Genie, but trust us in that it opens up a lot of ways to make scripts more powerful, easier to read and more reliable. + +Side-by-side comparison +------------------------ + | Open Genie syntax | `genie_python` syntax | Comments | |-------------------|-----------------------|----------| -| PROCEDURE my_func | -My Open Genie Script Notes My equivalent_genie_python Script -My_Instrument_Script It is fine to give your new genie_python script the same name as the original Open Genie script. My_Instrument_Script () -/* some comment */ Do_something arg1 arg2 In python, function calls have ( )s round the list of arguments. #some comment Do_something (arg1, arg2) -/* another comment */ Do_something_else arg3 ... #another comment Do_something_else (arg3) +| PROCEDURE my_func | def my_func(): | This is the standard way to define a function in Python | +| begin | g.begin() | Many functions in `genie_python` have the same name as in Open Genie. In these cases, prepend `g.` to idicate the method belongs to `genie_python` and append `()` to tell Python to execute the method with no arguments | +| my_func_2 100 | my_func_2(100) | To execute a function, give its name and then the argument in brackets. This is a user-defined function, not a `genie_python` function, so it has no `g.` in front. | +| my_func_3 100 200 | my_func_2(100,200) | As above, except that multiple arguments are separated by a comma | +| waitfor seconds=20 | g.waitfor(seconds=20) | Some methods can take named arguments. In these cases you simply give named arguments in the form `[name]=[value]`. Note that you can mix named and unnamed arguments, but unnamed arguments always appear at the start of the argument list. | +| # This is a comment | # This is a comment | Comments are the same in both languages | Creating and running instrument scripts ======================================= From f06869ed96320a0bc70d2e8835a47598daa42a78 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Thu, 29 Sep 2016 12:00:32 +0100 Subject: [PATCH 0350/1813] Updated Scripting (markdown) --- Scripting.md | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/Scripting.md b/Scripting.md index 4a4f8db..241432d 100644 --- a/Scripting.md +++ b/Scripting.md @@ -3,14 +3,14 @@ Scripting Scripting in IBEX is done using genie_python. The [genie_python reference manual] (http://shadow.nd.rl.ac.uk/genie_python/sphinx/genie_python.html ) gives a full account of what functions are available in genie_python. This page is intended to give a broad guide to scripting for the beginner and novice user. -- [Running genie commands](#running-genie-commands) -- [Common genie commands](#common-genie-commands) +- [Running `genie_python` commands](#running-genie_python-commands) +- [Common `genie_python` commands](#common-genie_python-commands) - [Converting Open Genie to `genie_python`](#converting-open-genie-to-genie_python) - [Creating and running instrument scripts](#creating-and-running-instrument-scripts) - [Creating and running user scripts](#creating-and-running-user-scripts) - [Tips from the developers](#tips-from-the-developers) -Running genie commands +Running genie_python commands ====================== When running `genie_python` from an interactive console such as from the GUI or after running `C:\Instrument\Apps\Python\genie_python.bat`, the `genie` module will be aliased to `g`. Genie commands can then be accessed by using the prefix `g.[COMMAND_NAME]`. For example: @@ -25,7 +25,7 @@ This is particularly useful from the GUI which will auto-complete commands and p Note that in many cases, arguments will be optional. For instance, `begin` can be used as `g.begin()` despite supporting all of the arguments `period`, `meas_id`, `meas_type`, `meas_subid`, `sample_id`, `delayed`, `quiet`, `paused`, and `verbose`. -Common genie commands +Common genie_python commands ===================== Many `genie_python` commands share the same name with their Open Genie equivalent so it will often be very straightforward to find the function you're looking for. Still, here is a list of the most commonly used `genie_python` commands. This is **not a complete list**. For full information, consult the [genie_python reference manual] ( http://shadow.nd.rl.ac.uk/genie_python/sphinx/genie_python.html ). @@ -75,6 +75,11 @@ Converting Open Genie to genie_python If you know a little bit of Python already, converting Open Genie scripts to `genie_python` is very often straightforward. Even if you're new to Python, once you know a few simple pieces of syntax, you'll be able to convert many scripts without issue. +List of functions +----------------- +We've included some +- [Common `genie_python` commands](#common-genie_python-commands) on this page, but for a full list refer to the [genie_python reference manual] (http://shadow.nd.rl.ac.uk/genie_python/sphinx/genie_python.html ). + Indentation ----------- From a995de95db0f29eeea8a13086f3aad28bf63fd0d Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Thu, 29 Sep 2016 12:23:14 +0100 Subject: [PATCH 0351/1813] Updated Scripting (markdown) --- Scripting.md | 43 ++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 42 insertions(+), 1 deletion(-) diff --git a/Scripting.md b/Scripting.md index 241432d..3791c17 100644 --- a/Scripting.md +++ b/Scripting.md @@ -113,7 +113,48 @@ Side-by-side comparison Creating and running instrument scripts ======================================= -[TODO] +Different instruments may have specific scripts that are required for multiple users. To make accessing these easier, `genie_python` loads instrument scripts at startup. + +Creating scripts +---------------- + +For the most part, this is the same as [creating-user-scripts](#creating-and-running-user-scripts). + +Unlike user scripts, instrument scripts should be placed in `C:\Instrument\Settings\config\[MACHINE_NAME]\Python`. Once the script has been created, edit the file `inst.py` in the same directory and add the line `from [MY_FILE] import *` where `[MY_FILE]` is the name of your file without the `.py` file extension. This will include the new script in the list of scripts loaded at startup. Best to avoid file names containing spaces, it [can be done](http://stackoverflow.com/questions/9123517/how-do-you-import-a-file-in-python-with-spaces-in-the-name) but it's easier to just not do it. + +Everything in the instrument scripts will be executed when `genie_python` is started. This includes + - Making functions available to be called later + - Setting variables + - Running methods +Typically, most code in instrument scripts will be contained within functions (procedures in Open Genie language), but it's important to be aware that anything that isn't will be included too. For example, if an instrument script is loaded: + +``` +a = 1 +def print_a(): + print str(a) +``` + +then the user can call `print_a`, but they can also use the variable `a`, and change its value, which may not be desirable. If instead the script was: + + +``` +def print_a(): + a = 1 + print str(a) +``` + +then the user could only access `print_a()` and the value could not be changed. + +Running +------- + +Once the script is loaded, anything from the script will be available using the `inst` package reference. For instance if your script contained the variable `my_var` and function `my_function` you can call: + +``` +print inst.my_var +inst.my_var = 1 +inst.my_function() +``` Creating and running user scripts ================================= From aa8b4e486f7038472aa86fc36f0354f16e661333 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Thu, 29 Sep 2016 12:26:27 +0100 Subject: [PATCH 0352/1813] Updated Scripting (markdown) --- Scripting.md | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/Scripting.md b/Scripting.md index 3791c17..2730318 100644 --- a/Scripting.md +++ b/Scripting.md @@ -120,8 +120,12 @@ Creating scripts For the most part, this is the same as [creating-user-scripts](#creating-and-running-user-scripts). +### Script directory + Unlike user scripts, instrument scripts should be placed in `C:\Instrument\Settings\config\[MACHINE_NAME]\Python`. Once the script has been created, edit the file `inst.py` in the same directory and add the line `from [MY_FILE] import *` where `[MY_FILE]` is the name of your file without the `.py` file extension. This will include the new script in the list of scripts loaded at startup. Best to avoid file names containing spaces, it [can be done](http://stackoverflow.com/questions/9123517/how-do-you-import-a-file-in-python-with-spaces-in-the-name) but it's easier to just not do it. +### Script structure + Everything in the instrument scripts will be executed when `genie_python` is started. This includes - Making functions available to be called later - Setting variables @@ -148,14 +152,14 @@ then the user could only access `print_a()` and the value could not be changed. Running ------- -Once the script is loaded, anything from the script will be available using the `inst` package reference. For instance if your script contained the variable `my_var` and function `my_function` you can call: +Once the script is loaded, anything from the script will be available using the `inst` package reference. For instance if your script contains the function `my_function` you can call: ``` -print inst.my_var -inst.my_var = 1 inst.my_function() ``` +Whilst using the scripting perspective in the Ibex GUI, users will also benefit from the same auto-complete feature as they do with `genie_python` commands. + Creating and running user scripts ================================= From 46dedd4f31028e8fee159a4b4e30ddb90c773d4a Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Thu, 29 Sep 2016 12:28:57 +0100 Subject: [PATCH 0353/1813] Updated Scripting (markdown) --- Scripting.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/Scripting.md b/Scripting.md index 2730318..e78fa91 100644 --- a/Scripting.md +++ b/Scripting.md @@ -103,12 +103,12 @@ Side-by-side comparison | Open Genie syntax | `genie_python` syntax | Comments | |-------------------|-----------------------|----------| -| PROCEDURE my_func | def my_func(): | This is the standard way to define a function in Python | -| begin | g.begin() | Many functions in `genie_python` have the same name as in Open Genie. In these cases, prepend `g.` to idicate the method belongs to `genie_python` and append `()` to tell Python to execute the method with no arguments | -| my_func_2 100 | my_func_2(100) | To execute a function, give its name and then the argument in brackets. This is a user-defined function, not a `genie_python` function, so it has no `g.` in front. | -| my_func_3 100 200 | my_func_2(100,200) | As above, except that multiple arguments are separated by a comma | -| waitfor seconds=20 | g.waitfor(seconds=20) | Some methods can take named arguments. In these cases you simply give named arguments in the form `[name]=[value]`. Note that you can mix named and unnamed arguments, but unnamed arguments always appear at the start of the argument list. | -| # This is a comment | # This is a comment | Comments are the same in both languages | +| PROCEDURE my_func | def my_func(): | This is the standard way to define a function in Python | +| begin | g.begin() | Many functions in `genie_python` have the same name as in Open Genie. In these cases, prepend `g.` to idicate the method belongs to `genie_python` and append `()` to tell Python to execute the method with no arguments | +| my_func_2 100 | my_func_2(100) | To execute a function, give its name and then the argument in brackets. This is a user-defined function, not a `genie_python` function, so it has no `g.` in front. | +| my_func_3 100 200 | my_func_2(100,200) | As above, except that multiple arguments are separated by a comma | +| waitfor seconds=20 | g.waitfor(seconds=20) | Some methods can take named arguments. In these cases you simply give named arguments in the form `[name]=[value]`. Note that you can mix named and unnamed arguments, but unnamed arguments always appear at the start of the argument list. | +| # This is a comment | # This is a comment | Comments are the same in both languages | Creating and running instrument scripts ======================================= From 97805137eb6206d3993e47a0c5c59d29f1fdb19c Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Thu, 29 Sep 2016 12:29:12 +0100 Subject: [PATCH 0354/1813] Updated Scripting (markdown) From 317d08eff8ed9afb290a96937c5ee82372fdc44f Mon Sep 17 00:00:00 2001 From: IsabellaRey Date: Tue, 4 Oct 2016 16:40:10 +0100 Subject: [PATCH 0355/1813] Minor, consistency --- Scripting.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Scripting.md b/Scripting.md index e78fa91..d902d00 100644 --- a/Scripting.md +++ b/Scripting.md @@ -48,8 +48,8 @@ Updating blocks and PVs |---------|------------------------------------------------------|---------------------------------------| | cget | Gets the useful values associated with a block | g.cget("NEW_BLOCK") | | cset | Sets the setpoint and runcontrol settings for blocks | g.cset("NEW_BLOCK",1) | -| get_pv | Get the value for the specified PV | g.get_pv("IN:INSTNAME:IOC_01:STAT") | -| set_pv | Set the value for the specified PV | g.set_pv("IN:INSTNAME:IOC_01:STAT",1) | +| get_pv | Gets the value for the specified PV | g.get_pv("IN:INSTNAME:IOC_01:STAT") | +| set_pv | Sets the value for the specified PV | g.set_pv("IN:INSTNAME:IOC_01:STAT",1) | Run control From b428eed1218534a78e6e4237e99ce65b063c91b0 Mon Sep 17 00:00:00 2001 From: IsabellaRey Date: Tue, 4 Oct 2016 16:43:27 +0100 Subject: [PATCH 0356/1813] Minor, consistency --- Scripting.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Scripting.md b/Scripting.md index d902d00..374ca56 100644 --- a/Scripting.md +++ b/Scripting.md @@ -57,18 +57,18 @@ Run control | Command | Description | Example | |------------------|---------------------------------------------------------------------------------------|---------------------------------------| -| get_uamps | Get the current number of micro-amp hours | g.get_uamps() | +| get_uamps | Gets the current number of micro-amp hours | g.get_uamps() | | get_frames | Gets the current number of good frames | g.get_frames() | -| get_runstate | Get the current status of the instrument as a string | g.get_runstate() | +| get_runstate | Gets the current status of the instrument as a string | g.get_runstate() | | get_mevents | Gets the total counts for all the detectors | g.get_mevents() | -| get_totalcounts | Get the total counts for the current run | g.get_totalcounts() | +| get_totalcounts | Gets the total counts for the current run | g.get_totalcounts() | | waitfor | Interrupts execution until certain conditions are met | g.waitfor("NEW_BLOCK",value=1) | | waitfor_block | Interrupts execution until block reaches specific value | g.waitfor_block("NEW_BLOCK",1) | | waitfor_time | Interrupts execution for a specified amount of time | g.waitfor_time(1) | | waitfor_frames | Interrupts execution to wait for number of total good frames to reach parameter value | g.waitfor_frames(1000) | | waitfor_uamps | Interrupts execution to wait for a specific total charge | g.waitfor_uamps(9.9) | -| waitfor_runstate | Wait for a particular instrument run state | g.waitfor_runstate("paused") | -| waitfor_move | Wait for all motion or specific motion to complete | g.waitfor_move("NEW_BLOCK") | +| waitfor_runstate | Waits for a particular instrument run state | g.waitfor_runstate("paused") | +| waitfor_move | Waits for all motion or specific motion to complete | g.waitfor_move("NEW_BLOCK") | Converting Open Genie to genie_python ===================================== From 1e505372856ecc6bf5de36664f2953e02cb86b4c Mon Sep 17 00:00:00 2001 From: IsabellaRey Date: Tue, 4 Oct 2016 17:01:48 +0100 Subject: [PATCH 0357/1813] Minor, fixed typo --- Scripting.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Scripting.md b/Scripting.md index 374ca56..86d4b43 100644 --- a/Scripting.md +++ b/Scripting.md @@ -241,4 +241,4 @@ is wrong and wouldn't work. Instead, we could have written: g.change_monitor(1,high=10,low=0) ``` -which would have work and makes it clear for whoever comes to edit the code in future. \ No newline at end of file +which would have worked and makes it clear for whoever comes to edit the code in future. \ No newline at end of file From 13468b5ff1f131c4ce58563ffc52d12feb02e153 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Wed, 5 Oct 2016 13:34:15 +0100 Subject: [PATCH 0358/1813] Updated Scripting (markdown => rest) --- Scripting.md | 244 ------------------------------------------------- Scripting.rest | 82 +++++++++++++++++ 2 files changed, 82 insertions(+), 244 deletions(-) delete mode 100644 Scripting.md create mode 100644 Scripting.rest diff --git a/Scripting.md b/Scripting.md deleted file mode 100644 index 86d4b43..0000000 --- a/Scripting.md +++ /dev/null @@ -1,244 +0,0 @@ -Scripting -========= - -Scripting in IBEX is done using genie_python. The [genie_python reference manual] (http://shadow.nd.rl.ac.uk/genie_python/sphinx/genie_python.html ) gives a full account of what functions are available in genie_python. This page is intended to give a broad guide to scripting for the beginner and novice user. - -- [Running `genie_python` commands](#running-genie_python-commands) -- [Common `genie_python` commands](#common-genie_python-commands) -- [Converting Open Genie to `genie_python`](#converting-open-genie-to-genie_python) -- [Creating and running instrument scripts](#creating-and-running-instrument-scripts) -- [Creating and running user scripts](#creating-and-running-user-scripts) -- [Tips from the developers](#tips-from-the-developers) - -Running genie_python commands -====================== - -When running `genie_python` from an interactive console such as from the GUI or after running `C:\Instrument\Apps\Python\genie_python.bat`, the `genie` module will be aliased to `g`. Genie commands can then be accessed by using the prefix `g.[COMMAND_NAME]`. For example: - -``` -g.start() -g.cset("BLOCK_1",1) -g.abort() -``` - -This is particularly useful from the GUI which will auto-complete commands and provide tool tips describing each function and its arguments. - -Note that in many cases, arguments will be optional. For instance, `begin` can be used as `g.begin()` despite supporting all of the arguments `period`, `meas_id`, `meas_type`, `meas_subid`, `sample_id`, `delayed`, `quiet`, `paused`, and `verbose`. - -Common genie_python commands -===================== - -Many `genie_python` commands share the same name with their Open Genie equivalent so it will often be very straightforward to find the function you're looking for. Still, here is a list of the most commonly used `genie_python` commands. This is **not a complete list**. For full information, consult the [genie_python reference manual] ( http://shadow.nd.rl.ac.uk/genie_python/sphinx/genie_python.html ). - -Starting and stopping a run ---------------------------- - -| Command | Description | Example | -|---------|--------------------------------------------------|------------| -| begin | Starts a new run | g.begin() | -| end | Ends the current run | g.end() | -| abort | Aborts the current run | g.abort() | -| pause | Pauses the current run | g.pause() | -| resume | Resumes the current run after it has been paused | g.resume() | - -Updating blocks and PVs ------------------------ - -| Command | Description | Example | -|---------|------------------------------------------------------|---------------------------------------| -| cget | Gets the useful values associated with a block | g.cget("NEW_BLOCK") | -| cset | Sets the setpoint and runcontrol settings for blocks | g.cset("NEW_BLOCK",1) | -| get_pv | Gets the value for the specified PV | g.get_pv("IN:INSTNAME:IOC_01:STAT") | -| set_pv | Sets the value for the specified PV | g.set_pv("IN:INSTNAME:IOC_01:STAT",1) | - - -Run control ----------- - -| Command | Description | Example | -|------------------|---------------------------------------------------------------------------------------|---------------------------------------| -| get_uamps | Gets the current number of micro-amp hours | g.get_uamps() | -| get_frames | Gets the current number of good frames | g.get_frames() | -| get_runstate | Gets the current status of the instrument as a string | g.get_runstate() | -| get_mevents | Gets the total counts for all the detectors | g.get_mevents() | -| get_totalcounts | Gets the total counts for the current run | g.get_totalcounts() | -| waitfor | Interrupts execution until certain conditions are met | g.waitfor("NEW_BLOCK",value=1) | -| waitfor_block | Interrupts execution until block reaches specific value | g.waitfor_block("NEW_BLOCK",1) | -| waitfor_time | Interrupts execution for a specified amount of time | g.waitfor_time(1) | -| waitfor_frames | Interrupts execution to wait for number of total good frames to reach parameter value | g.waitfor_frames(1000) | -| waitfor_uamps | Interrupts execution to wait for a specific total charge | g.waitfor_uamps(9.9) | -| waitfor_runstate | Waits for a particular instrument run state | g.waitfor_runstate("paused") | -| waitfor_move | Waits for all motion or specific motion to complete | g.waitfor_move("NEW_BLOCK") | - -Converting Open Genie to genie_python -===================================== - -If you know a little bit of Python already, converting Open Genie scripts to `genie_python` is very often straightforward. Even if you're new to Python, once you know a few simple pieces of syntax, you'll be able to convert many scripts without issue. - -List of functions ------------------ -We've included some -- [Common `genie_python` commands](#common-genie_python-commands) on this page, but for a full list refer to the [genie_python reference manual] (http://shadow.nd.rl.ac.uk/genie_python/sphinx/genie_python.html ). - -Indentation ------------ - -One thing where there is no direct comparison is with **indentation**. In Python, different code blocks are identified by their indentation level. In many programming languages, code blocks are encased in curly braces (`{...}`), but Python uses indentation. For example: - -``` -print "No indent" -def my_func(): - print "1 indent. Inside the function" - if True: - print "2 indents. Inside the if clause" - print "2 indents. Still inside the if clause" - print "1 indent. In the function but not the if clause" -print "No indent. Outside the function" -``` - -Typically an `indent` is 3 or 4 spaces. Tabs can be used too, but Python won't recognise that a tab is the same as 4 spaces so can lead to problems. It's often best to avoid them. This might be a new concept if you've only ever written Open Genie, but trust us in that it opens up a lot of ways to make scripts more powerful, easier to read and more reliable. - -Side-by-side comparison ------------------------- - -| Open Genie syntax | `genie_python` syntax | Comments | -|-------------------|-----------------------|----------| -| PROCEDURE my_func | def my_func(): | This is the standard way to define a function in Python | -| begin | g.begin() | Many functions in `genie_python` have the same name as in Open Genie. In these cases, prepend `g.` to idicate the method belongs to `genie_python` and append `()` to tell Python to execute the method with no arguments | -| my_func_2 100 | my_func_2(100) | To execute a function, give its name and then the argument in brackets. This is a user-defined function, not a `genie_python` function, so it has no `g.` in front. | -| my_func_3 100 200 | my_func_2(100,200) | As above, except that multiple arguments are separated by a comma | -| waitfor seconds=20 | g.waitfor(seconds=20) | Some methods can take named arguments. In these cases you simply give named arguments in the form `[name]=[value]`. Note that you can mix named and unnamed arguments, but unnamed arguments always appear at the start of the argument list. | -| # This is a comment | # This is a comment | Comments are the same in both languages | - -Creating and running instrument scripts -======================================= - -Different instruments may have specific scripts that are required for multiple users. To make accessing these easier, `genie_python` loads instrument scripts at startup. - -Creating scripts ----------------- - -For the most part, this is the same as [creating-user-scripts](#creating-and-running-user-scripts). - -### Script directory - -Unlike user scripts, instrument scripts should be placed in `C:\Instrument\Settings\config\[MACHINE_NAME]\Python`. Once the script has been created, edit the file `inst.py` in the same directory and add the line `from [MY_FILE] import *` where `[MY_FILE]` is the name of your file without the `.py` file extension. This will include the new script in the list of scripts loaded at startup. Best to avoid file names containing spaces, it [can be done](http://stackoverflow.com/questions/9123517/how-do-you-import-a-file-in-python-with-spaces-in-the-name) but it's easier to just not do it. - -### Script structure - -Everything in the instrument scripts will be executed when `genie_python` is started. This includes - - Making functions available to be called later - - Setting variables - - Running methods -Typically, most code in instrument scripts will be contained within functions (procedures in Open Genie language), but it's important to be aware that anything that isn't will be included too. For example, if an instrument script is loaded: - -``` -a = 1 -def print_a(): - print str(a) -``` - -then the user can call `print_a`, but they can also use the variable `a`, and change its value, which may not be desirable. If instead the script was: - - -``` -def print_a(): - a = 1 - print str(a) -``` - -then the user could only access `print_a()` and the value could not be changed. - -Running -------- - -Once the script is loaded, anything from the script will be available using the `inst` package reference. For instance if your script contains the function `my_function` you can call: - -``` -inst.my_function() -``` - -Whilst using the scripting perspective in the Ibex GUI, users will also benefit from the same auto-complete feature as they do with `genie_python` commands. - -Creating and running user scripts -================================= - -Creating scripts ----------------- - -1. First, we need to create a script file. By default, user scripts should be placed in `C:\scripts`. Navigate to your desired directory and create the script file with extension `.py`. -2. Write some `genie_python`! -3. Save the file - -We have glossed over step 2 because Python is a very powerful scripting language. Combined with Open Genie, the potential scope of a script is enormous, and well beyond the scope of this guide. For example though, here is a simple script that executes a calibration run. - -``` -# Change the title -calibration_run_title = "Calibration run 1, 29th September" -g.change(title=calibration_run_title) - -# Begin the run -print "Beginning calibration run : " + calibration_run_title -g.begin() - -# Wait for 100 uamps -g.waitfor(uamps=100) - -# End the run -g.end() -print "Calibration run finished successfully" -``` - -Running -------- - -Once you've created your script, it's time to run it. There are a number of ways of launching a Python script. - -### From Ibex - -1. Launch the Ibex GUI -1. Navigate to the scripting perspective -1. Run the command `g.load_script("C:\path\to\script\my_script.py")` where the path and script name are updated appropriately - - Note that if you omit the absolute path to the file (i.e. `C:\path\to\script`) then `genie_python` will look in the current script directory. By default this is `C:\scripts` but can be viewed and set with the commands `g.get_script_dir()` and `g.set_script_dir()` respectively. -1. When the script is loaded, any procedures in the script will be run automatically. If the script contains any function, you will now be able to call them from within the scripting window. - -### From a genie_python terminal - -1. Launch a `genie_python` terminal from `C:\Instrument\Apps\Python\` by running `genie_python.bat` -1. Follow the above starting at step 3. - -Tips from the developers -======================== - -Argument ordering ------------------ - -As this is Python, `genie_python` conforms to the standard pattern of calling Python functions. The arguments to the function are contained within brackets and the variables passed in as a comma-separated list. Ordering is important but can be overridden by using named variables, for instance the following are all correct and equivalent: - -``` -g.change_beamline_pars("PAR1",1) -g.change_beamline_pars(name="PAR1",value=1) -g.change_beamline_pars(value=1,name="PAR1") -g.change_beamline_pars("PAR1",value=1) -``` - -In the last example, named and unnamed variables are mixed. Unnamed variables must precede named variables. The following examples are not valid - -``` -g.change_beamline_pars(name="PAR1",1) # Named variable before unnamed -g.change_beamline_pars(1,"PAR1") # Cannot change order of unnamed variables -``` - -Using named variables can be **very useful in avoiding mistakes**. For instance, getting the order of high and low limits the wrong way round. For instance this example: - -``` -g.change_monitor(1,10,0) -``` - -is wrong and wouldn't work. Instead, we could have written: - -``` -g.change_monitor(1,high=10,low=0) -``` - -which would have worked and makes it clear for whoever comes to edit the code in future. \ No newline at end of file diff --git a/Scripting.rest b/Scripting.rest new file mode 100644 index 0000000..bc64034 --- /dev/null +++ b/Scripting.rest @@ -0,0 +1,82 @@ +Scripting +========= + +Scripting in IBEX is done using genie\_python. The [genie\_python +reference manual] +(http://shadow.nd.rl.ac.uk/genie_python/sphinx/genie_python.html ) gives +a full account of what functions are available in genie\_python. This +page is intended to give a broad guide to scripting for the beginner and +novice user. + +- `Running ``genie_python`` commands`_ +- `Common ``genie_python`` commands`_ +- `Converting Open Genie to ``genie_python```_ +- `Creating and running instrument scripts`_ +- `Creating and running user scripts`_ +- `Tips from the developers`_ + +Running genie\_python commands +============================== + +When running ``genie_python`` from an interactive console such as from +the GUI or after running ``C:\Instrument\Apps\Python\genie_python.bat``, +the ``genie`` module will be aliased to ``g``. Genie commands can then +be accessed by using the prefix ``g.[COMMAND_NAME]``. For example: + +:: + + g.start() + g.cset("BLOCK_1",1) + g.abort() + +This is particularly useful from the GUI which will auto-complete +commands and provide tool tips describing each function and its +arguments. + +Note that in many cases, arguments will be optional. For instance, +``begin`` can be used as ``g.begin()`` despite supporting all of the +arguments ``period``, ``meas_id``, ``meas_type``, ``meas_subid``, +``sample_id``, ``delayed``, ``quiet``, ``paused``, and ``verbose``. + +Common genie\_python commands +============================= + +Many ``genie_python`` commands share the same name with their Open Genie +equivalent so it will often be very straightforward to find the function +you’re looking for. Still, here is a list of the most commonly used +``genie_python`` commands. This is **not a complete list**. For full +information, consult the [genie\_python reference manual] ( +http://shadow.nd.rl.ac.uk/genie_python/sphinx/genie_python.html ). + +Starting and stopping a run +--------------------------- + ++-----------+----------------------------------------------------+--------------+ +| Command | Description | Example | ++===========+====================================================+==============+ +| begin | Starts a new run | g.begin() | ++-----------+----------------------------------------------------+--------------+ +| end | Ends the current run | g.end() | ++-----------+----------------------------------------------------+--------------+ +| abort | Aborts the current run | g.abort() | ++-----------+----------------------------------------------------+--------------+ +| pause | Pauses the current run | g.pause() | ++-----------+----------------------------------------------------+--------------+ +| resume | Resumes the current run after it has been paused | g.resume() | ++-----------+----------------------------------------------------+--------------+ + +Updating blocks and PVs +----------------------- + ++-----------+--------------------------------------------------+------------------------+ +| Command | Description | Example | ++===========+==================================================+========================+ +| cget | Gets the useful values associated with a block | g.cget(“NEW\_BLOCK”) | ++-----------+--------------------------------------------------+------------------------+ + +.. _Running ``genie_python`` commands: #running-genie_python-commands +.. _Common ``genie_python`` commands: #common-genie_python-commands +.. _Converting Open Genie to ``genie_python``: #converting-open-genie-to-genie_python +.. _Creating and running instrument scripts: #creating-and-running-instrument-scripts +.. _Creating and running user scripts: #creating-and-running-user-scripts +.. _Tips from the developers: #tips-from-the-developers \ No newline at end of file From 1ad1f2c98a3736dbc2492874f804a514484f7329 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Wed, 5 Oct 2016 13:34:34 +0100 Subject: [PATCH 0359/1813] Updated Scripting (rest) --- Scripting.rest | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Scripting.rest b/Scripting.rest index bc64034..a9eb57d 100644 --- a/Scripting.rest +++ b/Scripting.rest @@ -8,8 +8,8 @@ a full account of what functions are available in genie\_python. This page is intended to give a broad guide to scripting for the beginner and novice user. -- `Running ``genie_python`` commands`_ -- `Common ``genie_python`` commands`_ +- `Running genie_python commands`_ +- `Common genie_python commands`_ - `Converting Open Genie to ``genie_python```_ - `Creating and running instrument scripts`_ - `Creating and running user scripts`_ From 2fb88efa06c6203c8c6fbc5c55454ccc5f3890b0 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Wed, 5 Oct 2016 13:37:19 +0100 Subject: [PATCH 0360/1813] Updated Scripting (rest => markdown) --- Scripting.md | 244 +++++++++++++++++++++++++++++++++++++++++++++++++ Scripting.rest | 82 ----------------- 2 files changed, 244 insertions(+), 82 deletions(-) create mode 100644 Scripting.md delete mode 100644 Scripting.rest diff --git a/Scripting.md b/Scripting.md new file mode 100644 index 0000000..86d4b43 --- /dev/null +++ b/Scripting.md @@ -0,0 +1,244 @@ +Scripting +========= + +Scripting in IBEX is done using genie_python. The [genie_python reference manual] (http://shadow.nd.rl.ac.uk/genie_python/sphinx/genie_python.html ) gives a full account of what functions are available in genie_python. This page is intended to give a broad guide to scripting for the beginner and novice user. + +- [Running `genie_python` commands](#running-genie_python-commands) +- [Common `genie_python` commands](#common-genie_python-commands) +- [Converting Open Genie to `genie_python`](#converting-open-genie-to-genie_python) +- [Creating and running instrument scripts](#creating-and-running-instrument-scripts) +- [Creating and running user scripts](#creating-and-running-user-scripts) +- [Tips from the developers](#tips-from-the-developers) + +Running genie_python commands +====================== + +When running `genie_python` from an interactive console such as from the GUI or after running `C:\Instrument\Apps\Python\genie_python.bat`, the `genie` module will be aliased to `g`. Genie commands can then be accessed by using the prefix `g.[COMMAND_NAME]`. For example: + +``` +g.start() +g.cset("BLOCK_1",1) +g.abort() +``` + +This is particularly useful from the GUI which will auto-complete commands and provide tool tips describing each function and its arguments. + +Note that in many cases, arguments will be optional. For instance, `begin` can be used as `g.begin()` despite supporting all of the arguments `period`, `meas_id`, `meas_type`, `meas_subid`, `sample_id`, `delayed`, `quiet`, `paused`, and `verbose`. + +Common genie_python commands +===================== + +Many `genie_python` commands share the same name with their Open Genie equivalent so it will often be very straightforward to find the function you're looking for. Still, here is a list of the most commonly used `genie_python` commands. This is **not a complete list**. For full information, consult the [genie_python reference manual] ( http://shadow.nd.rl.ac.uk/genie_python/sphinx/genie_python.html ). + +Starting and stopping a run +--------------------------- + +| Command | Description | Example | +|---------|--------------------------------------------------|------------| +| begin | Starts a new run | g.begin() | +| end | Ends the current run | g.end() | +| abort | Aborts the current run | g.abort() | +| pause | Pauses the current run | g.pause() | +| resume | Resumes the current run after it has been paused | g.resume() | + +Updating blocks and PVs +----------------------- + +| Command | Description | Example | +|---------|------------------------------------------------------|---------------------------------------| +| cget | Gets the useful values associated with a block | g.cget("NEW_BLOCK") | +| cset | Sets the setpoint and runcontrol settings for blocks | g.cset("NEW_BLOCK",1) | +| get_pv | Gets the value for the specified PV | g.get_pv("IN:INSTNAME:IOC_01:STAT") | +| set_pv | Sets the value for the specified PV | g.set_pv("IN:INSTNAME:IOC_01:STAT",1) | + + +Run control +---------- + +| Command | Description | Example | +|------------------|---------------------------------------------------------------------------------------|---------------------------------------| +| get_uamps | Gets the current number of micro-amp hours | g.get_uamps() | +| get_frames | Gets the current number of good frames | g.get_frames() | +| get_runstate | Gets the current status of the instrument as a string | g.get_runstate() | +| get_mevents | Gets the total counts for all the detectors | g.get_mevents() | +| get_totalcounts | Gets the total counts for the current run | g.get_totalcounts() | +| waitfor | Interrupts execution until certain conditions are met | g.waitfor("NEW_BLOCK",value=1) | +| waitfor_block | Interrupts execution until block reaches specific value | g.waitfor_block("NEW_BLOCK",1) | +| waitfor_time | Interrupts execution for a specified amount of time | g.waitfor_time(1) | +| waitfor_frames | Interrupts execution to wait for number of total good frames to reach parameter value | g.waitfor_frames(1000) | +| waitfor_uamps | Interrupts execution to wait for a specific total charge | g.waitfor_uamps(9.9) | +| waitfor_runstate | Waits for a particular instrument run state | g.waitfor_runstate("paused") | +| waitfor_move | Waits for all motion or specific motion to complete | g.waitfor_move("NEW_BLOCK") | + +Converting Open Genie to genie_python +===================================== + +If you know a little bit of Python already, converting Open Genie scripts to `genie_python` is very often straightforward. Even if you're new to Python, once you know a few simple pieces of syntax, you'll be able to convert many scripts without issue. + +List of functions +----------------- +We've included some +- [Common `genie_python` commands](#common-genie_python-commands) on this page, but for a full list refer to the [genie_python reference manual] (http://shadow.nd.rl.ac.uk/genie_python/sphinx/genie_python.html ). + +Indentation +----------- + +One thing where there is no direct comparison is with **indentation**. In Python, different code blocks are identified by their indentation level. In many programming languages, code blocks are encased in curly braces (`{...}`), but Python uses indentation. For example: + +``` +print "No indent" +def my_func(): + print "1 indent. Inside the function" + if True: + print "2 indents. Inside the if clause" + print "2 indents. Still inside the if clause" + print "1 indent. In the function but not the if clause" +print "No indent. Outside the function" +``` + +Typically an `indent` is 3 or 4 spaces. Tabs can be used too, but Python won't recognise that a tab is the same as 4 spaces so can lead to problems. It's often best to avoid them. This might be a new concept if you've only ever written Open Genie, but trust us in that it opens up a lot of ways to make scripts more powerful, easier to read and more reliable. + +Side-by-side comparison +------------------------ + +| Open Genie syntax | `genie_python` syntax | Comments | +|-------------------|-----------------------|----------| +| PROCEDURE my_func | def my_func(): | This is the standard way to define a function in Python | +| begin | g.begin() | Many functions in `genie_python` have the same name as in Open Genie. In these cases, prepend `g.` to idicate the method belongs to `genie_python` and append `()` to tell Python to execute the method with no arguments | +| my_func_2 100 | my_func_2(100) | To execute a function, give its name and then the argument in brackets. This is a user-defined function, not a `genie_python` function, so it has no `g.` in front. | +| my_func_3 100 200 | my_func_2(100,200) | As above, except that multiple arguments are separated by a comma | +| waitfor seconds=20 | g.waitfor(seconds=20) | Some methods can take named arguments. In these cases you simply give named arguments in the form `[name]=[value]`. Note that you can mix named and unnamed arguments, but unnamed arguments always appear at the start of the argument list. | +| # This is a comment | # This is a comment | Comments are the same in both languages | + +Creating and running instrument scripts +======================================= + +Different instruments may have specific scripts that are required for multiple users. To make accessing these easier, `genie_python` loads instrument scripts at startup. + +Creating scripts +---------------- + +For the most part, this is the same as [creating-user-scripts](#creating-and-running-user-scripts). + +### Script directory + +Unlike user scripts, instrument scripts should be placed in `C:\Instrument\Settings\config\[MACHINE_NAME]\Python`. Once the script has been created, edit the file `inst.py` in the same directory and add the line `from [MY_FILE] import *` where `[MY_FILE]` is the name of your file without the `.py` file extension. This will include the new script in the list of scripts loaded at startup. Best to avoid file names containing spaces, it [can be done](http://stackoverflow.com/questions/9123517/how-do-you-import-a-file-in-python-with-spaces-in-the-name) but it's easier to just not do it. + +### Script structure + +Everything in the instrument scripts will be executed when `genie_python` is started. This includes + - Making functions available to be called later + - Setting variables + - Running methods +Typically, most code in instrument scripts will be contained within functions (procedures in Open Genie language), but it's important to be aware that anything that isn't will be included too. For example, if an instrument script is loaded: + +``` +a = 1 +def print_a(): + print str(a) +``` + +then the user can call `print_a`, but they can also use the variable `a`, and change its value, which may not be desirable. If instead the script was: + + +``` +def print_a(): + a = 1 + print str(a) +``` + +then the user could only access `print_a()` and the value could not be changed. + +Running +------- + +Once the script is loaded, anything from the script will be available using the `inst` package reference. For instance if your script contains the function `my_function` you can call: + +``` +inst.my_function() +``` + +Whilst using the scripting perspective in the Ibex GUI, users will also benefit from the same auto-complete feature as they do with `genie_python` commands. + +Creating and running user scripts +================================= + +Creating scripts +---------------- + +1. First, we need to create a script file. By default, user scripts should be placed in `C:\scripts`. Navigate to your desired directory and create the script file with extension `.py`. +2. Write some `genie_python`! +3. Save the file + +We have glossed over step 2 because Python is a very powerful scripting language. Combined with Open Genie, the potential scope of a script is enormous, and well beyond the scope of this guide. For example though, here is a simple script that executes a calibration run. + +``` +# Change the title +calibration_run_title = "Calibration run 1, 29th September" +g.change(title=calibration_run_title) + +# Begin the run +print "Beginning calibration run : " + calibration_run_title +g.begin() + +# Wait for 100 uamps +g.waitfor(uamps=100) + +# End the run +g.end() +print "Calibration run finished successfully" +``` + +Running +------- + +Once you've created your script, it's time to run it. There are a number of ways of launching a Python script. + +### From Ibex + +1. Launch the Ibex GUI +1. Navigate to the scripting perspective +1. Run the command `g.load_script("C:\path\to\script\my_script.py")` where the path and script name are updated appropriately + - Note that if you omit the absolute path to the file (i.e. `C:\path\to\script`) then `genie_python` will look in the current script directory. By default this is `C:\scripts` but can be viewed and set with the commands `g.get_script_dir()` and `g.set_script_dir()` respectively. +1. When the script is loaded, any procedures in the script will be run automatically. If the script contains any function, you will now be able to call them from within the scripting window. + +### From a genie_python terminal + +1. Launch a `genie_python` terminal from `C:\Instrument\Apps\Python\` by running `genie_python.bat` +1. Follow the above starting at step 3. + +Tips from the developers +======================== + +Argument ordering +----------------- + +As this is Python, `genie_python` conforms to the standard pattern of calling Python functions. The arguments to the function are contained within brackets and the variables passed in as a comma-separated list. Ordering is important but can be overridden by using named variables, for instance the following are all correct and equivalent: + +``` +g.change_beamline_pars("PAR1",1) +g.change_beamline_pars(name="PAR1",value=1) +g.change_beamline_pars(value=1,name="PAR1") +g.change_beamline_pars("PAR1",value=1) +``` + +In the last example, named and unnamed variables are mixed. Unnamed variables must precede named variables. The following examples are not valid + +``` +g.change_beamline_pars(name="PAR1",1) # Named variable before unnamed +g.change_beamline_pars(1,"PAR1") # Cannot change order of unnamed variables +``` + +Using named variables can be **very useful in avoiding mistakes**. For instance, getting the order of high and low limits the wrong way round. For instance this example: + +``` +g.change_monitor(1,10,0) +``` + +is wrong and wouldn't work. Instead, we could have written: + +``` +g.change_monitor(1,high=10,low=0) +``` + +which would have worked and makes it clear for whoever comes to edit the code in future. \ No newline at end of file diff --git a/Scripting.rest b/Scripting.rest deleted file mode 100644 index a9eb57d..0000000 --- a/Scripting.rest +++ /dev/null @@ -1,82 +0,0 @@ -Scripting -========= - -Scripting in IBEX is done using genie\_python. The [genie\_python -reference manual] -(http://shadow.nd.rl.ac.uk/genie_python/sphinx/genie_python.html ) gives -a full account of what functions are available in genie\_python. This -page is intended to give a broad guide to scripting for the beginner and -novice user. - -- `Running genie_python commands`_ -- `Common genie_python commands`_ -- `Converting Open Genie to ``genie_python```_ -- `Creating and running instrument scripts`_ -- `Creating and running user scripts`_ -- `Tips from the developers`_ - -Running genie\_python commands -============================== - -When running ``genie_python`` from an interactive console such as from -the GUI or after running ``C:\Instrument\Apps\Python\genie_python.bat``, -the ``genie`` module will be aliased to ``g``. Genie commands can then -be accessed by using the prefix ``g.[COMMAND_NAME]``. For example: - -:: - - g.start() - g.cset("BLOCK_1",1) - g.abort() - -This is particularly useful from the GUI which will auto-complete -commands and provide tool tips describing each function and its -arguments. - -Note that in many cases, arguments will be optional. For instance, -``begin`` can be used as ``g.begin()`` despite supporting all of the -arguments ``period``, ``meas_id``, ``meas_type``, ``meas_subid``, -``sample_id``, ``delayed``, ``quiet``, ``paused``, and ``verbose``. - -Common genie\_python commands -============================= - -Many ``genie_python`` commands share the same name with their Open Genie -equivalent so it will often be very straightforward to find the function -you’re looking for. Still, here is a list of the most commonly used -``genie_python`` commands. This is **not a complete list**. For full -information, consult the [genie\_python reference manual] ( -http://shadow.nd.rl.ac.uk/genie_python/sphinx/genie_python.html ). - -Starting and stopping a run ---------------------------- - -+-----------+----------------------------------------------------+--------------+ -| Command | Description | Example | -+===========+====================================================+==============+ -| begin | Starts a new run | g.begin() | -+-----------+----------------------------------------------------+--------------+ -| end | Ends the current run | g.end() | -+-----------+----------------------------------------------------+--------------+ -| abort | Aborts the current run | g.abort() | -+-----------+----------------------------------------------------+--------------+ -| pause | Pauses the current run | g.pause() | -+-----------+----------------------------------------------------+--------------+ -| resume | Resumes the current run after it has been paused | g.resume() | -+-----------+----------------------------------------------------+--------------+ - -Updating blocks and PVs ------------------------ - -+-----------+--------------------------------------------------+------------------------+ -| Command | Description | Example | -+===========+==================================================+========================+ -| cget | Gets the useful values associated with a block | g.cget(“NEW\_BLOCK”) | -+-----------+--------------------------------------------------+------------------------+ - -.. _Running ``genie_python`` commands: #running-genie_python-commands -.. _Common ``genie_python`` commands: #common-genie_python-commands -.. _Converting Open Genie to ``genie_python``: #converting-open-genie-to-genie_python -.. _Creating and running instrument scripts: #creating-and-running-instrument-scripts -.. _Creating and running user scripts: #creating-and-running-user-scripts -.. _Tips from the developers: #tips-from-the-developers \ No newline at end of file From 62826e38e6e4ae53d44d3f32b5a37a276342af50 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Wed, 5 Oct 2016 13:38:20 +0100 Subject: [PATCH 0361/1813] Updated Scripting (markdown => rest) --- Scripting.md => Scripting.rest | 243 +++++++++++++++++++++++++++++++++ 1 file changed, 243 insertions(+) rename Scripting.md => Scripting.rest (50%) diff --git a/Scripting.md b/Scripting.rest similarity index 50% rename from Scripting.md rename to Scripting.rest index 86d4b43..06627f9 100644 --- a/Scripting.md +++ b/Scripting.rest @@ -52,6 +52,128 @@ Updating blocks and PVs | set_pv | Sets the value for the specified PV | g.set_pv("IN:INSTNAME:IOC_01:STAT",1) | +Run control +---------- + +| Command | Description | Example | +|------------------|---------------------------------------------------------------------------------------|---------------------------------------| +| get_uamps | Gets the current number of micro-amp hours | g.get_uamps() | +| get_frames | Gets the current number of good frames | g.get_frames() | +| get_runstate | Gets the current status of the instrument as a string | g.get_runstate() | +| get_mevents | Gets the total counts for all the detectors | g.get_mevents() | +| get_totalcounts | Gets the total counts for the current run | g.get_totalcounts() | +| waitfor | Interrupts execution until certain conditions are met | g.waitfor("NEW_BLOCK",value=1) | +| waitfor_block | Interrupts execution until block reaches specific value | g.waitfor_block("NEW_BLOCK",1) | +| waitfor_time | Interrupts execution for a specified amount of time | g.waitfor_time(1) | +| waitfor_frames | Interrupts execution to wait for number of total good frames to reach parameter value | g.waitfor_frames(1000) | +| waitfor_uamps | Interrupts execution to wait for a specific total charge | g.waitfor_uamps(9.9) | +| waitfor_runstate | Waits for a particular instrument run state | g.waitfor_runstate("paused") | +| waitfor_move | Waits for all motion or specific motion to complete | g.waitfor_move("NEW_BLOCK") | + +Converting Open Genie to genie_python +===================================== + +If you know a little bit of Python already, converting Open Genie scripts to `genie_python` is very often straightforward. Even if you're new to Python, once you know a few simple pieces of syntax, you'll be able to convert many scripts without issue. + +List of functions +----------------- +We've included some +- [Common `genie_python` commands](#common-genie_python-commands) on this page, but for a full list refer to the [genie_python reference manual] (http://shadow.nd.rl.ac.uk/genie_python/sphinx/genie_python.html ). + +Indentation +----------- + +One thing where there is no direct comparison is with **indentation**. In Python, different code blocks are identified by their indentation level. In many programming languages, code blocks are encased in curly braces (`{...}`), but Python uses indentation. For example: + +``` +print "No indent" +def my_func(): + print "1 indent. Inside the function" + if True: + print "2 indents. Inside the if clause" + print "2 indents. Still inside the if clause" + print "1 indent. In the function but not the if clause" +print "No indent. Outside the function" +``` + +Typically an `indent` is 3 or 4 spaces. Tabs can be used too, but Python won't recognise that a tab is the same as 4 spaces so can lead to problems. It's often best to avoid them. This might be a new concept if you've only ever written Open Genie, but trust us in that it opens up a lot of ways to make scripts more powerful, easier to read and more reliable. + +Side-by-side comparison +------------------------ + +| Open Genie syntax | `genie_python` syntax | Comments | +|-------------------|-----------------------|----------| +| PROCEDURE my_func | def my_func(): | This is the standard way to define a function in Python | +| begin | g.begin() | Many functions in `genie_python` have the same name as in Open Genie. In these cases, prepend `g.` to idicate the method belongs to `genie_python` and append `()` to tell Python to execute the method with no arguments | +| my_func_2 100 | my_func_2(100) | To execute a function, give its name and then the argument in brackets. This is a user-defined function, not a `genie_python` function, so it has no `g.` in front. | +| my_func_3 100 200 | my_func_2(100,200) | As above, except that multiple arguments are separated by a comma | +| waitfor seconds=20 | g.waitfor(seconds=20) | Some methods can take named arguments. In these cases you simply give named arguments in the form `[name]=[value]`. Note that you can mix named and unnamed arguments, but unnamed arguments always appear at the start of the argument list. | +| # This is a comment | # This is a comment | Comments are the same in both languages | + +Creating and running instrument scripts +======================================= + +Different instruments may have specific scripts that are required for multiple users. To make accessing these easier, `genie_python` loads instrument scripts at startup. + +Creating scripts +---------------- + +For the most part, this is the same as [creating-user-scripts](#creating-and-running-user-scripts). + +### Script directoryScripting +========= + +Scripting in IBEX is done using genie_python. The [genie_python reference manual] (http://shadow.nd.rl.ac.uk/genie_python/sphinx/genie_python.html ) gives a full account of what functions are available in genie_python. This page is intended to give a broad guide to scripting for the beginner and novice user. + +- [Running `genie_python` commands](#running-genie_python-commands) +- [Common `genie_python` commands](#common-genie_python-commands) +- [Converting Open Genie to `genie_python`](#converting-open-genie-to-genie_python) +- [Creating and running instrument scripts](#creating-and-running-instrument-scripts) +- [Creating and running user scripts](#creating-and-running-user-scripts) +- [Tips from the developers](#tips-from-the-developers) + +Running genie_python commands +====================== + +When running `genie_python` from an interactive console such as from the GUI or after running `C:\Instrument\Apps\Python\genie_python.bat`, the `genie` module will be aliased to `g`. Genie commands can then be accessed by using the prefix `g.[COMMAND_NAME]`. For example: + +``` +g.start() +g.cset("BLOCK_1",1) +g.abort() +``` + +This is particularly useful from the GUI which will auto-complete commands and provide tool tips describing each function and its arguments. + +Note that in many cases, arguments will be optional. For instance, `begin` can be used as `g.begin()` despite supporting all of the arguments `period`, `meas_id`, `meas_type`, `meas_subid`, `sample_id`, `delayed`, `quiet`, `paused`, and `verbose`. + +Common genie_python commands +===================== + +Many `genie_python` commands share the same name with their Open Genie equivalent so it will often be very straightforward to find the function you're looking for. Still, here is a list of the most commonly used `genie_python` commands. This is **not a complete list**. For full information, consult the [genie_python reference manual] ( http://shadow.nd.rl.ac.uk/genie_python/sphinx/genie_python.html ). + +Starting and stopping a run +--------------------------- + +| Command | Description | Example | +|---------|--------------------------------------------------|------------| +| begin | Starts a new run | g.begin() | +| end | Ends the current run | g.end() | +| abort | Aborts the current run | g.abort() | +| pause | Pauses the current run | g.pause() | +| resume | Resumes the current run after it has been paused | g.resume() | + +Updating blocks and PVs +----------------------- + +| Command | Description | Example | +|---------|------------------------------------------------------|---------------------------------------| +| cget | Gets the useful values associated with a block | g.cget("NEW_BLOCK") | +| cset | Sets the setpoint and runcontrol settings for blocks | g.cset("NEW_BLOCK",1) | +| get_pv | Gets the value for the specified PV | g.get_pv("IN:INSTNAME:IOC_01:STAT") | +| set_pv | Sets the value for the specified PV | g.set_pv("IN:INSTNAME:IOC_01:STAT",1) | + + Run control ---------- @@ -141,6 +263,127 @@ def print_a(): then the user can call `print_a`, but they can also use the variable `a`, and change its value, which may not be desirable. If instead the script was: +``` +def print_a(): + a = 1 + print str(a) +``` + +then the user could only access `print_a()` and the value could not be changed. + +Running +------- + +Once the script is loaded, anything from the script will be available using the `inst` package reference. For instance if your script contains the function `my_function` you can call: + +``` +inst.my_function() +``` + +Whilst using the scripting perspective in the Ibex GUI, users will also benefit from the same auto-complete feature as they do with `genie_python` commands. + +Creating and running user scripts +================================= + +Creating scripts +---------------- + +1. First, we need to create a script file. By default, user scripts should be placed in `C:\scripts`. Navigate to your desired directory and create the script file with extension `.py`. +2. Write some `genie_python`! +3. Save the file + +We have glossed over step 2 because Python is a very powerful scripting language. Combined with Open Genie, the potential scope of a script is enormous, and well beyond the scope of this guide. For example though, here is a simple script that executes a calibration run. + +``` +# Change the title +calibration_run_title = "Calibration run 1, 29th September" +g.change(title=calibration_run_title) + +# Begin the run +print "Beginning calibration run : " + calibration_run_title +g.begin() + +# Wait for 100 uamps +g.waitfor(uamps=100) + +# End the run +g.end() +print "Calibration run finished successfully" +``` + +Running +------- + +Once you've created your script, it's time to run it. There are a number of ways of launching a Python script. + +### From Ibex + +1. Launch the Ibex GUI +1. Navigate to the scripting perspective +1. Run the command `g.load_script("C:\path\to\script\my_script.py")` where the path and script name are updated appropriately + - Note that if you omit the absolute path to the file (i.e. `C:\path\to\script`) then `genie_python` will look in the current script directory. By default this is `C:\scripts` but can be viewed and set with the commands `g.get_script_dir()` and `g.set_script_dir()` respectively. +1. When the script is loaded, any procedures in the script will be run automatically. If the script contains any function, you will now be able to call them from within the scripting window. + +### From a genie_python terminal + +1. Launch a `genie_python` terminal from `C:\Instrument\Apps\Python\` by running `genie_python.bat` +1. Follow the above starting at step 3. + +Tips from the developers +======================== + +Argument ordering +----------------- + +As this is Python, `genie_python` conforms to the standard pattern of calling Python functions. The arguments to the function are contained within brackets and the variables passed in as a comma-separated list. Ordering is important but can be overridden by using named variables, for instance the following are all correct and equivalent: + +``` +g.change_beamline_pars("PAR1",1) +g.change_beamline_pars(name="PAR1",value=1) +g.change_beamline_pars(value=1,name="PAR1") +g.change_beamline_pars("PAR1",value=1) +``` + +In the last example, named and unnamed variables are mixed. Unnamed variables must precede named variables. The following examples are not valid + +``` +g.change_beamline_pars(name="PAR1",1) # Named variable before unnamed +g.change_beamline_pars(1,"PAR1") # Cannot change order of unnamed variables +``` + +Using named variables can be **very useful in avoiding mistakes**. For instance, getting the order of high and low limits the wrong way round. For instance this example: + +``` +g.change_monitor(1,10,0) +``` + +is wrong and wouldn't work. Instead, we could have written: + +``` +g.change_monitor(1,high=10,low=0) +``` + +which would have worked and makes it clear for whoever comes to edit the code in future. + +Unlike user scripts, instrument scripts should be placed in `C:\Instrument\Settings\config\[MACHINE_NAME]\Python`. Once the script has been created, edit the file `inst.py` in the same directory and add the line `from [MY_FILE] import *` where `[MY_FILE]` is the name of your file without the `.py` file extension. This will include the new script in the list of scripts loaded at startup. Best to avoid file names containing spaces, it [can be done](http://stackoverflow.com/questions/9123517/how-do-you-import-a-file-in-python-with-spaces-in-the-name) but it's easier to just not do it. + +### Script structure + +Everything in the instrument scripts will be executed when `genie_python` is started. This includes + - Making functions available to be called later + - Setting variables + - Running methods +Typically, most code in instrument scripts will be contained within functions (procedures in Open Genie language), but it's important to be aware that anything that isn't will be included too. For example, if an instrument script is loaded: + +``` +a = 1 +def print_a(): + print str(a) +``` + +then the user can call `print_a`, but they can also use the variable `a`, and change its value, which may not be desirable. If instead the script was: + + ``` def print_a(): a = 1 From 986dac073004abc4d49c1d63a9ed51582046ee04 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Wed, 5 Oct 2016 13:40:24 +0100 Subject: [PATCH 0362/1813] Updated Scripting (rest) --- Scripting.rest | 873 +++++++++++++++++++++++++++++++------------------ 1 file changed, 550 insertions(+), 323 deletions(-) diff --git a/Scripting.rest b/Scripting.rest index 06627f9..4c5830f 100644 --- a/Scripting.rest +++ b/Scripting.rest @@ -1,286 +1,442 @@ Scripting ========= -Scripting in IBEX is done using genie_python. The [genie_python reference manual] (http://shadow.nd.rl.ac.uk/genie_python/sphinx/genie_python.html ) gives a full account of what functions are available in genie_python. This page is intended to give a broad guide to scripting for the beginner and novice user. - -- [Running `genie_python` commands](#running-genie_python-commands) -- [Common `genie_python` commands](#common-genie_python-commands) -- [Converting Open Genie to `genie_python`](#converting-open-genie-to-genie_python) -- [Creating and running instrument scripts](#creating-and-running-instrument-scripts) -- [Creating and running user scripts](#creating-and-running-user-scripts) -- [Tips from the developers](#tips-from-the-developers) - -Running genie_python commands -====================== - -When running `genie_python` from an interactive console such as from the GUI or after running `C:\Instrument\Apps\Python\genie_python.bat`, the `genie` module will be aliased to `g`. Genie commands can then be accessed by using the prefix `g.[COMMAND_NAME]`. For example: - -``` -g.start() -g.cset("BLOCK_1",1) -g.abort() -``` - -This is particularly useful from the GUI which will auto-complete commands and provide tool tips describing each function and its arguments. - -Note that in many cases, arguments will be optional. For instance, `begin` can be used as `g.begin()` despite supporting all of the arguments `period`, `meas_id`, `meas_type`, `meas_subid`, `sample_id`, `delayed`, `quiet`, `paused`, and `verbose`. - -Common genie_python commands -===================== - -Many `genie_python` commands share the same name with their Open Genie equivalent so it will often be very straightforward to find the function you're looking for. Still, here is a list of the most commonly used `genie_python` commands. This is **not a complete list**. For full information, consult the [genie_python reference manual] ( http://shadow.nd.rl.ac.uk/genie_python/sphinx/genie_python.html ). +Scripting in IBEX is done using genie\_python. The [genie\_python +reference manual] +(http://shadow.nd.rl.ac.uk/genie\_python/sphinx/genie\_python.html ) +gives a full account of what functions are available in genie\_python. +This page is intended to give a broad guide to scripting for the +beginner and novice user. + +- `Running ``genie_python`` + commands <#running-genie_python-commands>`__ +- `Common ``genie_python`` commands <#common-genie_python-commands>`__ +- `Converting Open Genie to + ``genie_python`` <#converting-open-genie-to-genie_python>`__ +- `Creating and running instrument + scripts <#creating-and-running-instrument-scripts>`__ +- `Creating and running user + scripts <#creating-and-running-user-scripts>`__ +- `Tips from the developers <#tips-from-the-developers>`__ + +Running genie\_python commands +============================== + +When running ``genie_python`` from an interactive console such as from +the GUI or after running ``C:\Instrument\Apps\Python\genie_python.bat``, +the ``genie`` module will be aliased to ``g``. Genie commands can then +be accessed by using the prefix ``g.[COMMAND_NAME]``. For example: + +:: + + g.start() + g.cset("BLOCK_1",1) + g.abort() + +This is particularly useful from the GUI which will auto-complete +commands and provide tool tips describing each function and its +arguments. + +Note that in many cases, arguments will be optional. For instance, +``begin`` can be used as ``g.begin()`` despite supporting all of the +arguments ``period``, ``meas_id``, ``meas_type``, ``meas_subid``, +``sample_id``, ``delayed``, ``quiet``, ``paused``, and ``verbose``. + +Common genie\_python commands +============================= + +Many ``genie_python`` commands share the same name with their Open Genie +equivalent so it will often be very straightforward to find the function +you're looking for. Still, here is a list of the most commonly used +``genie_python`` commands. This is **not a complete list**. For full +information, consult the [genie\_python reference manual] ( +http://shadow.nd.rl.ac.uk/genie\_python/sphinx/genie\_python.html ). Starting and stopping a run --------------------------- -| Command | Description | Example | -|---------|--------------------------------------------------|------------| -| begin | Starts a new run | g.begin() | -| end | Ends the current run | g.end() | -| abort | Aborts the current run | g.abort() | -| pause | Pauses the current run | g.pause() | -| resume | Resumes the current run after it has been paused | g.resume() | ++-----------+----------------------------------------------------+--------------+ +| Command | Description | Example | ++===========+====================================================+==============+ +| begin | Starts a new run | g.begin() | ++-----------+----------------------------------------------------+--------------+ +| end | Ends the current run | g.end() | ++-----------+----------------------------------------------------+--------------+ +| abort | Aborts the current run | g.abort() | ++-----------+----------------------------------------------------+--------------+ +| pause | Pauses the current run | g.pause() | ++-----------+----------------------------------------------------+--------------+ +| resume | Resumes the current run after it has been paused | g.resume() | ++-----------+----------------------------------------------------+--------------+ Updating blocks and PVs ----------------------- -| Command | Description | Example | -|---------|------------------------------------------------------|---------------------------------------| -| cget | Gets the useful values associated with a block | g.cget("NEW_BLOCK") | -| cset | Sets the setpoint and runcontrol settings for blocks | g.cset("NEW_BLOCK",1) | -| get_pv | Gets the value for the specified PV | g.get_pv("IN:INSTNAME:IOC_01:STAT") | -| set_pv | Sets the value for the specified PV | g.set_pv("IN:INSTNAME:IOC_01:STAT",1) | - ++-----------+--------------------------------------------------------+-------------------------------------------+ +| Command | Description | Example | ++===========+========================================================+===========================================+ +| cget | Gets the useful values associated with a block | g.cget("NEW\_BLOCK") | ++-----------+--------------------------------------------------------+-------------------------------------------+ +| cset | Sets the setpoint and runcontrol settings for blocks | g.cset("NEW\_BLOCK",1) | ++-----------+--------------------------------------------------------+-------------------------------------------+ +| get\_pv | Gets the value for the specified PV | g.get\_pv("IN:INSTNAME:IOC\_01:STAT") | ++-----------+--------------------------------------------------------+-------------------------------------------+ +| set\_pv | Sets the value for the specified PV | g.set\_pv("IN:INSTNAME:IOC\_01:STAT",1) | ++-----------+--------------------------------------------------------+-------------------------------------------+ Run control ----------- - -| Command | Description | Example | -|------------------|---------------------------------------------------------------------------------------|---------------------------------------| -| get_uamps | Gets the current number of micro-amp hours | g.get_uamps() | -| get_frames | Gets the current number of good frames | g.get_frames() | -| get_runstate | Gets the current status of the instrument as a string | g.get_runstate() | -| get_mevents | Gets the total counts for all the detectors | g.get_mevents() | -| get_totalcounts | Gets the total counts for the current run | g.get_totalcounts() | -| waitfor | Interrupts execution until certain conditions are met | g.waitfor("NEW_BLOCK",value=1) | -| waitfor_block | Interrupts execution until block reaches specific value | g.waitfor_block("NEW_BLOCK",1) | -| waitfor_time | Interrupts execution for a specified amount of time | g.waitfor_time(1) | -| waitfor_frames | Interrupts execution to wait for number of total good frames to reach parameter value | g.waitfor_frames(1000) | -| waitfor_uamps | Interrupts execution to wait for a specific total charge | g.waitfor_uamps(9.9) | -| waitfor_runstate | Waits for a particular instrument run state | g.waitfor_runstate("paused") | -| waitfor_move | Waits for all motion or specific motion to complete | g.waitfor_move("NEW_BLOCK") | - -Converting Open Genie to genie_python -===================================== - -If you know a little bit of Python already, converting Open Genie scripts to `genie_python` is very often straightforward. Even if you're new to Python, once you know a few simple pieces of syntax, you'll be able to convert many scripts without issue. +----------- + ++---------------------+-----------------------------------------------------------------------------------------+------------------------------------+ +| Command | Description | Example | ++=====================+=========================================================================================+====================================+ +| get\_uamps | Gets the current number of micro-amp hours | g.get\_uamps() | ++---------------------+-----------------------------------------------------------------------------------------+------------------------------------+ +| get\_frames | Gets the current number of good frames | g.get\_frames() | ++---------------------+-----------------------------------------------------------------------------------------+------------------------------------+ +| get\_runstate | Gets the current status of the instrument as a string | g.get\_runstate() | ++---------------------+-----------------------------------------------------------------------------------------+------------------------------------+ +| get\_mevents | Gets the total counts for all the detectors | g.get\_mevents() | ++---------------------+-----------------------------------------------------------------------------------------+------------------------------------+ +| get\_totalcounts | Gets the total counts for the current run | g.get\_totalcounts() | ++---------------------+-----------------------------------------------------------------------------------------+------------------------------------+ +| waitfor | Interrupts execution until certain conditions are met | g.waitfor("NEW\_BLOCK",value=1) | ++---------------------+-----------------------------------------------------------------------------------------+------------------------------------+ +| waitfor\_block | Interrupts execution until block reaches specific value | g.waitfor\_block("NEW\_BLOCK",1) | ++---------------------+-----------------------------------------------------------------------------------------+------------------------------------+ +| waitfor\_time | Interrupts execution for a specified amount of time | g.waitfor\_time(1) | ++---------------------+-----------------------------------------------------------------------------------------+------------------------------------+ +| waitfor\_frames | Interrupts execution to wait for number of total good frames to reach parameter value | g.waitfor\_frames(1000) | ++---------------------+-----------------------------------------------------------------------------------------+------------------------------------+ +| waitfor\_uamps | Interrupts execution to wait for a specific total charge | g.waitfor\_uamps(9.9) | ++---------------------+-----------------------------------------------------------------------------------------+------------------------------------+ +| waitfor\_runstate | Waits for a particular instrument run state | g.waitfor\_runstate("paused") | ++---------------------+-----------------------------------------------------------------------------------------+------------------------------------+ +| waitfor\_move | Waits for all motion or specific motion to complete | g.waitfor\_move("NEW\_BLOCK") | ++---------------------+-----------------------------------------------------------------------------------------+------------------------------------+ + +Converting Open Genie to genie\_python +====================================== + +If you know a little bit of Python already, converting Open Genie +scripts to ``genie_python`` is very often straightforward. Even if +you're new to Python, once you know a few simple pieces of syntax, +you'll be able to convert many scripts without issue. List of functions ----------------- -We've included some -- [Common `genie_python` commands](#common-genie_python-commands) on this page, but for a full list refer to the [genie_python reference manual] (http://shadow.nd.rl.ac.uk/genie_python/sphinx/genie_python.html ). + +We've included some - `Common ``genie_python`` +commands <#common-genie_python-commands>`__ on this page, but for a full +list refer to the [genie\_python reference manual] +(http://shadow.nd.rl.ac.uk/genie\_python/sphinx/genie\_python.html ). Indentation ----------- -One thing where there is no direct comparison is with **indentation**. In Python, different code blocks are identified by their indentation level. In many programming languages, code blocks are encased in curly braces (`{...}`), but Python uses indentation. For example: - -``` -print "No indent" -def my_func(): - print "1 indent. Inside the function" - if True: - print "2 indents. Inside the if clause" - print "2 indents. Still inside the if clause" - print "1 indent. In the function but not the if clause" -print "No indent. Outside the function" -``` - -Typically an `indent` is 3 or 4 spaces. Tabs can be used too, but Python won't recognise that a tab is the same as 4 spaces so can lead to problems. It's often best to avoid them. This might be a new concept if you've only ever written Open Genie, but trust us in that it opens up a lot of ways to make scripts more powerful, easier to read and more reliable. +One thing where there is no direct comparison is with **indentation**. +In Python, different code blocks are identified by their indentation +level. In many programming languages, code blocks are encased in curly +braces (``{...}``), but Python uses indentation. For example: + +:: + + print "No indent" + def my_func(): + print "1 indent. Inside the function" + if True: + print "2 indents. Inside the if clause" + print "2 indents. Still inside the if clause" + print "1 indent. In the function but not the if clause" + print "No indent. Outside the function" + +Typically an ``indent`` is 3 or 4 spaces. Tabs can be used too, but +Python won't recognise that a tab is the same as 4 spaces so can lead to +problems. It's often best to avoid them. This might be a new concept if +you've only ever written Open Genie, but trust us in that it opens up a +lot of ways to make scripts more powerful, easier to read and more +reliable. Side-by-side comparison ------------------------- +----------------------- -| Open Genie syntax | `genie_python` syntax | Comments | -|-------------------|-----------------------|----------| -| PROCEDURE my_func | def my_func(): | This is the standard way to define a function in Python | -| begin | g.begin() | Many functions in `genie_python` have the same name as in Open Genie. In these cases, prepend `g.` to idicate the method belongs to `genie_python` and append `()` to tell Python to execute the method with no arguments | -| my_func_2 100 | my_func_2(100) | To execute a function, give its name and then the argument in brackets. This is a user-defined function, not a `genie_python` function, so it has no `g.` in front. | -| my_func_3 100 200 | my_func_2(100,200) | As above, except that multiple arguments are separated by a comma | -| waitfor seconds=20 | g.waitfor(seconds=20) | Some methods can take named arguments. In these cases you simply give named arguments in the form `[name]=[value]`. Note that you can mix named and unnamed arguments, but unnamed arguments always appear at the start of the argument list. | -| # This is a comment | # This is a comment | Comments are the same in both languages | ++-----------------------+---------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| Open Genie syntax | ``genie_python`` syntax | Comments | ++=======================+===========================+===================================================================================================================================================================================================================================================+ +| PROCEDURE my\_func | def my\_func(): | This is the standard way to define a function in Python | ++-----------------------+---------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| begin | g.begin() | Many functions in ``genie_python`` have the same name as in Open Genie. In these cases, prepend ``g.`` to idicate the method belongs to ``genie_python`` and append ``()`` to tell Python to execute the method with no arguments | ++-----------------------+---------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| my\_func\_2 100 | my\_func\_2(100) | To execute a function, give its name and then the argument in brackets. This is a user-defined function, not a ``genie_python`` function, so it has no ``g.`` in front. | ++-----------------------+---------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| my\_func\_3 100 200 | my\_func\_2(100,200) | As above, except that multiple arguments are separated by a comma | ++-----------------------+---------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| waitfor seconds=20 | g.waitfor(seconds=20) | Some methods can take named arguments. In these cases you simply give named arguments in the form ``[name]=[value]``. Note that you can mix named and unnamed arguments, but unnamed arguments always appear at the start of the argument list. | ++-----------------------+---------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| # This is a comment | # This is a comment | Comments are the same in both languages | ++-----------------------+---------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ Creating and running instrument scripts ======================================= -Different instruments may have specific scripts that are required for multiple users. To make accessing these easier, `genie_python` loads instrument scripts at startup. +Different instruments may have specific scripts that are required for +multiple users. To make accessing these easier, ``genie_python`` loads +instrument scripts at startup. Creating scripts ---------------- -For the most part, this is the same as [creating-user-scripts](#creating-and-running-user-scripts). +For the most part, this is the same as +`creating-user-scripts <#creating-and-running-user-scripts>`__. ### Script directoryScripting -========= - -Scripting in IBEX is done using genie_python. The [genie_python reference manual] (http://shadow.nd.rl.ac.uk/genie_python/sphinx/genie_python.html ) gives a full account of what functions are available in genie_python. This page is intended to give a broad guide to scripting for the beginner and novice user. - -- [Running `genie_python` commands](#running-genie_python-commands) -- [Common `genie_python` commands](#common-genie_python-commands) -- [Converting Open Genie to `genie_python`](#converting-open-genie-to-genie_python) -- [Creating and running instrument scripts](#creating-and-running-instrument-scripts) -- [Creating and running user scripts](#creating-and-running-user-scripts) -- [Tips from the developers](#tips-from-the-developers) - -Running genie_python commands -====================== - -When running `genie_python` from an interactive console such as from the GUI or after running `C:\Instrument\Apps\Python\genie_python.bat`, the `genie` module will be aliased to `g`. Genie commands can then be accessed by using the prefix `g.[COMMAND_NAME]`. For example: - -``` -g.start() -g.cset("BLOCK_1",1) -g.abort() -``` - -This is particularly useful from the GUI which will auto-complete commands and provide tool tips describing each function and its arguments. - -Note that in many cases, arguments will be optional. For instance, `begin` can be used as `g.begin()` despite supporting all of the arguments `period`, `meas_id`, `meas_type`, `meas_subid`, `sample_id`, `delayed`, `quiet`, `paused`, and `verbose`. - -Common genie_python commands -===================== - -Many `genie_python` commands share the same name with their Open Genie equivalent so it will often be very straightforward to find the function you're looking for. Still, here is a list of the most commonly used `genie_python` commands. This is **not a complete list**. For full information, consult the [genie_python reference manual] ( http://shadow.nd.rl.ac.uk/genie_python/sphinx/genie_python.html ). +============================= + +Scripting in IBEX is done using genie\_python. The [genie\_python +reference manual] +(http://shadow.nd.rl.ac.uk/genie\_python/sphinx/genie\_python.html ) +gives a full account of what functions are available in genie\_python. +This page is intended to give a broad guide to scripting for the +beginner and novice user. + +- `Running ``genie_python`` + commands <#running-genie_python-commands>`__ +- `Common ``genie_python`` commands <#common-genie_python-commands>`__ +- `Converting Open Genie to + ``genie_python`` <#converting-open-genie-to-genie_python>`__ +- `Creating and running instrument + scripts <#creating-and-running-instrument-scripts>`__ +- `Creating and running user + scripts <#creating-and-running-user-scripts>`__ +- `Tips from the developers <#tips-from-the-developers>`__ + +Running genie\_python commands +============================== + +When running ``genie_python`` from an interactive console such as from +the GUI or after running ``C:\Instrument\Apps\Python\genie_python.bat``, +the ``genie`` module will be aliased to ``g``. Genie commands can then +be accessed by using the prefix ``g.[COMMAND_NAME]``. For example: + +:: + + g.start() + g.cset("BLOCK_1",1) + g.abort() + +This is particularly useful from the GUI which will auto-complete +commands and provide tool tips describing each function and its +arguments. + +Note that in many cases, arguments will be optional. For instance, +``begin`` can be used as ``g.begin()`` despite supporting all of the +arguments ``period``, ``meas_id``, ``meas_type``, ``meas_subid``, +``sample_id``, ``delayed``, ``quiet``, ``paused``, and ``verbose``. + +Common genie\_python commands +============================= + +Many ``genie_python`` commands share the same name with their Open Genie +equivalent so it will often be very straightforward to find the function +you're looking for. Still, here is a list of the most commonly used +``genie_python`` commands. This is **not a complete list**. For full +information, consult the [genie\_python reference manual] ( +http://shadow.nd.rl.ac.uk/genie\_python/sphinx/genie\_python.html ). Starting and stopping a run --------------------------- -| Command | Description | Example | -|---------|--------------------------------------------------|------------| -| begin | Starts a new run | g.begin() | -| end | Ends the current run | g.end() | -| abort | Aborts the current run | g.abort() | -| pause | Pauses the current run | g.pause() | -| resume | Resumes the current run after it has been paused | g.resume() | ++-----------+----------------------------------------------------+--------------+ +| Command | Description | Example | ++===========+====================================================+==============+ +| begin | Starts a new run | g.begin() | ++-----------+----------------------------------------------------+--------------+ +| end | Ends the current run | g.end() | ++-----------+----------------------------------------------------+--------------+ +| abort | Aborts the current run | g.abort() | ++-----------+----------------------------------------------------+--------------+ +| pause | Pauses the current run | g.pause() | ++-----------+----------------------------------------------------+--------------+ +| resume | Resumes the current run after it has been paused | g.resume() | ++-----------+----------------------------------------------------+--------------+ Updating blocks and PVs ----------------------- -| Command | Description | Example | -|---------|------------------------------------------------------|---------------------------------------| -| cget | Gets the useful values associated with a block | g.cget("NEW_BLOCK") | -| cset | Sets the setpoint and runcontrol settings for blocks | g.cset("NEW_BLOCK",1) | -| get_pv | Gets the value for the specified PV | g.get_pv("IN:INSTNAME:IOC_01:STAT") | -| set_pv | Sets the value for the specified PV | g.set_pv("IN:INSTNAME:IOC_01:STAT",1) | - ++-----------+--------------------------------------------------------+-------------------------------------------+ +| Command | Description | Example | ++===========+========================================================+===========================================+ +| cget | Gets the useful values associated with a block | g.cget("NEW\_BLOCK") | ++-----------+--------------------------------------------------------+-------------------------------------------+ +| cset | Sets the setpoint and runcontrol settings for blocks | g.cset("NEW\_BLOCK",1) | ++-----------+--------------------------------------------------------+-------------------------------------------+ +| get\_pv | Gets the value for the specified PV | g.get\_pv("IN:INSTNAME:IOC\_01:STAT") | ++-----------+--------------------------------------------------------+-------------------------------------------+ +| set\_pv | Sets the value for the specified PV | g.set\_pv("IN:INSTNAME:IOC\_01:STAT",1) | ++-----------+--------------------------------------------------------+-------------------------------------------+ Run control ----------- - -| Command | Description | Example | -|------------------|---------------------------------------------------------------------------------------|---------------------------------------| -| get_uamps | Gets the current number of micro-amp hours | g.get_uamps() | -| get_frames | Gets the current number of good frames | g.get_frames() | -| get_runstate | Gets the current status of the instrument as a string | g.get_runstate() | -| get_mevents | Gets the total counts for all the detectors | g.get_mevents() | -| get_totalcounts | Gets the total counts for the current run | g.get_totalcounts() | -| waitfor | Interrupts execution until certain conditions are met | g.waitfor("NEW_BLOCK",value=1) | -| waitfor_block | Interrupts execution until block reaches specific value | g.waitfor_block("NEW_BLOCK",1) | -| waitfor_time | Interrupts execution for a specified amount of time | g.waitfor_time(1) | -| waitfor_frames | Interrupts execution to wait for number of total good frames to reach parameter value | g.waitfor_frames(1000) | -| waitfor_uamps | Interrupts execution to wait for a specific total charge | g.waitfor_uamps(9.9) | -| waitfor_runstate | Waits for a particular instrument run state | g.waitfor_runstate("paused") | -| waitfor_move | Waits for all motion or specific motion to complete | g.waitfor_move("NEW_BLOCK") | - -Converting Open Genie to genie_python -===================================== - -If you know a little bit of Python already, converting Open Genie scripts to `genie_python` is very often straightforward. Even if you're new to Python, once you know a few simple pieces of syntax, you'll be able to convert many scripts without issue. +----------- + ++---------------------+-----------------------------------------------------------------------------------------+------------------------------------+ +| Command | Description | Example | ++=====================+=========================================================================================+====================================+ +| get\_uamps | Gets the current number of micro-amp hours | g.get\_uamps() | ++---------------------+-----------------------------------------------------------------------------------------+------------------------------------+ +| get\_frames | Gets the current number of good frames | g.get\_frames() | ++---------------------+-----------------------------------------------------------------------------------------+------------------------------------+ +| get\_runstate | Gets the current status of the instrument as a string | g.get\_runstate() | ++---------------------+-----------------------------------------------------------------------------------------+------------------------------------+ +| get\_mevents | Gets the total counts for all the detectors | g.get\_mevents() | ++---------------------+-----------------------------------------------------------------------------------------+------------------------------------+ +| get\_totalcounts | Gets the total counts for the current run | g.get\_totalcounts() | ++---------------------+-----------------------------------------------------------------------------------------+------------------------------------+ +| waitfor | Interrupts execution until certain conditions are met | g.waitfor("NEW\_BLOCK",value=1) | ++---------------------+-----------------------------------------------------------------------------------------+------------------------------------+ +| waitfor\_block | Interrupts execution until block reaches specific value | g.waitfor\_block("NEW\_BLOCK",1) | ++---------------------+-----------------------------------------------------------------------------------------+------------------------------------+ +| waitfor\_time | Interrupts execution for a specified amount of time | g.waitfor\_time(1) | ++---------------------+-----------------------------------------------------------------------------------------+------------------------------------+ +| waitfor\_frames | Interrupts execution to wait for number of total good frames to reach parameter value | g.waitfor\_frames(1000) | ++---------------------+-----------------------------------------------------------------------------------------+------------------------------------+ +| waitfor\_uamps | Interrupts execution to wait for a specific total charge | g.waitfor\_uamps(9.9) | ++---------------------+-----------------------------------------------------------------------------------------+------------------------------------+ +| waitfor\_runstate | Waits for a particular instrument run state | g.waitfor\_runstate("paused") | ++---------------------+-----------------------------------------------------------------------------------------+------------------------------------+ +| waitfor\_move | Waits for all motion or specific motion to complete | g.waitfor\_move("NEW\_BLOCK") | ++---------------------+-----------------------------------------------------------------------------------------+------------------------------------+ + +Converting Open Genie to genie\_python +====================================== + +If you know a little bit of Python already, converting Open Genie +scripts to ``genie_python`` is very often straightforward. Even if +you're new to Python, once you know a few simple pieces of syntax, +you'll be able to convert many scripts without issue. List of functions ----------------- -We've included some -- [Common `genie_python` commands](#common-genie_python-commands) on this page, but for a full list refer to the [genie_python reference manual] (http://shadow.nd.rl.ac.uk/genie_python/sphinx/genie_python.html ). + +We've included some - `Common ``genie_python`` +commands <#common-genie_python-commands>`__ on this page, but for a full +list refer to the [genie\_python reference manual] +(http://shadow.nd.rl.ac.uk/genie\_python/sphinx/genie\_python.html ). Indentation ----------- -One thing where there is no direct comparison is with **indentation**. In Python, different code blocks are identified by their indentation level. In many programming languages, code blocks are encased in curly braces (`{...}`), but Python uses indentation. For example: - -``` -print "No indent" -def my_func(): - print "1 indent. Inside the function" - if True: - print "2 indents. Inside the if clause" - print "2 indents. Still inside the if clause" - print "1 indent. In the function but not the if clause" -print "No indent. Outside the function" -``` - -Typically an `indent` is 3 or 4 spaces. Tabs can be used too, but Python won't recognise that a tab is the same as 4 spaces so can lead to problems. It's often best to avoid them. This might be a new concept if you've only ever written Open Genie, but trust us in that it opens up a lot of ways to make scripts more powerful, easier to read and more reliable. +One thing where there is no direct comparison is with **indentation**. +In Python, different code blocks are identified by their indentation +level. In many programming languages, code blocks are encased in curly +braces (``{...}``), but Python uses indentation. For example: + +:: + + print "No indent" + def my_func(): + print "1 indent. Inside the function" + if True: + print "2 indents. Inside the if clause" + print "2 indents. Still inside the if clause" + print "1 indent. In the function but not the if clause" + print "No indent. Outside the function" + +Typically an ``indent`` is 3 or 4 spaces. Tabs can be used too, but +Python won't recognise that a tab is the same as 4 spaces so can lead to +problems. It's often best to avoid them. This might be a new concept if +you've only ever written Open Genie, but trust us in that it opens up a +lot of ways to make scripts more powerful, easier to read and more +reliable. Side-by-side comparison ------------------------- +----------------------- -| Open Genie syntax | `genie_python` syntax | Comments | -|-------------------|-----------------------|----------| -| PROCEDURE my_func | def my_func(): | This is the standard way to define a function in Python | -| begin | g.begin() | Many functions in `genie_python` have the same name as in Open Genie. In these cases, prepend `g.` to idicate the method belongs to `genie_python` and append `()` to tell Python to execute the method with no arguments | -| my_func_2 100 | my_func_2(100) | To execute a function, give its name and then the argument in brackets. This is a user-defined function, not a `genie_python` function, so it has no `g.` in front. | -| my_func_3 100 200 | my_func_2(100,200) | As above, except that multiple arguments are separated by a comma | -| waitfor seconds=20 | g.waitfor(seconds=20) | Some methods can take named arguments. In these cases you simply give named arguments in the form `[name]=[value]`. Note that you can mix named and unnamed arguments, but unnamed arguments always appear at the start of the argument list. | -| # This is a comment | # This is a comment | Comments are the same in both languages | ++-----------------------+---------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| Open Genie syntax | ``genie_python`` syntax | Comments | ++=======================+===========================+===================================================================================================================================================================================================================================================+ +| PROCEDURE my\_func | def my\_func(): | This is the standard way to define a function in Python | ++-----------------------+---------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| begin | g.begin() | Many functions in ``genie_python`` have the same name as in Open Genie. In these cases, prepend ``g.`` to idicate the method belongs to ``genie_python`` and append ``()`` to tell Python to execute the method with no arguments | ++-----------------------+---------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| my\_func\_2 100 | my\_func\_2(100) | To execute a function, give its name and then the argument in brackets. This is a user-defined function, not a ``genie_python`` function, so it has no ``g.`` in front. | ++-----------------------+---------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| my\_func\_3 100 200 | my\_func\_2(100,200) | As above, except that multiple arguments are separated by a comma | ++-----------------------+---------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| waitfor seconds=20 | g.waitfor(seconds=20) | Some methods can take named arguments. In these cases you simply give named arguments in the form ``[name]=[value]``. Note that you can mix named and unnamed arguments, but unnamed arguments always appear at the start of the argument list. | ++-----------------------+---------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| # This is a comment | # This is a comment | Comments are the same in both languages | ++-----------------------+---------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ Creating and running instrument scripts ======================================= -Different instruments may have specific scripts that are required for multiple users. To make accessing these easier, `genie_python` loads instrument scripts at startup. +Different instruments may have specific scripts that are required for +multiple users. To make accessing these easier, ``genie_python`` loads +instrument scripts at startup. Creating scripts ---------------- -For the most part, this is the same as [creating-user-scripts](#creating-and-running-user-scripts). +For the most part, this is the same as +`creating-user-scripts <#creating-and-running-user-scripts>`__. -### Script directory +Script directory +~~~~~~~~~~~~~~~~ -Unlike user scripts, instrument scripts should be placed in `C:\Instrument\Settings\config\[MACHINE_NAME]\Python`. Once the script has been created, edit the file `inst.py` in the same directory and add the line `from [MY_FILE] import *` where `[MY_FILE]` is the name of your file without the `.py` file extension. This will include the new script in the list of scripts loaded at startup. Best to avoid file names containing spaces, it [can be done](http://stackoverflow.com/questions/9123517/how-do-you-import-a-file-in-python-with-spaces-in-the-name) but it's easier to just not do it. +Unlike user scripts, instrument scripts should be placed in +``C:\Instrument\Settings\config\[MACHINE_NAME]\Python``. Once the script +has been created, edit the file ``inst.py`` in the same directory and +add the line ``from [MY_FILE] import *`` where ``[MY_FILE]`` is the name +of your file without the ``.py`` file extension. This will include the +new script in the list of scripts loaded at startup. Best to avoid file +names containing spaces, it `can be +done `__ +but it's easier to just not do it. -### Script structure +Script structure +~~~~~~~~~~~~~~~~ -Everything in the instrument scripts will be executed when `genie_python` is started. This includes - - Making functions available to be called later - - Setting variables - - Running methods -Typically, most code in instrument scripts will be contained within functions (procedures in Open Genie language), but it's important to be aware that anything that isn't will be included too. For example, if an instrument script is loaded: +Everything in the instrument scripts will be executed when +``genie_python`` is started. This includes - Making functions available +to be called later - Setting variables - Running methods Typically, most +code in instrument scripts will be contained within functions +(procedures in Open Genie language), but it's important to be aware that +anything that isn't will be included too. For example, if an instrument +script is loaded: -``` -a = 1 -def print_a(): - print str(a) -``` +:: -then the user can call `print_a`, but they can also use the variable `a`, and change its value, which may not be desirable. If instead the script was: + a = 1 + def print_a(): + print str(a) +then the user can call ``print_a``, but they can also use the variable +``a``, and change its value, which may not be desirable. If instead the +script was: -``` -def print_a(): - a = 1 - print str(a) -``` +:: -then the user could only access `print_a()` and the value could not be changed. + def print_a(): + a = 1 + print str(a) + +then the user could only access ``print_a()`` and the value could not be +changed. Running ------- -Once the script is loaded, anything from the script will be available using the `inst` package reference. For instance if your script contains the function `my_function` you can call: +Once the script is loaded, anything from the script will be available +using the ``inst`` package reference. For instance if your script +contains the function ``my_function`` you can call: + +:: -``` -inst.my_function() -``` + inst.my_function() -Whilst using the scripting perspective in the Ibex GUI, users will also benefit from the same auto-complete feature as they do with `genie_python` commands. +Whilst using the scripting perspective in the Ibex GUI, users will also +benefit from the same auto-complete feature as they do with +``genie_python`` commands. Creating and running user scripts ================================= @@ -288,46 +444,64 @@ Creating and running user scripts Creating scripts ---------------- -1. First, we need to create a script file. By default, user scripts should be placed in `C:\scripts`. Navigate to your desired directory and create the script file with extension `.py`. -2. Write some `genie_python`! +1. First, we need to create a script file. By default, user scripts + should be placed in ``C:\scripts``. Navigate to your desired + directory and create the script file with extension ``.py``. +2. Write some ``genie_python``! 3. Save the file -We have glossed over step 2 because Python is a very powerful scripting language. Combined with Open Genie, the potential scope of a script is enormous, and well beyond the scope of this guide. For example though, here is a simple script that executes a calibration run. +We have glossed over step 2 because Python is a very powerful scripting +language. Combined with Open Genie, the potential scope of a script is +enormous, and well beyond the scope of this guide. For example though, +here is a simple script that executes a calibration run. -``` -# Change the title -calibration_run_title = "Calibration run 1, 29th September" -g.change(title=calibration_run_title) +:: -# Begin the run -print "Beginning calibration run : " + calibration_run_title -g.begin() + # Change the title + calibration_run_title = "Calibration run 1, 29th September" + g.change(title=calibration_run_title) -# Wait for 100 uamps -g.waitfor(uamps=100) + # Begin the run + print "Beginning calibration run : " + calibration_run_title + g.begin() -# End the run -g.end() -print "Calibration run finished successfully" -``` + # Wait for 100 uamps + g.waitfor(uamps=100) + + # End the run + g.end() + print "Calibration run finished successfully" Running ------- -Once you've created your script, it's time to run it. There are a number of ways of launching a Python script. +Once you've created your script, it's time to run it. There are a number +of ways of launching a Python script. + +From Ibex +~~~~~~~~~ -### From Ibex +1. Launch the Ibex GUI +2. Navigate to the scripting perspective +3. Run the command ``g.load_script("C:\path\to\script\my_script.py")`` + where the path and script name are updated appropriately -1. Launch the Ibex GUI -1. Navigate to the scripting perspective -1. Run the command `g.load_script("C:\path\to\script\my_script.py")` where the path and script name are updated appropriately - - Note that if you omit the absolute path to the file (i.e. `C:\path\to\script`) then `genie_python` will look in the current script directory. By default this is `C:\scripts` but can be viewed and set with the commands `g.get_script_dir()` and `g.set_script_dir()` respectively. -1. When the script is loaded, any procedures in the script will be run automatically. If the script contains any function, you will now be able to call them from within the scripting window. + - Note that if you omit the absolute path to the file (i.e. + ``C:\path\to\script``) then ``genie_python`` will look in the + current script directory. By default this is ``C:\scripts`` but + can be viewed and set with the commands ``g.get_script_dir()`` and + ``g.set_script_dir()`` respectively. -### From a genie_python terminal +4. When the script is loaded, any procedures in the script will be run + automatically. If the script contains any function, you will now be + able to call them from within the scripting window. -1. Launch a `genie_python` terminal from `C:\Instrument\Apps\Python\` by running `genie_python.bat` -1. Follow the above starting at step 3. +From a genie\_python terminal +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +1. Launch a ``genie_python`` terminal from + ``C:\Instrument\Apps\Python\`` by running ``genie_python.bat`` +2. Follow the above starting at step 3. Tips from the developers ======================== @@ -335,73 +509,99 @@ Tips from the developers Argument ordering ----------------- -As this is Python, `genie_python` conforms to the standard pattern of calling Python functions. The arguments to the function are contained within brackets and the variables passed in as a comma-separated list. Ordering is important but can be overridden by using named variables, for instance the following are all correct and equivalent: +As this is Python, ``genie_python`` conforms to the standard pattern of +calling Python functions. The arguments to the function are contained +within brackets and the variables passed in as a comma-separated list. +Ordering is important but can be overridden by using named variables, +for instance the following are all correct and equivalent: -``` -g.change_beamline_pars("PAR1",1) -g.change_beamline_pars(name="PAR1",value=1) -g.change_beamline_pars(value=1,name="PAR1") -g.change_beamline_pars("PAR1",value=1) -``` +:: -In the last example, named and unnamed variables are mixed. Unnamed variables must precede named variables. The following examples are not valid + g.change_beamline_pars("PAR1",1) + g.change_beamline_pars(name="PAR1",value=1) + g.change_beamline_pars(value=1,name="PAR1") + g.change_beamline_pars("PAR1",value=1) -``` -g.change_beamline_pars(name="PAR1",1) # Named variable before unnamed -g.change_beamline_pars(1,"PAR1") # Cannot change order of unnamed variables -``` +In the last example, named and unnamed variables are mixed. Unnamed +variables must precede named variables. The following examples are not +valid -Using named variables can be **very useful in avoiding mistakes**. For instance, getting the order of high and low limits the wrong way round. For instance this example: +:: -``` -g.change_monitor(1,10,0) -``` + g.change_beamline_pars(name="PAR1",1) # Named variable before unnamed + g.change_beamline_pars(1,"PAR1") # Cannot change order of unnamed variables -is wrong and wouldn't work. Instead, we could have written: +Using named variables can be **very useful in avoiding mistakes**. For +instance, getting the order of high and low limits the wrong way round. +For instance this example: -``` -g.change_monitor(1,high=10,low=0) -``` +:: -which would have worked and makes it clear for whoever comes to edit the code in future. + g.change_monitor(1,10,0) -Unlike user scripts, instrument scripts should be placed in `C:\Instrument\Settings\config\[MACHINE_NAME]\Python`. Once the script has been created, edit the file `inst.py` in the same directory and add the line `from [MY_FILE] import *` where `[MY_FILE]` is the name of your file without the `.py` file extension. This will include the new script in the list of scripts loaded at startup. Best to avoid file names containing spaces, it [can be done](http://stackoverflow.com/questions/9123517/how-do-you-import-a-file-in-python-with-spaces-in-the-name) but it's easier to just not do it. +is wrong and wouldn't work. Instead, we could have written: -### Script structure +:: -Everything in the instrument scripts will be executed when `genie_python` is started. This includes - - Making functions available to be called later - - Setting variables - - Running methods -Typically, most code in instrument scripts will be contained within functions (procedures in Open Genie language), but it's important to be aware that anything that isn't will be included too. For example, if an instrument script is loaded: + g.change_monitor(1,high=10,low=0) -``` -a = 1 -def print_a(): - print str(a) -``` +which would have worked and makes it clear for whoever comes to edit the +code in future. -then the user can call `print_a`, but they can also use the variable `a`, and change its value, which may not be desirable. If instead the script was: +Unlike user scripts, instrument scripts should be placed in +``C:\Instrument\Settings\config\[MACHINE_NAME]\Python``. Once the script +has been created, edit the file ``inst.py`` in the same directory and +add the line ``from [MY_FILE] import *`` where ``[MY_FILE]`` is the name +of your file without the ``.py`` file extension. This will include the +new script in the list of scripts loaded at startup. Best to avoid file +names containing spaces, it `can be +done `__ +but it's easier to just not do it. +Script structure +~~~~~~~~~~~~~~~~ + +Everything in the instrument scripts will be executed when +``genie_python`` is started. This includes - Making functions available +to be called later - Setting variables - Running methods Typically, most +code in instrument scripts will be contained within functions +(procedures in Open Genie language), but it's important to be aware that +anything that isn't will be included too. For example, if an instrument +script is loaded: + +:: -``` -def print_a(): a = 1 - print str(a) -``` + def print_a(): + print str(a) + +then the user can call ``print_a``, but they can also use the variable +``a``, and change its value, which may not be desirable. If instead the +script was: + +:: -then the user could only access `print_a()` and the value could not be changed. + def print_a(): + a = 1 + print str(a) + +then the user could only access ``print_a()`` and the value could not be +changed. Running ------- -Once the script is loaded, anything from the script will be available using the `inst` package reference. For instance if your script contains the function `my_function` you can call: +Once the script is loaded, anything from the script will be available +using the ``inst`` package reference. For instance if your script +contains the function ``my_function`` you can call: + +:: -``` -inst.my_function() -``` + inst.my_function() -Whilst using the scripting perspective in the Ibex GUI, users will also benefit from the same auto-complete feature as they do with `genie_python` commands. +Whilst using the scripting perspective in the Ibex GUI, users will also +benefit from the same auto-complete feature as they do with +``genie_python`` commands. Creating and running user scripts ================================= @@ -409,46 +609,64 @@ Creating and running user scripts Creating scripts ---------------- -1. First, we need to create a script file. By default, user scripts should be placed in `C:\scripts`. Navigate to your desired directory and create the script file with extension `.py`. -2. Write some `genie_python`! +1. First, we need to create a script file. By default, user scripts + should be placed in ``C:\scripts``. Navigate to your desired + directory and create the script file with extension ``.py``. +2. Write some ``genie_python``! 3. Save the file -We have glossed over step 2 because Python is a very powerful scripting language. Combined with Open Genie, the potential scope of a script is enormous, and well beyond the scope of this guide. For example though, here is a simple script that executes a calibration run. +We have glossed over step 2 because Python is a very powerful scripting +language. Combined with Open Genie, the potential scope of a script is +enormous, and well beyond the scope of this guide. For example though, +here is a simple script that executes a calibration run. + +:: -``` -# Change the title -calibration_run_title = "Calibration run 1, 29th September" -g.change(title=calibration_run_title) + # Change the title + calibration_run_title = "Calibration run 1, 29th September" + g.change(title=calibration_run_title) -# Begin the run -print "Beginning calibration run : " + calibration_run_title -g.begin() + # Begin the run + print "Beginning calibration run : " + calibration_run_title + g.begin() -# Wait for 100 uamps -g.waitfor(uamps=100) + # Wait for 100 uamps + g.waitfor(uamps=100) -# End the run -g.end() -print "Calibration run finished successfully" -``` + # End the run + g.end() + print "Calibration run finished successfully" Running ------- -Once you've created your script, it's time to run it. There are a number of ways of launching a Python script. +Once you've created your script, it's time to run it. There are a number +of ways of launching a Python script. -### From Ibex +From Ibex +~~~~~~~~~ -1. Launch the Ibex GUI -1. Navigate to the scripting perspective -1. Run the command `g.load_script("C:\path\to\script\my_script.py")` where the path and script name are updated appropriately - - Note that if you omit the absolute path to the file (i.e. `C:\path\to\script`) then `genie_python` will look in the current script directory. By default this is `C:\scripts` but can be viewed and set with the commands `g.get_script_dir()` and `g.set_script_dir()` respectively. -1. When the script is loaded, any procedures in the script will be run automatically. If the script contains any function, you will now be able to call them from within the scripting window. +1. Launch the Ibex GUI +2. Navigate to the scripting perspective +3. Run the command ``g.load_script("C:\path\to\script\my_script.py")`` + where the path and script name are updated appropriately -### From a genie_python terminal + - Note that if you omit the absolute path to the file (i.e. + ``C:\path\to\script``) then ``genie_python`` will look in the + current script directory. By default this is ``C:\scripts`` but + can be viewed and set with the commands ``g.get_script_dir()`` and + ``g.set_script_dir()`` respectively. -1. Launch a `genie_python` terminal from `C:\Instrument\Apps\Python\` by running `genie_python.bat` -1. Follow the above starting at step 3. +4. When the script is loaded, any procedures in the script will be run + automatically. If the script contains any function, you will now be + able to call them from within the scripting window. + +From a genie\_python terminal +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +1. Launch a ``genie_python`` terminal from + ``C:\Instrument\Apps\Python\`` by running ``genie_python.bat`` +2. Follow the above starting at step 3. Tips from the developers ======================== @@ -456,32 +674,41 @@ Tips from the developers Argument ordering ----------------- -As this is Python, `genie_python` conforms to the standard pattern of calling Python functions. The arguments to the function are contained within brackets and the variables passed in as a comma-separated list. Ordering is important but can be overridden by using named variables, for instance the following are all correct and equivalent: +As this is Python, ``genie_python`` conforms to the standard pattern of +calling Python functions. The arguments to the function are contained +within brackets and the variables passed in as a comma-separated list. +Ordering is important but can be overridden by using named variables, +for instance the following are all correct and equivalent: + +:: -``` -g.change_beamline_pars("PAR1",1) -g.change_beamline_pars(name="PAR1",value=1) -g.change_beamline_pars(value=1,name="PAR1") -g.change_beamline_pars("PAR1",value=1) -``` + g.change_beamline_pars("PAR1",1) + g.change_beamline_pars(name="PAR1",value=1) + g.change_beamline_pars(value=1,name="PAR1") + g.change_beamline_pars("PAR1",value=1) -In the last example, named and unnamed variables are mixed. Unnamed variables must precede named variables. The following examples are not valid +In the last example, named and unnamed variables are mixed. Unnamed +variables must precede named variables. The following examples are not +valid -``` -g.change_beamline_pars(name="PAR1",1) # Named variable before unnamed -g.change_beamline_pars(1,"PAR1") # Cannot change order of unnamed variables -``` +:: -Using named variables can be **very useful in avoiding mistakes**. For instance, getting the order of high and low limits the wrong way round. For instance this example: + g.change_beamline_pars(name="PAR1",1) # Named variable before unnamed + g.change_beamline_pars(1,"PAR1") # Cannot change order of unnamed variables -``` -g.change_monitor(1,10,0) -``` +Using named variables can be **very useful in avoiding mistakes**. For +instance, getting the order of high and low limits the wrong way round. +For instance this example: + +:: + + g.change_monitor(1,10,0) is wrong and wouldn't work. Instead, we could have written: -``` -g.change_monitor(1,high=10,low=0) -``` +:: + + g.change_monitor(1,high=10,low=0) -which would have worked and makes it clear for whoever comes to edit the code in future. \ No newline at end of file +which would have worked and makes it clear for whoever comes to edit the +code in future. \ No newline at end of file From e3eed33bfd9abbddcba1ecbc3f1d266842944957 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Wed, 5 Oct 2016 13:41:00 +0100 Subject: [PATCH 0363/1813] Updated Scripting (rest) --- Scripting.rest | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Scripting.rest b/Scripting.rest index 4c5830f..f334ec2 100644 --- a/Scripting.rest +++ b/Scripting.rest @@ -8,8 +8,7 @@ gives a full account of what functions are available in genie\_python. This page is intended to give a broad guide to scripting for the beginner and novice user. -- `Running ``genie_python`` - commands <#running-genie_python-commands>`__ +- `Running ``genie_python`` commands <#running-genie_python-commands>`__ - `Common ``genie_python`` commands <#common-genie_python-commands>`__ - `Converting Open Genie to ``genie_python`` <#converting-open-genie-to-genie_python>`__ From c2a761faffa19c6220478d745320b0cd47f0bcec Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Wed, 5 Oct 2016 13:41:21 +0100 Subject: [PATCH 0364/1813] Updated Scripting (rest) --- Scripting.rest | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/Scripting.rest b/Scripting.rest index f334ec2..e72adc3 100644 --- a/Scripting.rest +++ b/Scripting.rest @@ -8,14 +8,11 @@ gives a full account of what functions are available in genie\_python. This page is intended to give a broad guide to scripting for the beginner and novice user. -- `Running ``genie_python`` commands <#running-genie_python-commands>`__ -- `Common ``genie_python`` commands <#common-genie_python-commands>`__ -- `Converting Open Genie to - ``genie_python`` <#converting-open-genie-to-genie_python>`__ -- `Creating and running instrument - scripts <#creating-and-running-instrument-scripts>`__ -- `Creating and running user - scripts <#creating-and-running-user-scripts>`__ +- `Running genie_python commands <#running-genie_python-commands>`__ +- `Common genie_python commands <#common-genie_python-commands>`__ +- `Converting Open Genie to genie_python <#converting-open-genie-to-genie_python>`__ +- `Creating and running instrument scripts <#creating-and-running-instrument-scripts>`__ +- `Creating and running user scripts <#creating-and-running-user-scripts>`__ - `Tips from the developers <#tips-from-the-developers>`__ Running genie\_python commands From 3f121f9eef872ab12ea4e5fa9ab9cc9afe10058c Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Wed, 5 Oct 2016 13:43:40 +0100 Subject: [PATCH 0365/1813] Updated Scripting (rest) --- Scripting.rest | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Scripting.rest b/Scripting.rest index e72adc3..1a8c8c6 100644 --- a/Scripting.rest +++ b/Scripting.rest @@ -1,9 +1,7 @@ Scripting ========= -Scripting in IBEX is done using genie\_python. The [genie\_python -reference manual] -(http://shadow.nd.rl.ac.uk/genie\_python/sphinx/genie\_python.html ) +Scripting in IBEX is done using genie\_python. The `genie\_python refrefence manual`__ gives a full account of what functions are available in genie\_python. This page is intended to give a broad guide to scripting for the beginner and novice user. @@ -15,6 +13,8 @@ beginner and novice user. - `Creating and running user scripts <#creating-and-running-user-scripts>`__ - `Tips from the developers <#tips-from-the-developers>`__ +.. _`genie\_python refrefence manual`: http://shadow.nd.rl.ac.uk/genie\_python/sphinx/genie\_python.html + Running genie\_python commands ============================== From 66baa81e18d0b32708d0d9e84fc7b7ea3a65e597 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Wed, 5 Oct 2016 13:46:49 +0100 Subject: [PATCH 0366/1813] Updated Scripting (rest) --- Scripting.rest | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Scripting.rest b/Scripting.rest index 1a8c8c6..a908eb4 100644 --- a/Scripting.rest +++ b/Scripting.rest @@ -1,7 +1,7 @@ Scripting ========= -Scripting in IBEX is done using genie\_python. The `genie\_python refrefence manual`__ +Scripting in IBEX is done using genie\_python. The `genie\_python reference manual`_ gives a full account of what functions are available in genie\_python. This page is intended to give a broad guide to scripting for the beginner and novice user. @@ -13,7 +13,7 @@ beginner and novice user. - `Creating and running user scripts <#creating-and-running-user-scripts>`__ - `Tips from the developers <#tips-from-the-developers>`__ -.. _`genie\_python refrefence manual`: http://shadow.nd.rl.ac.uk/genie\_python/sphinx/genie\_python.html +.. _`genie\_python reference manual`: http://shadow.nd.rl.ac.uk/genie\_python/sphinx/genie\_python.html Running genie\_python commands ============================== From c3fc19c9bf55a6d1784114a906ebbb2d380fc2e1 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Wed, 5 Oct 2016 13:47:34 +0100 Subject: [PATCH 0367/1813] Updated Scripting (rest) --- Scripting.rest | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/Scripting.rest b/Scripting.rest index a908eb4..ffaaf0d 100644 --- a/Scripting.rest +++ b/Scripting.rest @@ -45,8 +45,7 @@ Many ``genie_python`` commands share the same name with their Open Genie equivalent so it will often be very straightforward to find the function you're looking for. Still, here is a list of the most commonly used ``genie_python`` commands. This is **not a complete list**. For full -information, consult the [genie\_python reference manual] ( -http://shadow.nd.rl.ac.uk/genie\_python/sphinx/genie\_python.html ). +information, consult the `genie\_python reference manual`_. Starting and stopping a run --------------------------- @@ -124,9 +123,7 @@ List of functions We've included some - `Common ``genie_python`` commands <#common-genie_python-commands>`__ on this page, but for a full -list refer to the [genie\_python reference manual] -(http://shadow.nd.rl.ac.uk/genie\_python/sphinx/genie\_python.html ). - +list refer to the `genie\_python reference manual`_. Indentation ----------- @@ -188,9 +185,7 @@ For the most part, this is the same as ### Script directoryScripting ============================= -Scripting in IBEX is done using genie\_python. The [genie\_python -reference manual] -(http://shadow.nd.rl.ac.uk/genie\_python/sphinx/genie\_python.html ) +Scripting in IBEX is done using genie\_python. The `genie\_python reference manual`_ gives a full account of what functions are available in genie\_python. This page is intended to give a broad guide to scripting for the beginner and novice user. From f6eecfd360b852afd12602370a6627a4ec6f4092 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Wed, 5 Oct 2016 13:48:16 +0100 Subject: [PATCH 0368/1813] Updated Scripting (rest) --- Scripting.rest | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/Scripting.rest b/Scripting.rest index ffaaf0d..238b1d4 100644 --- a/Scripting.rest +++ b/Scripting.rest @@ -231,8 +231,7 @@ Many ``genie_python`` commands share the same name with their Open Genie equivalent so it will often be very straightforward to find the function you're looking for. Still, here is a list of the most commonly used ``genie_python`` commands. This is **not a complete list**. For full -information, consult the [genie\_python reference manual] ( -http://shadow.nd.rl.ac.uk/genie\_python/sphinx/genie\_python.html ). +information, consult the `genie\_python reference manual`_. Starting and stopping a run --------------------------- @@ -310,8 +309,7 @@ List of functions We've included some - `Common ``genie_python`` commands <#common-genie_python-commands>`__ on this page, but for a full -list refer to the [genie\_python reference manual] -(http://shadow.nd.rl.ac.uk/genie\_python/sphinx/genie\_python.html ). +list refer to the `genie\_python reference manual`_. Indentation ----------- From 69fceccc3beebb77c065c7b48839b9f421c839ac Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Wed, 5 Oct 2016 13:50:25 +0100 Subject: [PATCH 0369/1813] Updated Scripting (rest) --- Scripting.rest | 186 +------------------------------------------------ 1 file changed, 2 insertions(+), 184 deletions(-) diff --git a/Scripting.rest b/Scripting.rest index 238b1d4..40e0579 100644 --- a/Scripting.rest +++ b/Scripting.rest @@ -1,188 +1,4 @@ Scripting -========= - -Scripting in IBEX is done using genie\_python. The `genie\_python reference manual`_ -gives a full account of what functions are available in genie\_python. -This page is intended to give a broad guide to scripting for the -beginner and novice user. - -- `Running genie_python commands <#running-genie_python-commands>`__ -- `Common genie_python commands <#common-genie_python-commands>`__ -- `Converting Open Genie to genie_python <#converting-open-genie-to-genie_python>`__ -- `Creating and running instrument scripts <#creating-and-running-instrument-scripts>`__ -- `Creating and running user scripts <#creating-and-running-user-scripts>`__ -- `Tips from the developers <#tips-from-the-developers>`__ - -.. _`genie\_python reference manual`: http://shadow.nd.rl.ac.uk/genie\_python/sphinx/genie\_python.html - -Running genie\_python commands -============================== - -When running ``genie_python`` from an interactive console such as from -the GUI or after running ``C:\Instrument\Apps\Python\genie_python.bat``, -the ``genie`` module will be aliased to ``g``. Genie commands can then -be accessed by using the prefix ``g.[COMMAND_NAME]``. For example: - -:: - - g.start() - g.cset("BLOCK_1",1) - g.abort() - -This is particularly useful from the GUI which will auto-complete -commands and provide tool tips describing each function and its -arguments. - -Note that in many cases, arguments will be optional. For instance, -``begin`` can be used as ``g.begin()`` despite supporting all of the -arguments ``period``, ``meas_id``, ``meas_type``, ``meas_subid``, -``sample_id``, ``delayed``, ``quiet``, ``paused``, and ``verbose``. - -Common genie\_python commands -============================= - -Many ``genie_python`` commands share the same name with their Open Genie -equivalent so it will often be very straightforward to find the function -you're looking for. Still, here is a list of the most commonly used -``genie_python`` commands. This is **not a complete list**. For full -information, consult the `genie\_python reference manual`_. - -Starting and stopping a run ---------------------------- - -+-----------+----------------------------------------------------+--------------+ -| Command | Description | Example | -+===========+====================================================+==============+ -| begin | Starts a new run | g.begin() | -+-----------+----------------------------------------------------+--------------+ -| end | Ends the current run | g.end() | -+-----------+----------------------------------------------------+--------------+ -| abort | Aborts the current run | g.abort() | -+-----------+----------------------------------------------------+--------------+ -| pause | Pauses the current run | g.pause() | -+-----------+----------------------------------------------------+--------------+ -| resume | Resumes the current run after it has been paused | g.resume() | -+-----------+----------------------------------------------------+--------------+ - -Updating blocks and PVs ------------------------ - -+-----------+--------------------------------------------------------+-------------------------------------------+ -| Command | Description | Example | -+===========+========================================================+===========================================+ -| cget | Gets the useful values associated with a block | g.cget("NEW\_BLOCK") | -+-----------+--------------------------------------------------------+-------------------------------------------+ -| cset | Sets the setpoint and runcontrol settings for blocks | g.cset("NEW\_BLOCK",1) | -+-----------+--------------------------------------------------------+-------------------------------------------+ -| get\_pv | Gets the value for the specified PV | g.get\_pv("IN:INSTNAME:IOC\_01:STAT") | -+-----------+--------------------------------------------------------+-------------------------------------------+ -| set\_pv | Sets the value for the specified PV | g.set\_pv("IN:INSTNAME:IOC\_01:STAT",1) | -+-----------+--------------------------------------------------------+-------------------------------------------+ - -Run control ------------ - -+---------------------+-----------------------------------------------------------------------------------------+------------------------------------+ -| Command | Description | Example | -+=====================+=========================================================================================+====================================+ -| get\_uamps | Gets the current number of micro-amp hours | g.get\_uamps() | -+---------------------+-----------------------------------------------------------------------------------------+------------------------------------+ -| get\_frames | Gets the current number of good frames | g.get\_frames() | -+---------------------+-----------------------------------------------------------------------------------------+------------------------------------+ -| get\_runstate | Gets the current status of the instrument as a string | g.get\_runstate() | -+---------------------+-----------------------------------------------------------------------------------------+------------------------------------+ -| get\_mevents | Gets the total counts for all the detectors | g.get\_mevents() | -+---------------------+-----------------------------------------------------------------------------------------+------------------------------------+ -| get\_totalcounts | Gets the total counts for the current run | g.get\_totalcounts() | -+---------------------+-----------------------------------------------------------------------------------------+------------------------------------+ -| waitfor | Interrupts execution until certain conditions are met | g.waitfor("NEW\_BLOCK",value=1) | -+---------------------+-----------------------------------------------------------------------------------------+------------------------------------+ -| waitfor\_block | Interrupts execution until block reaches specific value | g.waitfor\_block("NEW\_BLOCK",1) | -+---------------------+-----------------------------------------------------------------------------------------+------------------------------------+ -| waitfor\_time | Interrupts execution for a specified amount of time | g.waitfor\_time(1) | -+---------------------+-----------------------------------------------------------------------------------------+------------------------------------+ -| waitfor\_frames | Interrupts execution to wait for number of total good frames to reach parameter value | g.waitfor\_frames(1000) | -+---------------------+-----------------------------------------------------------------------------------------+------------------------------------+ -| waitfor\_uamps | Interrupts execution to wait for a specific total charge | g.waitfor\_uamps(9.9) | -+---------------------+-----------------------------------------------------------------------------------------+------------------------------------+ -| waitfor\_runstate | Waits for a particular instrument run state | g.waitfor\_runstate("paused") | -+---------------------+-----------------------------------------------------------------------------------------+------------------------------------+ -| waitfor\_move | Waits for all motion or specific motion to complete | g.waitfor\_move("NEW\_BLOCK") | -+---------------------+-----------------------------------------------------------------------------------------+------------------------------------+ - -Converting Open Genie to genie\_python -====================================== - -If you know a little bit of Python already, converting Open Genie -scripts to ``genie_python`` is very often straightforward. Even if -you're new to Python, once you know a few simple pieces of syntax, -you'll be able to convert many scripts without issue. - -List of functions ------------------ - -We've included some - `Common ``genie_python`` -commands <#common-genie_python-commands>`__ on this page, but for a full -list refer to the `genie\_python reference manual`_. -Indentation ------------ - -One thing where there is no direct comparison is with **indentation**. -In Python, different code blocks are identified by their indentation -level. In many programming languages, code blocks are encased in curly -braces (``{...}``), but Python uses indentation. For example: - -:: - - print "No indent" - def my_func(): - print "1 indent. Inside the function" - if True: - print "2 indents. Inside the if clause" - print "2 indents. Still inside the if clause" - print "1 indent. In the function but not the if clause" - print "No indent. Outside the function" - -Typically an ``indent`` is 3 or 4 spaces. Tabs can be used too, but -Python won't recognise that a tab is the same as 4 spaces so can lead to -problems. It's often best to avoid them. This might be a new concept if -you've only ever written Open Genie, but trust us in that it opens up a -lot of ways to make scripts more powerful, easier to read and more -reliable. - -Side-by-side comparison ------------------------ - -+-----------------------+---------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ -| Open Genie syntax | ``genie_python`` syntax | Comments | -+=======================+===========================+===================================================================================================================================================================================================================================================+ -| PROCEDURE my\_func | def my\_func(): | This is the standard way to define a function in Python | -+-----------------------+---------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ -| begin | g.begin() | Many functions in ``genie_python`` have the same name as in Open Genie. In these cases, prepend ``g.`` to idicate the method belongs to ``genie_python`` and append ``()`` to tell Python to execute the method with no arguments | -+-----------------------+---------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ -| my\_func\_2 100 | my\_func\_2(100) | To execute a function, give its name and then the argument in brackets. This is a user-defined function, not a ``genie_python`` function, so it has no ``g.`` in front. | -+-----------------------+---------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ -| my\_func\_3 100 200 | my\_func\_2(100,200) | As above, except that multiple arguments are separated by a comma | -+-----------------------+---------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ -| waitfor seconds=20 | g.waitfor(seconds=20) | Some methods can take named arguments. In these cases you simply give named arguments in the form ``[name]=[value]``. Note that you can mix named and unnamed arguments, but unnamed arguments always appear at the start of the argument list. | -+-----------------------+---------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ -| # This is a comment | # This is a comment | Comments are the same in both languages | -+-----------------------+---------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - -Creating and running instrument scripts -======================================= - -Different instruments may have specific scripts that are required for -multiple users. To make accessing these easier, ``genie_python`` loads -instrument scripts at startup. - -Creating scripts ----------------- - -For the most part, this is the same as -`creating-user-scripts <#creating-and-running-user-scripts>`__. - -### Script directoryScripting ============================= Scripting in IBEX is done using genie\_python. The `genie\_python reference manual`_ @@ -201,6 +17,8 @@ beginner and novice user. scripts <#creating-and-running-user-scripts>`__ - `Tips from the developers <#tips-from-the-developers>`__ +.. _`genie\_python reference manual`: http://shadow.nd.rl.ac.uk/genie\_python/sphinx/genie\_python.html + Running genie\_python commands ============================== From cdc3ac1e14ab65b926d9da8f7e68fcd78c4ffb60 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Wed, 5 Oct 2016 13:50:44 +0100 Subject: [PATCH 0370/1813] Updated Scripting (rest) --- Scripting.rest | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Scripting.rest b/Scripting.rest index 40e0579..16086fb 100644 --- a/Scripting.rest +++ b/Scripting.rest @@ -6,11 +6,11 @@ gives a full account of what functions are available in genie\_python. This page is intended to give a broad guide to scripting for the beginner and novice user. -- `Running ``genie_python`` +- `Running genie_python commands <#running-genie_python-commands>`__ -- `Common ``genie_python`` commands <#common-genie_python-commands>`__ +- `Common genie_python commands <#common-genie_python-commands>`__ - `Converting Open Genie to - ``genie_python`` <#converting-open-genie-to-genie_python>`__ + genie_python <#converting-open-genie-to-genie_python>`__ - `Creating and running instrument scripts <#creating-and-running-instrument-scripts>`__ - `Creating and running user From 9fec69b718dfbc2a6a1c82372fe6399758b70530 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Wed, 5 Oct 2016 15:08:56 +0100 Subject: [PATCH 0371/1813] Updated Scripting (rest) --- Scripting.rest | 165 ------------------------------------------------- 1 file changed, 165 deletions(-) diff --git a/Scripting.rest b/Scripting.rest index 16086fb..893b6c6 100644 --- a/Scripting.rest +++ b/Scripting.rest @@ -348,171 +348,6 @@ For instance this example: is wrong and wouldn't work. Instead, we could have written: -:: - - g.change_monitor(1,high=10,low=0) - -which would have worked and makes it clear for whoever comes to edit the -code in future. - -Unlike user scripts, instrument scripts should be placed in -``C:\Instrument\Settings\config\[MACHINE_NAME]\Python``. Once the script -has been created, edit the file ``inst.py`` in the same directory and -add the line ``from [MY_FILE] import *`` where ``[MY_FILE]`` is the name -of your file without the ``.py`` file extension. This will include the -new script in the list of scripts loaded at startup. Best to avoid file -names containing spaces, it `can be -done `__ -but it's easier to just not do it. - -Script structure -~~~~~~~~~~~~~~~~ - -Everything in the instrument scripts will be executed when -``genie_python`` is started. This includes - Making functions available -to be called later - Setting variables - Running methods Typically, most -code in instrument scripts will be contained within functions -(procedures in Open Genie language), but it's important to be aware that -anything that isn't will be included too. For example, if an instrument -script is loaded: - -:: - - a = 1 - def print_a(): - print str(a) - -then the user can call ``print_a``, but they can also use the variable -``a``, and change its value, which may not be desirable. If instead the -script was: - -:: - - def print_a(): - a = 1 - print str(a) - -then the user could only access ``print_a()`` and the value could not be -changed. - -Running -------- - -Once the script is loaded, anything from the script will be available -using the ``inst`` package reference. For instance if your script -contains the function ``my_function`` you can call: - -:: - - inst.my_function() - -Whilst using the scripting perspective in the Ibex GUI, users will also -benefit from the same auto-complete feature as they do with -``genie_python`` commands. - -Creating and running user scripts -================================= - -Creating scripts ----------------- - -1. First, we need to create a script file. By default, user scripts - should be placed in ``C:\scripts``. Navigate to your desired - directory and create the script file with extension ``.py``. -2. Write some ``genie_python``! -3. Save the file - -We have glossed over step 2 because Python is a very powerful scripting -language. Combined with Open Genie, the potential scope of a script is -enormous, and well beyond the scope of this guide. For example though, -here is a simple script that executes a calibration run. - -:: - - # Change the title - calibration_run_title = "Calibration run 1, 29th September" - g.change(title=calibration_run_title) - - # Begin the run - print "Beginning calibration run : " + calibration_run_title - g.begin() - - # Wait for 100 uamps - g.waitfor(uamps=100) - - # End the run - g.end() - print "Calibration run finished successfully" - -Running -------- - -Once you've created your script, it's time to run it. There are a number -of ways of launching a Python script. - -From Ibex -~~~~~~~~~ - -1. Launch the Ibex GUI -2. Navigate to the scripting perspective -3. Run the command ``g.load_script("C:\path\to\script\my_script.py")`` - where the path and script name are updated appropriately - - - Note that if you omit the absolute path to the file (i.e. - ``C:\path\to\script``) then ``genie_python`` will look in the - current script directory. By default this is ``C:\scripts`` but - can be viewed and set with the commands ``g.get_script_dir()`` and - ``g.set_script_dir()`` respectively. - -4. When the script is loaded, any procedures in the script will be run - automatically. If the script contains any function, you will now be - able to call them from within the scripting window. - -From a genie\_python terminal -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -1. Launch a ``genie_python`` terminal from - ``C:\Instrument\Apps\Python\`` by running ``genie_python.bat`` -2. Follow the above starting at step 3. - -Tips from the developers -======================== - -Argument ordering ------------------ - -As this is Python, ``genie_python`` conforms to the standard pattern of -calling Python functions. The arguments to the function are contained -within brackets and the variables passed in as a comma-separated list. -Ordering is important but can be overridden by using named variables, -for instance the following are all correct and equivalent: - -:: - - g.change_beamline_pars("PAR1",1) - g.change_beamline_pars(name="PAR1",value=1) - g.change_beamline_pars(value=1,name="PAR1") - g.change_beamline_pars("PAR1",value=1) - -In the last example, named and unnamed variables are mixed. Unnamed -variables must precede named variables. The following examples are not -valid - -:: - - g.change_beamline_pars(name="PAR1",1) # Named variable before unnamed - g.change_beamline_pars(1,"PAR1") # Cannot change order of unnamed variables - -Using named variables can be **very useful in avoiding mistakes**. For -instance, getting the order of high and low limits the wrong way round. -For instance this example: - -:: - - g.change_monitor(1,10,0) - -is wrong and wouldn't work. Instead, we could have written: - :: g.change_monitor(1,high=10,low=0) From d2bdc334e172cf3c01baeb6434c0734a82f0856b Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Thu, 6 Oct 2016 15:50:04 +0100 Subject: [PATCH 0372/1813] Updated Scripting (rest) --- Scripting.rest | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Scripting.rest b/Scripting.rest index 893b6c6..09ccc60 100644 --- a/Scripting.rest +++ b/Scripting.rest @@ -169,7 +169,9 @@ Side-by-side comparison +-----------------------+---------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | my\_func\_3 100 200 | my\_func\_2(100,200) | As above, except that multiple arguments are separated by a comma | +-----------------------+---------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ -| waitfor seconds=20 | g.waitfor(seconds=20) | Some methods can take named arguments. In these cases you simply give named arguments in the form ``[name]=[value]``. Note that you can mix named and unnamed arguments, but unnamed arguments always appear at the start of the argument list. | +| waitfor seconds=20 | g.waitfor(seconds=20) | Some methods can take named arguments. In these cases you simply give named arguments in the form ``[name]=[value]``. Note that you can mix named and unnamed arguments, but unnamed arguments always appear at the start of the argument list. `This section <#argument_ordering>`__ gives a more detailed description | ++-----------------------+---------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| cset/nocontrol MY_BLOCK = value | g.cset(MY_BLOCK,value,runcontrol=False) | Some Open Genie commands take optional arguments. The same principle applies as in the above example. | +-----------------------+---------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | # This is a comment | # This is a comment | Comments are the same in both languages | +-----------------------+---------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ From 8eabf873bf6b44a3c29a534a0687a23c32f439b5 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Thu, 6 Oct 2016 15:51:10 +0100 Subject: [PATCH 0373/1813] Updated Scripting (rest) From 3b9dadcfb2e1b34351d3133514e4ed80fb1ceaa8 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Thu, 6 Oct 2016 15:58:33 +0100 Subject: [PATCH 0374/1813] Updated Scripting (rest) --- Scripting.rest | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/Scripting.rest b/Scripting.rest index 09ccc60..ef2f664 100644 --- a/Scripting.rest +++ b/Scripting.rest @@ -158,23 +158,23 @@ reliable. Side-by-side comparison ----------------------- -+-----------------------+---------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ -| Open Genie syntax | ``genie_python`` syntax | Comments | -+=======================+===========================+===================================================================================================================================================================================================================================================+ -| PROCEDURE my\_func | def my\_func(): | This is the standard way to define a function in Python | -+-----------------------+---------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ -| begin | g.begin() | Many functions in ``genie_python`` have the same name as in Open Genie. In these cases, prepend ``g.`` to idicate the method belongs to ``genie_python`` and append ``()`` to tell Python to execute the method with no arguments | -+-----------------------+---------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ -| my\_func\_2 100 | my\_func\_2(100) | To execute a function, give its name and then the argument in brackets. This is a user-defined function, not a ``genie_python`` function, so it has no ``g.`` in front. | -+-----------------------+---------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ -| my\_func\_3 100 200 | my\_func\_2(100,200) | As above, except that multiple arguments are separated by a comma | -+-----------------------+---------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ -| waitfor seconds=20 | g.waitfor(seconds=20) | Some methods can take named arguments. In these cases you simply give named arguments in the form ``[name]=[value]``. Note that you can mix named and unnamed arguments, but unnamed arguments always appear at the start of the argument list. `This section <#argument_ordering>`__ gives a more detailed description | -+-----------------------+---------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ -| cset/nocontrol MY_BLOCK = value | g.cset(MY_BLOCK,value,runcontrol=False) | Some Open Genie commands take optional arguments. The same principle applies as in the above example. | -+-----------------------+---------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ -| # This is a comment | # This is a comment | Comments are the same in both languages | -+-----------------------+---------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ ++-------------------------------+-----------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| Open Genie syntax | ``genie_python`` syntax | Comments | ++===============================+=========================================+==========================================================================================================================================================================================================================================================================================================================+ +| PROCEDURE my\_func | def my\_func(): | This is the standard way to define a function in Python | ++-------------------------------+-----------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| begin | g.begin() | Many functions in ``genie_python`` have the same name as in Open Genie. In these cases, prepend ``g.`` to idicate the method belongs to ``genie_python`` and append ``()`` to tell Python to execute the method with no arguments | ++-------------------------------+-----------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| my\_func\_2 100 | my\_func\_2(100) | To execute a function, give its name and then the argument in brackets. This is a user-defined function, not a ``genie_python`` function, so it has no ``g.`` in front. | ++-------------------------------+-----------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| my\_func\_3 100 200 | my\_func\_2(100,200) | As above, except that multiple arguments are separated by a comma | ++-------------------------------+-----------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| waitfor seconds=20 | g.waitfor(seconds=20) | Some methods can take named arguments. In these cases you simply give named arguments in the form ``[name]=[value]``. Note that you can mix named and unnamed arguments, but unnamed arguments always appear at the start of the argument list. `This section <#argument_ordering>`__ gives a more detailed description | ++-------------------------------+-----------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| cset/nocontrol MY_BLOCK=value | g.cset(MY_BLOCK,value,runcontrol=False) | Some Open Genie commands take optional arguments. The same principle applies as in the above example. | ++-------------------------------+-----------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| # This is a comment | # This is a comment | Comments are the same in both languages | ++-------------------------------+-----------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ Creating and running instrument scripts ======================================= From 45d17b29bafff43bc4ca8302b76bb2860a6350f1 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Thu, 6 Oct 2016 15:59:09 +0100 Subject: [PATCH 0375/1813] Updated Scripting (rest) --- Scripting.rest | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Scripting.rest b/Scripting.rest index ef2f664..3ab98cc 100644 --- a/Scripting.rest +++ b/Scripting.rest @@ -171,7 +171,7 @@ Side-by-side comparison +-------------------------------+-----------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | waitfor seconds=20 | g.waitfor(seconds=20) | Some methods can take named arguments. In these cases you simply give named arguments in the form ``[name]=[value]``. Note that you can mix named and unnamed arguments, but unnamed arguments always appear at the start of the argument list. `This section <#argument_ordering>`__ gives a more detailed description | +-------------------------------+-----------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ -| cset/nocontrol MY_BLOCK=value | g.cset(MY_BLOCK,value,runcontrol=False) | Some Open Genie commands take optional arguments. The same principle applies as in the above example. | +| cset/nocontrol MY_BLOCK=value | g.cset("MY_BLOCK",value,runcontrol=False) | Some Open Genie commands take optional arguments. The same principle applies as in the above example. | +-------------------------------+-----------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | # This is a comment | # This is a comment | Comments are the same in both languages | +-------------------------------+-----------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ From c50bae648ea628c06992a643089d9d99cd332edd Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Thu, 6 Oct 2016 15:59:39 +0100 Subject: [PATCH 0376/1813] Updated Scripting (rest) --- Scripting.rest | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Scripting.rest b/Scripting.rest index 3ab98cc..6af7173 100644 --- a/Scripting.rest +++ b/Scripting.rest @@ -171,7 +171,7 @@ Side-by-side comparison +-------------------------------+-----------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | waitfor seconds=20 | g.waitfor(seconds=20) | Some methods can take named arguments. In these cases you simply give named arguments in the form ``[name]=[value]``. Note that you can mix named and unnamed arguments, but unnamed arguments always appear at the start of the argument list. `This section <#argument_ordering>`__ gives a more detailed description | +-------------------------------+-----------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ -| cset/nocontrol MY_BLOCK=value | g.cset("MY_BLOCK",value,runcontrol=False) | Some Open Genie commands take optional arguments. The same principle applies as in the above example. | +| cset/nocontrol MY_BLOCK=value | g.cset(``MY_BLOCK``,value,runcontrol=False) | Some Open Genie commands take optional arguments. The same principle applies as in the above example. | +-------------------------------+-----------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | # This is a comment | # This is a comment | Comments are the same in both languages | +-------------------------------+-----------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ From fb8832e614d5f44f18d709860d5f13467b831fc2 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Thu, 6 Oct 2016 16:00:08 +0100 Subject: [PATCH 0377/1813] Updated Scripting (rest) --- Scripting.rest | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Scripting.rest b/Scripting.rest index 6af7173..ba2ef7e 100644 --- a/Scripting.rest +++ b/Scripting.rest @@ -171,7 +171,7 @@ Side-by-side comparison +-------------------------------+-----------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | waitfor seconds=20 | g.waitfor(seconds=20) | Some methods can take named arguments. In these cases you simply give named arguments in the form ``[name]=[value]``. Note that you can mix named and unnamed arguments, but unnamed arguments always appear at the start of the argument list. `This section <#argument_ordering>`__ gives a more detailed description | +-------------------------------+-----------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ -| cset/nocontrol MY_BLOCK=value | g.cset(``MY_BLOCK``,value,runcontrol=False) | Some Open Genie commands take optional arguments. The same principle applies as in the above example. | +| cset/nocontrol MY_BLOCK=value | g.cset('MY_BLOCK',value,runcontrol=False) | Some Open Genie commands take optional arguments. The same principle applies as in the above example. | +-------------------------------+-----------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | # This is a comment | # This is a comment | Comments are the same in both languages | +-------------------------------+-----------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ From ae1ef2f28547ae5047778234b11d2cf522a83ba2 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Thu, 6 Oct 2016 16:02:04 +0100 Subject: [PATCH 0378/1813] Updated Scripting (rest) --- Scripting.rest | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/Scripting.rest b/Scripting.rest index ba2ef7e..dde32e0 100644 --- a/Scripting.rest +++ b/Scripting.rest @@ -158,23 +158,23 @@ reliable. Side-by-side comparison ----------------------- -+-------------------------------+-----------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ -| Open Genie syntax | ``genie_python`` syntax | Comments | -+===============================+=========================================+==========================================================================================================================================================================================================================================================================================================================+ -| PROCEDURE my\_func | def my\_func(): | This is the standard way to define a function in Python | -+-------------------------------+-----------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ -| begin | g.begin() | Many functions in ``genie_python`` have the same name as in Open Genie. In these cases, prepend ``g.`` to idicate the method belongs to ``genie_python`` and append ``()`` to tell Python to execute the method with no arguments | -+-------------------------------+-----------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ -| my\_func\_2 100 | my\_func\_2(100) | To execute a function, give its name and then the argument in brackets. This is a user-defined function, not a ``genie_python`` function, so it has no ``g.`` in front. | -+-------------------------------+-----------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ -| my\_func\_3 100 200 | my\_func\_2(100,200) | As above, except that multiple arguments are separated by a comma | -+-------------------------------+-----------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ -| waitfor seconds=20 | g.waitfor(seconds=20) | Some methods can take named arguments. In these cases you simply give named arguments in the form ``[name]=[value]``. Note that you can mix named and unnamed arguments, but unnamed arguments always appear at the start of the argument list. `This section <#argument_ordering>`__ gives a more detailed description | -+-------------------------------+-----------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ ++-------------------------------+-------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| Open Genie syntax | ``genie_python`` syntax | Comments | ++===============================+===========================================+==========================================================================================================================================================================================================================================================================================================================+ +| PROCEDURE my\_func | def my\_func(): | This is the standard way to define a function in Python | ++-------------------------------+-------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| begin | g.begin() | Many functions in ``genie_python`` have the same name as in Open Genie. In these cases, prepend ``g.`` to idicate the method belongs to ``genie_python`` and append ``()`` to tell Python to execute the method with no arguments | ++-------------------------------+-------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| my\_func\_2 100 | my\_func\_2(100) | To execute a function, give its name and then the argument in brackets. This is a user-defined function, not a ``genie_python`` function, so it has no ``g.`` in front. | ++-------------------------------+-------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| my\_func\_3 100 200 | my\_func\_2(100,200) | As above, except that multiple arguments are separated by a comma | ++-------------------------------+-------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| waitfor seconds=20 | g.waitfor(seconds=20) | Some methods can take named arguments. In these cases you simply give named arguments in the form ``[name]=[value]``. Note that you can mix named and unnamed arguments, but unnamed arguments always appear at the start of the argument list. `This section <#argument_ordering>`__ gives a more detailed description | ++-------------------------------+-------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | cset/nocontrol MY_BLOCK=value | g.cset('MY_BLOCK',value,runcontrol=False) | Some Open Genie commands take optional arguments. The same principle applies as in the above example. | -+-------------------------------+-----------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ -| # This is a comment | # This is a comment | Comments are the same in both languages | -+-------------------------------+-----------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ ++-------------------------------+-------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| # This is a comment | # This is a comment | Comments are the same in both languages | ++-------------------------------+-------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ Creating and running instrument scripts ======================================= From 27c0193355e04075de33638c45b9de50ed408349 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Thu, 6 Oct 2016 16:12:47 +0100 Subject: [PATCH 0379/1813] Updated HowToDoThingsInIBEX (rest) --- HowToDoThingsInIBEX.rest | 2 -- 1 file changed, 2 deletions(-) diff --git a/HowToDoThingsInIBEX.rest b/HowToDoThingsInIBEX.rest index 89422cd..82f6ebc 100644 --- a/HowToDoThingsInIBEX.rest +++ b/HowToDoThingsInIBEX.rest @@ -15,8 +15,6 @@ In this section of the IBEX User Manual, we describe how to do the most common a [[Create and Manage Synoptics|CreateandManageSynoptics]] -[[Create and Manage Scripts|CreateandManageScripts]] - [[Manage the DAE|ManagetheDAE]] [[Plot a Block Graph|PlotaBlockGraph]] From b7b55e4d0d830d5115f8c787a618bdc548d61266 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Thu, 6 Oct 2016 16:13:57 +0100 Subject: [PATCH 0380/1813] Updated Scripting (rest) --- Scripting.rest | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Scripting.rest b/Scripting.rest index dde32e0..b6030b6 100644 --- a/Scripting.rest +++ b/Scripting.rest @@ -235,6 +235,8 @@ changed. Running ------- +**Please note:** When you are running scripts, the script is being executed on the instrument control PC. This means that the script itself has to be stored on the instrument control PC. It also means that any path names in your scripts refer to locations on the instrument control PC (unless you are referring to network drives). + Once the script is loaded, anything from the script will be available using the ``inst`` package reference. For instance if your script contains the function ``my_function`` you can call: @@ -284,6 +286,8 @@ here is a simple script that executes a calibration run. Running ------- +**Please note:** When you are running scripts, the script is being executed on the instrument control PC. This means that the script itself has to be stored on the instrument control PC. It also means that any path names in your scripts refer to locations on the instrument control PC (unless you are referring to network drives). + Once you've created your script, it's time to run it. There are a number of ways of launching a Python script. From 607e87ee36ff34c813dc7d0fac193ae6bd23784b Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Thu, 6 Oct 2016 16:15:18 +0100 Subject: [PATCH 0381/1813] Updated Scripting (rest) --- Scripting.rest | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Scripting.rest b/Scripting.rest index b6030b6..c277d33 100644 --- a/Scripting.rest +++ b/Scripting.rest @@ -17,6 +17,8 @@ beginner and novice user. scripts <#creating-and-running-user-scripts>`__ - `Tips from the developers <#tips-from-the-developers>`__ +There is also some specific `scripting advice for the Muon Front END`. + .. _`genie\_python reference manual`: http://shadow.nd.rl.ac.uk/genie\_python/sphinx/genie\_python.html Running genie\_python commands From bd8135f29d44f4d3a3aad05007e49934fd65e896 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Thu, 6 Oct 2016 16:15:30 +0100 Subject: [PATCH 0382/1813] Updated Scripting (rest) --- Scripting.rest | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Scripting.rest b/Scripting.rest index c277d33..66d4bd1 100644 --- a/Scripting.rest +++ b/Scripting.rest @@ -17,7 +17,7 @@ beginner and novice user. scripts <#creating-and-running-user-scripts>`__ - `Tips from the developers <#tips-from-the-developers>`__ -There is also some specific `scripting advice for the Muon Front END`. +There is also some specific `scripting advice for the Muon Front END`__. .. _`genie\_python reference manual`: http://shadow.nd.rl.ac.uk/genie\_python/sphinx/genie\_python.html From 7c7b4447b80c6643a6e9ef8d409331f9610d84a5 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Thu, 6 Oct 2016 16:15:43 +0100 Subject: [PATCH 0383/1813] Updated Scripting (rest) --- Scripting.rest | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Scripting.rest b/Scripting.rest index 66d4bd1..2060ce0 100644 --- a/Scripting.rest +++ b/Scripting.rest @@ -17,7 +17,7 @@ beginner and novice user. scripts <#creating-and-running-user-scripts>`__ - `Tips from the developers <#tips-from-the-developers>`__ -There is also some specific `scripting advice for the Muon Front END`__. +There is also some specific `scripting advice for the Muon Front END<#MuonFEScriptGuidance>`__. .. _`genie\_python reference manual`: http://shadow.nd.rl.ac.uk/genie\_python/sphinx/genie\_python.html From 3dbd035f73bec188860a9d7a745c325c0c3573c2 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Thu, 6 Oct 2016 16:16:18 +0100 Subject: [PATCH 0384/1813] Updated Scripting (rest) --- Scripting.rest | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Scripting.rest b/Scripting.rest index 2060ce0..19f6a27 100644 --- a/Scripting.rest +++ b/Scripting.rest @@ -17,7 +17,7 @@ beginner and novice user. scripts <#creating-and-running-user-scripts>`__ - `Tips from the developers <#tips-from-the-developers>`__ -There is also some specific `scripting advice for the Muon Front END<#MuonFEScriptGuidance>`__. +There is also some specific `scripting advice for the Muon Front END`__. .. _`genie\_python reference manual`: http://shadow.nd.rl.ac.uk/genie\_python/sphinx/genie\_python.html From 421634fbb2b13d1932c5ef35483d7359bc666e9a Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Thu, 6 Oct 2016 16:17:09 +0100 Subject: [PATCH 0385/1813] Updated Scripting (rest) --- Scripting.rest | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Scripting.rest b/Scripting.rest index 19f6a27..abf5330 100644 --- a/Scripting.rest +++ b/Scripting.rest @@ -17,8 +17,9 @@ beginner and novice user. scripts <#creating-and-running-user-scripts>`__ - `Tips from the developers <#tips-from-the-developers>`__ -There is also some specific `scripting advice for the Muon Front END`__. +There is also some specific `scripting advice for the Muon Front END`_. +.. _`scripting advice for the Muon Front END`: https://github.com/ISISComputingGroup/ibex_user_manual/wiki/MuonFEScriptGuidance .. _`genie\_python reference manual`: http://shadow.nd.rl.ac.uk/genie\_python/sphinx/genie\_python.html Running genie\_python commands From b84c78ebf90e9596875fc9079b6dd7d7011fa8b7 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Thu, 6 Oct 2016 16:17:26 +0100 Subject: [PATCH 0386/1813] Updated Scripting (rest) --- Scripting.rest | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Scripting.rest b/Scripting.rest index abf5330..0046bb7 100644 --- a/Scripting.rest +++ b/Scripting.rest @@ -17,9 +17,9 @@ beginner and novice user. scripts <#creating-and-running-user-scripts>`__ - `Tips from the developers <#tips-from-the-developers>`__ -There is also some specific `scripting advice for the Muon Front END`_. +There is also some specific `scripting advice for the Muon Front End`_. -.. _`scripting advice for the Muon Front END`: https://github.com/ISISComputingGroup/ibex_user_manual/wiki/MuonFEScriptGuidance +.. _`scripting advice for the Muon Front End`: https://github.com/ISISComputingGroup/ibex_user_manual/wiki/MuonFEScriptGuidance .. _`genie\_python reference manual`: http://shadow.nd.rl.ac.uk/genie\_python/sphinx/genie\_python.html Running genie\_python commands From f206b0bf496ddefd67e2e19d9b08655e0d4637fe Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Thu, 6 Oct 2016 16:17:58 +0100 Subject: [PATCH 0387/1813] Destroyed CreateandManageScripts (rest) --- CreateandManageScripts.rest | 65 ------------------------------------- 1 file changed, 65 deletions(-) delete mode 100644 CreateandManageScripts.rest diff --git a/CreateandManageScripts.rest b/CreateandManageScripts.rest deleted file mode 100644 index da93f28..0000000 --- a/CreateandManageScripts.rest +++ /dev/null @@ -1,65 +0,0 @@ -.. _CreateandManageScripts: - -Create & Manage Scripts -======================= - -In IBEX, the scripting language is Python, augmented by the genie_python library. This means that you have the full facilities of the Python language available to write scripts, plus a library of commands designed to work with IBEX on instruments at ISIS. - -The `genie_python Library`_ replicates the command set in the existing Open-Genie command environment used with the SECI instrument control system. This make it relatively easy to migrate existing Open-Genie scripts to the Python/genie_python environment. - -Contents --------- - -#. `Creating Scripts`_ -#. `genie_python Library`_ -#. `Running Scripts via the IBEX Client`_ -#. `Running Scripts via a Command Window`_ -#. `Guidance for Writing Scripts`_ - - -Creating Scripts ----------------- - -You can create Python scripts to run on IBEX using your favourite text editor (e.g. Notepad++) or Python programming environment. - -**Tip:** Configure your text editor or Python programming environment to replace tabs with spaces. - -Return to `Contents`_. - -genie_python Library --------------------- - -The `genie_python Reference -`_ describes the full capabilitioes of the genie_python library. - -Return to `Contents`_. - -Running Scripts via the IBEX Client ------------------------------------ - -In IBEX, the Scripting View provides you with an interactive Python scripting environment. To view the Scripting View simply click on the ``Scripting`` button in the View Selector. - -The first time you use the Scripting View in an IBEX session, IBEX will need to load the Python scripting environment. This might take a few moments. Please wait while the environment is loaded. - -Once the environment has loaded, you can load and run scripts. - -**Please note:** When you are running scripts, the script is being executed on the instrument control PC. This means that the script itself has to be stored on the instrument control PC. It also means that any path names in your scripts refer to locations on the instrument control PC (unless you are referring to network drives). - -Return to `Contents`_. - -Running Scripts via a Command Window ------------------------------------- -To run scripts via a command window, you must first log into you the control server PC of your instrument using Remote Desktop Connection or VNC. - -**Please note:** When you are running scripts, the script is being executed on the instrument control PC. This means that the script itself has to be stored on the instrument control PC. It also means that any path names in your scripts refer to locations on the instrument control PC (unless you are referring to network drives). - -Return to `Contents`_. - -Guidance for Writing Scripts ----------------------------- -We have compiled a number of pages providing guidance on writing scripts. - -* [[GeneralScriptGuidance]] -* [[MuonFEScriptGuidance]] - -Return to `Contents`_. From 4dd24ba543b5000c52bfdde1df1486f56b4eeb8a Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Thu, 6 Oct 2016 16:19:37 +0100 Subject: [PATCH 0388/1813] Updated WhatIsIBEX (rest) --- WhatIsIBEX.rest | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/WhatIsIBEX.rest b/WhatIsIBEX.rest index e52f21f..6c3f59f 100644 --- a/WhatIsIBEX.rest +++ b/WhatIsIBEX.rest @@ -35,6 +35,6 @@ A full reference to genie_python is available here: http://shadow.nd.rl.ac.uk/ge Differences between Open Genie and genie_python ------------------------------------------------ -Open Genie and genie_python are not the same. +A detailed description of the differences is available on the [[Scripting page|Scripting]]. From f5301a761586828550d193f1112053d2d29a823b Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Thu, 6 Oct 2016 16:20:10 +0100 Subject: [PATCH 0389/1813] Updated Scripting (rest) --- Scripting.rest | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Scripting.rest b/Scripting.rest index 0046bb7..6808a2c 100644 --- a/Scripting.rest +++ b/Scripting.rest @@ -17,9 +17,8 @@ beginner and novice user. scripts <#creating-and-running-user-scripts>`__ - `Tips from the developers <#tips-from-the-developers>`__ -There is also some specific `scripting advice for the Muon Front End`_. +There is also some specific [[scripting advice for the Muon Front End|MuonFEScriptGuidance]] -.. _`scripting advice for the Muon Front End`: https://github.com/ISISComputingGroup/ibex_user_manual/wiki/MuonFEScriptGuidance .. _`genie\_python reference manual`: http://shadow.nd.rl.ac.uk/genie\_python/sphinx/genie\_python.html Running genie\_python commands From 7e5ab8e0b6aca2a9585f36bd1ea7acad72686589 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Thu, 6 Oct 2016 16:21:14 +0100 Subject: [PATCH 0390/1813] Updated _Sidebar (rest) --- Concepts/_Sidebar.rest | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/Concepts/_Sidebar.rest b/Concepts/_Sidebar.rest index f120fb1..dea3c9c 100644 --- a/Concepts/_Sidebar.rest +++ b/Concepts/_Sidebar.rest @@ -1,3 +1,9 @@ -* [[Blocks]] -* [[ProcessVariables]] -* [[PVNamingConventions]] \ No newline at end of file +* [[What Is IBEX|WhatIsIBEX]] +* [[Installing IBEX|InstallingIBEX]] +* [[Starting And Stopping IBEX|StartingAndStoppingIBEX]] +* [[Key Concepts in IBEX|KeyConceptsinIBEX]] +* [[IBEX GUI Features|IBEXGUIFeatures]] +* [[How To Do Things In IBEX|HowToDoThingsInIBEX]] +* [[Scripting]] +* [[FAQ]] +* [[Glossary]] From 1678726a9ee387d88ac5791cdaddb0f5f86f1483 Mon Sep 17 00:00:00 2001 From: IsabellaRey Date: Fri, 7 Oct 2016 11:41:05 +0100 Subject: [PATCH 0391/1813] Fixed link --- Scripting.rest | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Scripting.rest b/Scripting.rest index 6808a2c..bc2652b 100644 --- a/Scripting.rest +++ b/Scripting.rest @@ -127,7 +127,7 @@ you'll be able to convert many scripts without issue. List of functions ----------------- -We've included some - `Common ``genie_python`` +We've included some - `Common genie_python commands <#common-genie_python-commands>`__ on this page, but for a full list refer to the `genie\_python reference manual`_. From 960a68bcb0662b907ddcf7928a82362ebafaf228 Mon Sep 17 00:00:00 2001 From: IsabellaRey Date: Fri, 7 Oct 2016 11:41:49 +0100 Subject: [PATCH 0392/1813] fixed link formatting --- Scripting.rest | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Scripting.rest b/Scripting.rest index bc2652b..ddd40bc 100644 --- a/Scripting.rest +++ b/Scripting.rest @@ -127,7 +127,7 @@ you'll be able to convert many scripts without issue. List of functions ----------------- -We've included some - `Common genie_python +We've included some `common genie_python commands <#common-genie_python-commands>`__ on this page, but for a full list refer to the `genie\_python reference manual`_. From 0bb1b62c6fdd09dfbbee2224264b4719d25d884a Mon Sep 17 00:00:00 2001 From: IsabellaRey Date: Fri, 7 Oct 2016 11:49:42 +0100 Subject: [PATCH 0393/1813] Updated Scripting (rest) From 7f8e132dc0a62da168bb3bb9412070aac8495fed Mon Sep 17 00:00:00 2001 From: AdrianPotter Date: Fri, 7 Oct 2016 11:52:19 +0100 Subject: [PATCH 0394/1813] Update sidebar to include scripting --- _Sidebar.rest | 1 + 1 file changed, 1 insertion(+) diff --git a/_Sidebar.rest b/_Sidebar.rest index 0232209..d80ce73 100644 --- a/_Sidebar.rest +++ b/_Sidebar.rest @@ -4,5 +4,6 @@ * [[KeyConceptsinIBEX]] * [[IBEXGUIFeatures]] * [[HowToDoThingsInIBEX]] +* [[Scripting]] * [[FAQ]] * [[Glossary]] From 9ea37892708636ad159224e517861f0f0dc44f3a Mon Sep 17 00:00:00 2001 From: AdrianPotter Date: Fri, 7 Oct 2016 11:53:09 +0100 Subject: [PATCH 0395/1813] Investigating odd header behaviour --- Scripting.rest | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Scripting.rest b/Scripting.rest index ddd40bc..1308fc1 100644 --- a/Scripting.rest +++ b/Scripting.rest @@ -321,6 +321,8 @@ From a genie\_python terminal Tips from the developers ======================== +Here is some text. + Argument ordering ----------------- From 12b22260505bfe8c26383d8e070cd4fc9c987ac3 Mon Sep 17 00:00:00 2001 From: AdrianPotter Date: Fri, 7 Oct 2016 11:53:42 +0100 Subject: [PATCH 0396/1813] Investigating odd header behaviour --- Scripting.rest | 1 - 1 file changed, 1 deletion(-) diff --git a/Scripting.rest b/Scripting.rest index 1308fc1..ef841eb 100644 --- a/Scripting.rest +++ b/Scripting.rest @@ -321,7 +321,6 @@ From a genie\_python terminal Tips from the developers ======================== -Here is some text. Argument ordering ----------------- From 36ce15eaeec1731895142064e63d8bb3988262ce Mon Sep 17 00:00:00 2001 From: AdrianPotter Date: Fri, 7 Oct 2016 11:55:40 +0100 Subject: [PATCH 0397/1813] Add some placeholder text so the headering doesn't get confused --- Scripting.rest | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Scripting.rest b/Scripting.rest index ef841eb..a4194cd 100644 --- a/Scripting.rest +++ b/Scripting.rest @@ -321,6 +321,8 @@ From a genie\_python terminal Tips from the developers ======================== +Even with correct syntax, a working script can become bug-prone and difficult for users to update. Here we document some tips +to help keep your scripts working as expected and easy to modify in the future. Argument ordering ----------------- From a44c91681eb39460f6b3636ba6788feb7aeeb29e Mon Sep 17 00:00:00 2001 From: AdrianPotter Date: Fri, 7 Oct 2016 11:57:19 +0100 Subject: [PATCH 0398/1813] Can't link to subsections --- Scripting.rest | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Scripting.rest b/Scripting.rest index a4194cd..d900009 100644 --- a/Scripting.rest +++ b/Scripting.rest @@ -171,7 +171,7 @@ Side-by-side comparison +-------------------------------+-------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | my\_func\_3 100 200 | my\_func\_2(100,200) | As above, except that multiple arguments are separated by a comma | +-------------------------------+-------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ -| waitfor seconds=20 | g.waitfor(seconds=20) | Some methods can take named arguments. In these cases you simply give named arguments in the form ``[name]=[value]``. Note that you can mix named and unnamed arguments, but unnamed arguments always appear at the start of the argument list. `This section <#argument_ordering>`__ gives a more detailed description | +| waitfor seconds=20 | g.waitfor(seconds=20) | Some methods can take named arguments. In these cases you simply give named arguments in the form ``[name]=[value]``. Note that you can mix named and unnamed arguments, but unnamed arguments always appear at the start of the argument list. `This section <#tips_from_the_developers>`__ gives a more detailed description | +-------------------------------+-------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | cset/nocontrol MY_BLOCK=value | g.cset('MY_BLOCK',value,runcontrol=False) | Some Open Genie commands take optional arguments. The same principle applies as in the above example. | +-------------------------------+-------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ From f4734c2f7ccc80dc44418d53460457b8d37f3c65 Mon Sep 17 00:00:00 2001 From: AdrianPotter Date: Fri, 7 Oct 2016 11:59:15 +0100 Subject: [PATCH 0399/1813] Whoever wrote the code for RST tables is evil --- Scripting.rest | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/Scripting.rest b/Scripting.rest index d900009..d88ecc3 100644 --- a/Scripting.rest +++ b/Scripting.rest @@ -160,23 +160,23 @@ reliable. Side-by-side comparison ----------------------- -+-------------------------------+-------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ -| Open Genie syntax | ``genie_python`` syntax | Comments | -+===============================+===========================================+==========================================================================================================================================================================================================================================================================================================================+ -| PROCEDURE my\_func | def my\_func(): | This is the standard way to define a function in Python | -+-------------------------------+-------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ -| begin | g.begin() | Many functions in ``genie_python`` have the same name as in Open Genie. In these cases, prepend ``g.`` to idicate the method belongs to ``genie_python`` and append ``()`` to tell Python to execute the method with no arguments | -+-------------------------------+-------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ -| my\_func\_2 100 | my\_func\_2(100) | To execute a function, give its name and then the argument in brackets. This is a user-defined function, not a ``genie_python`` function, so it has no ``g.`` in front. | -+-------------------------------+-------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ -| my\_func\_3 100 200 | my\_func\_2(100,200) | As above, except that multiple arguments are separated by a comma | -+-------------------------------+-------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ ++-------------------------------+-------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| Open Genie syntax | ``genie_python`` syntax | Comments | ++===============================+===========================================+=================================================================================================================================================================================================================================================================================================================================+ +| PROCEDURE my\_func | def my\_func(): | This is the standard way to define a function in Python | ++-------------------------------+-------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| begin | g.begin() | Many functions in ``genie_python`` have the same name as in Open Genie. In these cases, prepend ``g.`` to idicate the method belongs to ``genie_python`` and append ``()`` to tell Python to execute the method with no arguments | ++-------------------------------+-------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| my\_func\_2 100 | my\_func\_2(100) | To execute a function, give its name and then the argument in brackets. This is a user-defined function, not a ``genie_python`` function, so it has no ``g.`` in front. | ++-------------------------------+-------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| my\_func\_3 100 200 | my\_func\_2(100,200) | As above, except that multiple arguments are separated by a comma | ++-------------------------------+-------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | waitfor seconds=20 | g.waitfor(seconds=20) | Some methods can take named arguments. In these cases you simply give named arguments in the form ``[name]=[value]``. Note that you can mix named and unnamed arguments, but unnamed arguments always appear at the start of the argument list. `This section <#tips_from_the_developers>`__ gives a more detailed description | -+-------------------------------+-------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ -| cset/nocontrol MY_BLOCK=value | g.cset('MY_BLOCK',value,runcontrol=False) | Some Open Genie commands take optional arguments. The same principle applies as in the above example. | -+-------------------------------+-------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ -| # This is a comment | # This is a comment | Comments are the same in both languages | -+-------------------------------+-------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ ++-------------------------------+-------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| cset/nocontrol MY_BLOCK=value | g.cset('MY_BLOCK',value,runcontrol=False) | Some Open Genie commands take optional arguments. The same principle applies as in the above example. | ++-------------------------------+-------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| # This is a comment | # This is a comment | Comments are the same in both languages | ++-------------------------------+-------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ Creating and running instrument scripts ======================================= From 07157505e112e625309987d6e0b8b54963959cba Mon Sep 17 00:00:00 2001 From: AdrianPotter Date: Fri, 7 Oct 2016 12:00:13 +0100 Subject: [PATCH 0400/1813] Perhaps we can links to subheaders --- Scripting.rest | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Scripting.rest b/Scripting.rest index d88ecc3..c871e49 100644 --- a/Scripting.rest +++ b/Scripting.rest @@ -171,7 +171,7 @@ Side-by-side comparison +-------------------------------+-------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | my\_func\_3 100 200 | my\_func\_2(100,200) | As above, except that multiple arguments are separated by a comma | +-------------------------------+-------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ -| waitfor seconds=20 | g.waitfor(seconds=20) | Some methods can take named arguments. In these cases you simply give named arguments in the form ``[name]=[value]``. Note that you can mix named and unnamed arguments, but unnamed arguments always appear at the start of the argument list. `This section <#tips_from_the_developers>`__ gives a more detailed description | +| waitfor seconds=20 | g.waitfor(seconds=20) | Some methods can take named arguments. In these cases you simply give named arguments in the form ``[name]=[value]``. Note that you can mix named and unnamed arguments, but unnamed arguments always appear at the start of the argument list. `This section <#argument-ordering>`__ gives a more detailed description | +-------------------------------+-------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | cset/nocontrol MY_BLOCK=value | g.cset('MY_BLOCK',value,runcontrol=False) | Some Open Genie commands take optional arguments. The same principle applies as in the above example. | +-------------------------------+-------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ From 0b3382876a2b7219886f2fa74470c29d1108f383 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Fri, 7 Oct 2016 15:30:02 +0100 Subject: [PATCH 0401/1813] Updated InstallingIBEX (rest) --- InstallingIBEX.rest | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/InstallingIBEX.rest b/InstallingIBEX.rest index 967cd7e..b37b1cb 100644 --- a/InstallingIBEX.rest +++ b/InstallingIBEX.rest @@ -51,18 +51,13 @@ Installation 2.0.0 2.1.0 - ... - EPICS - genie_python_release Change to the folder with the highest value of ``N.M.O`` (e.g. ``cd 2.1.0`` in the above example). 4. In the folder ``N.M.O``, change to the Client folder: ``cd Client`` -5. In the folder ``Client``, change to the folder named ``BUILDmmm``: ``cd BUILDmmm`` - -6. Run the command ``install_client.bat``. This will copy the contents of the above directory +5. Run the command ``install_client.bat``. This will copy the contents of the above directory to ``C:\Instrument\Apps\Client``. It will also install genie_python. -7. You might find it convenient to create a desktop shortcut to use to launch the IBEX client. The path to the IBEX Client executable is ``C:\Instrument\Apps\Client\ibex-client.exe``. +6. You might find it convenient to create a desktop shortcut to use to launch the IBEX client. The path to the IBEX Client executable is ``C:\Instrument\Apps\Client\ibex-client.exe``. From 46f3c4e2842fd79b579cdf898877cd76064556f0 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Fri, 7 Oct 2016 15:46:17 +0100 Subject: [PATCH 0402/1813] Updated InstallingIBEX (rest) --- InstallingIBEX.rest | 2 ++ 1 file changed, 2 insertions(+) diff --git a/InstallingIBEX.rest b/InstallingIBEX.rest index b37b1cb..84e60d8 100644 --- a/InstallingIBEX.rest +++ b/InstallingIBEX.rest @@ -45,6 +45,8 @@ Installation cd \\isis\inst$\Kits$\CompGroup\ICP\Releases +Alternatively use ``\\isis.cclrc.ac.uk\inst$\...`` for non-domain machines. + 3. Inside this folder you will see a list of folders resembling the following: :: From 3ffba9508d86d13a30f2169fe0dec54a1e9f9dd8 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Fri, 7 Oct 2016 15:46:30 +0100 Subject: [PATCH 0403/1813] Updated InstallingIBEX (rest) --- InstallingIBEX.rest | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/InstallingIBEX.rest b/InstallingIBEX.rest index 84e60d8..db29f8e 100644 --- a/InstallingIBEX.rest +++ b/InstallingIBEX.rest @@ -45,7 +45,7 @@ Installation cd \\isis\inst$\Kits$\CompGroup\ICP\Releases -Alternatively use ``\\isis.cclrc.ac.uk\inst$\...`` for non-domain machines. + Alternatively use ``\\isis.cclrc.ac.uk\inst$\...`` for non-domain machines. 3. Inside this folder you will see a list of folders resembling the following: From f68bf5d715e7d8bda00894ad466808e80886434e Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Fri, 7 Oct 2016 15:46:42 +0100 Subject: [PATCH 0404/1813] Updated InstallingIBEX (rest) --- InstallingIBEX.rest | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/InstallingIBEX.rest b/InstallingIBEX.rest index db29f8e..84e60d8 100644 --- a/InstallingIBEX.rest +++ b/InstallingIBEX.rest @@ -45,7 +45,7 @@ Installation cd \\isis\inst$\Kits$\CompGroup\ICP\Releases - Alternatively use ``\\isis.cclrc.ac.uk\inst$\...`` for non-domain machines. +Alternatively use ``\\isis.cclrc.ac.uk\inst$\...`` for non-domain machines. 3. Inside this folder you will see a list of folders resembling the following: From 993a8993120f23a88f748ce38b01cdb1f871d83a Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Fri, 7 Oct 2016 15:46:52 +0100 Subject: [PATCH 0405/1813] Updated InstallingIBEX (rest) From 006f6f9588089a5b1cb9985b0d05bf29fc45186e Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Fri, 7 Oct 2016 15:47:54 +0100 Subject: [PATCH 0406/1813] Updated InstallingIBEX (rest) --- InstallingIBEX.rest | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/InstallingIBEX.rest b/InstallingIBEX.rest index 84e60d8..8027c1f 100644 --- a/InstallingIBEX.rest +++ b/InstallingIBEX.rest @@ -45,7 +45,7 @@ Installation cd \\isis\inst$\Kits$\CompGroup\ICP\Releases -Alternatively use ``\\isis.cclrc.ac.uk\inst$\...`` for non-domain machines. +Alternatively use ``\\isis.cclrc.ac.uk\inst$\...`` for non-domain machines. You may need to use your FedID to access this folder. 3. Inside this folder you will see a list of folders resembling the following: From 0ed319e6824c0d177c2008977f0d9523a6331b59 Mon Sep 17 00:00:00 2001 From: Gollum Date: Tue, 11 Oct 2016 14:46:29 +0100 Subject: [PATCH 0407/1813] Updated CreateandManageConfigurations (rest) From cb007ddf7c368a992dc230be7284e095b11a8da0 Mon Sep 17 00:00:00 2001 From: Gollum Date: Tue, 11 Oct 2016 15:05:23 +0100 Subject: [PATCH 0408/1813] Updated CreateandManageConfigurations (rest) --- CreateandManageConfigurations.rest | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CreateandManageConfigurations.rest b/CreateandManageConfigurations.rest index e30a6a8..8b315d6 100644 --- a/CreateandManageConfigurations.rest +++ b/CreateandManageConfigurations.rest @@ -128,6 +128,8 @@ Logging Settings **Note:** Blocks that have been inherited from a component will be shown, but cannot be cannot be modified, in the Edit Configuration dialog (the blocks will be shown as "greyed-out"). To modify inherited blocks you need to use the Edit Component dialog (see [[CreateandManageComponents]]). +TEST CONTENT + Return to `Contents`_. Groups Tab From 5d11f43ffb5ab6c5f8e16ff63d7075b89a1d5631 Mon Sep 17 00:00:00 2001 From: Gollum Date: Tue, 11 Oct 2016 15:06:28 +0100 Subject: [PATCH 0409/1813] Updated CreateandManageConfigurations (rest) --- CreateandManageConfigurations.rest | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CreateandManageConfigurations.rest b/CreateandManageConfigurations.rest index 8b315d6..fbede63 100644 --- a/CreateandManageConfigurations.rest +++ b/CreateandManageConfigurations.rest @@ -128,7 +128,8 @@ Logging Settings **Note:** Blocks that have been inherited from a component will be shown, but cannot be cannot be modified, in the Edit Configuration dialog (the blocks will be shown as "greyed-out"). To modify inherited blocks you need to use the Edit Component dialog (see [[CreateandManageComponents]]). -TEST CONTENT +.. role:: rubric +:rubric:`TEST CONTENT` Return to `Contents`_. From de0c13ee72837b519b8067af16640360048b9a6d Mon Sep 17 00:00:00 2001 From: Gollum Date: Tue, 11 Oct 2016 15:06:49 +0100 Subject: [PATCH 0410/1813] Updated CreateandManageConfigurations (rest) From bb0211c08c89817de399cb638a5298be2715ad83 Mon Sep 17 00:00:00 2001 From: Gollum Date: Tue, 11 Oct 2016 15:08:36 +0100 Subject: [PATCH 0411/1813] Updated CreateandManageConfigurations (rest) --- CreateandManageConfigurations.rest | 1 + 1 file changed, 1 insertion(+) diff --git a/CreateandManageConfigurations.rest b/CreateandManageConfigurations.rest index fbede63..4a7c7cf 100644 --- a/CreateandManageConfigurations.rest +++ b/CreateandManageConfigurations.rest @@ -129,6 +129,7 @@ Logging Settings **Note:** Blocks that have been inherited from a component will be shown, but cannot be cannot be modified, in the Edit Configuration dialog (the blocks will be shown as "greyed-out"). To modify inherited blocks you need to use the Edit Component dialog (see [[CreateandManageComponents]]). .. role:: rubric + :rubric:`TEST CONTENT` Return to `Contents`_. From 37fbde67ea483fcaf892ba8691e606c612a67040 Mon Sep 17 00:00:00 2001 From: Gollum Date: Tue, 11 Oct 2016 15:09:15 +0100 Subject: [PATCH 0412/1813] Updated CreateandManageConfigurations (rest) --- CreateandManageConfigurations.rest | 4 ---- 1 file changed, 4 deletions(-) diff --git a/CreateandManageConfigurations.rest b/CreateandManageConfigurations.rest index 4a7c7cf..e30a6a8 100644 --- a/CreateandManageConfigurations.rest +++ b/CreateandManageConfigurations.rest @@ -128,10 +128,6 @@ Logging Settings **Note:** Blocks that have been inherited from a component will be shown, but cannot be cannot be modified, in the Edit Configuration dialog (the blocks will be shown as "greyed-out"). To modify inherited blocks you need to use the Edit Component dialog (see [[CreateandManageComponents]]). -.. role:: rubric - -:rubric:`TEST CONTENT` - Return to `Contents`_. Groups Tab From 029633987ad633f2281dd168e5bee61f23309119 Mon Sep 17 00:00:00 2001 From: Gollum Date: Tue, 11 Oct 2016 15:14:18 +0100 Subject: [PATCH 0413/1813] Updated CreateandManageConfigurations (rest) --- CreateandManageConfigurations.rest | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/CreateandManageConfigurations.rest b/CreateandManageConfigurations.rest index e30a6a8..7e33f18 100644 --- a/CreateandManageConfigurations.rest +++ b/CreateandManageConfigurations.rest @@ -121,11 +121,13 @@ Run-Control Settings Logging Settings Use the Logging Settings section of the Configure Block dialog to control how the value of the block is logged. - * **Note:** By default logging is disabled (i.e. changes in the value of the block will not be logged). + * **Note:** By default logging is enabled (i.e. changes in the value of the block will be logged). * Click on the ``Enabled`` check-box to change the way the block is logged. If the ``Enabled`` check-box is checked, then logging is enabled. * You can choose to log the block value periodically (the default period is every 30 seconds). * Alternatively, you can set a "deadband" - the block will only be logged if its value falls outside +/- the limit defined by the deadband value. +**PREVIOUS VERSIONS OF IBEX:** In releases 2.1.0 or earlier, the logging is disabled by default. + **Note:** Blocks that have been inherited from a component will be shown, but cannot be cannot be modified, in the Edit Configuration dialog (the blocks will be shown as "greyed-out"). To modify inherited blocks you need to use the Edit Component dialog (see [[CreateandManageComponents]]). Return to `Contents`_. From 190ec323aa5978172a54b2aa4ef38f8196d0d4d0 Mon Sep 17 00:00:00 2001 From: Gollum Date: Fri, 14 Oct 2016 16:36:53 +0100 Subject: [PATCH 0414/1813] Updated InstallingIBEX (rest) --- InstallingIBEX.rest | 43 ++++++++++++++++++++++++++++++++++--------- 1 file changed, 34 insertions(+), 9 deletions(-) diff --git a/InstallingIBEX.rest b/InstallingIBEX.rest index 8027c1f..8be4179 100644 --- a/InstallingIBEX.rest +++ b/InstallingIBEX.rest @@ -38,28 +38,53 @@ Installation mkdir C:\Instrument\Apps\Python cd C:\Instrument -2. In the command window type the following (if your command prompt doesn't support UNC paths, - use ``pushd`` instead of ``cd``): +2. If your PC is in the ISIS domain (i.e. it is an ISIS PC), use the following instruction. +If your PC is not in the ISIS domain (i.e. it is not an ISIS PC) skip to step 3. +In the command window type the following command: :: - cd \\isis\inst$\Kits$\CompGroup\ICP\Releases + net use Z: \\isis\inst$\Kits$\CompGroup\ICP\Releases /user:my_fed_id -Alternatively use ``\\isis.cclrc.ac.uk\inst$\...`` for non-domain machines. You may need to use your FedID to access this folder. +substituting your federal-ID instead of ``my_fed_id``. The command will prompt you for your password. This command will map the shared folder ``\\isis\inst$\Kits$\CompGroup\ICP\Releases`` to the ``Z:`` drive. You don't have to choose ``Z:`` as your drive letter, you can choose any drive letter you wish (provided it is not already in use on your PC). Please take care to use the ``\`` and ``/`` characters as shown in the above example, otherwise the command will not work (hint: it is easiest to cut/paste the above command into the command window). -3. Inside this folder you will see a list of folders resembling the following: +Change to the ``Z:`` drive: +:: + + Z: + +Now proceed directly to step 4 (i.e. skip step 3). + +3. If your PC is not in the ISIS domain (i.e. it is not an ISIS PC), type the following command in the command window : + +:: + + net use Z: \\isis.cclrc.ac.uk\inst$\Kits$\CompGroup\ICP\Releases /user:my_fed_id + +substituting your federal-ID instead of ``my_fed_id``. The command will prompt you for your password. This command will map the shared folder ``\\isis\inst$\Kits$\CompGroup\ICP\Releases`` to the ``Z:`` drive. You don't have to choose ``Z:`` as your drive letter, you can choose any drive letter you wish (provided it is not already in use on your PC). Please take care to use the ``\`` and ``/`` characters as shown in the above example, otherwise the command will not work (hint: it is easiest to cut/paste the above command into the command window). + +Change to the ``Z:`` drive: +:: + + Z: + +Proceed directly to step 4. + +4. On the ``Z:`` drive you will see a list of folders resembling the following: :: 2.0.0 2.1.0 - Change to the folder with the highest value of ``N.M.O`` (e.g. ``cd 2.1.0`` in the above example). -4. In the folder ``N.M.O``, change to the Client folder: ``cd Client`` +5. In the folder ``N.M.O``, change to the Client folder: +:: + + cd Client -5. Run the command ``install_client.bat``. This will copy the contents of the above directory +6. Run the command ``install_client.bat``. This will copy the contents of the above directory to ``C:\Instrument\Apps\Client``. It will also install genie_python. -6. You might find it convenient to create a desktop shortcut to use to launch the IBEX client. The path to the IBEX Client executable is ``C:\Instrument\Apps\Client\ibex-client.exe``. +7. You might find it convenient to create a desktop shortcut to use to launch the IBEX client. The path to the IBEX Client executable is ``C:\Instrument\Apps\Client\ibex-client.exe``. From 4b07b11cefd976821d0d395fa84e7744727826d2 Mon Sep 17 00:00:00 2001 From: Gollum Date: Fri, 14 Oct 2016 16:45:17 +0100 Subject: [PATCH 0415/1813] Updated InstallingIBEX (rest) --- InstallingIBEX.rest | 33 ++++++++++----------------------- 1 file changed, 10 insertions(+), 23 deletions(-) diff --git a/InstallingIBEX.rest b/InstallingIBEX.rest index 8be4179..a60f51b 100644 --- a/InstallingIBEX.rest +++ b/InstallingIBEX.rest @@ -38,39 +38,29 @@ Installation mkdir C:\Instrument\Apps\Python cd C:\Instrument -2. If your PC is in the ISIS domain (i.e. it is an ISIS PC), use the following instruction. -If your PC is not in the ISIS domain (i.e. it is not an ISIS PC) skip to step 3. -In the command window type the following command: +2. In the command window type one of the following commands: -:: - - net use Z: \\isis\inst$\Kits$\CompGroup\ICP\Releases /user:my_fed_id + a. If your your PC is in the ISIS domain (i.e. it is an ISIS PC): -substituting your federal-ID instead of ``my_fed_id``. The command will prompt you for your password. This command will map the shared folder ``\\isis\inst$\Kits$\CompGroup\ICP\Releases`` to the ``Z:`` drive. You don't have to choose ``Z:`` as your drive letter, you can choose any drive letter you wish (provided it is not already in use on your PC). Please take care to use the ``\`` and ``/`` characters as shown in the above example, otherwise the command will not work (hint: it is easiest to cut/paste the above command into the command window). - -Change to the ``Z:`` drive: :: - Z: - -Now proceed directly to step 4 (i.e. skip step 3). + net use Z: \\isis\inst$\Kits$\CompGroup\ICP\Releases /user:my_fed_id -3. If your PC is not in the ISIS domain (i.e. it is not an ISIS PC), type the following command in the command window : +or + b. If your your PC is not in the ISIS domain (i.e. it is not an ISIS PC): :: net use Z: \\isis.cclrc.ac.uk\inst$\Kits$\CompGroup\ICP\Releases /user:my_fed_id -substituting your federal-ID instead of ``my_fed_id``. The command will prompt you for your password. This command will map the shared folder ``\\isis\inst$\Kits$\CompGroup\ICP\Releases`` to the ``Z:`` drive. You don't have to choose ``Z:`` as your drive letter, you can choose any drive letter you wish (provided it is not already in use on your PC). Please take care to use the ``\`` and ``/`` characters as shown in the above example, otherwise the command will not work (hint: it is easiest to cut/paste the above command into the command window). +In either case, substitute your federal-ID instead of ``my_fed_id``. The command will prompt you for your password. This command will map the shared folder ``\\isis\inst$\Kits$\CompGroup\ICP\Releases`` to the ``Z:`` drive. You can choose any drive letter you wish (provided it is not already in use on your PC). Please take care to use the ``\`` and ``/`` characters as shown in the above example, otherwise the command will not work (hint: it is easiest to cut/paste the above command into the command window). Change to the ``Z:`` drive: :: Z: -Proceed directly to step 4. - -4. On the ``Z:`` drive you will see a list of folders resembling the following: +3. On the ``Z:`` drive you will see a list of folders resembling the following: :: @@ -79,12 +69,9 @@ Proceed directly to step 4. Change to the folder with the highest value of ``N.M.O`` (e.g. ``cd 2.1.0`` in the above example). -5. In the folder ``N.M.O``, change to the Client folder: -:: - - cd Client +4. In the folder ``N.M.O``, change to the Client folder: ``cd Client`` -6. Run the command ``install_client.bat``. This will copy the contents of the above directory +5. Run the command ``install_client.bat``. This will copy the contents of the above directory to ``C:\Instrument\Apps\Client``. It will also install genie_python. -7. You might find it convenient to create a desktop shortcut to use to launch the IBEX client. The path to the IBEX Client executable is ``C:\Instrument\Apps\Client\ibex-client.exe``. +6. You might find it convenient to create a desktop shortcut to use to launch the IBEX client. The path to the IBEX Client executable is ``C:\Instrument\Apps\Client\ibex-client.exe``. From a6cb7bc0dc370b30dbd4aef97da899b476020df2 Mon Sep 17 00:00:00 2001 From: Gollum Date: Fri, 14 Oct 2016 17:05:26 +0100 Subject: [PATCH 0416/1813] Updated InstallingIBEX (rest) --- InstallingIBEX.rest | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/InstallingIBEX.rest b/InstallingIBEX.rest index a60f51b..0184471 100644 --- a/InstallingIBEX.rest +++ b/InstallingIBEX.rest @@ -53,7 +53,7 @@ or net use Z: \\isis.cclrc.ac.uk\inst$\Kits$\CompGroup\ICP\Releases /user:my_fed_id -In either case, substitute your federal-ID instead of ``my_fed_id``. The command will prompt you for your password. This command will map the shared folder ``\\isis\inst$\Kits$\CompGroup\ICP\Releases`` to the ``Z:`` drive. You can choose any drive letter you wish (provided it is not already in use on your PC). Please take care to use the ``\`` and ``/`` characters as shown in the above example, otherwise the command will not work (hint: it is easiest to cut/paste the above command into the command window). +In either case, substitute your federal-ID instead of ``my_fed_id``. The command will prompt you for your password. This command will map the shared folder ``\\isis\inst$\Kits$\CompGroup\ICP\Releases`` to the ``Z:`` drive. You don't have to choose ``Z:`` as the drive letter, you can choose any drive letter you wish (provided it is not already in use on your PC). Please take care to use the ``\`` and ``/`` characters as shown in the above example, otherwise the command will not work (hint: it is easiest to cut/paste the above command into the command window). Change to the ``Z:`` drive: :: From 10c2b5743243640e2e5861ccc74ad7305f666282 Mon Sep 17 00:00:00 2001 From: Gollum Date: Fri, 14 Oct 2016 17:06:16 +0100 Subject: [PATCH 0417/1813] Updated InstallingIBEX (rest) --- InstallingIBEX.rest | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/InstallingIBEX.rest b/InstallingIBEX.rest index 0184471..125301a 100644 --- a/InstallingIBEX.rest +++ b/InstallingIBEX.rest @@ -53,7 +53,7 @@ or net use Z: \\isis.cclrc.ac.uk\inst$\Kits$\CompGroup\ICP\Releases /user:my_fed_id -In either case, substitute your federal-ID instead of ``my_fed_id``. The command will prompt you for your password. This command will map the shared folder ``\\isis\inst$\Kits$\CompGroup\ICP\Releases`` to the ``Z:`` drive. You don't have to choose ``Z:`` as the drive letter, you can choose any drive letter you wish (provided it is not already in use on your PC). Please take care to use the ``\`` and ``/`` characters as shown in the above example, otherwise the command will not work (hint: it is easiest to cut/paste the above command into the command window). +In either case, substitute your federal-ID instead of ``my_fed_id``. The command will prompt you for your password. This command will map the shared folder ``\\isis\inst$\Kits$\CompGroup\ICP\Releases`` to the ``Z:`` drive. You don't have to choose ``Z:`` as the drive letter, you can choose any drive letter you wish (provided it is not already in use on your PC). Please take care to use the ``\`` and ``/`` characters exactly as shown in the above example, otherwise the command will not work (hint: it is easiest to cut/paste the above command into the command window). Change to the ``Z:`` drive: :: From b6ea2271d02cccec4c6a4365394b014856bb5efa Mon Sep 17 00:00:00 2001 From: Gollum Date: Fri, 14 Oct 2016 17:07:35 +0100 Subject: [PATCH 0418/1813] Updated InstallingIBEX (rest) --- InstallingIBEX.rest | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/InstallingIBEX.rest b/InstallingIBEX.rest index 125301a..f5da8c0 100644 --- a/InstallingIBEX.rest +++ b/InstallingIBEX.rest @@ -51,7 +51,7 @@ or :: - net use Z: \\isis.cclrc.ac.uk\inst$\Kits$\CompGroup\ICP\Releases /user:my_fed_id + net use Z: \\isis.cclrc.ac.uk\inst$\Kits$\CompGroup\ICP\Releases /user:CLRC\my_fed_id In either case, substitute your federal-ID instead of ``my_fed_id``. The command will prompt you for your password. This command will map the shared folder ``\\isis\inst$\Kits$\CompGroup\ICP\Releases`` to the ``Z:`` drive. You don't have to choose ``Z:`` as the drive letter, you can choose any drive letter you wish (provided it is not already in use on your PC). Please take care to use the ``\`` and ``/`` characters exactly as shown in the above example, otherwise the command will not work (hint: it is easiest to cut/paste the above command into the command window). From 55e47f044e2a9752c50176fbbb51baa397c37541 Mon Sep 17 00:00:00 2001 From: Gollum Date: Mon, 17 Oct 2016 15:56:12 +0100 Subject: [PATCH 0419/1813] Updated HowToDoThingsInIBEX (rest) --- HowToDoThingsInIBEX.rest | 2 ++ 1 file changed, 2 insertions(+) diff --git a/HowToDoThingsInIBEX.rest b/HowToDoThingsInIBEX.rest index 82f6ebc..89422cd 100644 --- a/HowToDoThingsInIBEX.rest +++ b/HowToDoThingsInIBEX.rest @@ -15,6 +15,8 @@ In this section of the IBEX User Manual, we describe how to do the most common a [[Create and Manage Synoptics|CreateandManageSynoptics]] +[[Create and Manage Scripts|CreateandManageScripts]] + [[Manage the DAE|ManagetheDAE]] [[Plot a Block Graph|PlotaBlockGraph]] From a6fe842caa66c3b60f333802f16d5a732bf18a4a Mon Sep 17 00:00:00 2001 From: Gollum Date: Mon, 17 Oct 2016 15:56:34 +0100 Subject: [PATCH 0420/1813] Updated HowToDoThingsInIBEX (rest) --- HowToDoThingsInIBEX.rest | 2 -- 1 file changed, 2 deletions(-) diff --git a/HowToDoThingsInIBEX.rest b/HowToDoThingsInIBEX.rest index 89422cd..82f6ebc 100644 --- a/HowToDoThingsInIBEX.rest +++ b/HowToDoThingsInIBEX.rest @@ -15,8 +15,6 @@ In this section of the IBEX User Manual, we describe how to do the most common a [[Create and Manage Synoptics|CreateandManageSynoptics]] -[[Create and Manage Scripts|CreateandManageScripts]] - [[Manage the DAE|ManagetheDAE]] [[Plot a Block Graph|PlotaBlockGraph]] From 412eb50072bcbe1d618557c71fda03d3a89387bb Mon Sep 17 00:00:00 2001 From: Gollum Date: Mon, 17 Oct 2016 16:25:36 +0100 Subject: [PATCH 0421/1813] Updated Scripting (rest) --- Scripting.rest | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Scripting.rest b/Scripting.rest index c871e49..f14dce5 100644 --- a/Scripting.rest +++ b/Scripting.rest @@ -364,4 +364,4 @@ is wrong and wouldn't work. Instead, we could have written: g.change_monitor(1,high=10,low=0) which would have worked and makes it clear for whoever comes to edit the -code in future. \ No newline at end of file +code in future (hint: that person might be you!). \ No newline at end of file From a9746d3d839be36fd6456b6713b3867b99a5d5e1 Mon Sep 17 00:00:00 2001 From: Gollum Date: Mon, 17 Oct 2016 16:29:04 +0100 Subject: [PATCH 0422/1813] Updated Scripting (rest) --- Scripting.rest | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Scripting.rest b/Scripting.rest index f14dce5..1199fe3 100644 --- a/Scripting.rest +++ b/Scripting.rest @@ -134,7 +134,7 @@ list refer to the `genie\_python reference manual`_. Indentation ----------- -One thing where there is no direct comparison is with **indentation**. +One thing where there is no direct comparison between Python and Open Genie is with **indentation**. In Python, different code blocks are identified by their indentation level. In many programming languages, code blocks are encased in curly braces (``{...}``), but Python uses indentation. For example: @@ -209,7 +209,7 @@ Script structure Everything in the instrument scripts will be executed when ``genie_python`` is started. This includes - Making functions available -to be called later - Setting variables - Running methods Typically, most +to be called later - Setting variables - Running methods. Typically, most code in instrument scripts will be contained within functions (procedures in Open Genie language), but it's important to be aware that anything that isn't will be included too. For example, if an instrument From 7638291f1adc39a7541b0355d186cd9739e74eab Mon Sep 17 00:00:00 2001 From: Gollum Date: Mon, 17 Oct 2016 16:37:58 +0100 Subject: [PATCH 0423/1813] Updated Scripting (rest) --- Scripting.rest | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Scripting.rest b/Scripting.rest index 1199fe3..b4690de 100644 --- a/Scripting.rest +++ b/Scripting.rest @@ -19,6 +19,9 @@ beginner and novice user. There is also some specific [[scripting advice for the Muon Front End|MuonFEScriptGuidance]] +If you are new to Python, the Mantid team has created an excellent `Introduction to Python +`_ on the Mantid web-site. + .. _`genie\_python reference manual`: http://shadow.nd.rl.ac.uk/genie\_python/sphinx/genie\_python.html Running genie\_python commands @@ -124,6 +127,9 @@ scripts to ``genie_python`` is very often straightforward. Even if you're new to Python, once you know a few simple pieces of syntax, you'll be able to convert many scripts without issue. +**Note:** If you are new to Python, consult the `Introduction to Python +`_ on the Mantid web-site. + List of functions ----------------- From 4cd13d6e128f3052be1286b278c94e44b4ca7caf Mon Sep 17 00:00:00 2001 From: Gollum Date: Mon, 17 Oct 2016 16:46:06 +0100 Subject: [PATCH 0424/1813] Updated FAQ (rest) --- FAQ.rest | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/FAQ.rest b/FAQ.rest index e3d728f..4ad85f8 100644 --- a/FAQ.rest +++ b/FAQ.rest @@ -14,7 +14,7 @@ List of Frequently Asked Questions #. `How do I start IBEX Server?`_ #. `How do I stop IBEX Server?`_ #. `Can I run IBEX and SECI at the same time?`_ -#. `This is the seventh question`_ +#. `Where can I learn about Python?`_ #. `This is the eighth question`_ #. `This is the ninth question`_ #. `This is the tenth question`_ @@ -67,9 +67,9 @@ Return_ Return_ -.. _`This is the seventh question`: +.. _`Where can I learn about Python?`: -This is the seventh answer. +Python (extended by genie_python) is the scripting language used by IBEX. If you are new to Python, we suggest you consult the excellent `Introduction to Python `_ created by the Mantid team. Return_ From 96c1938cc5a3ece53de3bd441dafa1fd34af0ff1 Mon Sep 17 00:00:00 2001 From: Gollum Date: Mon, 17 Oct 2016 16:47:26 +0100 Subject: [PATCH 0425/1813] Updated FAQ (rest) --- FAQ.rest | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/FAQ.rest b/FAQ.rest index 4ad85f8..c62d92b 100644 --- a/FAQ.rest +++ b/FAQ.rest @@ -69,7 +69,9 @@ Return_ .. _`Where can I learn about Python?`: -Python (extended by genie_python) is the scripting language used by IBEX. If you are new to Python, we suggest you consult the excellent `Introduction to Python `_ created by the Mantid team. +**Q: Where can I learn about Python?** + +**A:** Python (extended by genie_python) is the scripting language used by IBEX. If you are new to Python, we suggest you consult the excellent `Introduction to Python `_ created by the Mantid team. Return_ From aa82a76b1e35357527b69ae97a9f09c6191a45b7 Mon Sep 17 00:00:00 2001 From: Gollum Date: Mon, 17 Oct 2016 17:02:43 +0100 Subject: [PATCH 0426/1813] Updated FAQ (rest) --- FAQ.rest | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/FAQ.rest b/FAQ.rest index c62d92b..de03fbb 100644 --- a/FAQ.rest +++ b/FAQ.rest @@ -14,8 +14,8 @@ List of Frequently Asked Questions #. `How do I start IBEX Server?`_ #. `How do I stop IBEX Server?`_ #. `Can I run IBEX and SECI at the same time?`_ +#. `Can I write scripts to control my experiment?`_ #. `Where can I learn about Python?`_ -#. `This is the eighth question`_ #. `This is the ninth question`_ #. `This is the tenth question`_ @@ -67,17 +67,19 @@ Return_ Return_ -.. _`Where can I learn about Python?`: +.. _`Can I write scripts to control my experiment?`: -**Q: Where can I learn about Python?** +**Q: Can I write scripts to control my experiment?** -**A:** Python (extended by genie_python) is the scripting language used by IBEX. If you are new to Python, we suggest you consult the excellent `Introduction to Python `_ created by the Mantid team. +**A:** Yes, you can. Scripting in IBEX is done using gene_python (essentially Python, extended by a module called genie_python). See [[Scripting]] for more details. Return_ -.. _`This is the eighth question`: +.. _`Where can I learn about Python?`: -This is the eighth answer. +**Q: Where can I learn about Python?** + +**A:** Python (extended by genie_python) is the scripting language used by IBEX. If you are new to Python, we suggest you consult the excellent `Introduction to Python `_ created by the Mantid team. Return_ From 45965efce5f8ec9a613354f7fc975e69c009615e Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Thu, 20 Oct 2016 09:15:46 +0100 Subject: [PATCH 0427/1813] Updated Home (rest) --- Home.rest | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Home.rest b/Home.rest index b7bd381..c711ef3 100644 --- a/Home.rest +++ b/Home.rest @@ -12,6 +12,8 @@ [[Scripting]] +[[Instrument specific guidance|InstrumentGuidance]] + [[FAQ]] [[Glossary]] From 995004b4fd121adad46a246852bdc8dce2204db7 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Thu, 20 Oct 2016 09:16:10 +0100 Subject: [PATCH 0428/1813] Updated _Sidebar (rest) --- Concepts/_Sidebar.rest | 1 + 1 file changed, 1 insertion(+) diff --git a/Concepts/_Sidebar.rest b/Concepts/_Sidebar.rest index dea3c9c..9dd70b4 100644 --- a/Concepts/_Sidebar.rest +++ b/Concepts/_Sidebar.rest @@ -5,5 +5,6 @@ * [[IBEX GUI Features|IBEXGUIFeatures]] * [[How To Do Things In IBEX|HowToDoThingsInIBEX]] * [[Scripting]] +* [[Instrument Specific Guidance|InstrumentGuidance]] * [[FAQ]] * [[Glossary]] From 45b987e006f20389658c67a815b58d8be38d8e92 Mon Sep 17 00:00:00 2001 From: AdrianPotter Date: Thu, 20 Oct 2016 09:17:33 +0100 Subject: [PATCH 0429/1813] Add instrument guidance to sidebar --- _Sidebar.rest | 1 + 1 file changed, 1 insertion(+) diff --git a/_Sidebar.rest b/_Sidebar.rest index d80ce73..0d8a0f3 100644 --- a/_Sidebar.rest +++ b/_Sidebar.rest @@ -5,5 +5,6 @@ * [[IBEXGUIFeatures]] * [[HowToDoThingsInIBEX]] * [[Scripting]] +* [[Instrument Specific Guidance|InstrumentGuidance]] * [[FAQ]] * [[Glossary]] From b2f4bcfac35acadbc186bb7a2f2e6e8d77d095a2 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Thu, 20 Oct 2016 09:18:51 +0100 Subject: [PATCH 0430/1813] Created InstrumentGuidance (markdown) --- InstrumentGuidance.md | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 InstrumentGuidance.md diff --git a/InstrumentGuidance.md b/InstrumentGuidance.md new file mode 100644 index 0000000..9737618 --- /dev/null +++ b/InstrumentGuidance.md @@ -0,0 +1,3 @@ +Owing to the highly varied nature of the instruments that Ibex supports, some instruments have specific guidance for particular operations. + +[[Muon front end scripting|MuonFEScriptingGuidance]] \ No newline at end of file From b590fafd8dd89b57f86649d4145dd6e9d5d8d0ad Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Thu, 20 Oct 2016 09:19:12 +0100 Subject: [PATCH 0431/1813] Updated InstrumentGuidance (markdown) --- InstrumentGuidance.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/InstrumentGuidance.md b/InstrumentGuidance.md index 9737618..11f513e 100644 --- a/InstrumentGuidance.md +++ b/InstrumentGuidance.md @@ -1,3 +1,3 @@ Owing to the highly varied nature of the instruments that Ibex supports, some instruments have specific guidance for particular operations. -[[Muon front end scripting|MuonFEScriptingGuidance]] \ No newline at end of file +[[Muon front end scripting|MuonFEScriptGuidance]] \ No newline at end of file From dd1fa6a6248fa49575ebf9f4656078882e1735ac Mon Sep 17 00:00:00 2001 From: Gollum Date: Thu, 20 Oct 2016 09:21:39 +0100 Subject: [PATCH 0432/1813] Updated InstrumentGuidance (markdown) --- InstrumentGuidance.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/InstrumentGuidance.md b/InstrumentGuidance.md index 11f513e..4eb4f04 100644 --- a/InstrumentGuidance.md +++ b/InstrumentGuidance.md @@ -1,3 +1,3 @@ -Owing to the highly varied nature of the instruments that Ibex supports, some instruments have specific guidance for particular operations. +Owing to the highly varied nature of the instruments that IBEX supports, some instruments have specific guidance for particular operations. [[Muon front end scripting|MuonFEScriptGuidance]] \ No newline at end of file From 2890820009bdf1e6b76bfbe82598b979a0069ef5 Mon Sep 17 00:00:00 2001 From: Gollum Date: Thu, 20 Oct 2016 09:21:56 +0100 Subject: [PATCH 0433/1813] Updated InstrumentGuidance (markdown) --- InstrumentGuidance.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/InstrumentGuidance.md b/InstrumentGuidance.md index 4eb4f04..6222d5c 100644 --- a/InstrumentGuidance.md +++ b/InstrumentGuidance.md @@ -1,3 +1,3 @@ Owing to the highly varied nature of the instruments that IBEX supports, some instruments have specific guidance for particular operations. -[[Muon front end scripting|MuonFEScriptGuidance]] \ No newline at end of file +[[Muon Front End scripting|MuonFEScriptGuidance]] \ No newline at end of file From 724d18929d61b6e844d7c82db212389370a9b64d Mon Sep 17 00:00:00 2001 From: Gollum Date: Thu, 20 Oct 2016 09:22:22 +0100 Subject: [PATCH 0434/1813] Updated Home (rest) --- Home.rest | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Home.rest b/Home.rest index c711ef3..5328878 100644 --- a/Home.rest +++ b/Home.rest @@ -12,7 +12,7 @@ [[Scripting]] -[[Instrument specific guidance|InstrumentGuidance]] +[[Instrument Specific Guidance|InstrumentGuidance]] [[FAQ]] From 9e4e46ffaf8c0557eb12ee77911199604c5a2842 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Thu, 20 Oct 2016 09:27:07 +0100 Subject: [PATCH 0435/1813] Updated MuonFEScriptGuidance (rest) --- MuonFEScriptGuidance.rest | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/MuonFEScriptGuidance.rest b/MuonFEScriptGuidance.rest index 0e5b8a7..d437054 100644 --- a/MuonFEScriptGuidance.rest +++ b/MuonFEScriptGuidance.rest @@ -16,6 +16,8 @@ Contents Starting & Stopping Runs Remotely --------------------------------- +### Ensuring the control machine has sufficient permission to begin a run + The relevant code can be found in the github repository: https://github.com/ISISComputingGroup/mfe_control_scripts @@ -34,9 +36,9 @@ Note that the script relies on the host machine and user having sufficient DCOM 2. Enter the credentials (e.g. NDXMUSR, NDXMUSR\\spudulike, [PASSWORD]) 3. Click "OK" -To write your own scripts, use the MultipleDaeController class in Python to issue commands to multiple machines simultaneously. The script run_interactively.py provides a good example of how to use it. +### Using the script to control the runs -Insert documentation explaining how to start/stop runs on each instrument remotely. +To write your own scripts, use the MultipleDaeController class in Python to issue commands to multiple machines simultaneously. The script run_interactively.py provides a good example of how to use it. :: From a2d58167b36cbd636cb02f620a7bb10312a5cea6 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Thu, 20 Oct 2016 09:28:37 +0100 Subject: [PATCH 0436/1813] Updated MuonFEScriptGuidance (rest) --- MuonFEScriptGuidance.rest | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/MuonFEScriptGuidance.rest b/MuonFEScriptGuidance.rest index d437054..aaa94e3 100644 --- a/MuonFEScriptGuidance.rest +++ b/MuonFEScriptGuidance.rest @@ -16,8 +16,8 @@ Contents Starting & Stopping Runs Remotely --------------------------------- -### Ensuring the control machine has sufficient permission to begin a run - +Ensuring the control machine has sufficient permission to begin a run +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The relevant code can be found in the github repository: https://github.com/ISISComputingGroup/mfe_control_scripts @@ -36,7 +36,8 @@ Note that the script relies on the host machine and user having sufficient DCOM 2. Enter the credentials (e.g. NDXMUSR, NDXMUSR\\spudulike, [PASSWORD]) 3. Click "OK" -### Using the script to control the runs +Using the script to control the runs +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ To write your own scripts, use the MultipleDaeController class in Python to issue commands to multiple machines simultaneously. The script run_interactively.py provides a good example of how to use it. From fcfce6eda04d2c3f970b79aa995b52f221d7bc40 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Thu, 20 Oct 2016 09:30:17 +0100 Subject: [PATCH 0437/1813] Updated MuonFEScriptGuidance (rest) --- MuonFEScriptGuidance.rest | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/MuonFEScriptGuidance.rest b/MuonFEScriptGuidance.rest index aaa94e3..f92aed7 100644 --- a/MuonFEScriptGuidance.rest +++ b/MuonFEScriptGuidance.rest @@ -1,5 +1,7 @@ .. MuonFEScriptGuidance: +.. _`genie\_python`: http://shadow.nd.rl.ac.uk/genie\_python/sphinx/genie\_python.html + Guidance on Writing Scripts for the Muon Front-End =================================================== @@ -75,7 +77,7 @@ Using Blocks to Write Tuning Control Scripts -------------------------------------------- A configuration with blocks should be created as for any IBEX instrument on NDEMUONFE. -On an appropriate system, import genie_python to Mantid, and set your instrument to be "MUONFE". +On an appropriate system, import `genie\_python`_ to Mantid, and set your instrument to be "MUONFE". :: @@ -133,7 +135,7 @@ To do this, the relevant configuration must be setup in the following way: #. In the ``IOCs`` tab, locate the correct IOC and make sure both the ``Auto-start?`` and ``Auto-restart?`` boxes for the IOC are checked. #. In the ``IOC Macros`` tab, select the correct IOC and set the macro ``SP_AT_STARTUP`` to ``YES`` (default is ``NO``). -The set-points can be re-applied by reloading the current configuration (which will restart the IOCs), with the following genie_python command: +The set-points can be re-applied by reloading the current configuration (which will restart the IOCs), with the following `genie\_python`_ command: :: From 660adfd787260667e119d99938a9b25e245a2257 Mon Sep 17 00:00:00 2001 From: Gollum Date: Thu, 20 Oct 2016 11:42:19 +0100 Subject: [PATCH 0438/1813] Updated MuonFEScriptGuidance (rest) --- MuonFEScriptGuidance.rest | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/MuonFEScriptGuidance.rest b/MuonFEScriptGuidance.rest index f92aed7..cd40bf9 100644 --- a/MuonFEScriptGuidance.rest +++ b/MuonFEScriptGuidance.rest @@ -76,11 +76,15 @@ Return to `Contents`_. Using Blocks to Write Tuning Control Scripts -------------------------------------------- -A configuration with blocks should be created as for any IBEX instrument on NDEMUONFE. -On an appropriate system, import `genie\_python`_ to Mantid, and set your instrument to be "MUONFE". +A configuration_ with blocks should be created as for any IBEX instrument on NDEMUONFE. + +.. _configuration: CreateandManageConfigurations + +On an appropriate system, import `genie\_python`_ to Mantid, and set your instrument to be "MUONFE", then get the associated blocks. :: + set_instrument("MUONFE") get_blocks() You should now get a list of blocks on the remote system. These can then be used as standard for scripting by simply writing to and from those values. @@ -104,7 +108,7 @@ Gateway settings have been set up to allow NDX and NDL systems to control each i https://github.com/ISISComputingGroup/ibex_developers_manual/wiki/Access-Gateway -In order to limit the systems listed in globals.txt to read only then sending the following command should be entered into an EPICS prompt: +Machines listed in the globals.txt can be restricted to read only access by sending the following command: :: From 50960c6f105dbfc76b9a580a25c578d18306994f Mon Sep 17 00:00:00 2001 From: Gollum Date: Thu, 20 Oct 2016 11:46:36 +0100 Subject: [PATCH 0439/1813] Added some clarification as to why one may want to re-apply PSUs settings --- MuonFEScriptGuidance.rest | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MuonFEScriptGuidance.rest b/MuonFEScriptGuidance.rest index cd40bf9..7fc96cc 100644 --- a/MuonFEScriptGuidance.rest +++ b/MuonFEScriptGuidance.rest @@ -131,7 +131,7 @@ Return to `Contents`_. How to Re-apply Settings ------------------------ -IOCs controlling Power Supply Units have the option to re-apply their set-points (current, voltage, status on/off) the next time they are restarted. +IOCs controlling Power Supply Units (PSUs) have the option to re-apply their set-points (current, voltage, status on/off) the next time they are restarted. The following may be useful if, for any reason, the PSUs are restarted and lose their set-points, and you need a quick way to re-apply them all at once rather than manually one by one. To do this, the relevant configuration must be setup in the following way: From 5df51f0874f1771f0cc656235964522b20787abb Mon Sep 17 00:00:00 2001 From: Gollum Date: Tue, 25 Oct 2016 16:28:19 +0100 Subject: [PATCH 0440/1813] Updated FAQ (rest) --- FAQ.rest | 22 +++++++++------------- 1 file changed, 9 insertions(+), 13 deletions(-) diff --git a/FAQ.rest b/FAQ.rest index de03fbb..fa0e966 100644 --- a/FAQ.rest +++ b/FAQ.rest @@ -14,10 +14,9 @@ List of Frequently Asked Questions #. `How do I start IBEX Server?`_ #. `How do I stop IBEX Server?`_ #. `Can I run IBEX and SECI at the same time?`_ +#. `Can I switch from running IBEX to SECI and vice-versa?`_ #. `Can I write scripts to control my experiment?`_ #. `Where can I learn about Python?`_ -#. `This is the ninth question`_ -#. `This is the tenth question`_ .. _`How do I report a problem with IBEX?`: @@ -67,6 +66,14 @@ Return_ Return_ +.. _`Can I switch from running IBEX to SECI and vice-versa?`: + +**Q: Can I switch from running IBEX to SECI and vice-versa?** + +**A:** Yes, it is possible to switch from running IBEX to SECI or to switch from SECI to IBEX, but you have to be careful. You cannot have IBEX and SECI running simultaneously - you must fully shut-down the one control system before you can start running the other control system. You should be especially careful to ensure that you do not inadvertently leave a run executing on the DAE when switching between control systems. + +Return_ + .. _`Can I write scripts to control my experiment?`: **Q: Can I write scripts to control my experiment?** @@ -83,14 +90,3 @@ Return_ Return_ -.. _`This is the ninth question`: - -This is the ninth answer. - -Return_ - -.. _`This is the tenth question`: - -This is the tenth answer. - -Return_ From 2e26f31bd09e4f34e77fa99bbb890a06cd642a35 Mon Sep 17 00:00:00 2001 From: John Holt Date: Tue, 8 Nov 2016 14:19:32 +0000 Subject: [PATCH 0441/1813] Updated CreateandManageConfigurations (rest) --- CreateandManageConfigurations.rest | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CreateandManageConfigurations.rest b/CreateandManageConfigurations.rest index 7e33f18..0b9f45c 100644 --- a/CreateandManageConfigurations.rest +++ b/CreateandManageConfigurations.rest @@ -68,7 +68,7 @@ The IOCs tab lists all the IOCs available on the instrument. In general, you wi The [[KeyConceptsinIBEX]] page describes what an IOC is. -To include an IOC in your configuration, scroll down the list until you find the appropriate IOC and select the Auto-Start or Auto-Restart check-boxes (or select both). By selecting these check-boxes, IBEX will automatically start (or restart) to chosen IOCs each time your configuration is loaded into IBEX. +To include an IOC in your configuration, scroll down the list until you find the appropriate IOC and select the Auto-Start or Auto-Restart check-boxes (or select both). By selecting these check-boxes, IBEX will automatically start (or restart) the IOCs each time your configuration is loaded into IBEX. **Note:** The list of IOCs in the IOC tab also includes a column headed Sim. level. This column is used to indicate whether the IOC should run in simulation mode. By default, the Sim. level file is set to NONE, meaning that the IOC will not run in simulation mode. Under normal circumstances, you should not change the default setting. From 94294b322c3b26c3ce2ab61b36f21ca6fe06f48a Mon Sep 17 00:00:00 2001 From: Matt Clarke Date: Tue, 15 Nov 2016 11:08:05 +0000 Subject: [PATCH 0442/1813] Updated InstallingIBEX (rest) --- InstallingIBEX.rest | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/InstallingIBEX.rest b/InstallingIBEX.rest index f5da8c0..332defc 100644 --- a/InstallingIBEX.rest +++ b/InstallingIBEX.rest @@ -74,4 +74,7 @@ Change to the folder with the highest value of ``N.M.O`` (e.g. ``cd 2.1.0`` in t 5. Run the command ``install_client.bat``. This will copy the contents of the above directory to ``C:\Instrument\Apps\Client``. It will also install genie_python. -6. You might find it convenient to create a desktop shortcut to use to launch the IBEX client. The path to the IBEX Client executable is ``C:\Instrument\Apps\Client\ibex-client.exe``. +6. You might find it convenient to create a desktop shortcut to use to launch the IBEX client. The path to the IBEX Client executable is ``C:\Instrument\Apps\Client\ibex-client.exe`` + +7. Open up the firewall ports needed by the client by running the following command as Administrator in a command window: +```netsh advfirewall firewall add rule name="Control SVCS Machine" dir=in action=allow protocol=UDP remoteip=130.246.51.171 remoteport=5064 profile=any``` From bf6e759770bee0aafaae42eda92134050343882f Mon Sep 17 00:00:00 2001 From: Matt Clarke Date: Tue, 15 Nov 2016 11:08:31 +0000 Subject: [PATCH 0443/1813] Updated InstallingIBEX (rest) --- InstallingIBEX.rest | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/InstallingIBEX.rest b/InstallingIBEX.rest index 332defc..c852b1c 100644 --- a/InstallingIBEX.rest +++ b/InstallingIBEX.rest @@ -77,4 +77,7 @@ Change to the folder with the highest value of ``N.M.O`` (e.g. ``cd 2.1.0`` in t 6. You might find it convenient to create a desktop shortcut to use to launch the IBEX client. The path to the IBEX Client executable is ``C:\Instrument\Apps\Client\ibex-client.exe`` 7. Open up the firewall ports needed by the client by running the following command as Administrator in a command window: -```netsh advfirewall firewall add rule name="Control SVCS Machine" dir=in action=allow protocol=UDP remoteip=130.246.51.171 remoteport=5064 profile=any``` + +:: + +netsh advfirewall firewall add rule name="Control SVCS Machine" dir=in action=allow protocol=UDP remoteip=130.246.51.171 remoteport=5064 profile=any From 105b0dddbb218d57bcfbbdd60f58a9b7a7dd690d Mon Sep 17 00:00:00 2001 From: Matt Clarke Date: Tue, 15 Nov 2016 11:09:00 +0000 Subject: [PATCH 0444/1813] Updated InstallingIBEX (rest) --- InstallingIBEX.rest | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/InstallingIBEX.rest b/InstallingIBEX.rest index c852b1c..046ae13 100644 --- a/InstallingIBEX.rest +++ b/InstallingIBEX.rest @@ -80,4 +80,4 @@ Change to the folder with the highest value of ``N.M.O`` (e.g. ``cd 2.1.0`` in t :: -netsh advfirewall firewall add rule name="Control SVCS Machine" dir=in action=allow protocol=UDP remoteip=130.246.51.171 remoteport=5064 profile=any + netsh advfirewall firewall add rule name="Control SVCS Machine" dir=in action=allow protocol=UDP remoteip=130.246.51.171 remoteport=5064 profile=any From e26363a9906e43a59b4d46f7687a772bc80e96c4 Mon Sep 17 00:00:00 2001 From: Matt Clarke Date: Tue, 15 Nov 2016 11:10:14 +0000 Subject: [PATCH 0445/1813] Updated InstallingIBEX (rest) --- InstallingIBEX.rest | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/InstallingIBEX.rest b/InstallingIBEX.rest index 046ae13..ac8a2c7 100644 --- a/InstallingIBEX.rest +++ b/InstallingIBEX.rest @@ -40,14 +40,14 @@ Installation 2. In the command window type one of the following commands: - a. If your your PC is in the ISIS domain (i.e. it is an ISIS PC): + a) If your your PC is in the ISIS domain (i.e. it is an ISIS PC): :: net use Z: \\isis\inst$\Kits$\CompGroup\ICP\Releases /user:my_fed_id or - b. If your your PC is not in the ISIS domain (i.e. it is not an ISIS PC): + b) If your your PC is not in the ISIS domain (i.e. it is not an ISIS PC): :: From df19a37a8e7f2831df32a54fe3322201ad58305e Mon Sep 17 00:00:00 2001 From: Matt Clarke Date: Tue, 15 Nov 2016 11:18:04 +0000 Subject: [PATCH 0446/1813] Updated InstallingIBEX (rest) --- InstallingIBEX.rest | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/InstallingIBEX.rest b/InstallingIBEX.rest index ac8a2c7..bbe8498 100644 --- a/InstallingIBEX.rest +++ b/InstallingIBEX.rest @@ -38,16 +38,13 @@ Installation mkdir C:\Instrument\Apps\Python cd C:\Instrument -2. In the command window type one of the following commands: - - a) If your your PC is in the ISIS domain (i.e. it is an ISIS PC): +2. If your your PC is in the ISIS domain (i.e. it is an ISIS PC) then in the command window type: :: net use Z: \\isis\inst$\Kits$\CompGroup\ICP\Releases /user:my_fed_id -or - b) If your your PC is not in the ISIS domain (i.e. it is not an ISIS PC): +If your your PC is not in the ISIS domain (i.e. it is not an ISIS PC) then in the command window type: :: From fb2acfb975161c176ce4379c76ec003d483fc54d Mon Sep 17 00:00:00 2001 From: Gollum Date: Wed, 16 Nov 2016 09:16:44 +0000 Subject: [PATCH 0447/1813] Updated InstallingIBEX (rest) --- InstallingIBEX.rest | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/InstallingIBEX.rest b/InstallingIBEX.rest index bbe8498..4920a6f 100644 --- a/InstallingIBEX.rest +++ b/InstallingIBEX.rest @@ -63,8 +63,10 @@ Change to the ``Z:`` drive: 2.0.0 2.1.0 + 2.2.0 + ... etc. -Change to the folder with the highest value of ``N.M.O`` (e.g. ``cd 2.1.0`` in the above example). +Change to the folder with the highest value of ``N.M.O`` (e.g. ``cd 2.2.0`` in the above example). 4. In the folder ``N.M.O``, change to the Client folder: ``cd Client`` From beae703178d2ff4b3c97237620018d903444fdd9 Mon Sep 17 00:00:00 2001 From: Gollum Date: Mon, 21 Nov 2016 09:47:46 +0000 Subject: [PATCH 0448/1813] Updated Home (rest) --- _Sidebar.rest | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/_Sidebar.rest b/_Sidebar.rest index 0d8a0f3..9dd70b4 100644 --- a/_Sidebar.rest +++ b/_Sidebar.rest @@ -1,9 +1,9 @@ -* [[WhatIsIBEX]] -* [[InstallingIBEX]] -* [[StartingAndStoppingIBEX]] -* [[KeyConceptsinIBEX]] -* [[IBEXGUIFeatures]] -* [[HowToDoThingsInIBEX]] +* [[What Is IBEX|WhatIsIBEX]] +* [[Installing IBEX|InstallingIBEX]] +* [[Starting And Stopping IBEX|StartingAndStoppingIBEX]] +* [[Key Concepts in IBEX|KeyConceptsinIBEX]] +* [[IBEX GUI Features|IBEXGUIFeatures]] +* [[How To Do Things In IBEX|HowToDoThingsInIBEX]] * [[Scripting]] * [[Instrument Specific Guidance|InstrumentGuidance]] * [[FAQ]] From deb21b5ac7998af913220b296fda54c181f9c5f1 Mon Sep 17 00:00:00 2001 From: Gollum Date: Mon, 21 Nov 2016 13:45:18 +0000 Subject: [PATCH 0449/1813] Updated Dashboard (rest) --- Dashboard.rest | 66 +++++++++++++++++++++++++------------------------- 1 file changed, 33 insertions(+), 33 deletions(-) diff --git a/Dashboard.rest b/Dashboard.rest index 88f7b10..ba123cb 100644 --- a/Dashboard.rest +++ b/Dashboard.rest @@ -14,36 +14,36 @@ Dashboard States & Colours The meanings of the dashboard states and colours are: -+------------+-------------------+ -| State | Background Colour | -+============+===================+ -| RUNNING | LIGHT_GREEN | -+------------+-------------------+ -| SETUP | LIGHT_BLUE | -+------------+-------------------+ -| PAUSED | RED | -+------------+-------------------+ -| WAITING | DARK_YELLOW | -+------------+-------------------+ -| VETOING | DARK_YELLOW | -+------------+-------------------+ -| ENDING | BLUE | -+------------+-------------------+ -| PAUSING | DARK_RED | -+------------+-------------------+ -| BEGINNING | GREEN | -+------------+-------------------+ -| ABORTING | BLUE | -+------------+-------------------+ -| RESUMING | GREEN | -+------------+-------------------+ -| PROCESSING | YELLOW | -+------------+-------------------+ -| UPDATING | YELLOW | -+------------+-------------------+ -| STORING | YELLOW | -+------------+-------------------+ -| SAVING | YELLOW | -+------------+-------------------+ -| UNKNOWN | YELLOW | -+------------+-------------------+ ++------------+-------------------+--------------------------------------------------------------------------------------------+ +| State | Background Colour | Meaning | ++============+===================+============================================================================================+ +| RUNNING | LIGHT_GREEN | DAE is collecting data | ++------------+-------------------+--------------------------------------------------------------------------------------------+ +| SETUP | LIGHT_BLUE | DAE is read to begin a run | ++------------+-------------------+--------------------------------------------------------------------------------------------+ +| PAUSED | RED | DAE has been paused by a script or user | ++------------+-------------------+--------------------------------------------------------------------------------------------+ +| WAITING | DARK_YELLOW | DAE is not collecting data and is waiting for a run controlled variable to come into range | ++------------+-------------------+--------------------------------------------------------------------------------------------+ +| VETOING | DARK_YELLOW | A veto is inforce and data is not collected | ++------------+-------------------+--------------------------------------------------------------------------------------------+ +| ENDING | BLUE | A run is has been ended and the data is being written (it will change to setup when done). | ++------------+-------------------+--------------------------------------------------------------------------------------------+ +| PAUSING | DARK_RED | DAE is about to be in the paused state | ++------------+-------------------+--------------------------------------------------------------------------------------------+ +| BEGINNING | GREEN | DAE is starting a run | ++------------+-------------------+--------------------------------------------------------------------------------------------+ +| ABORTING | BLUE | DAE run is being aborted | ++------------+-------------------+--------------------------------------------------------------------------------------------+ +| RESUMING | GREEN | DAE is resuming after being paused | ++------------+-------------------+--------------------------------------------------------------------------------------------+ +| PROCESSING | YELLOW | DAE is setting up | ++------------+-------------------+--------------------------------------------------------------------------------------------+ +| UPDATING | YELLOW | | ++------------+-------------------+--------------------------------------------------------------------------------------------+ +| STORING | YELLOW | | ++------------+-------------------+--------------------------------------------------------------------------------------------+ +| SAVING | YELLOW | | ++------------+-------------------+--------------------------------------------------------------------------------------------+ +| UNKNOWN | YELLOW | | ++------------+-------------------+--------------------------------------------------------------------------------------------+ From 77058f13189027d25c43606fff41e029e35615a8 Mon Sep 17 00:00:00 2001 From: John Holt Date: Mon, 21 Nov 2016 13:54:43 +0000 Subject: [PATCH 0450/1813] Updated ManagetheDAE (rest) --- ManagetheDAE.rest | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/ManagetheDAE.rest b/ManagetheDAE.rest index 3dabe61..0596dbf 100644 --- a/ManagetheDAE.rest +++ b/ManagetheDAE.rest @@ -3,7 +3,7 @@ Manage the DAE ============== -The Data Acquisition Electronics (DAE) is the hardware where the neutron or muon data is collected. The DAE is controlled by the ICP (see [[KeyConceptsinIBEX]]), which informs the DAE when to start and stop collecting data from the instrument detectors. The ICP also receives sample environment information and combines it with the detector data and is responsible for transferring the final combined dataset to a data file. +The Data Acquisition Electronics (DAE) is the hardware where the neutron or muon data is collected. The DAE is controlled by the ICP (see [[Key Concepts in IBEX|KeyConceptsinIBEX]]), which informs the DAE when to start and stop collecting data from the instrument detectors. The ICP also receives sample environment information and combines it with the detector data and is responsible for transferring the final combined dataset to a data file. The DAE view communicates with the ICP to control the DAE. @@ -77,16 +77,25 @@ The Experiment Setup comprises three sub-tabs. Each of these 3 sub-tabs will ha Time Channels ~~~~~~~~~~~~~ +The time channels tab allows the setting of the spectra captured in different time regimes. By setting different step sizes and size distributions (using mode) you can optimise the time bins in the final spectra. The time channels can be set using the table below or if more regiemes are required a file can be specified. The files are part of the settings stored in the `configurations/tcb` directory. + Return to `Contents`_. Data Acquisition ~~~~~~~~~~~~~~~~ +The data acquisition tab allow you to set up how the data is collected. The wiring table, detector table and spectra table can be set so that the DAE knows how to collect data from the detectors and turn it into spectra. These files are part of the settings stored in the `configurations/tables` directory. +The vetos section allows different vetos to be turned on. +The muon section allows the DAE to collect muon data. +The Timing section allows timing source and auto save frequency to be set. + Return to `Contents`_. Periods ~~~~~~~ +The period tab allows the period types and needed parameters to be setup within the DAE. Periods allow data to be collected as if restarting the DAE but without the time overhead of doing this. Software periods are controlled via software command, e.g. genie_python's `change_period` command. The other options are Harware controlled and these are internal (within the DAE) or external control. + Return to `Contents`_. Run Information From 43d99b5bc268fd1072b446b19f38b5ccc93ce988 Mon Sep 17 00:00:00 2001 From: John Holt Date: Mon, 21 Nov 2016 13:56:04 +0000 Subject: [PATCH 0451/1813] Updated ManagetheDAE (rest) --- ManagetheDAE.rest | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ManagetheDAE.rest b/ManagetheDAE.rest index 0596dbf..40c2e84 100644 --- a/ManagetheDAE.rest +++ b/ManagetheDAE.rest @@ -77,7 +77,7 @@ The Experiment Setup comprises three sub-tabs. Each of these 3 sub-tabs will ha Time Channels ~~~~~~~~~~~~~ -The time channels tab allows the setting of the spectra captured in different time regimes. By setting different step sizes and size distributions (using mode) you can optimise the time bins in the final spectra. The time channels can be set using the table below or if more regiemes are required a file can be specified. The files are part of the settings stored in the `configurations/tcb` directory. +The time channels tab allows the setting of the spectra captured in different time regimes. By setting different step sizes and size distributions (using mode) you can optimise the time bins in the final spectra. The time channels can be set using the table below or if more regimes are required a file can be specified. The files are part of the settings stored in the `configurations/tcb` directory. Return to `Contents`_. From f02631d0e617ded43c9fd205fbade537934ce23c Mon Sep 17 00:00:00 2001 From: John Holt Date: Mon, 21 Nov 2016 14:06:16 +0000 Subject: [PATCH 0452/1813] Updated FAQ (rest) --- FAQ.rest | 29 +++++++++++++++++++++++------ 1 file changed, 23 insertions(+), 6 deletions(-) diff --git a/FAQ.rest b/FAQ.rest index de03fbb..aeed358 100644 --- a/FAQ.rest +++ b/FAQ.rest @@ -16,8 +16,8 @@ List of Frequently Asked Questions #. `Can I run IBEX and SECI at the same time?`_ #. `Can I write scripts to control my experiment?`_ #. `Where can I learn about Python?`_ -#. `This is the ninth question`_ -#. `This is the tenth question`_ +#. `There are no RAW frames when Collecting Data`_ +#. `There are no GOOD frames when Collecting Data`_ .. _`How do I report a problem with IBEX?`: @@ -83,14 +83,31 @@ Return_ Return_ -.. _`This is the ninth question`: +.. _`There are no RAW frames when Collecting Data`: -This is the ninth answer. +If when collecting data no raw frames are counted (see `Good / Raw` Frames on the dash board) then: + +Timing is ISIS: + Either ISIS is offor there is a problem with the TOF (ISIS) signal. Check other instruments to find out. + +Timing is SMP: + Chopper is not spinning or there is a problem with the signal + +Consider swapping the timing source to help diagnose the problem. Return_ -.. _`This is the tenth question`: +.. _`There are no GOOD frames when Collecting Data`: + +If there are RAW frames but no good frames then the count is being vetoed. Open the DAE perspective and select the Vetoes tab to see what is vetoing the frame. + +FIFO veto: + Too many counts in a frame, e.g. noisy detector, jaws opened too wide + +SMP veto: + chopper out of phase with ISIS, or no ISIS signal -This is the tenth answer. +External veto{0-3}: + could be an additional chopper, the shutter or moderator Return_ From 76623afa77a55f9eea647f13cb0980008e927fba Mon Sep 17 00:00:00 2001 From: John Holt Date: Mon, 21 Nov 2016 14:09:42 +0000 Subject: [PATCH 0453/1813] Updated FAQ (rest) --- FAQ.rest | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/FAQ.rest b/FAQ.rest index aeed358..9a56a3d 100644 --- a/FAQ.rest +++ b/FAQ.rest @@ -85,7 +85,9 @@ Return_ .. _`There are no RAW frames when Collecting Data`: -If when collecting data no raw frames are counted (see `Good / Raw` Frames on the dash board) then: +**Q: There are no RAW frames when Collecting Data** + +**A:** If when collecting data no raw frames are counted (see `Good / Raw` Frames on the dash board) then: Timing is ISIS: Either ISIS is offor there is a problem with the TOF (ISIS) signal. Check other instruments to find out. @@ -99,7 +101,8 @@ Return_ .. _`There are no GOOD frames when Collecting Data`: -If there are RAW frames but no good frames then the count is being vetoed. Open the DAE perspective and select the Vetoes tab to see what is vetoing the frame. +**Q: There are no GOOD frames when Collecting Data: ** +**A:** If there are RAW frames but no good frames then the count is being vetoed. Open the DAE perspective and select the Vetoes tab to see what is vetoing the frame. FIFO veto: Too many counts in a frame, e.g. noisy detector, jaws opened too wide From 6c0c083f16b26e64d34fd498e8d325b0b6e4ab03 Mon Sep 17 00:00:00 2001 From: John Holt Date: Mon, 21 Nov 2016 14:13:51 +0000 Subject: [PATCH 0454/1813] Updated FAQ (rest) --- FAQ.rest | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/FAQ.rest b/FAQ.rest index 9a56a3d..c8591b1 100644 --- a/FAQ.rest +++ b/FAQ.rest @@ -16,8 +16,8 @@ List of Frequently Asked Questions #. `Can I run IBEX and SECI at the same time?`_ #. `Can I write scripts to control my experiment?`_ #. `Where can I learn about Python?`_ -#. `There are no RAW frames when Collecting Data`_ -#. `There are no GOOD frames when Collecting Data`_ +#. `What do I look at if there are no RAW frames when Collecting Data?`_ +#. `What do I look at if there are no GOOD frames when Collecting Data?`_ .. _`How do I report a problem with IBEX?`: @@ -83,9 +83,9 @@ Return_ Return_ -.. _`There are no RAW frames when Collecting Data`: +.. _`What do I look at if there are no RAW frames when Collecting Data?` -**Q: There are no RAW frames when Collecting Data** +**Q: What do I look at if there are no RAW frames when Collecting Data?** **A:** If when collecting data no raw frames are counted (see `Good / Raw` Frames on the dash board) then: @@ -99,9 +99,10 @@ Consider swapping the timing source to help diagnose the problem. Return_ -.. _`There are no GOOD frames when Collecting Data`: +.. _`What do I look at if there are no GOOD frames when Collecting Data?` + +**Q: What do I look at if there are no GOOD frames when Collecting Data?** -**Q: There are no GOOD frames when Collecting Data: ** **A:** If there are RAW frames but no good frames then the count is being vetoed. Open the DAE perspective and select the Vetoes tab to see what is vetoing the frame. FIFO veto: From 09ea6938780926961f74597e5f5012c62278c9b6 Mon Sep 17 00:00:00 2001 From: John Holt Date: Mon, 21 Nov 2016 14:25:02 +0000 Subject: [PATCH 0455/1813] Updated FAQ (rest) --- FAQ.rest | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/FAQ.rest b/FAQ.rest index c8591b1..983a58a 100644 --- a/FAQ.rest +++ b/FAQ.rest @@ -83,8 +83,7 @@ Return_ Return_ -.. _`What do I look at if there are no RAW frames when Collecting Data?` - +.. _`What do I look at if there are no RAW frames when Collecting Data` **Q: What do I look at if there are no RAW frames when Collecting Data?** **A:** If when collecting data no raw frames are counted (see `Good / Raw` Frames on the dash board) then: From 698e104339de5df4a428648ae1cd52d6b2c57c34 Mon Sep 17 00:00:00 2001 From: John Holt Date: Mon, 21 Nov 2016 14:25:25 +0000 Subject: [PATCH 0456/1813] Updated _Sidebar (rest) From a1bc9f19da5eaef26ca76e89d54d5dc114d49659 Mon Sep 17 00:00:00 2001 From: John Holt Date: Mon, 21 Nov 2016 14:27:38 +0000 Subject: [PATCH 0457/1813] Updated FAQ (rest) --- FAQ.rest | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/FAQ.rest b/FAQ.rest index 983a58a..c5c990c 100644 --- a/FAQ.rest +++ b/FAQ.rest @@ -83,7 +83,7 @@ Return_ Return_ -.. _`What do I look at if there are no RAW frames when Collecting Data` +.. _`What do I look at if there are no RAW frames when Collecting Data?`: **Q: What do I look at if there are no RAW frames when Collecting Data?** **A:** If when collecting data no raw frames are counted (see `Good / Raw` Frames on the dash board) then: @@ -98,7 +98,7 @@ Consider swapping the timing source to help diagnose the problem. Return_ -.. _`What do I look at if there are no GOOD frames when Collecting Data?` +.. _`What do I look at if there are no GOOD frames when Collecting Data?`: **Q: What do I look at if there are no GOOD frames when Collecting Data?** From b6b4ef8c37eeaff69fa49efd237556110868cd3c Mon Sep 17 00:00:00 2001 From: John Holt Date: Mon, 21 Nov 2016 14:32:44 +0000 Subject: [PATCH 0458/1813] Updated ManagetheDAE (rest) --- ManagetheDAE.rest | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ManagetheDAE.rest b/ManagetheDAE.rest index 40c2e84..1ab600d 100644 --- a/ManagetheDAE.rest +++ b/ManagetheDAE.rest @@ -108,7 +108,7 @@ Return to `Contents`_. Spectra Plots ------------- -The Spectra Plots Tab displays up to 4 spectra plots. You can choose which spectra are plotted bu using the ``Spectrum:`` and ``Period:`` fields for each plot. Click on the ``Set Plot`` button (positioned at the top right of each plot) to update the plot after changing the ``Spectrum:`` or ``Period:`` fields. +The Spectra Plots Tab displays up to 4 spectra plots. The plots show the recorded spectra from the detectors which were setup using the tables in the data acquisition tab. You can choose which spectra are plotted by using the ``Spectrum:`` and ``Period:`` fields for each plot. Click on the ``Set Plot`` button (positioned at the top right of each plot) to update the plot after changing the ``Spectrum:`` or ``Period:`` fields. Return to `Contents`_. From 10573d1aab216d1eab62082693a6603b163d72a2 Mon Sep 17 00:00:00 2001 From: John Holt Date: Tue, 22 Nov 2016 10:51:40 +0000 Subject: [PATCH 0459/1813] Updated ManagetheDAE (rest) --- ManagetheDAE.rest | 44 ++++++++++++++++++++++++++++---------------- 1 file changed, 28 insertions(+), 16 deletions(-) diff --git a/ManagetheDAE.rest b/ManagetheDAE.rest index 1ab600d..71e0cb0 100644 --- a/ManagetheDAE.rest +++ b/ManagetheDAE.rest @@ -45,25 +45,25 @@ The message log area lets you view any messages issued by the ICP. The message The Run Summary tab also provides a number of buttons to control the acquisition of data. -Begin Run +Begin Run: Click on the ``BEGIN RUN`` button to start a new run. Beginning a run instructs the ICP to tell the DAE to start collecting data. The DAE’s run status will change to RUNNING (which is reflected in the ``Run Status`` field and in the IBEX [[Dashboard]]. -End Run +End Run: Click on the ``END RUN`` button to terminate the current run. Ending a run instructs the ICP to tell the DAE to stop collecting data. It also instructs the ICP to write the data collected during the run to a file. The DAE’s run status will change to SETUP. -Pause Run +Pause Run: Click on the ``PAUSE RUN`` button to halt (but not end) the current run. Pausing a run instructs the ICP to tell the DAE to pause data collection indefinitely. The DAE’s run status will change to PAUSED. The DAE's status will remain PAUSED until it is instructed to RESUME. -Resume Run +Resume Run: Click on the ``RESUME RUN`` button to resume a previously paused run. Resuming a run instructs the ICP to tell the DAE to resume data collection after it has been paused. The DAE’s run status will return to RUNNING. -Abort Run +Abort Run: Click on the ``ABORT RUN`` button to abort the current run. Aborting a run instructs the ICP to tell the DAE to stop data collection (as for END). However, the data that has been collected is not written to a file; if a new run is started, then any data that has been collected will be lost. The DAE’s run status will change to SETUP. -Cancel Abort +Cancel Abort: Click on the ``CANCEL ABORT`` button to cancel the abort process. -Save Run +Save Run: Click on the ``SAVE RUN`` button to save the current run. Return to `Contents`_. @@ -77,17 +77,29 @@ The Experiment Setup comprises three sub-tabs. Each of these 3 sub-tabs will ha Time Channels ~~~~~~~~~~~~~ -The time channels tab allows the setting of the spectra captured in different time regimes. By setting different step sizes and size distributions (using mode) you can optimise the time bins in the final spectra. The time channels can be set using the table below or if more regimes are required a file can be specified. The files are part of the settings stored in the `configurations/tcb` directory. +The time channels tab allows the setting of the spectra captured in different time regimes. By setting different step sizes and size distributions (using mode) you can optimise the time bins in the final spectra. The time channels can be set using the table below or if more regimes are required a file can be specified. The files are stored in the ``configurations/tcb`` directory in the settings on the instrument. Return to `Contents`_. Data Acquisition ~~~~~~~~~~~~~~~~ -The data acquisition tab allow you to set up how the data is collected. The wiring table, detector table and spectra table can be set so that the DAE knows how to collect data from the detectors and turn it into spectra. These files are part of the settings stored in the `configurations/tables` directory. -The vetos section allows different vetos to be turned on. -The muon section allows the DAE to collect muon data. -The Timing section allows timing source and auto save frequency to be set. +The data acquisition tab allow you to set up how the DAE will collect the data. The page is split into several sections: + +Tables: + The wiring table, detector table and spectra table set the files used when turning signals generated at the detectors into spectra. These files are stored in the ``configurations/tables`` directory in settings on the instrument. + +Monitor: + Set which spectra number is used for the monitor counts and between what times the spectra should be integrated to return the counts. + +Vetoes: + Set which [[vetoes|KeyConceptsinIBEX#vetoes]] are active. + +Muons: + Set if and how to collect muon data. + +Timing: + Set the source of the [[timing signal|KeyConceptsinIBEX#dae-timing-sources]] and how often the data should be auto saved. Return to `Contents`_. @@ -101,7 +113,7 @@ Return to `Contents`_. Run Information --------------- -The Run Information Tab provides a more compete summary of the DAE setup than the Run Summary tab. All the fields on this tab are read-only. +The Run Information Tab provides a more complete summary of the DAE setup than the Run Summary tab. All the fields on this tab are read-only. Return to `Contents`_. @@ -118,9 +130,9 @@ Diagnostics Return to `Contents`_. -Vetos ------ +Vetoes +------ -The Vetos tab shows a summary of the vetoes that are in force for the current run. This information is read-only. Vetoes can only be changed prior to the start of a run, via the `Data Acquisition`_ sub-tab on the `Experiment Setup`_ tab. +The Vetoes tab shows a summary of the vetoes that are in force for the current run. This information is read-only. Vetoes can only be changed prior to the start of a run, via the `Data Acquisition`_ sub-tab on the `Experiment Setup`_ tab. Return to `Contents`_. From 97f8ee7b39e03976079f224350fe6834f7e6a45b Mon Sep 17 00:00:00 2001 From: John Holt Date: Tue, 22 Nov 2016 10:55:14 +0000 Subject: [PATCH 0460/1813] Updated ManagetheDAE (rest) --- ManagetheDAE.rest | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ManagetheDAE.rest b/ManagetheDAE.rest index 71e0cb0..53e7690 100644 --- a/ManagetheDAE.rest +++ b/ManagetheDAE.rest @@ -20,7 +20,7 @@ Contents #. `Run Information`_ #. `Spectra Plots`_ #. `Diagnostics`_ -#. `Vetos`_ +#. `Vetoes`_ Run Summary ----------- @@ -84,7 +84,7 @@ Return to `Contents`_. Data Acquisition ~~~~~~~~~~~~~~~~ -The data acquisition tab allow you to set up how the DAE will collect the data. The page is split into several sections: +The data acquisition tab allows you to set up how the DAE will collect the data. The page is split into several sections: Tables: The wiring table, detector table and spectra table set the files used when turning signals generated at the detectors into spectra. These files are stored in the ``configurations/tables`` directory in settings on the instrument. @@ -106,7 +106,7 @@ Return to `Contents`_. Periods ~~~~~~~ -The period tab allows the period types and needed parameters to be setup within the DAE. Periods allow data to be collected as if restarting the DAE but without the time overhead of doing this. Software periods are controlled via software command, e.g. genie_python's `change_period` command. The other options are Harware controlled and these are internal (within the DAE) or external control. +The period tab allows the period types and needed parameters to be setup within the DAE. Periods allow data to be collected as if restarting the DAE but without the time overhead of doing this. Software periods are controlled via software command, e.g. genie_python's ``change_period`` command. The other options are Hardware controlled and these are internal (within the DAE) or external control. Return to `Contents`_. From 063d87f0efae0564a10b2a638a194cbf88a69b12 Mon Sep 17 00:00:00 2001 From: John Holt Date: Tue, 22 Nov 2016 11:20:17 +0000 Subject: [PATCH 0461/1813] Updated ManagetheDAE (rest) --- ManagetheDAE.rest | 44 ++++++++++++++++++++++++-------------------- 1 file changed, 24 insertions(+), 20 deletions(-) diff --git a/ManagetheDAE.rest b/ManagetheDAE.rest index 53e7690..0b27fe0 100644 --- a/ManagetheDAE.rest +++ b/ManagetheDAE.rest @@ -3,9 +3,9 @@ Manage the DAE ============== -The Data Acquisition Electronics (DAE) is the hardware where the neutron or muon data is collected. The DAE is controlled by the ICP (see [[Key Concepts in IBEX|KeyConceptsinIBEX]]), which informs the DAE when to start and stop collecting data from the instrument detectors. The ICP also receives sample environment information and combines it with the detector data and is responsible for transferring the final combined dataset to a data file. +The Data Acquisition Electronics (DAE) is the hardware which collects neutron or muon data. The DAE is controlled by the ICP (see [[Key Concepts in IBEX|KeyConceptsinIBEX]]), which informs the DAE when to start and stop collecting data from the instrument detectors. The ICP also receives sample environment information and combines it with the detector data and is responsible for transferring the final combined dataset to a data file. -The DAE view communicates with the ICP to control the DAE. +The DAE view communicates with the ICP to control the DAE. The view is split into a number of tabs and sub tabs. Contents -------- @@ -30,41 +30,41 @@ The Run Summary tab displays some summary information about the current run and Run Summary Fields ~~~~~~~~~~~~~~~~~~ -* ``Instrument``: (read-only) records the instrument on which the current run is being performed -* ``Run Status``: (read-only) records status of the current run -* ``Run Number``: (read-only) records the current run number -* ``ISIS Cycle``: (read-only) records the current ISIS cycle +* ``Instrument``: records the instrument on which the current run is being performed +* ``Run Status``: records status of the current run +* ``Run Number``: records the current run number +* ``ISIS Cycle``: records the current ISIS cycle * ``Title``: you can provide a short description of the current run in the ``Title`` field. Click on the ``Set`` button to commit the change (i.e. send it to the ICP, so that it gets included in the data file). -* The ``Show Title in Dataweb Dashboard Page`` check box allows you to toggle the display of the title in the Dataweb dashboard. This checkbox only affects the Dataweb dashboard; it does not affect display of the title in IBEX, or the inclusion of the title in the data file. +* ``Show Title in Dataweb Dashboard Page``: set whether to display the title in the Dataweb dashboard. This checkbox only affects the Dataweb dashboard; it does not affect display of the title in IBEX, or the inclusion of the title in the data file. Return to `Contents`_. Message Log ~~~~~~~~~~~ -The message log area lets you view any messages issued by the ICP. The message log area is the same as the main Log Messages view, filtered to show only messages from the ICP. +The message log area lets you view any messages issued by the ICP. The message log area is the same as the main Log Messages view but filtered to show only messages from the ICP. The Run Summary tab also provides a number of buttons to control the acquisition of data. Begin Run: - Click on the ``BEGIN RUN`` button to start a new run. Beginning a run instructs the ICP to tell the DAE to start collecting data. The DAE’s run status will change to RUNNING (which is reflected in the ``Run Status`` field and in the IBEX [[Dashboard]]. + Beginning a run instructs the ICP to tell the DAE to start collecting data. The DAE’s run status will change to BEGINNING and then RUNNING; this is displayed in the ``Run Status`` field and in the IBEX [[Dashboard]]. End Run: - Click on the ``END RUN`` button to terminate the current run. Ending a run instructs the ICP to tell the DAE to stop collecting data. It also instructs the ICP to write the data collected during the run to a file. The DAE’s run status will change to SETUP. + Ending a run instructs the ICP to tell the DAE to stop collecting data and save the data. The DAE’s run status will change to ENDING (while it saves the data) and then SETUP when it is ready to be started again. Pause Run: - Click on the ``PAUSE RUN`` button to halt (but not end) the current run. Pausing a run instructs the ICP to tell the DAE to pause data collection indefinitely. The DAE’s run status will change to PAUSED. The DAE's status will remain PAUSED until it is instructed to RESUME. + Pausing a run instructs the ICP to tell the DAE to pause data collection indefinitely. The DAE’s run status will change to PAUSED. The DAE's status will remain PAUSED until it is instructed to resume, end or abort the run. Resume Run: - Click on the ``RESUME RUN`` button to resume a previously paused run. Resuming a run instructs the ICP to tell the DAE to resume data collection after it has been paused. The DAE’s run status will return to RUNNING. + Resuming a run instructs the ICP to tell the DAE to resume data collection after it has been paused. The DAE’s run status will return to RUNNING. Abort Run: - Click on the ``ABORT RUN`` button to abort the current run. Aborting a run instructs the ICP to tell the DAE to stop data collection (as for END). However, the data that has been collected is not written to a file; if a new run is started, then any data that has been collected will be lost. The DAE’s run status will change to SETUP. + Aborting a run instructs the ICP to tell the DAE to stop data collection (as for END). However, the data that has been collected is not written to a file; if a new run is started, then any data that has been collected will be lost. The DAE’s run status will change to SETUP. If this is done mistakenly the cancel abort button can be used to undo the abort. Cancel Abort: - Click on the ``CANCEL ABORT`` button to cancel the abort process. + This will instruct the DAE to cancel a previous abort. The DAE will be left in a paused state. Save Run: - Click on the ``SAVE RUN`` button to save the current run. + Click on the ``SAVE RUN`` button to save the current run data without stopping the current run. Return to `Contents`_. @@ -72,12 +72,14 @@ Return to `Contents`_. Experiment Setup ---------------- -The Experiment Setup comprises three sub-tabs. Each of these 3 sub-tabs will have been configured by an ISIS Instrument Scientist. Please do not modify the contents of these 3 tabs without consulting with the instrument scientist. +The Experiment Setup comprises three sub-tabs. Each of these 3 sub-tabs will have been configured by an ISIS Instrument Scientist. Please do not modify the contents of these 3 tabs without consulting with the instrument scientist. + +Any changes made are only sent to the DAE when the ``Apply Changes`` button is pressed. If there is a problem with the setting an error message will appear on the `Run Summary`_ panel. Time Channels ~~~~~~~~~~~~~ -The time channels tab allows the setting of the spectra captured in different time regimes. By setting different step sizes and size distributions (using mode) you can optimise the time bins in the final spectra. The time channels can be set using the table below or if more regimes are required a file can be specified. The files are stored in the ``configurations/tcb`` directory in the settings on the instrument. +The time channels tab allows the setting of the spectra captured in different time regimes. By setting different step sizes and modes you can optimise the sizes of the time bins in the final spectra. The setting for the time channels can be set either using the table or by setting a file; usually used when more than 6 regimes are required. The files are stored in the ``configurations/tcb`` directory in the settings on the instrument. Return to `Contents`_. @@ -87,10 +89,10 @@ Data Acquisition The data acquisition tab allows you to set up how the DAE will collect the data. The page is split into several sections: Tables: - The wiring table, detector table and spectra table set the files used when turning signals generated at the detectors into spectra. These files are stored in the ``configurations/tables`` directory in settings on the instrument. + The wiring table, detector table and spectra table set the files used when turning signals generated in the detectors into spectra. These files are stored in the ``configurations/tables`` directory in settings on the instrument. Monitor: - Set which spectra number is used for the monitor counts and between what times the spectra should be integrated to return the counts. + Set which spectra number is used for the monitor counts and between which times the spectra should be integrated to return the monitor counts. Vetoes: Set which [[vetoes|KeyConceptsinIBEX#vetoes]] are active. @@ -128,11 +130,13 @@ Return to `Contents`_. Diagnostics ----------- +Intentionally left blank :-) . + Return to `Contents`_. Vetoes ------ -The Vetoes tab shows a summary of the vetoes that are in force for the current run. This information is read-only. Vetoes can only be changed prior to the start of a run, via the `Data Acquisition`_ sub-tab on the `Experiment Setup`_ tab. +The Vetoes tab shows a summary of the vetoes that are in force and their effect for the current run. This information is read-only. Vetoes can only be changed prior to the start of a run, via the `Data Acquisition`_ sub-tab on the `Experiment Setup`_ tab. Return to `Contents`_. From 461c996daa3414a4d2b3fa13b841eb71537af0f3 Mon Sep 17 00:00:00 2001 From: John Holt Date: Tue, 22 Nov 2016 15:58:49 +0000 Subject: [PATCH 0462/1813] Updated KeyConceptsinIBEX (rest) --- KeyConceptsinIBEX.rest | 2 ++ 1 file changed, 2 insertions(+) diff --git a/KeyConceptsinIBEX.rest b/KeyConceptsinIBEX.rest index c4c6a62..d723953 100644 --- a/KeyConceptsinIBEX.rest +++ b/KeyConceptsinIBEX.rest @@ -130,6 +130,8 @@ Environment/Period Card The DAE is usually connected to the instrument control PC via a USB or MXI-2 cable. +Settings for the DAE can be read and changed either through the [[IBEX client|ManagetheDAE]] or commands [[issued in scripts|scripting]]. + What does the DAE do? ~~~~~~~~~~~~~~~~~~~~~ The DAE: From 305c73ddd371f4bed0e2777ab382ddaa2939e59f Mon Sep 17 00:00:00 2001 From: John Holt Date: Tue, 22 Nov 2016 16:30:49 +0000 Subject: [PATCH 0463/1813] Updated InstallingIBEX (rest) --- InstallingIBEX.rest | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/InstallingIBEX.rest b/InstallingIBEX.rest index bbe8498..1f42d3b 100644 --- a/InstallingIBEX.rest +++ b/InstallingIBEX.rest @@ -78,3 +78,26 @@ Change to the folder with the highest value of ``N.M.O`` (e.g. ``cd 2.1.0`` in t :: netsh advfirewall firewall add rule name="Control SVCS Machine" dir=in action=allow protocol=UDP remoteip=130.246.51.171 remoteport=5064 profile=any + +Installation Layout +------------------- + +After installation the current paths are used by the various components. + ++-------------------------------------------------------+-------------------------------------------------------------------+ +| Item | Path + ++=======================================================+===================================================================+ +|IBEX Client | ``C:\Instrument\Apps\Client`` | ++-------------------------------------------------------+-------------------------------------------------------------------| +| genie_python (include python and dependencies) | ``C:\Instrument\Apps\Python`` | ++-------------------------------------------------------+-------------------------------------------------------------------| +| EPICS utilities | ``C:\Instrument\Apps\Python\EPICS_UTILS`` | ++-------------------------------------------------------+-------------------------------------------------------------------| +| Server Code and executables | ``c:\Instrument\Apps\EPICS`` | ++-------------------------------------------------------+-------------------------------------------------------------------| +| Server Settings | ``C:\Instrument\Settings\config\\configurations`` | ++-------------------------------------------------------+-------------------------------------------------------------------| +| Common settings files (e.g. sensor calibration files) | ``C:\Instrument\Settings\config\common`` | ++-------------------------------------------------------+-------------------------------------------------------------------| +| Server logs, autosave and database files | ``C:\Instrument\Var`` | ++-------------------------------------------------------+-------------------------------------------------------------------| From a9b342774ceb70864ff890e6addb30c57c2534f7 Mon Sep 17 00:00:00 2001 From: John Holt Date: Tue, 22 Nov 2016 16:32:12 +0000 Subject: [PATCH 0464/1813] Updated InstallingIBEX (rest) --- InstallingIBEX.rest | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/InstallingIBEX.rest b/InstallingIBEX.rest index 1f42d3b..9edaccb 100644 --- a/InstallingIBEX.rest +++ b/InstallingIBEX.rest @@ -85,19 +85,19 @@ Installation Layout After installation the current paths are used by the various components. +-------------------------------------------------------+-------------------------------------------------------------------+ -| Item | Path + +| Item | Path | +=======================================================+===================================================================+ |IBEX Client | ``C:\Instrument\Apps\Client`` | -+-------------------------------------------------------+-------------------------------------------------------------------| ++-------------------------------------------------------+-------------------------------------------------------------------+ | genie_python (include python and dependencies) | ``C:\Instrument\Apps\Python`` | -+-------------------------------------------------------+-------------------------------------------------------------------| ++-------------------------------------------------------+-------------------------------------------------------------------+ | EPICS utilities | ``C:\Instrument\Apps\Python\EPICS_UTILS`` | -+-------------------------------------------------------+-------------------------------------------------------------------| ++-------------------------------------------------------+-------------------------------------------------------------------+ | Server Code and executables | ``c:\Instrument\Apps\EPICS`` | -+-------------------------------------------------------+-------------------------------------------------------------------| ++-------------------------------------------------------+-------------------------------------------------------------------+ | Server Settings | ``C:\Instrument\Settings\config\\configurations`` | -+-------------------------------------------------------+-------------------------------------------------------------------| ++-------------------------------------------------------+-------------------------------------------------------------------+ | Common settings files (e.g. sensor calibration files) | ``C:\Instrument\Settings\config\common`` | -+-------------------------------------------------------+-------------------------------------------------------------------| ++-------------------------------------------------------+-------------------------------------------------------------------+ | Server logs, autosave and database files | ``C:\Instrument\Var`` | -+-------------------------------------------------------+-------------------------------------------------------------------| ++-------------------------------------------------------+-------------------------------------------------------------------+ \ No newline at end of file From 698790b719f179be542dd30f204939fd4c26544e Mon Sep 17 00:00:00 2001 From: John Holt Date: Tue, 22 Nov 2016 16:41:11 +0000 Subject: [PATCH 0465/1813] Updated ManagetheDAE (rest) --- ManagetheDAE.rest | 59 +++++++++++++++++++++++++---------------------- 1 file changed, 31 insertions(+), 28 deletions(-) diff --git a/ManagetheDAE.rest b/ManagetheDAE.rest index 0b27fe0..6bc984e 100644 --- a/ManagetheDAE.rest +++ b/ManagetheDAE.rest @@ -5,7 +5,7 @@ Manage the DAE The Data Acquisition Electronics (DAE) is the hardware which collects neutron or muon data. The DAE is controlled by the ICP (see [[Key Concepts in IBEX|KeyConceptsinIBEX]]), which informs the DAE when to start and stop collecting data from the instrument detectors. The ICP also receives sample environment information and combines it with the detector data and is responsible for transferring the final combined dataset to a data file. -The DAE view communicates with the ICP to control the DAE. The view is split into a number of tabs and sub tabs. +The DAE view communicates with the ICP to control the DAE. The DAE can be managed from the DAE view in the client. The DAE view is split into a number of tabs and sub tabs which are listed with their functions below. Contents -------- @@ -30,10 +30,10 @@ The Run Summary tab displays some summary information about the current run and Run Summary Fields ~~~~~~~~~~~~~~~~~~ -* ``Instrument``: records the instrument on which the current run is being performed -* ``Run Status``: records status of the current run -* ``Run Number``: records the current run number -* ``ISIS Cycle``: records the current ISIS cycle +* ``Instrument``: the instrument on which the current run is being performed +* ``Run Status``: status of the current run +* ``Run Number``: the current run number +* ``ISIS Cycle``: the current ISIS cycle * ``Title``: you can provide a short description of the current run in the ``Title`` field. Click on the ``Set`` button to commit the change (i.e. send it to the ICP, so that it gets included in the data file). * ``Show Title in Dataweb Dashboard Page``: set whether to display the title in the Dataweb dashboard. This checkbox only affects the Dataweb dashboard; it does not affect display of the title in IBEX, or the inclusion of the title in the data file. @@ -43,28 +43,31 @@ Message Log ~~~~~~~~~~~ The message log area lets you view any messages issued by the ICP. The message log area is the same as the main Log Messages view but filtered to show only messages from the ICP. -The Run Summary tab also provides a number of buttons to control the acquisition of data. +Run Control Buttons +~~~~~~~~~~~~~~~~~~~ -Begin Run: - Beginning a run instructs the ICP to tell the DAE to start collecting data. The DAE’s run status will change to BEGINNING and then RUNNING; this is displayed in the ``Run Status`` field and in the IBEX [[Dashboard]]. +The Run Summary tab also provides a number of buttons to control the acquisition of data. Which buttons are available is dependent on the current status of the DAE; this is displayed in the ``Run Status`` field and in the IBEX [[Dashboard]]. -End Run: +Begin Run + Beginning a run instructs the ICP to tell the DAE to start collecting data. The DAE’s run status will change to BEGINNING and then RUNNING. + +End Run Ending a run instructs the ICP to tell the DAE to stop collecting data and save the data. The DAE’s run status will change to ENDING (while it saves the data) and then SETUP when it is ready to be started again. -Pause Run: +Pause Run Pausing a run instructs the ICP to tell the DAE to pause data collection indefinitely. The DAE’s run status will change to PAUSED. The DAE's status will remain PAUSED until it is instructed to resume, end or abort the run. -Resume Run: +Resume Run Resuming a run instructs the ICP to tell the DAE to resume data collection after it has been paused. The DAE’s run status will return to RUNNING. -Abort Run: +Abort Run Aborting a run instructs the ICP to tell the DAE to stop data collection (as for END). However, the data that has been collected is not written to a file; if a new run is started, then any data that has been collected will be lost. The DAE’s run status will change to SETUP. If this is done mistakenly the cancel abort button can be used to undo the abort. -Cancel Abort: +Cancel Abort This will instruct the DAE to cancel a previous abort. The DAE will be left in a paused state. -Save Run: - Click on the ``SAVE RUN`` button to save the current run data without stopping the current run. +Save Run + This will save the current run data without stopping the current run. Return to `Contents`_. @@ -72,35 +75,35 @@ Return to `Contents`_. Experiment Setup ---------------- -The Experiment Setup comprises three sub-tabs. Each of these 3 sub-tabs will have been configured by an ISIS Instrument Scientist. Please do not modify the contents of these 3 tabs without consulting with the instrument scientist. +The Experiment Setup comprises of sub-tabs which will have been configured by an ISIS Instrument Scientist. Please do not modify their contents without consulting with the instrument scientist. Any changes made are only sent to the DAE when the ``Apply Changes`` button is pressed. If there is a problem with the setting an error message will appear on the `Run Summary`_ panel. Time Channels ~~~~~~~~~~~~~ -The time channels tab allows the setting of the spectra captured in different time regimes. By setting different step sizes and modes you can optimise the sizes of the time bins in the final spectra. The setting for the time channels can be set either using the table or by setting a file; usually used when more than 6 regimes are required. The files are stored in the ``configurations/tcb`` directory in the settings on the instrument. +The time channels sub-tab allows the setting of the spectra captured in different time regimes. By setting different step sizes and modes you can optimise the sizes of the time bins in the final spectra. The setting for the time channels can be set either using the table or by setting a file; usually used when more than 6 regimes are required. The files are stored in the ``configurations/tcb`` directory in the [[server settings|InstallingIBEX#installation-layout]] on the instrument. Return to `Contents`_. Data Acquisition ~~~~~~~~~~~~~~~~ -The data acquisition tab allows you to set up how the DAE will collect the data. The page is split into several sections: +The data acquisition sub-tab allows you to set up how the DAE will collect the data. The page is split into several sections: -Tables: - The wiring table, detector table and spectra table set the files used when turning signals generated in the detectors into spectra. These files are stored in the ``configurations/tables`` directory in settings on the instrument. +Tables + The wiring table, detector table and spectra table set the files used when turning signals generated in the detectors into spectra. These files are stored in the ``configurations/tables`` directory in [[server settings|InstallingIBEX#installation-layout]] on the instrument. -Monitor: +Monitor Set which spectra number is used for the monitor counts and between which times the spectra should be integrated to return the monitor counts. -Vetoes: +Vetoes Set which [[vetoes|KeyConceptsinIBEX#vetoes]] are active. -Muons: +Muons Set if and how to collect muon data. -Timing: +Timing Set the source of the [[timing signal|KeyConceptsinIBEX#dae-timing-sources]] and how often the data should be auto saved. Return to `Contents`_. @@ -108,21 +111,21 @@ Return to `Contents`_. Periods ~~~~~~~ -The period tab allows the period types and needed parameters to be setup within the DAE. Periods allow data to be collected as if restarting the DAE but without the time overhead of doing this. Software periods are controlled via software command, e.g. genie_python's ``change_period`` command. The other options are Hardware controlled and these are internal (within the DAE) or external control. +The period sub-tab allows the period types and needed parameters to be set up within the DAE. Periods allow data to be collected as if restarting the DAE but without the time overhead of doing this. Software periods are controlled via software command, e.g. genie_python's ``change_period`` command. The other options are hardware controlled and these are internal (within the DAE) or external control. Return to `Contents`_. Run Information --------------- -The Run Information Tab provides a more complete summary of the DAE setup than the Run Summary tab. All the fields on this tab are read-only. +The Run Information tab provides a more complete summary of the DAE set up than the Run Summary tab. All the fields on this tab are read-only. Return to `Contents`_. Spectra Plots ------------- -The Spectra Plots Tab displays up to 4 spectra plots. The plots show the recorded spectra from the detectors which were setup using the tables in the data acquisition tab. You can choose which spectra are plotted by using the ``Spectrum:`` and ``Period:`` fields for each plot. Click on the ``Set Plot`` button (positioned at the top right of each plot) to update the plot after changing the ``Spectrum:`` or ``Period:`` fields. +The Spectra Plots Tab displays up to 4 spectra plots. The plots show the recorded spectra from the detectors which were setup using the tables in the data acquisition tab. You can choose which spectra are plotted by using the ``Spectrum`` and ``Period`` fields for each plot. Click on the ``Set Plot`` button (positioned at the top right of each plot) to update the plot after changing the ``Spectrum`` or ``Period`` fields. Return to `Contents`_. @@ -130,7 +133,7 @@ Return to `Contents`_. Diagnostics ----------- -Intentionally left blank :-) . +This page in the GUI intentionally left blank :-) (It is a work in progress) Return to `Contents`_. From 5ec245a429fc09d5ea2de1ea956cfad91a7cc426 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Fri, 25 Nov 2016 11:50:06 +0000 Subject: [PATCH 0466/1813] Updated CreateandManageConfigurations (rest) --- CreateandManageConfigurations.rest | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/CreateandManageConfigurations.rest b/CreateandManageConfigurations.rest index 0b9f45c..333c104 100644 --- a/CreateandManageConfigurations.rest +++ b/CreateandManageConfigurations.rest @@ -68,7 +68,10 @@ The IOCs tab lists all the IOCs available on the instrument. In general, you wi The [[KeyConceptsinIBEX]] page describes what an IOC is. -To include an IOC in your configuration, scroll down the list until you find the appropriate IOC and select the Auto-Start or Auto-Restart check-boxes (or select both). By selecting these check-boxes, IBEX will automatically start (or restart) the IOCs each time your configuration is loaded into IBEX. +To include an IOC in your configuration, scroll down the list until you find the appropriate IOC and select the Auto-Start or Auto-Restart check-boxes (or select both). + +- Auto start: The IOC will be started/restarted whenever the configuration is changed. +- Auto restart: The IOC will be restarted whenever the configuration is changed. If the IOC is stopped, it will not be started. **Note:** The list of IOCs in the IOC tab also includes a column headed Sim. level. This column is used to indicate whether the IOC should run in simulation mode. By default, the Sim. level file is set to NONE, meaning that the IOC will not run in simulation mode. Under normal circumstances, you should not change the default setting. From 47e057e865f1ef844e8b866e425239ad3efbe6fc Mon Sep 17 00:00:00 2001 From: AdrianPotter Date: Wed, 30 Nov 2016 13:43:15 +0000 Subject: [PATCH 0467/1813] Clarify auto start and auto restart behaviour --- CreateandManageConfigurations.rest | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CreateandManageConfigurations.rest b/CreateandManageConfigurations.rest index 333c104..244ed31 100644 --- a/CreateandManageConfigurations.rest +++ b/CreateandManageConfigurations.rest @@ -68,10 +68,10 @@ The IOCs tab lists all the IOCs available on the instrument. In general, you wi The [[KeyConceptsinIBEX]] page describes what an IOC is. -To include an IOC in your configuration, scroll down the list until you find the appropriate IOC and select the Auto-Start or Auto-Restart check-boxes (or select both). +To include an IOC in your configuration, scroll down the list until you find the appropriate IOC and select the Auto-Start or Auto-Restart check-boxes as required - Auto start: The IOC will be started/restarted whenever the configuration is changed. -- Auto restart: The IOC will be restarted whenever the configuration is changed. If the IOC is stopped, it will not be started. +- Auto restart: This setting only applies if auto start has been selected as well, otherwise it does nothing. If both auto start and auto restart are selected then if the IOC is terminated unexpectedly, it will be automatically restarted. If the IOC is stopped from the client or writing to the appropriate PV then it will not be restarted. **Note:** The list of IOCs in the IOC tab also includes a column headed Sim. level. This column is used to indicate whether the IOC should run in simulation mode. By default, the Sim. level file is set to NONE, meaning that the IOC will not run in simulation mode. Under normal circumstances, you should not change the default setting. From dc5230555ea02980426d63f5624de7f1ffa40a08 Mon Sep 17 00:00:00 2001 From: Thomas Lohnert Date: Wed, 8 Feb 2017 09:11:30 +0000 Subject: [PATCH 0468/1813] Updated CreateandManageConfigurations (rest) --- CreateandManageConfigurations.rest | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CreateandManageConfigurations.rest b/CreateandManageConfigurations.rest index 244ed31..135adcf 100644 --- a/CreateandManageConfigurations.rest +++ b/CreateandManageConfigurations.rest @@ -3,7 +3,7 @@ Create & Manage Configurations ================================ -A configuration is the means by which an instrument is described and defined to IBEX. A configuration defines the blocks, IOCs, components, macros and other items which IBEX needs to use in order to control the instrument. You can create multiple configurations for an instrument, to describe and define how the instrument has been set up for different experiments. +A configuration is the means by which an instrument is described and defined to IBEX. A configuration defines the blocks, IOCs, components, macros and other items which IBEX needs to use in order to control the instrument. You can create multiple configurations for an instrument, to describe and define how the instrument has been set up for different experiments. **Please note:** An IBEX configuration is **not** the same as a Mantid configuration. IBEX and Mantid view instruments in fundamentally different ways, which means that their respective configurations are not interchangeable. From 515c10874d4f28ff6aabe3c4d222fe85d998d71a Mon Sep 17 00:00:00 2001 From: Thomas Lohnert Date: Wed, 8 Feb 2017 09:11:45 +0000 Subject: [PATCH 0469/1813] Updated CreateandManageConfigurations (rest) --- CreateandManageConfigurations.rest | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CreateandManageConfigurations.rest b/CreateandManageConfigurations.rest index 135adcf..e55fa86 100644 --- a/CreateandManageConfigurations.rest +++ b/CreateandManageConfigurations.rest @@ -12,6 +12,7 @@ Contents #. `Creating a Configuration`_ + #. `Summary`_ #. `IOCs Tab`_ #. `Blocks Tab`_ #. `Groups Tab`_ @@ -19,7 +20,6 @@ Contents #. `IOC Macros`_ #. `IOC PV Values`_ #. `IOC PV Sets`_ - #. `Summary`_ #. `Editing a Configuration`_ #. `Edit Current Configuration ...`_ @@ -34,6 +34,7 @@ To create a configuration: #. Select ``Configurations > New`` from the ``Configuration`` menu. #. IBEX displays the Edit Configuration dialog, which contains eight tabs. + #. Summary #. IOCs #. Blocks #. Groups @@ -41,7 +42,6 @@ To create a configuration: #. IOC Macros #. IOC PV Values #. IOC PV Sets - #. Summary #. At the bottom of the dialog are two buttons From 0a394d6e9e13808d628faf13f50d9d97c44efa79 Mon Sep 17 00:00:00 2001 From: Thomas Lohnert Date: Wed, 8 Feb 2017 09:38:35 +0000 Subject: [PATCH 0470/1813] Updated CreateandManageConfigurations (rest) --- CreateandManageConfigurations.rest | 64 +++++++++++++++--------------- 1 file changed, 32 insertions(+), 32 deletions(-) diff --git a/CreateandManageConfigurations.rest b/CreateandManageConfigurations.rest index e55fa86..13515e5 100644 --- a/CreateandManageConfigurations.rest +++ b/CreateandManageConfigurations.rest @@ -13,10 +13,10 @@ Contents #. `Creating a Configuration`_ #. `Summary`_ + #. `Components Tab`_ #. `IOCs Tab`_ #. `Blocks Tab`_ #. `Groups Tab`_ - #. `Components Tab`_ #. `IOC Macros`_ #. `IOC PV Values`_ #. `IOC PV Sets`_ @@ -32,13 +32,13 @@ Creating a Configuration To create a configuration: #. Select ``Configurations > New`` from the ``Configuration`` menu. -#. IBEX displays the Edit Configuration dialog, which contains eight tabs. +#. IBEX displays the Edit Configuration dialog, which contains the following eight sections: #. Summary + #. Components #. IOCs #. Blocks #. Groups - #. Components #. IOC Macros #. IOC PV Values #. IOC PV Sets @@ -62,6 +62,35 @@ Return to `Contents`_. We'll describe each of the Edit Configuration dialog tabs in turn. +Summary +~~~~~~~ + +The Summary allows you to create a short description for your configuration. It also allows you to associate a default synoptic view with your configuration. + +The summary is displayed at the top of the dialog and contains the following fields: + +Name + This is a read-only field. It is defined when you save the configuration. When you are creating a new configuration, the ``Name:`` field will be empty. + +Description + Provide a short description of your configuration. Configuration names can sometime be a little cryptic; a short description will help you to better remember the purpose of the configuration. + +Synoptic + IBEX allows you to create different synoptic views for use with different configurations. Therefore, it is convenient to associate a synoptic view with a configuration - it saves you from having to remember the association. Your chosen synoptic will be used as the default synoptic whenever you use this configuration. + +Return to `Contents`_. + +Components Tab +~~~~~~~~~~~~~~ + +Components are, in essence, mini configurations. You can use components to "pre-configure" a device (or group of devices) and then include the components in a configuration. The process of creating and managing components is described in [[CreateandManageComponents]]. + +The Components tab displays two lists of components. The left hand list shows which components are available to be included in your configuration. The right hand list shows which components are already included in your configuration. You can only include a component once in a configuration. + +Use the arrow buttons to move components between the two lists. + +Return to `Contents`_. + IOCs Tab ~~~~~~~~ The IOCs tab lists all the IOCs available on the instrument. In general, you will only wish to include a sub-set of these in your configuration (i.e. those that correspond to devices on your instrument). @@ -157,17 +186,6 @@ You can select multiple blocks to be added (or removed) from a group using the ` Return to `Contents`_. -Components Tab -~~~~~~~~~~~~~~ - -Components are, in essence, mini configurations. You can use components to "pre-configure" a device (or group of devices) and then include the components in a configuration. The process of creating and managing components is described in [[CreateandManageComponents]]. - -The Components tab displays two lists of components. The left hand list shows which components are available to be included in your configuration. The right hand list shows which components are already included in your configuration. You can only include a component once in a configuration. - -Use the arrow buttons to move components between the two lists. - -Return to `Contents`_. - IOC Macros ~~~~~~~~~~ @@ -210,24 +228,6 @@ IOC PV Sets is an experimental feature within IBEX **do not** use this before ta Return to `Contents`_. -Summary -~~~~~~~ - -The Summary tab allows you to create a short description for your configuration. It also allows you to associate a default synoptic view with your configuration. - -When you click on the Summary tab, IBEX displays the following fields: - -Name - This is a read-only field. It is defined when you save the configuration. When you are creating a new configuration, the ``Name:`` field will be empty. - -Description - Provide a short description of your configuration. Configuration names can sometime be a little cryptic; a short description will help you to better remember the purpose of the configuration. - -Synoptic - IBEX allows you to create different synoptic views for use with different configurations. Therefore, it is convenient to associate a synoptic view with a configuration - it saves you from having to remember the association. Your chosen synoptic will be used as the default synoptic whenever you use this configuration. - -Return to `Contents`_. - Editing a Configuration ----------------------- From f15595b5981031bc4eba8cc6ace8b920a2ad3598 Mon Sep 17 00:00:00 2001 From: Thomas Lohnert Date: Wed, 8 Feb 2017 13:51:12 +0000 Subject: [PATCH 0471/1813] Updated CreateandManageConfigurations (rest) --- CreateandManageConfigurations.rest | 26 ++++++++++++++++++++------ 1 file changed, 20 insertions(+), 6 deletions(-) diff --git a/CreateandManageConfigurations.rest b/CreateandManageConfigurations.rest index 13515e5..f511b7b 100644 --- a/CreateandManageConfigurations.rest +++ b/CreateandManageConfigurations.rest @@ -93,16 +93,27 @@ Return to `Contents`_. IOCs Tab ~~~~~~~~ -The IOCs tab lists all the IOCs available on the instrument. In general, you will only wish to include a sub-set of these in your configuration (i.e. those that correspond to devices on your instrument). -The [[KeyConceptsinIBEX]] page describes what an IOC is. +*Note: Managing IOCs in a configuration has changed for releases newer than IBEX 3.1.0. This section contains instructions for both versions. We have provided screenshots of the IOCs tab in each version to help determine which one you are using.* -To include an IOC in your configuration, scroll down the list until you find the appropriate IOC and select the Auto-Start or Auto-Restart check-boxes as required +The [[KeyConceptsinIBEX]] page describes what an IOC is. In general, you will only wish to include a sub-set of these in your configuration (i.e. those that correspond to devices on your instrument). + +Up to Version 3.1.0: + The IOCs tab lists all the IOCs available on the instrument. To include an IOC in your configuration, scroll down the list until you find the appropriate IOC and select the Auto-Start or Auto-Restart check-boxes as required + + - Auto start: The IOC will be started/restarted whenever the configuration is changed. + - Auto restart: This setting only applies if auto start has been selected as well, otherwise it does nothing. If both auto start and auto restart are selected then if the IOC is terminated unexpectedly, it will be automatically restarted. If the IOC is stopped from the client or writing to the appropriate PV then it will not be restarted. + + **Note:** The list of IOCs in the IOC tab also includes a column headed Sim. level. This column is used to indicate whether the IOC should run in simulation mode. By default, the Sim. level file is set to NONE, meaning that the IOC will not run in simulation mode. Under normal circumstances, you should not change the default setting. + +Newer Versions: + IOCs need to be explicitly added to the configuration. The IOCs tab shows an overview of all IOCs that are part of the currently viewed configuration. Below the overview table, the tab contains three buttons to add, edit or delete an IOC. + + - The "Edit IOC"-button opens a dialog containing all the settings related to the selected IOC: the general Simulation level and Auto-(re)start settings at the top, as well as tabs for setting `IOC Macros`_, `IOC PV Values`_ and `IOC PV Sets`_. + - The "Add IOC"-button opens a dialog which lets you choose from a list of all IOCs available on the instrument. Confirming your selection will take you to the "Edit IOC" dialog for the selected IOC. + - The "Delete IOC"-button allows you to delete IOCs from the list and the configuration. This works with multiple selection, too. -- Auto start: The IOC will be started/restarted whenever the configuration is changed. -- Auto restart: This setting only applies if auto start has been selected as well, otherwise it does nothing. If both auto start and auto restart are selected then if the IOC is terminated unexpectedly, it will be automatically restarted. If the IOC is stopped from the client or writing to the appropriate PV then it will not be restarted. -**Note:** The list of IOCs in the IOC tab also includes a column headed Sim. level. This column is used to indicate whether the IOC should run in simulation mode. By default, the Sim. level file is set to NONE, meaning that the IOC will not run in simulation mode. Under normal circumstances, you should not change the default setting. Return to `Contents`_. @@ -188,6 +199,7 @@ Return to `Contents`_. IOC Macros ~~~~~~~~~~ +*Note: In Ibex versions newer than 3.1.0 the IOC macros tab has been moved into the new "Edit IOC"-Dialog. See section* `IOCs Tab`_. IOC Macros are configurable values that IBEX can supply to the IOC when the IOC is started. For example, if the IOC is controlling a serial device attached to a COM port, you can use an macro to identify the appropriate port to the IOC. This is especially useful if the device moves between instruments and may be attached to different COM ports on different instruments. Another example of an IOC macro might be the name of a calibration file. @@ -212,6 +224,7 @@ Return to `Contents`_. IOC PV Values ~~~~~~~~~~~~~ +*Note: In Ibex versions newer than 3.1.0 the IOC PV Values tab has been moved into the new "Edit IOC"-Dialog. See section* `IOCs Tab`_. IOC PV Values allows you to set the values of a PV when the configuration is first loaded. For example setting a experimental parameter on first load. @@ -221,6 +234,7 @@ Return to `Contents`_. IOC PV Sets ~~~~~~~~~~~ +*Note: In Ibex versions newer than 3.1.0 the IOC PV Sets tab has been moved into the new "Edit IOC"-Dialog. See section* `IOCs Tab`_. IOC PV Sets is an experimental feature within IBEX **do not** use this before talking to the IBEX team. It can be used to load in autosaved values from a specific file setup beforehand. From d574f62e4d76487f7636b12f2f2ba4e13aaf59eb Mon Sep 17 00:00:00 2001 From: Thomas Lohnert Date: Wed, 8 Feb 2017 14:02:22 +0000 Subject: [PATCH 0472/1813] Updated CreateandManageConfigurations (rest) From 3a31144ca25125e3b669ae929ed4f0c1283cee2b Mon Sep 17 00:00:00 2001 From: Thomas Lohnert Date: Wed, 8 Feb 2017 14:21:02 +0000 Subject: [PATCH 0473/1813] Updated CreateandManageConfigurations (rest) --- CreateandManageConfigurations.rest | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/CreateandManageConfigurations.rest b/CreateandManageConfigurations.rest index f511b7b..fb9b9e6 100644 --- a/CreateandManageConfigurations.rest +++ b/CreateandManageConfigurations.rest @@ -94,7 +94,7 @@ Return to `Contents`_. IOCs Tab ~~~~~~~~ -*Note: Managing IOCs in a configuration has changed for releases newer than IBEX 3.1.0. This section contains instructions for both versions. We have provided screenshots of the IOCs tab in each version to help determine which one you are using.* +*Note: Managing IOCs in a configuration has changed for releases newer than IBEX 3.1.0. This section contains instructions for both versions. You can see your client version under* ``Help > About`` *in the IBEX Window.* The [[KeyConceptsinIBEX]] page describes what an IOC is. In general, you will only wish to include a sub-set of these in your configuration (i.e. those that correspond to devices on your instrument). @@ -113,8 +113,6 @@ Newer Versions: - The "Add IOC"-button opens a dialog which lets you choose from a list of all IOCs available on the instrument. Confirming your selection will take you to the "Edit IOC" dialog for the selected IOC. - The "Delete IOC"-button allows you to delete IOCs from the list and the configuration. This works with multiple selection, too. - - Return to `Contents`_. Blocks Tab From b1c541e9607cb8fdbb1543e9804a3cc5e5155947 Mon Sep 17 00:00:00 2001 From: Thomas Lohnert Date: Wed, 8 Feb 2017 14:28:15 +0000 Subject: [PATCH 0474/1813] Updated CreateandManageConfigurations (rest) --- CreateandManageConfigurations.rest | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/CreateandManageConfigurations.rest b/CreateandManageConfigurations.rest index fb9b9e6..ba86ef1 100644 --- a/CreateandManageConfigurations.rest +++ b/CreateandManageConfigurations.rest @@ -197,7 +197,7 @@ Return to `Contents`_. IOC Macros ~~~~~~~~~~ -*Note: In Ibex versions newer than 3.1.0 the IOC macros tab has been moved into the new "Edit IOC"-Dialog. See section* `IOCs Tab`_. +*Note: In Ibex versions newer than 3.1.0 the IOC macros are directly set from the new "Edit IOC"-Dialog. See also section* `IOCs Tab`_. IOC Macros are configurable values that IBEX can supply to the IOC when the IOC is started. For example, if the IOC is controlling a serial device attached to a COM port, you can use an macro to identify the appropriate port to the IOC. This is especially useful if the device moves between instruments and may be attached to different COM ports on different instruments. Another example of an IOC macro might be the name of a calibration file. @@ -222,7 +222,7 @@ Return to `Contents`_. IOC PV Values ~~~~~~~~~~~~~ -*Note: In Ibex versions newer than 3.1.0 the IOC PV Values tab has been moved into the new "Edit IOC"-Dialog. See section* `IOCs Tab`_. +*Note: In Ibex versions newer than 3.1.0 the IOC PV Values are directly set from the new "Edit IOC"-Dialog. See also section* `IOCs Tab`_. IOC PV Values allows you to set the values of a PV when the configuration is first loaded. For example setting a experimental parameter on first load. @@ -232,7 +232,7 @@ Return to `Contents`_. IOC PV Sets ~~~~~~~~~~~ -*Note: In Ibex versions newer than 3.1.0 the IOC PV Sets tab has been moved into the new "Edit IOC"-Dialog. See section* `IOCs Tab`_. +*Note: In Ibex versions newer than 3.1.0, PV Sets are directly set from the new "Edit IOC"-Dialog. See also section* `IOCs Tab`_. IOC PV Sets is an experimental feature within IBEX **do not** use this before talking to the IBEX team. It can be used to load in autosaved values from a specific file setup beforehand. From c455d375028c564d5cb3cde5682e284b17c2dc18 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Mon, 27 Feb 2017 14:47:17 +0000 Subject: [PATCH 0475/1813] Updated Scripting (rest) --- Scripting.rest | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/Scripting.rest b/Scripting.rest index b4690de..586a739 100644 --- a/Scripting.rest +++ b/Scripting.rest @@ -200,15 +200,7 @@ For the most part, this is the same as Script directory ~~~~~~~~~~~~~~~~ -Unlike user scripts, instrument scripts should be placed in -``C:\Instrument\Settings\config\[MACHINE_NAME]\Python``. Once the script -has been created, edit the file ``inst.py`` in the same directory and -add the line ``from [MY_FILE] import *`` where ``[MY_FILE]`` is the name -of your file without the ``.py`` file extension. This will include the -new script in the list of scripts loaded at startup. Best to avoid file -names containing spaces, it `can be -done `__ -but it's easier to just not do it. +Instrument scripts should be placed in ``C:\Instrument\Settings\config\[MACHINE_NAME]\Python\inst``. O Script structure ~~~~~~~~~~~~~~~~ From 2d6b70a469f2a3fc964cf805ae19d01a1c675ca7 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Mon, 27 Feb 2017 14:48:04 +0000 Subject: [PATCH 0476/1813] Updated Scripting (rest) --- Scripting.rest | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Scripting.rest b/Scripting.rest index 586a739..5f3c34a 100644 --- a/Scripting.rest +++ b/Scripting.rest @@ -200,7 +200,7 @@ For the most part, this is the same as Script directory ~~~~~~~~~~~~~~~~ -Instrument scripts should be placed in ``C:\Instrument\Settings\config\[MACHINE_NAME]\Python\inst``. O +Instrument scripts should be placed in ``C:\Instrument\Settings\config\[MACHINE_NAME]\Python\inst``. Script structure ~~~~~~~~~~~~~~~~ From ed5fe0e6e4ea73c75faead078bf83c57d51f8d77 Mon Sep 17 00:00:00 2001 From: John Holt Date: Tue, 28 Mar 2017 12:05:35 +0100 Subject: [PATCH 0477/1813] Updated CreateandManageConfigurations (rest) --- CreateandManageConfigurations.rest | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/CreateandManageConfigurations.rest b/CreateandManageConfigurations.rest index ba86ef1..47d132c 100644 --- a/CreateandManageConfigurations.rest +++ b/CreateandManageConfigurations.rest @@ -3,7 +3,7 @@ Create & Manage Configurations ================================ -A configuration is the means by which an instrument is described and defined to IBEX. A configuration defines the blocks, IOCs, components, macros and other items which IBEX needs to use in order to control the instrument. You can create multiple configurations for an instrument, to describe and define how the instrument has been set up for different experiments. +A configuration is the means by which an instrument is described and defined to IBEX. A configuration defines the blocks, IOCs, components, macros and other items which IBEX needs to use in order to control the instrument. You can create multiple configurations for an instrument, to describe and define how the instrument has been set up for different experiments. In some cases there are macro settings which are global for the instrument these are set outside of the GUI and override the values in the configuration. These are setting which should not change, e.g. the IP address of the Galil motors (see the section below on how to alter these). **Please note:** An IBEX configuration is **not** the same as a Mantid configuration. IBEX and Mantid view instruments in fundamentally different ways, which means that their respective configurations are not interchangeable. @@ -25,6 +25,7 @@ Contents #. `Edit Current Configuration ...`_ #. `Load a Configuration`_ #. `Delete a Configuration`_ +#. `Editing a global setting`_ Creating a Configuration ------------------------ @@ -297,4 +298,15 @@ To delete a configuration: **Note 2:** When you delete a configuration it really is deleted. It is no longer available to be used by IBEX. Before deleting a configuration, please be sure that you really do want to delete it. If you unintentionally delete a configuration, please contact the Experimental Controls team - it may be possible to recover the deleted configuration. -Return to `Contents`_. + + +Editing a global setting +-------------------- + +Global setting are stored in the configuration directory in a file called `globals.txt` file (\\config\\\\configurations). Lines in the file starting with a '#' are comments. Settings are expressed by a line + +`__=` + +where IOC Name is the name of the IOC on which the macro is set, macro name is the name of the macro and value is the value is should have. (NB that is a double underscore). + +Return to `Contents`_. \ No newline at end of file From fca0a497b0a9835a29167ef87ba27b5dd833d846 Mon Sep 17 00:00:00 2001 From: kjwoodsISIS Date: Tue, 28 Mar 2017 12:19:57 +0100 Subject: [PATCH 0478/1813] Updated CreateandManageConfigurations (rest) --- CreateandManageConfigurations.rest | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CreateandManageConfigurations.rest b/CreateandManageConfigurations.rest index 47d132c..85c964d 100644 --- a/CreateandManageConfigurations.rest +++ b/CreateandManageConfigurations.rest @@ -301,9 +301,9 @@ To delete a configuration: Editing a global setting --------------------- +------------------------ -Global setting are stored in the configuration directory in a file called `globals.txt` file (\\config\\\\configurations). Lines in the file starting with a '#' are comments. Settings are expressed by a line +Global settings are stored in the configuration directory in a file called `globals.txt` file (\\config\\\\configurations). Lines in the file starting with a '#' are comments. Settings are expressed by a line `__=` From 28bc47ee7cc8e2fcbf2942a4e964076306ecb78e Mon Sep 17 00:00:00 2001 From: kjwoodsISIS Date: Tue, 28 Mar 2017 13:39:16 +0100 Subject: [PATCH 0479/1813] Updated CreateandManageConfigurations (rest) --- CreateandManageConfigurations.rest | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CreateandManageConfigurations.rest b/CreateandManageConfigurations.rest index 85c964d..a20cd18 100644 --- a/CreateandManageConfigurations.rest +++ b/CreateandManageConfigurations.rest @@ -170,7 +170,7 @@ Logging Settings **PREVIOUS VERSIONS OF IBEX:** In releases 2.1.0 or earlier, the logging is disabled by default. -**Note:** Blocks that have been inherited from a component will be shown, but cannot be cannot be modified, in the Edit Configuration dialog (the blocks will be shown as "greyed-out"). To modify inherited blocks you need to use the Edit Component dialog (see [[CreateandManageComponents]]). +**Note:** Blocks that have been inherited from a component will be shown, but cannot be modified, in the Edit Configuration dialog (the blocks will be shown as "greyed-out"). To modify inherited blocks you need to use the Edit Component dialog (see [[CreateandManageComponents]]). Return to `Contents`_. @@ -303,7 +303,7 @@ To delete a configuration: Editing a global setting ------------------------ -Global settings are stored in the configuration directory in a file called `globals.txt` file (\\config\\\\configurations). Lines in the file starting with a '#' are comments. Settings are expressed by a line +Global settings are stored in the configuration directory in a file called `globals.txt` file (`\\config\\\\configurations`). Lines in the file starting with a '#' are comments. Settings are expressed by a line `__=` From 05df580c7a07a897fe2719c436a8520eb0e04086 Mon Sep 17 00:00:00 2001 From: kjwoodsISIS Date: Tue, 28 Mar 2017 13:40:01 +0100 Subject: [PATCH 0480/1813] Updated CreateandManageConfigurations (rest) --- CreateandManageConfigurations.rest | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CreateandManageConfigurations.rest b/CreateandManageConfigurations.rest index a20cd18..78ee378 100644 --- a/CreateandManageConfigurations.rest +++ b/CreateandManageConfigurations.rest @@ -303,9 +303,9 @@ To delete a configuration: Editing a global setting ------------------------ -Global settings are stored in the configuration directory in a file called `globals.txt` file (`\\config\\\\configurations`). Lines in the file starting with a '#' are comments. Settings are expressed by a line +Global settings are stored in the configuration directory in a file called ``globals.txt`` file (``\\config\\\\configurations``). Lines in the file starting with a '#' are comments. Settings are expressed by a line -`__=` +``__=`` where IOC Name is the name of the IOC on which the macro is set, macro name is the name of the macro and value is the value is should have. (NB that is a double underscore). From f0c461af1142d6ac428f2e859f257c3b79a6e70e Mon Sep 17 00:00:00 2001 From: kjwoodsISIS Date: Tue, 28 Mar 2017 13:41:25 +0100 Subject: [PATCH 0481/1813] Updated CreateandManageConfigurations (rest) --- CreateandManageConfigurations.rest | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CreateandManageConfigurations.rest b/CreateandManageConfigurations.rest index 78ee378..1722580 100644 --- a/CreateandManageConfigurations.rest +++ b/CreateandManageConfigurations.rest @@ -303,10 +303,10 @@ To delete a configuration: Editing a global setting ------------------------ -Global settings are stored in the configuration directory in a file called ``globals.txt`` file (``\\config\\\\configurations``). Lines in the file starting with a '#' are comments. Settings are expressed by a line +Global settings are stored in the configuration directory in a file called ``globals.txt`` (the configuration directory is ``\\config\\\\configurations``). Lines in the file starting with a '#' are comments. Settings are expressed by a line ``__=`` -where IOC Name is the name of the IOC on which the macro is set, macro name is the name of the macro and value is the value is should have. (NB that is a double underscore). +where IOC Name is the name of the IOC on which the macro is set, macro name is the name of the macro and value is the value is should have. (*N.B.* that is a double underscore). Return to `Contents`_. \ No newline at end of file From d9ced303d0a6a4517e0adadc854f7c0fcb428695 Mon Sep 17 00:00:00 2001 From: kjwoodsISIS Date: Tue, 28 Mar 2017 13:41:56 +0100 Subject: [PATCH 0482/1813] Updated CreateandManageConfigurations (rest) --- CreateandManageConfigurations.rest | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CreateandManageConfigurations.rest b/CreateandManageConfigurations.rest index 1722580..160b086 100644 --- a/CreateandManageConfigurations.rest +++ b/CreateandManageConfigurations.rest @@ -307,6 +307,6 @@ Global settings are stored in the configuration directory in a file called ``glo ``__=`` -where IOC Name is the name of the IOC on which the macro is set, macro name is the name of the macro and value is the value is should have. (*N.B.* that is a double underscore). +where IOC Name is the name of the IOC on which the macro is set, macro name is the name of the macro and value is the value is should have. (**N.B.** that is a double underscore). Return to `Contents`_. \ No newline at end of file From fe935b723a79b3aa5f6d31f19931dcc0925bd0e5 Mon Sep 17 00:00:00 2001 From: kjwoodsISIS Date: Tue, 28 Mar 2017 13:44:29 +0100 Subject: [PATCH 0483/1813] Updated CreateandManageConfigurations (rest) --- CreateandManageConfigurations.rest | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CreateandManageConfigurations.rest b/CreateandManageConfigurations.rest index 160b086..2f2843d 100644 --- a/CreateandManageConfigurations.rest +++ b/CreateandManageConfigurations.rest @@ -307,6 +307,6 @@ Global settings are stored in the configuration directory in a file called ``glo ``__=`` -where IOC Name is the name of the IOC on which the macro is set, macro name is the name of the macro and value is the value is should have. (**N.B.** that is a double underscore). +where ``IOC name`` is the name of the IOC on which the macro is set, ``Macro name`` is the name of the macro and value is the value it should have. (**N.B.** that is a double underscore between ``IOC name`` and ``Macro name``). Return to `Contents`_. \ No newline at end of file From c821f23ec4a14002b735495a0139cdabebda64a2 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Thu, 6 Apr 2017 12:42:40 +0100 Subject: [PATCH 0484/1813] Updated Scripting (rest) --- Scripting.rest | 47 ++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 46 insertions(+), 1 deletion(-) diff --git a/Scripting.rest b/Scripting.rest index 5f3c34a..98a4d56 100644 --- a/Scripting.rest +++ b/Scripting.rest @@ -16,6 +16,7 @@ beginner and novice user. - `Creating and running user scripts <#creating-and-running-user-scripts>`__ - `Tips from the developers <#tips-from-the-developers>`__ +- `Some examples <#some-examples>`__ There is also some specific [[scripting advice for the Muon Front End|MuonFEScriptGuidance]] @@ -362,4 +363,48 @@ is wrong and wouldn't work. Instead, we could have written: g.change_monitor(1,high=10,low=0) which would have worked and makes it clear for whoever comes to edit the -code in future (hint: that person might be you!). \ No newline at end of file +code in future (hint: that person might be you!). + +Some examples +======================== + +Reads the power of a temperature controller and gradually ramp it down over a few minutes + +:: + + from genie_python import g + + def ramp(time, block_name, steps=100, final_value=0.0): + """ + Moves a block between an initial and target value over a sequence of steps, waiting a fixed time at each step. + + :param time: The overall time to take to ramp. Time will be split evenly between steps + :param nsteps: The number of steps to take during the ramp + :param block_name: The name of the block whose value to set + :param final_value: The value we want to ramp to + """ + + initial_value = g.cget(block_name) + if initial_value is None: + print "Unable to determine temperature from block {0}. No action will be taken".format(block_name) + + step_value = initial_value + step_size = (final_value - initial_value)/steps + step_duration = time/steps + + def values_match(v1, v2): + tolerance = 0.001 + small = 1.0e-20 + return 2*abs(v1-v2)/(abs(v1)+abs(v2)+small) < tolerance + + while not values_match(step_value, final_value): + step_value += step_size + g.cset(block_name, step_value) + print "Ramping to: {0} Target value: {1}".format(step_value, final_value) + g.waitfor_time(seconds=step_duration) + new_block_value = g.cget(block_name) + if not values_match(new_block_value, step_value): + print "WARNING: The current value for block {0}, {1}, does not match the target value of {2}".format(block_name, new_block_value, step_value) + + print "Ramp complete" + \ No newline at end of file From c6eb9721d9db1b638fe5dd3b4d4829bf433f0d1d Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Thu, 6 Apr 2017 12:57:00 +0100 Subject: [PATCH 0485/1813] Updated Scripting (rest) --- Scripting.rest | 28 ++++++++++++++++++++++++++-- 1 file changed, 26 insertions(+), 2 deletions(-) diff --git a/Scripting.rest b/Scripting.rest index 98a4d56..9900525 100644 --- a/Scripting.rest +++ b/Scripting.rest @@ -368,11 +368,35 @@ code in future (hint: that person might be you!). Some examples ======================== -Reads the power of a temperature controller and gradually ramp it down over a few minutes +Sequentially sets a position (e.g. sample changer) and waits for a fixed number of uamps :: - from genie_python import g + + from genie_python import genie as g + + def loop_over_samples(block_name, position_names, charge_to_wait_for): + """ + Begins a run. Loops over a set of sample positions. Ends the run + + :param block_name: The name of the block containing the sample position + :param position_names: A collection of the positions to loop over + :param uamps_to_wait_for: The number of uamps to wait for between samples + """ + g.begin() + total_charge_to_wait_for = 0 + for position_name in position_names: + print "Moving sample changer to position: {0}".format(position_name) + g.cset(block_name, position_name) + total_charge_to_wait_for += charge_to_wait_for + g.waitfor_uamps(total_charge_to_wait_for) + g.end() + +Reads the value of a block and moves it through a series of intervals to a new values taking a fixed time + +:: + + from genie_python import genie as g def ramp(time, block_name, steps=100, final_value=0.0): """ From 97a9e29ee04a3d579c0c3866fceb016e6e5a9d2c Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Thu, 6 Apr 2017 13:00:12 +0100 Subject: [PATCH 0486/1813] Updated Scripting (rest) --- Scripting.rest | 1 + 1 file changed, 1 insertion(+) diff --git a/Scripting.rest b/Scripting.rest index 9900525..d1d96c3 100644 --- a/Scripting.rest +++ b/Scripting.rest @@ -411,6 +411,7 @@ Reads the value of a block and moves it through a series of intervals to a new v initial_value = g.cget(block_name) if initial_value is None: print "Unable to determine temperature from block {0}. No action will be taken".format(block_name) + return step_value = initial_value step_size = (final_value - initial_value)/steps From 449e9002cf1a59c64b124849d5e0ccc691fbb616 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Thu, 6 Apr 2017 13:43:14 +0100 Subject: [PATCH 0487/1813] Updated Scripting (rest) --- Scripting.rest | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Scripting.rest b/Scripting.rest index d1d96c3..495f2e1 100644 --- a/Scripting.rest +++ b/Scripting.rest @@ -408,7 +408,7 @@ Reads the value of a block and moves it through a series of intervals to a new v :param final_value: The value we want to ramp to """ - initial_value = g.cget(block_name) + initial_value = g.cget(block_name)['value'] if initial_value is None: print "Unable to determine temperature from block {0}. No action will be taken".format(block_name) return From 27d5dc350fe5308db28a81e5e20ee538a72083c7 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Thu, 6 Apr 2017 13:44:28 +0100 Subject: [PATCH 0488/1813] Updated Scripting (rest) --- Scripting.rest | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Scripting.rest b/Scripting.rest index 495f2e1..41f748c 100644 --- a/Scripting.rest +++ b/Scripting.rest @@ -427,7 +427,7 @@ Reads the value of a block and moves it through a series of intervals to a new v g.cset(block_name, step_value) print "Ramping to: {0} Target value: {1}".format(step_value, final_value) g.waitfor_time(seconds=step_duration) - new_block_value = g.cget(block_name) + new_block_value = g.cget(block_name)['value'] if not values_match(new_block_value, step_value): print "WARNING: The current value for block {0}, {1}, does not match the target value of {2}".format(block_name, new_block_value, step_value) From 84bda8cda02373b56460f7d363cc2452a613b98b Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Thu, 6 Apr 2017 13:49:17 +0100 Subject: [PATCH 0489/1813] Updated Scripting (rest) --- Scripting.rest | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/Scripting.rest b/Scripting.rest index 41f748c..6bb0a95 100644 --- a/Scripting.rest +++ b/Scripting.rest @@ -412,24 +412,21 @@ Reads the value of a block and moves it through a series of intervals to a new v if initial_value is None: print "Unable to determine temperature from block {0}. No action will be taken".format(block_name) return - - step_value = initial_value - step_size = (final_value - initial_value)/steps - step_duration = time/steps - + def values_match(v1, v2): tolerance = 0.001 small = 1.0e-20 return 2*abs(v1-v2)/(abs(v1)+abs(v2)+small) < tolerance - while not values_match(step_value, final_value): - step_value += step_size + step_duration = time/steps + for i in range(1, steps+1): + step_value = initial_value + (final_value - initial_value)/steps*i g.cset(block_name, step_value) print "Ramping to: {0} Target value: {1}".format(step_value, final_value) g.waitfor_time(seconds=step_duration) new_block_value = g.cget(block_name)['value'] if not values_match(new_block_value, step_value): print "WARNING: The current value for block {0}, {1}, does not match the target value of {2}".format(block_name, new_block_value, step_value) - + print "Ramp complete" \ No newline at end of file From eb55a886780196aef84c0dc523aa7b1490fc5ba3 Mon Sep 17 00:00:00 2001 From: John Holt Date: Wed, 12 Apr 2017 14:46:53 +0100 Subject: [PATCH 0490/1813] Updated Scripting (rest) --- Scripting.rest | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Scripting.rest b/Scripting.rest index 6bb0a95..94f34ea 100644 --- a/Scripting.rest +++ b/Scripting.rest @@ -233,6 +233,8 @@ script was: then the user could only access ``print_a()`` and the value could not be changed. +To reload the inst module, for instance if you had updated the script or added a new script, you should issue the command ``reload(inst)``. + Running ------- From 1d7a24adccb9c1462404c5a58254ae743f284ea6 Mon Sep 17 00:00:00 2001 From: John Holt Date: Fri, 21 Apr 2017 11:57:55 +0100 Subject: [PATCH 0491/1813] Updated StartandStopIOCs (rest) --- StartandStopIOCs.rest | 17 ++++------------- 1 file changed, 4 insertions(+), 13 deletions(-) diff --git a/StartandStopIOCs.rest b/StartandStopIOCs.rest index 773b6be..cc3c856 100644 --- a/StartandStopIOCs.rest +++ b/StartandStopIOCs.rest @@ -9,21 +9,12 @@ In order to communicate with a hardware device, the corresponding IOC must be ru Starting or Stopping an IOC --------------------------- -To start or stop an IOC: +To start, stop or restart an IOC: #. Select ``Start/Stop IOCs`` from the ``IOC`` menu. -#. IBEX displays a dialog containing two panes. - - #. The first pane is a list of all the IOCs available on the instrument. The list shows whether each IOC is running or stopped. - #. The second pane, below the list, allows you to start, stop or restart the selected IOC. - -#. Scroll down the list until you find the IOC you wish to start or stop. Select the IOC by clicking on it once. -#. The selected IOC is highlighted in the list and lower pane activates. -#. Click on - - #. the ``Start`` button to start an IOC that is currently stopped - #. the ``Stop`` button to stop an IOC that is currently running - #. the ``Restart`` button to restart an IOC that is currently running +#. IBEX displays a dialog containing a list of all the IOCs available on the instrument. The list shows whether each IOC is running or stopped. +#. Find the IOC you want in the list and use the buttons at the bottom to start, stop or restart that IOC. It might take a few moments from pressing the button for the selected IOC to fully start itself up or fully shut itself down. You might also see a number of messages written to the IOC Log (see [[Views]]) as the IOC starts up or shuts down. +NB The effect of auto-restart has no effect on the stop action. Stop will stop the IOC and it will not restart. \ No newline at end of file From fe55d02b0fcabdee81681c86670d83ceca072c71 Mon Sep 17 00:00:00 2001 From: John Holt Date: Fri, 28 Apr 2017 12:10:34 +0100 Subject: [PATCH 0492/1813] Updated FAQ (rest) --- FAQ.rest | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/FAQ.rest b/FAQ.rest index c5c990c..4caa247 100644 --- a/FAQ.rest +++ b/FAQ.rest @@ -18,6 +18,7 @@ List of Frequently Asked Questions #. `Where can I learn about Python?`_ #. `What do I look at if there are no RAW frames when Collecting Data?`_ #. `What do I look at if there are no GOOD frames when Collecting Data?`_ +#. `Can I change what my graphs look like in the log plotter or OPI?`_ .. _`How do I report a problem with IBEX?`: @@ -114,3 +115,15 @@ External veto{0-3}: could be an additional chopper, the shutter or moderator Return_ + +.. _`Can I change what my graphs look like in the log plotter or OPI?`: + +**Q: Can I change what my graphs look like in the log plotter or OPI?** + +**A: Yes**, there are lots of setting exposed by the native control. These include graph title, axis font type and size, trace line colour, line type and line width. To reach these settings + +#. Show the tool bar + #. In the log plotter view this is already shown + #. On an OPI right click and select Show/Hide Graph Toolbar +#. The click the settings button (left most icon with a spanner and screwdriver on it) +#. Click on the tabs to find what you want to change. Graph is the first panel, axes on the second and traces (with a drop down to select for which trace) is on the third From 8c027c83d8fcf929153cd9973c0414187c235ef1 Mon Sep 17 00:00:00 2001 From: John Holt Date: Fri, 28 Apr 2017 15:25:47 +0100 Subject: [PATCH 0493/1813] Updated Scripting (rest) --- Scripting.rest | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Scripting.rest b/Scripting.rest index 94f34ea..2ffa00e 100644 --- a/Scripting.rest +++ b/Scripting.rest @@ -367,6 +367,11 @@ is wrong and wouldn't work. Instead, we could have written: which would have worked and makes it clear for whoever comes to edit the code in future (hint: that person might be you!). +Making Errors Standout in Python Console +---------------------------------------- + +Python console will display most output in black this is from the standard out but will display error information in red. Error information should be written to standard error using `sys.stderr.write("error\n")`. + Some examples ======================== From d616d905537b6d057e548ffae81875969345ddcc Mon Sep 17 00:00:00 2001 From: John Holt Date: Thu, 8 Jun 2017 14:49:41 +0100 Subject: [PATCH 0494/1813] Updated Scripting (rest) --- Scripting.rest | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Scripting.rest b/Scripting.rest index 2ffa00e..358d3a8 100644 --- a/Scripting.rest +++ b/Scripting.rest @@ -48,6 +48,11 @@ Note that in many cases, arguments will be optional. For instance, arguments ``period``, ``meas_id``, ``meas_type``, ``meas_subid``, ``sample_id``, ``delayed``, ``quiet``, ``paused``, and ``verbose``. +Running in simulation mode +~~~~~~~~~~~~~~~~~~~~~~~~~~ + +It is possible to start genie python in a simulation mode too. To do this use the ``genie_python_simulate.bat`` found in ``C:\Instrument\Apps\Python``. This will simulate blocks and motor waits etc while not actually interacting with your instrument. The block names will be created on the fly so this will not validate your block names exist in the configuration or that they are writable too. However it will ensure that the python your have written is sensible. + Common genie\_python commands ============================= From efddc537be24dee4a92fbd8bcc077fa79938014d Mon Sep 17 00:00:00 2001 From: John Holt Date: Thu, 8 Jun 2017 14:54:59 +0100 Subject: [PATCH 0495/1813] Updated Scripting (rest) --- Scripting.rest | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Scripting.rest b/Scripting.rest index 358d3a8..e40312f 100644 --- a/Scripting.rest +++ b/Scripting.rest @@ -49,9 +49,9 @@ arguments ``period``, ``meas_id``, ``meas_type``, ``meas_subid``, ``sample_id``, ``delayed``, ``quiet``, ``paused``, and ``verbose``. Running in simulation mode -~~~~~~~~~~~~~~~~~~~~~~~~~~ +-------------------------- -It is possible to start genie python in a simulation mode too. To do this use the ``genie_python_simulate.bat`` found in ``C:\Instrument\Apps\Python``. This will simulate blocks and motor waits etc while not actually interacting with your instrument. The block names will be created on the fly so this will not validate your block names exist in the configuration or that they are writable too. However it will ensure that the python your have written is sensible. +Genie_python can be used in simulation mode. Simulation mode will allow you to run scripts but without changing items on your instrument. It does this by putting dummy commands in for some genie command, it also creates dummy blocks on the fly so that block values can be read and written to. NB This means that simulation can not be this will not validate your block names within the script. To run in simulation mode use the ``genie_python_simulate.bat`` found in ``C:\Instrument\Apps\Python``. Common genie\_python commands ============================= From 055071dd024f8b5391a6b75a56058bc155aa3191 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Wed, 28 Jun 2017 09:01:14 +0100 Subject: [PATCH 0496/1813] Created Introduction to scripting with genie_python (markdown) --- ...oduction-to-scripting-with-genie_python.md | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 Introduction-to-scripting-with-genie_python.md diff --git a/Introduction-to-scripting-with-genie_python.md b/Introduction-to-scripting-with-genie_python.md new file mode 100644 index 0000000..9586a46 --- /dev/null +++ b/Introduction-to-scripting-with-genie_python.md @@ -0,0 +1,26 @@ +# Contents + +# Starting a scripting session + +# Accessing genie_python commands + +# Controlling runs with genie_python + +# Controlling blocks with genie_python + +# Creating scripts + +## Instrument scripts + +## User scripts + + +# Open Genie: Compare and contrast + +## Commands + +## Arguments + +## Procedures vs. functions + +## Loops \ No newline at end of file From e89243989e8f09f6f713279df5d49f8f0dd65d41 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Wed, 28 Jun 2017 09:03:01 +0100 Subject: [PATCH 0497/1813] Updated Introduction to scripting with genie_python (markdown => rest) --- ...oduction-to-scripting-with-genie_python.md | 26 ------------- ...uction-to-scripting-with-genie_python.rest | 38 +++++++++++++++++++ 2 files changed, 38 insertions(+), 26 deletions(-) delete mode 100644 Introduction-to-scripting-with-genie_python.md create mode 100644 Introduction-to-scripting-with-genie_python.rest diff --git a/Introduction-to-scripting-with-genie_python.md b/Introduction-to-scripting-with-genie_python.md deleted file mode 100644 index 9586a46..0000000 --- a/Introduction-to-scripting-with-genie_python.md +++ /dev/null @@ -1,26 +0,0 @@ -# Contents - -# Starting a scripting session - -# Accessing genie_python commands - -# Controlling runs with genie_python - -# Controlling blocks with genie_python - -# Creating scripts - -## Instrument scripts - -## User scripts - - -# Open Genie: Compare and contrast - -## Commands - -## Arguments - -## Procedures vs. functions - -## Loops \ No newline at end of file diff --git a/Introduction-to-scripting-with-genie_python.rest b/Introduction-to-scripting-with-genie_python.rest new file mode 100644 index 0000000..edd1dde --- /dev/null +++ b/Introduction-to-scripting-with-genie_python.rest @@ -0,0 +1,38 @@ +Contents +======== + +Starting a scripting session +============================ + +Accessing genie_python commands +=============================== + +Controlling runs with genie_python +================================== + +Controlling blocks with genie_python +==================================== + +Creating scripts +================ + +Instrument scripts +------------------ + +User scripts +------------ + +Open Genie: Compare and contrast +================================ + +Commands +-------- + +Arguments +--------- + +Procedures vs. functions +------------------------ + +Loops +----- \ No newline at end of file From 1369b9652924719f843033d1af1fe173903812af Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Wed, 28 Jun 2017 09:37:03 +0100 Subject: [PATCH 0498/1813] Updated Introduction to scripting with genie_python (rest) --- ...uction-to-scripting-with-genie_python.rest | 66 ++++++++++++++++--- 1 file changed, 57 insertions(+), 9 deletions(-) diff --git a/Introduction-to-scripting-with-genie_python.rest b/Introduction-to-scripting-with-genie_python.rest index edd1dde..aac5f32 100644 --- a/Introduction-to-scripting-with-genie_python.rest +++ b/Introduction-to-scripting-with-genie_python.rest @@ -4,24 +4,62 @@ Contents Starting a scripting session ============================ -Accessing genie_python commands -=============================== +The best way to run ``genie_python`` commands is from the scripting perspective of the Ibex client. -Controlling runs with genie_python -================================== +To open a scripting window: -Controlling blocks with genie_python -==================================== +1. Start the Ibex client +2. Open the scripting perspective:: + IMAGE: OpenTheScriptingPerspective -Creating scripts -================ +**Exercise 1** +-------------- +- Open a scripting window in Ibex +- Write some simple Python commands to calculate the square of all the integers between 1 and 10 + +You can also open a scripting terminal by running ``C:\Instrument\Apps\Python\genie_python.bat``. This will not provide some advanced features such as auto-complete though, and is recommended for advanced users only. + + +Accessing ``genie_python`` commands +=================================== + +Basic commands +============== + +Instrument control +------------------ + +Blocks +------ + +Run control +----------- + +Experiment setup +---------------- + + +Creating and running scripts +============================ Instrument scripts ------------------ +Create +~~~~~~ + +Run +~~~ + User scripts ------------ +Create +~~~~~~ + +Run +~~~ + Open Genie: Compare and contrast ================================ @@ -35,4 +73,14 @@ Procedures vs. functions ------------------------ Loops ------ \ No newline at end of file +----- + +Exercise notes +============== + +Exercise 1 +---------- +- Opening a scripting window should hopefully not be problematic +- Check for any unexpected output while the scripting window sets the instrument:: + IMAGE: StandardStartupOutputOnDemo + From e4efa4ebb40cc285452239b0d0139f03db3ab9dc Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Wed, 28 Jun 2017 09:37:16 +0100 Subject: [PATCH 0499/1813] Updated Introduction to scripting with genie_python (rest) --- Introduction-to-scripting-with-genie_python.rest | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Introduction-to-scripting-with-genie_python.rest b/Introduction-to-scripting-with-genie_python.rest index aac5f32..1595ef5 100644 --- a/Introduction-to-scripting-with-genie_python.rest +++ b/Introduction-to-scripting-with-genie_python.rest @@ -9,7 +9,8 @@ The best way to run ``genie_python`` commands is from the scripting perspective To open a scripting window: 1. Start the Ibex client -2. Open the scripting perspective:: +2. Open the scripting perspective +:: IMAGE: OpenTheScriptingPerspective **Exercise 1** From 338477cb2424b7a221bc6a1194e1b8e0c99440c5 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Wed, 28 Jun 2017 09:37:26 +0100 Subject: [PATCH 0500/1813] Updated Introduction to scripting with genie_python (rest) --- Introduction-to-scripting-with-genie_python.rest | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Introduction-to-scripting-with-genie_python.rest b/Introduction-to-scripting-with-genie_python.rest index 1595ef5..d9e2e2c 100644 --- a/Introduction-to-scripting-with-genie_python.rest +++ b/Introduction-to-scripting-with-genie_python.rest @@ -82,6 +82,7 @@ Exercise notes Exercise 1 ---------- - Opening a scripting window should hopefully not be problematic -- Check for any unexpected output while the scripting window sets the instrument:: +- Check for any unexpected output while the scripting window sets the instrument +:: IMAGE: StandardStartupOutputOnDemo From 900522f403aaea4cfa50d3834949776b22ba0591 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Wed, 28 Jun 2017 09:37:42 +0100 Subject: [PATCH 0501/1813] Updated Introduction to scripting with genie_python (rest) --- Introduction-to-scripting-with-genie_python.rest | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Introduction-to-scripting-with-genie_python.rest b/Introduction-to-scripting-with-genie_python.rest index d9e2e2c..105f072 100644 --- a/Introduction-to-scripting-with-genie_python.rest +++ b/Introduction-to-scripting-with-genie_python.rest @@ -85,4 +85,6 @@ Exercise 1 - Check for any unexpected output while the scripting window sets the instrument :: IMAGE: StandardStartupOutputOnDemo +:: + IMAGE: OpenTheScriptingPerspective From 1a4b1350413d076e0f0de16411c9c4be66d7ab37 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Wed, 28 Jun 2017 09:37:58 +0100 Subject: [PATCH 0502/1813] Updated Introduction to scripting with genie_python (rest) --- Introduction-to-scripting-with-genie_python.rest | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Introduction-to-scripting-with-genie_python.rest b/Introduction-to-scripting-with-genie_python.rest index 105f072..4ef00ab 100644 --- a/Introduction-to-scripting-with-genie_python.rest +++ b/Introduction-to-scripting-with-genie_python.rest @@ -83,8 +83,7 @@ Exercise 1 ---------- - Opening a scripting window should hopefully not be problematic - Check for any unexpected output while the scripting window sets the instrument + :: IMAGE: StandardStartupOutputOnDemo -:: - IMAGE: OpenTheScriptingPerspective From 166c802f05bc290adb57de818924be1b45a55dcc Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Wed, 28 Jun 2017 10:17:58 +0100 Subject: [PATCH 0503/1813] Updated Introduction to scripting with genie_python (rest) --- ...uction-to-scripting-with-genie_python.rest | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/Introduction-to-scripting-with-genie_python.rest b/Introduction-to-scripting-with-genie_python.rest index 4ef00ab..c1003dc 100644 --- a/Introduction-to-scripting-with-genie_python.rest +++ b/Introduction-to-scripting-with-genie_python.rest @@ -10,13 +10,15 @@ To open a scripting window: 1. Start the Ibex client 2. Open the scripting perspective + :: IMAGE: OpenTheScriptingPerspective **Exercise 1** -------------- - Open a scripting window in Ibex -- Write some simple Python commands to calculate the square of all the integers between 1 and 10 +- Output "Hello, world!" to the console +- Calculate and output the square of all the integers between 1 and 10 You can also open a scripting terminal by running ``C:\Instrument\Apps\Python\genie_python.bat``. This will not provide some advanced features such as auto-complete though, and is recommended for advanced users only. @@ -81,9 +83,18 @@ Exercise notes Exercise 1 ---------- -- Opening a scripting window should hopefully not be problematic -- Check for any unexpected output while the scripting window sets the instrument - +- Open a scripting window in Ibex + - Should be straightforward if Ibex is correctly installed. + - Ideally the instrument will appear as ``SETUP`` + - The output when the scripting window opens should look a bit like this: :: IMAGE: StandardStartupOutputOnDemo +- Output "Hello, world!" to the console + - Enter something like ``print "Hello, World!`` and press return +- Calculate and output the square of all the integers between 1 and 10 + - This is best achieved with the following loop: +:: + for i in range(1,11): + print i*i + - A **blank line** will indicate to the scripting window that you've finished writing the loop and it can go ahead and execute it \ No newline at end of file From 5997ac7c0080ce2c1e32410428c3958f5ef920e7 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Wed, 28 Jun 2017 10:27:35 +0100 Subject: [PATCH 0504/1813] Updated Introduction to scripting with genie_python (rest) --- ...uction-to-scripting-with-genie_python.rest | 27 ++++++++++++++++--- 1 file changed, 24 insertions(+), 3 deletions(-) diff --git a/Introduction-to-scripting-with-genie_python.rest b/Introduction-to-scripting-with-genie_python.rest index c1003dc..02b725f 100644 --- a/Introduction-to-scripting-with-genie_python.rest +++ b/Introduction-to-scripting-with-genie_python.rest @@ -14,6 +14,8 @@ To open a scripting window: :: IMAGE: OpenTheScriptingPerspective +3. From here, you can start entering Python code. It will be executed line by line as you enter it. + **Exercise 1** -------------- - Open a scripting window in Ibex @@ -22,16 +24,35 @@ To open a scripting window: You can also open a scripting terminal by running ``C:\Instrument\Apps\Python\genie_python.bat``. This will not provide some advanced features such as auto-complete though, and is recommended for advanced users only. - Accessing ``genie_python`` commands =================================== -Basic commands -============== +Where Ibex has been installed correctly on your machine, ``genie_python`` commands can be accessed via the ``g`` namespace. Try entering ``g.get_version()``. + +You should have noticed when you typed ``g.`` that an autocomplete window appeared: + +:: + IMAGE: AutoCompleteWindowBasic + +The window lists the available commands, and the arguments they take in brackets. You also notice that a description of the highlighted functions and its arguments is also given. Instrument control ------------------ +Instrument control commands let you switch between experimental states. The most common commands are: + +- ``g.begin()`` +- ``g.pause()`` +- ``g.resume()`` +- ``g.end()`` +- ``g.abort()`` + +You can also update and store results using: + +- ``g.update()`` +- ``g.store()`` +- ``g.updatestore()`` (does both an update and a store) + Blocks ------ From 3cbb4e570aa65eb62c4cabec58b591f6b65baf79 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Wed, 28 Jun 2017 10:47:39 +0100 Subject: [PATCH 0505/1813] Updated Introduction to scripting with genie_python (rest) --- Introduction-to-scripting-with-genie_python.rest | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/Introduction-to-scripting-with-genie_python.rest b/Introduction-to-scripting-with-genie_python.rest index 02b725f..3d42c4d 100644 --- a/Introduction-to-scripting-with-genie_python.rest +++ b/Introduction-to-scripting-with-genie_python.rest @@ -62,6 +62,20 @@ Run control Experiment setup ---------------- +**Exercise 3** +-------------- +- This exercise requires the following pre-requisites. These should be satisfied if you are following this as part of the Ibex-run training course: + - You have permission to begin and end runs on the instrument you're using. + - The instrument your using has been configured so it can successfully enter a running state + - You have a settable block called "MY_BLOCK" +- From the scripting perspective, complete the following actions: + - Change the title of the run to "Exercise 3" + - Begin a new run + - Pause the run + - Set the value of "MY_BLOCK" to 5 + - Resume the run + - End the run + Creating and running scripts ============================ From 8f9f6a80ba860efc44103fe657a240a9594ed3b3 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Wed, 28 Jun 2017 10:51:19 +0100 Subject: [PATCH 0506/1813] Updated Introduction to scripting with genie_python (rest) --- ...duction-to-scripting-with-genie_python.rest | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/Introduction-to-scripting-with-genie_python.rest b/Introduction-to-scripting-with-genie_python.rest index 3d42c4d..53ad4f9 100644 --- a/Introduction-to-scripting-with-genie_python.rest +++ b/Introduction-to-scripting-with-genie_python.rest @@ -41,17 +41,19 @@ Instrument control Instrument control commands let you switch between experimental states. The most common commands are: -- ``g.begin()`` -- ``g.pause()`` -- ``g.resume()`` -- ``g.end()`` -- ``g.abort()`` +- ``begin``: Begins a new run +- ``pause``: Pauses the current run +- ``resume``: Resumes the current run +- ``end``: Ends the current run +- ``abort``: Aborts the current run You can also update and store results using: -- ``g.update()`` -- ``g.store()`` -- ``g.updatestore()`` (does both an update and a store) +- ``update``: Load the data from the DAE into memory +- ``store``: Write the updated DAE information to disk +- ``updatestore``: Load the data from the DAE into memory and store it to disk + +Each of the commands above accepts an optional ``boolean`` parameter. Setting it to ``True`` (e.g. ``g.begin(True)``) will give extra output from the DAE. Blocks ------ From 92bc45257c4dd1373c1645f6c92791cf8c1661d5 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Wed, 28 Jun 2017 10:52:09 +0100 Subject: [PATCH 0507/1813] Updated Introduction to scripting with genie_python (rest) --- Introduction-to-scripting-with-genie_python.rest | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/Introduction-to-scripting-with-genie_python.rest b/Introduction-to-scripting-with-genie_python.rest index 53ad4f9..4c30ab6 100644 --- a/Introduction-to-scripting-with-genie_python.rest +++ b/Introduction-to-scripting-with-genie_python.rest @@ -53,6 +53,13 @@ You can also update and store results using: - ``store``: Write the updated DAE information to disk - ``updatestore``: Load the data from the DAE into memory and store it to disk +As an example, you can begin and then immediately end a run by calling the following commands: + +:: + g.begin() + g.end() + + Each of the commands above accepts an optional ``boolean`` parameter. Setting it to ``True`` (e.g. ``g.begin(True)``) will give extra output from the DAE. Blocks From 06b57c21c9ec0ae86bdb2027965a02645e8aa946 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Wed, 28 Jun 2017 10:56:55 +0100 Subject: [PATCH 0508/1813] Updated Introduction to scripting with genie_python (rest) --- Introduction-to-scripting-with-genie_python.rest | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Introduction-to-scripting-with-genie_python.rest b/Introduction-to-scripting-with-genie_python.rest index 4c30ab6..0f49200 100644 --- a/Introduction-to-scripting-with-genie_python.rest +++ b/Introduction-to-scripting-with-genie_python.rest @@ -71,7 +71,7 @@ Run control Experiment setup ---------------- -**Exercise 3** +**Exercise 2** -------------- - This exercise requires the following pre-requisites. These should be satisfied if you are following this as part of the Ibex-run training course: - You have permission to begin and end runs on the instrument you're using. From 67d89053f28c2a072a7073dcba158cf7a3bdb56c Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Wed, 28 Jun 2017 11:13:20 +0100 Subject: [PATCH 0509/1813] Updated Introduction to scripting with genie_python (rest) --- Introduction-to-scripting-with-genie_python.rest | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/Introduction-to-scripting-with-genie_python.rest b/Introduction-to-scripting-with-genie_python.rest index 0f49200..71b4d75 100644 --- a/Introduction-to-scripting-with-genie_python.rest +++ b/Introduction-to-scripting-with-genie_python.rest @@ -65,6 +65,22 @@ Each of the commands above accepts an optional ``boolean`` parameter. Setting it Blocks ------ +- ``get_blocks``: Gets a list of the currently available blocks +- ``cshow``: + - Given the name of the block (e.g. `g.chsow("MY_BLOCK")`) it will give a string output of the current settings for that block (e.g. ``MY_BLOCK = 10 (runcontrol = NO, lowlimit = 0.0, highlimit = 0.0)``) + - If called without arguments, it will show the same information for all blocks, with each block on a new line +- ``cget``: + - Returns settings for a named block as a dictionary of values (e.g. ``MY_BLOCK = 10 (runcontrol = NO, lowlimit = 0.0, highlimit = 0.0)``) + - Unlike ``cshow``, a block name must be specified`` + - Values can be accessed as standard Python: + +:: + block_info = g.cget("MY_BLOCK") + name = block_info("name") + value = block_info("value") + print "The value of block {0} is {1}".format(name, value) + + Run control ----------- From 4c898ff85ab2c9848a1a106cf30908cf67de3980 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Wed, 28 Jun 2017 11:18:30 +0100 Subject: [PATCH 0510/1813] Updated Introduction to scripting with genie_python (rest) --- Introduction-to-scripting-with-genie_python.rest | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/Introduction-to-scripting-with-genie_python.rest b/Introduction-to-scripting-with-genie_python.rest index 71b4d75..4e3c624 100644 --- a/Introduction-to-scripting-with-genie_python.rest +++ b/Introduction-to-scripting-with-genie_python.rest @@ -72,13 +72,21 @@ Blocks - ``cget``: - Returns settings for a named block as a dictionary of values (e.g. ``MY_BLOCK = 10 (runcontrol = NO, lowlimit = 0.0, highlimit = 0.0)``) - Unlike ``cshow``, a block name must be specified`` - - Values can be accessed as standard Python: + - Properties can be accessed as standard Python: :: block_info = g.cget("MY_BLOCK") name = block_info("name") value = block_info("value") print "The value of block {0} is {1}".format(name, value) + +- ``cset`` + - Sets the value for a particular block + - Assumes that either a setpoint exists for the underlying value or the block itself points at a setpoint + - Can be called with block names as named arguments. This is useful for setting multiple blocks + - Example: ``g.cset(MY_BLOCK=1, MY_OTHER_BLOCK=2)`` + - The block can also be passed in by name. This is useful when setting advanced block properties: + - Example: ``g.cset("MY_BLOCK", lowlimit=1, highlimit=10, runcontrol=True)`` Run control From b35ffb52135e6038a880638e5d4d29c478d16275 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Wed, 28 Jun 2017 11:24:24 +0100 Subject: [PATCH 0511/1813] Updated Introduction to scripting with genie_python (rest) --- Introduction-to-scripting-with-genie_python.rest | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Introduction-to-scripting-with-genie_python.rest b/Introduction-to-scripting-with-genie_python.rest index 4e3c624..07df988 100644 --- a/Introduction-to-scripting-with-genie_python.rest +++ b/Introduction-to-scripting-with-genie_python.rest @@ -155,12 +155,15 @@ Exercise 1 - Should be straightforward if Ibex is correctly installed. - Ideally the instrument will appear as ``SETUP`` - The output when the scripting window opens should look a bit like this: + :: IMAGE: StandardStartupOutputOnDemo + - Output "Hello, world!" to the console - Enter something like ``print "Hello, World!`` and press return - Calculate and output the square of all the integers between 1 and 10 - This is best achieved with the following loop: + :: for i in range(1,11): print i*i From 22fdf15f32fe1250e8aa0a6d41cbe283d2f31aa7 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Wed, 28 Jun 2017 11:33:15 +0100 Subject: [PATCH 0512/1813] Updated Introduction to scripting with genie_python (rest) --- ...uction-to-scripting-with-genie_python.rest | 30 ++++++++++++------- 1 file changed, 20 insertions(+), 10 deletions(-) diff --git a/Introduction-to-scripting-with-genie_python.rest b/Introduction-to-scripting-with-genie_python.rest index 07df988..57b457c 100644 --- a/Introduction-to-scripting-with-genie_python.rest +++ b/Introduction-to-scripting-with-genie_python.rest @@ -47,17 +47,26 @@ Instrument control commands let you switch between experimental states. The most - ``end``: Ends the current run - ``abort``: Aborts the current run +At each point you can get the state of the run as a string using the command: + +- ``get_runstate``: Gets the states of the current run + You can also update and store results using: - ``update``: Load the data from the DAE into memory - ``store``: Write the updated DAE information to disk - ``updatestore``: Load the data from the DAE into memory and store it to disk -As an example, you can begin and then immediately end a run by calling the following commands: +As an example, the following script will begin and run, then stop it once it reaches a running state: :: - g.begin() - g.end() + import time + if g.get_runstate=="SETUP" + g.begin() + # Will run forever if we never reach running + while g.get_runstate()!="RUNNING" + time.sleep(1) + g.end() Each of the commands above accepts an optional ``boolean`` parameter. Setting it to ``True`` (e.g. ``g.begin(True)``) will give extra output from the DAE. @@ -101,13 +110,14 @@ Experiment setup - You have permission to begin and end runs on the instrument you're using. - The instrument your using has been configured so it can successfully enter a running state - You have a settable block called "MY_BLOCK" -- From the scripting perspective, complete the following actions: - - Change the title of the run to "Exercise 3" - - Begin a new run - - Pause the run - - Set the value of "MY_BLOCK" to 5 - - Resume the run - - End the run +- Change the title of the run to "Exercise 2" +- Begin a new run +- Pause the run +- Set the value of "MY_BLOCK" to 5, with a high limit of 10, a low limit of 1 and put it under run control +- Resume the run +- Set the value of "MY_BLOCK" to 20 +- Confirm (using ``genie_python``) that the instrument has entered a waiting state +- End the run Creating and running scripts From 2beaa987b5bac3ccedc00415e100f52c52981413 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Wed, 28 Jun 2017 11:36:48 +0100 Subject: [PATCH 0513/1813] Updated Introduction to scripting with genie_python (rest) --- Introduction-to-scripting-with-genie_python.rest | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Introduction-to-scripting-with-genie_python.rest b/Introduction-to-scripting-with-genie_python.rest index 57b457c..203f147 100644 --- a/Introduction-to-scripting-with-genie_python.rest +++ b/Introduction-to-scripting-with-genie_python.rest @@ -66,7 +66,7 @@ As an example, the following script will begin and run, then stop it once it rea # Will run forever if we never reach running while g.get_runstate()!="RUNNING" time.sleep(1) - g.end() + g.end() Each of the commands above accepts an optional ``boolean`` parameter. Setting it to ``True`` (e.g. ``g.begin(True)``) will give extra output from the DAE. From 94a8369957c46e7e8d75b738250e712de193c27d Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Wed, 28 Jun 2017 11:39:07 +0100 Subject: [PATCH 0514/1813] Updated Introduction to scripting with genie_python (rest) --- Introduction-to-scripting-with-genie_python.rest | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/Introduction-to-scripting-with-genie_python.rest b/Introduction-to-scripting-with-genie_python.rest index 203f147..6607444 100644 --- a/Introduction-to-scripting-with-genie_python.rest +++ b/Introduction-to-scripting-with-genie_python.rest @@ -63,10 +63,13 @@ As an example, the following script will begin and run, then stop it once it rea import time if g.get_runstate=="SETUP" g.begin() - # Will run forever if we never reach running - while g.get_runstate()!="RUNNING" + for i in range(60): + if g.get_runstate()=="RUNNING": + g.end() + break time.sleep(1) - g.end() + else: + "Could not reach a running state" Each of the commands above accepts an optional ``boolean`` parameter. Setting it to ``True`` (e.g. ``g.begin(True)``) will give extra output from the DAE. From 04683f819e4ffc28d25a852d4da9855c041175c3 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Wed, 28 Jun 2017 11:39:30 +0100 Subject: [PATCH 0515/1813] Updated Introduction to scripting with genie_python (rest) --- Introduction-to-scripting-with-genie_python.rest | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Introduction-to-scripting-with-genie_python.rest b/Introduction-to-scripting-with-genie_python.rest index 6607444..ba14a7e 100644 --- a/Introduction-to-scripting-with-genie_python.rest +++ b/Introduction-to-scripting-with-genie_python.rest @@ -47,6 +47,8 @@ Instrument control commands let you switch between experimental states. The most - ``end``: Ends the current run - ``abort``: Aborts the current run +Each of the commands above accepts an optional ``boolean`` parameter. Setting it to ``True`` (e.g. ``g.begin(True)``) will give extra output from the DAE. + At each point you can get the state of the run as a string using the command: - ``get_runstate``: Gets the states of the current run @@ -72,7 +74,6 @@ As an example, the following script will begin and run, then stop it once it rea "Could not reach a running state" -Each of the commands above accepts an optional ``boolean`` parameter. Setting it to ``True`` (e.g. ``g.begin(True)``) will give extra output from the DAE. Blocks ------ From 6b6d2fb628fb14325516516d40fea3e5fd69a13a Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Wed, 28 Jun 2017 11:42:15 +0100 Subject: [PATCH 0516/1813] Updated Introduction to scripting with genie_python (rest) --- Introduction-to-scripting-with-genie_python.rest | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Introduction-to-scripting-with-genie_python.rest b/Introduction-to-scripting-with-genie_python.rest index ba14a7e..ec9ac1b 100644 --- a/Introduction-to-scripting-with-genie_python.rest +++ b/Introduction-to-scripting-with-genie_python.rest @@ -53,7 +53,9 @@ At each point you can get the state of the run as a string using the command: - ``get_runstate``: Gets the states of the current run -You can also update and store results using: +**NOTE**: Switching run state is not guaranteed. Executing "g.begin()" could lead to a number of run states (e.g. running, waiting, vetoed, setup). It's a good idea to put checks into your scripts that you've reached the expected state before continuing. + +You can update and store DAE results using: - ``update``: Load the data from the DAE into memory - ``store``: Write the updated DAE information to disk From bec7797714fe09b6ba1082d1e4782587e89676bf Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Wed, 28 Jun 2017 11:59:28 +0100 Subject: [PATCH 0517/1813] Updated Introduction to scripting with genie_python (rest) --- ...uction-to-scripting-with-genie_python.rest | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/Introduction-to-scripting-with-genie_python.rest b/Introduction-to-scripting-with-genie_python.rest index ec9ac1b..1462cbe 100644 --- a/Introduction-to-scripting-with-genie_python.rest +++ b/Introduction-to-scripting-with-genie_python.rest @@ -1,6 +1,31 @@ +Introduction +============ + +Welcome to this introductory course on ``genie_python``, a Python module that enables instrument control using Genie commands with Python. Once you have completed this course, you will be able to do the following using ``genie_python`` + +- Start and stop runs +- Get and set block information +- Update experiment details +- Create specialised instrument and user scripts scripts +- Convert ``OpenGENIE`` scripts to ``genie_python`` + +At each stage the course aims to assist learning with exercises and worked examples. + +If you're looking for specific answers, please refer to the course contents below. Otherwise, let's `get started`__! + +__ GettingStarted_ + Contents ======== +We expect that most people will take this course in a linear fashion, but if you have a specific query, the course is broadly split up into the following topics + +- Getting started +- Common ``genie_python`` commands +- Scripting +- Converting between ``OpenGENIE`` and ``genie_python`` + + Starting a scripting session ============================ From 675dd00e52ff63b040c3b19fb16bc4260f0e4c18 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Wed, 28 Jun 2017 11:59:48 +0100 Subject: [PATCH 0518/1813] Updated Introduction to scripting with genie_python (rest) --- Introduction-to-scripting-with-genie_python.rest | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Introduction-to-scripting-with-genie_python.rest b/Introduction-to-scripting-with-genie_python.rest index 1462cbe..7a27a8f 100644 --- a/Introduction-to-scripting-with-genie_python.rest +++ b/Introduction-to-scripting-with-genie_python.rest @@ -13,6 +13,11 @@ At each stage the course aims to assist learning with exercises and worked examp If you're looking for specific answers, please refer to the course contents below. Otherwise, let's `get started`__! +Internal crossreferences, like example_. +.. _example: + +This is an example crossreference target. + __ GettingStarted_ Contents From 4fe0a30afdc2b3df5c1625aa69f4873a4bfa2b5a Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Wed, 28 Jun 2017 12:00:19 +0100 Subject: [PATCH 0519/1813] Updated Introduction to scripting with genie_python (rest) --- Introduction-to-scripting-with-genie_python.rest | 5 ----- 1 file changed, 5 deletions(-) diff --git a/Introduction-to-scripting-with-genie_python.rest b/Introduction-to-scripting-with-genie_python.rest index 7a27a8f..1462cbe 100644 --- a/Introduction-to-scripting-with-genie_python.rest +++ b/Introduction-to-scripting-with-genie_python.rest @@ -13,11 +13,6 @@ At each stage the course aims to assist learning with exercises and worked examp If you're looking for specific answers, please refer to the course contents below. Otherwise, let's `get started`__! -Internal crossreferences, like example_. -.. _example: - -This is an example crossreference target. - __ GettingStarted_ Contents From 19a18a390fb4a5c5f3820844175c2d196f3e3a46 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Wed, 28 Jun 2017 12:00:43 +0100 Subject: [PATCH 0520/1813] Updated Introduction to scripting with genie_python (rest) --- ..._python.rest => Scripting-with-genie_python:-Introduction.rest | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename Introduction-to-scripting-with-genie_python.rest => Scripting-with-genie_python:-Introduction.rest (100%) diff --git a/Introduction-to-scripting-with-genie_python.rest b/Scripting-with-genie_python:-Introduction.rest similarity index 100% rename from Introduction-to-scripting-with-genie_python.rest rename to Scripting-with-genie_python:-Introduction.rest From f76f803b9e608b54f5776a3a07e110be0daf086c Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Wed, 28 Jun 2017 12:00:52 +0100 Subject: [PATCH 0521/1813] Updated Scripting with genie_python: Introduction (rest) From b450b590a0842d6ed2a12142f5a5e9218f42e3ea Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Wed, 28 Jun 2017 12:01:06 +0100 Subject: [PATCH 0522/1813] Created Scripting with genie_python: Getting started (markdown) --- Scripting-with-genie_python:-Getting-started.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 Scripting-with-genie_python:-Getting-started.md diff --git a/Scripting-with-genie_python:-Getting-started.md b/Scripting-with-genie_python:-Getting-started.md new file mode 100644 index 0000000..28d44e9 --- /dev/null +++ b/Scripting-with-genie_python:-Getting-started.md @@ -0,0 +1 @@ +asdsad \ No newline at end of file From 4dacbd5c876a731c63c404b40dcfe461ecd6f6a2 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Wed, 28 Jun 2017 12:01:37 +0100 Subject: [PATCH 0523/1813] Updated Scripting with genie_python: Getting started (markdown) --- ...ting-with-genie_python:-Getting-started.md | 25 ++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/Scripting-with-genie_python:-Getting-started.md b/Scripting-with-genie_python:-Getting-started.md index 28d44e9..a5dc780 100644 --- a/Scripting-with-genie_python:-Getting-started.md +++ b/Scripting-with-genie_python:-Getting-started.md @@ -1 +1,24 @@ -asdsad \ No newline at end of file + + +Starting a scripting session +============================ + +The best way to run ``genie_python`` commands is from the scripting perspective of the Ibex client. + +To open a scripting window: + +1. Start the Ibex client +2. Open the scripting perspective + +:: + IMAGE: OpenTheScriptingPerspective + +3. From here, you can start entering Python code. It will be executed line by line as you enter it. + +**Exercise 1** +-------------- +- Open a scripting window in Ibex +- Output "Hello, world!" to the console +- Calculate and output the square of all the integers between 1 and 10 + +You can also open a scripting terminal by running ``C:\Instrument\Apps\Python\genie_python.bat``. This will not provide some advanced features such as auto-complete though, and is recommended for advanced users only. \ No newline at end of file From 9e1089d66ccca71b2b7d40a61a61ed5c8f876a44 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Wed, 28 Jun 2017 12:01:46 +0100 Subject: [PATCH 0524/1813] Updated Scripting with genie_python: Introduction (rest) --- ...pting-with-genie_python:-Introduction.rest | 23 ------------------- 1 file changed, 23 deletions(-) diff --git a/Scripting-with-genie_python:-Introduction.rest b/Scripting-with-genie_python:-Introduction.rest index 1462cbe..abf4248 100644 --- a/Scripting-with-genie_python:-Introduction.rest +++ b/Scripting-with-genie_python:-Introduction.rest @@ -26,29 +26,6 @@ We expect that most people will take this course in a linear fashion, but if you - Converting between ``OpenGENIE`` and ``genie_python`` -Starting a scripting session -============================ - -The best way to run ``genie_python`` commands is from the scripting perspective of the Ibex client. - -To open a scripting window: - -1. Start the Ibex client -2. Open the scripting perspective - -:: - IMAGE: OpenTheScriptingPerspective - -3. From here, you can start entering Python code. It will be executed line by line as you enter it. - -**Exercise 1** --------------- -- Open a scripting window in Ibex -- Output "Hello, world!" to the console -- Calculate and output the square of all the integers between 1 and 10 - -You can also open a scripting terminal by running ``C:\Instrument\Apps\Python\genie_python.bat``. This will not provide some advanced features such as auto-complete though, and is recommended for advanced users only. - Accessing ``genie_python`` commands =================================== From e52cad6eaa23dda0801e1433cecec9df2ce7404a Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Wed, 28 Jun 2017 12:02:02 +0100 Subject: [PATCH 0525/1813] Updated Scripting with genie_python: Introduction (rest) From 7faa03bba574346a4f848106872bfd7576732a69 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Wed, 28 Jun 2017 12:02:13 +0100 Subject: [PATCH 0526/1813] Created Scripting with genie_python: Common commands (markdown) --- Scripting-with-genie_python:-Common-commands.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 Scripting-with-genie_python:-Common-commands.md diff --git a/Scripting-with-genie_python:-Common-commands.md b/Scripting-with-genie_python:-Common-commands.md new file mode 100644 index 0000000..cdabc49 --- /dev/null +++ b/Scripting-with-genie_python:-Common-commands.md @@ -0,0 +1 @@ +asdasda \ No newline at end of file From 2397d921d5ef500d45d038ba41e736d7d0d3bf74 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Wed, 28 Jun 2017 12:02:42 +0100 Subject: [PATCH 0527/1813] Updated Scripting with genie_python: Common commands (markdown) --- ...ting-with-genie_python:-Common-commands.md | 101 +++++++++++++++++- 1 file changed, 100 insertions(+), 1 deletion(-) diff --git a/Scripting-with-genie_python:-Common-commands.md b/Scripting-with-genie_python:-Common-commands.md index cdabc49..30edcf8 100644 --- a/Scripting-with-genie_python:-Common-commands.md +++ b/Scripting-with-genie_python:-Common-commands.md @@ -1 +1,100 @@ -asdasda \ No newline at end of file +Accessing ``genie_python`` commands +=================================== + +Where Ibex has been installed correctly on your machine, ``genie_python`` commands can be accessed via the ``g`` namespace. Try entering ``g.get_version()``. + +You should have noticed when you typed ``g.`` that an autocomplete window appeared: + +:: + IMAGE: AutoCompleteWindowBasic + +The window lists the available commands, and the arguments they take in brackets. You also notice that a description of the highlighted functions and its arguments is also given. + +Instrument control +------------------ + +Instrument control commands let you switch between experimental states. The most common commands are: + +- ``begin``: Begins a new run +- ``pause``: Pauses the current run +- ``resume``: Resumes the current run +- ``end``: Ends the current run +- ``abort``: Aborts the current run + +Each of the commands above accepts an optional ``boolean`` parameter. Setting it to ``True`` (e.g. ``g.begin(True)``) will give extra output from the DAE. + +At each point you can get the state of the run as a string using the command: + +- ``get_runstate``: Gets the states of the current run + +**NOTE**: Switching run state is not guaranteed. Executing "g.begin()" could lead to a number of run states (e.g. running, waiting, vetoed, setup). It's a good idea to put checks into your scripts that you've reached the expected state before continuing. + +You can update and store DAE results using: + +- ``update``: Load the data from the DAE into memory +- ``store``: Write the updated DAE information to disk +- ``updatestore``: Load the data from the DAE into memory and store it to disk + +As an example, the following script will begin and run, then stop it once it reaches a running state: + +:: + import time + if g.get_runstate=="SETUP" + g.begin() + for i in range(60): + if g.get_runstate()=="RUNNING": + g.end() + break + time.sleep(1) + else: + "Could not reach a running state" + + + +Blocks +------ + +- ``get_blocks``: Gets a list of the currently available blocks +- ``cshow``: + - Given the name of the block (e.g. `g.chsow("MY_BLOCK")`) it will give a string output of the current settings for that block (e.g. ``MY_BLOCK = 10 (runcontrol = NO, lowlimit = 0.0, highlimit = 0.0)``) + - If called without arguments, it will show the same information for all blocks, with each block on a new line +- ``cget``: + - Returns settings for a named block as a dictionary of values (e.g. ``MY_BLOCK = 10 (runcontrol = NO, lowlimit = 0.0, highlimit = 0.0)``) + - Unlike ``cshow``, a block name must be specified`` + - Properties can be accessed as standard Python: + +:: + block_info = g.cget("MY_BLOCK") + name = block_info("name") + value = block_info("value") + print "The value of block {0} is {1}".format(name, value) + +- ``cset`` + - Sets the value for a particular block + - Assumes that either a setpoint exists for the underlying value or the block itself points at a setpoint + - Can be called with block names as named arguments. This is useful for setting multiple blocks + - Example: ``g.cset(MY_BLOCK=1, MY_OTHER_BLOCK=2)`` + - The block can also be passed in by name. This is useful when setting advanced block properties: + - Example: ``g.cset("MY_BLOCK", lowlimit=1, highlimit=10, runcontrol=True)`` + + +Run control +----------- + +Experiment setup +---------------- + +**Exercise 2** +-------------- +- This exercise requires the following pre-requisites. These should be satisfied if you are following this as part of the Ibex-run training course: + - You have permission to begin and end runs on the instrument you're using. + - The instrument your using has been configured so it can successfully enter a running state + - You have a settable block called "MY_BLOCK" +- Change the title of the run to "Exercise 2" +- Begin a new run +- Pause the run +- Set the value of "MY_BLOCK" to 5, with a high limit of 10, a low limit of 1 and put it under run control +- Resume the run +- Set the value of "MY_BLOCK" to 20 +- Confirm (using ``genie_python``) that the instrument has entered a waiting state +- End the run \ No newline at end of file From ca1956b6876c855634f0c4a6d80642b2d3e6325f Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Wed, 28 Jun 2017 12:03:01 +0100 Subject: [PATCH 0528/1813] Updated Scripting with genie_python: Introduction (rest) --- ...pting-with-genie_python:-Introduction.rest | 118 ------------------ 1 file changed, 118 deletions(-) diff --git a/Scripting-with-genie_python:-Introduction.rest b/Scripting-with-genie_python:-Introduction.rest index abf4248..63a8329 100644 --- a/Scripting-with-genie_python:-Introduction.rest +++ b/Scripting-with-genie_python:-Introduction.rest @@ -26,128 +26,10 @@ We expect that most people will take this course in a linear fashion, but if you - Converting between ``OpenGENIE`` and ``genie_python`` -Accessing ``genie_python`` commands -=================================== -Where Ibex has been installed correctly on your machine, ``genie_python`` commands can be accessed via the ``g`` namespace. Try entering ``g.get_version()``. -You should have noticed when you typed ``g.`` that an autocomplete window appeared: -:: - IMAGE: AutoCompleteWindowBasic - -The window lists the available commands, and the arguments they take in brackets. You also notice that a description of the highlighted functions and its arguments is also given. - -Instrument control ------------------- - -Instrument control commands let you switch between experimental states. The most common commands are: - -- ``begin``: Begins a new run -- ``pause``: Pauses the current run -- ``resume``: Resumes the current run -- ``end``: Ends the current run -- ``abort``: Aborts the current run - -Each of the commands above accepts an optional ``boolean`` parameter. Setting it to ``True`` (e.g. ``g.begin(True)``) will give extra output from the DAE. - -At each point you can get the state of the run as a string using the command: - -- ``get_runstate``: Gets the states of the current run -**NOTE**: Switching run state is not guaranteed. Executing "g.begin()" could lead to a number of run states (e.g. running, waiting, vetoed, setup). It's a good idea to put checks into your scripts that you've reached the expected state before continuing. - -You can update and store DAE results using: - -- ``update``: Load the data from the DAE into memory -- ``store``: Write the updated DAE information to disk -- ``updatestore``: Load the data from the DAE into memory and store it to disk - -As an example, the following script will begin and run, then stop it once it reaches a running state: - -:: - import time - if g.get_runstate=="SETUP" - g.begin() - for i in range(60): - if g.get_runstate()=="RUNNING": - g.end() - break - time.sleep(1) - else: - "Could not reach a running state" - - - -Blocks ------- - -- ``get_blocks``: Gets a list of the currently available blocks -- ``cshow``: - - Given the name of the block (e.g. `g.chsow("MY_BLOCK")`) it will give a string output of the current settings for that block (e.g. ``MY_BLOCK = 10 (runcontrol = NO, lowlimit = 0.0, highlimit = 0.0)``) - - If called without arguments, it will show the same information for all blocks, with each block on a new line -- ``cget``: - - Returns settings for a named block as a dictionary of values (e.g. ``MY_BLOCK = 10 (runcontrol = NO, lowlimit = 0.0, highlimit = 0.0)``) - - Unlike ``cshow``, a block name must be specified`` - - Properties can be accessed as standard Python: - -:: - block_info = g.cget("MY_BLOCK") - name = block_info("name") - value = block_info("value") - print "The value of block {0} is {1}".format(name, value) - -- ``cset`` - - Sets the value for a particular block - - Assumes that either a setpoint exists for the underlying value or the block itself points at a setpoint - - Can be called with block names as named arguments. This is useful for setting multiple blocks - - Example: ``g.cset(MY_BLOCK=1, MY_OTHER_BLOCK=2)`` - - The block can also be passed in by name. This is useful when setting advanced block properties: - - Example: ``g.cset("MY_BLOCK", lowlimit=1, highlimit=10, runcontrol=True)`` - - -Run control ------------ - -Experiment setup ----------------- - -**Exercise 2** --------------- -- This exercise requires the following pre-requisites. These should be satisfied if you are following this as part of the Ibex-run training course: - - You have permission to begin and end runs on the instrument you're using. - - The instrument your using has been configured so it can successfully enter a running state - - You have a settable block called "MY_BLOCK" -- Change the title of the run to "Exercise 2" -- Begin a new run -- Pause the run -- Set the value of "MY_BLOCK" to 5, with a high limit of 10, a low limit of 1 and put it under run control -- Resume the run -- Set the value of "MY_BLOCK" to 20 -- Confirm (using ``genie_python``) that the instrument has entered a waiting state -- End the run - - -Creating and running scripts -============================ - -Instrument scripts ------------------- - -Create -~~~~~~ - -Run -~~~ - -User scripts ------------- - -Create -~~~~~~ - -Run -~~~ Open Genie: Compare and contrast ================================ From 9894bd22c7f8c126f5ca45ef32e7e2239329b659 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Wed, 28 Jun 2017 12:03:20 +0100 Subject: [PATCH 0529/1813] Created Ibex and genie_python: Scripting (markdown) --- Ibex-and-genie_python:-Scripting.md | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 Ibex-and-genie_python:-Scripting.md diff --git a/Ibex-and-genie_python:-Scripting.md b/Ibex-and-genie_python:-Scripting.md new file mode 100644 index 0000000..6378df9 --- /dev/null +++ b/Ibex-and-genie_python:-Scripting.md @@ -0,0 +1,20 @@ +Creating and running scripts +============================ + +Instrument scripts +------------------ + +Create +~~~~~~ + +Run +~~~ + +User scripts +------------ + +Create +~~~~~~ + +Run +~~~ \ No newline at end of file From a1ff3fd5281c61d15ea91ffe05022f637f724345 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Wed, 28 Jun 2017 12:03:29 +0100 Subject: [PATCH 0530/1813] Updated Scripting with genie_python: Introduction (rest) --- ...-Introduction.rest => Ibex-and-genie_python:-Introduction.rest | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename Scripting-with-genie_python:-Introduction.rest => Ibex-and-genie_python:-Introduction.rest (100%) diff --git a/Scripting-with-genie_python:-Introduction.rest b/Ibex-and-genie_python:-Introduction.rest similarity index 100% rename from Scripting-with-genie_python:-Introduction.rest rename to Ibex-and-genie_python:-Introduction.rest From 7c8e20a97c0531d77a0a422357a70d753c40efa2 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Wed, 28 Jun 2017 12:03:54 +0100 Subject: [PATCH 0531/1813] Updated Scripting with genie_python: Common commands (markdown) --- ...ommon-commands.md => Ibex-and-genie_python:-Common-commands.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename Scripting-with-genie_python:-Common-commands.md => Ibex-and-genie_python:-Common-commands.md (100%) diff --git a/Scripting-with-genie_python:-Common-commands.md b/Ibex-and-genie_python:-Common-commands.md similarity index 100% rename from Scripting-with-genie_python:-Common-commands.md rename to Ibex-and-genie_python:-Common-commands.md From 1758c27e5b7391158304e26e48329e4d7e52d665 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Wed, 28 Jun 2017 12:04:42 +0100 Subject: [PATCH 0532/1813] Created Ibex and genie_python: Converting from OpenGENIE (markdown) --- ...-and-genie_python:-Converting-from-OpenGENIE.md | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 Ibex-and-genie_python:-Converting-from-OpenGENIE.md diff --git a/Ibex-and-genie_python:-Converting-from-OpenGENIE.md b/Ibex-and-genie_python:-Converting-from-OpenGENIE.md new file mode 100644 index 0000000..ccd3d98 --- /dev/null +++ b/Ibex-and-genie_python:-Converting-from-OpenGENIE.md @@ -0,0 +1,14 @@ +Open Genie: Compare and contrast +================================ + +Commands +-------- + +Arguments +--------- + +Procedures vs. functions +------------------------ + +Loops +----- \ No newline at end of file From c6a1944b976cc90392e80c1fbf4908edbbb91930 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Wed, 28 Jun 2017 12:05:00 +0100 Subject: [PATCH 0533/1813] Created Ibex and genie_python: Exercise answers (markdown) --- Ibex-and-genie_python:-Exercise-answers.md | 25 ++++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 Ibex-and-genie_python:-Exercise-answers.md diff --git a/Ibex-and-genie_python:-Exercise-answers.md b/Ibex-and-genie_python:-Exercise-answers.md new file mode 100644 index 0000000..6d308b4 --- /dev/null +++ b/Ibex-and-genie_python:-Exercise-answers.md @@ -0,0 +1,25 @@ + + +Exercise notes +============== + +Exercise 1 +---------- +- Open a scripting window in Ibex + - Should be straightforward if Ibex is correctly installed. + - Ideally the instrument will appear as ``SETUP`` + - The output when the scripting window opens should look a bit like this: + +:: + IMAGE: StandardStartupOutputOnDemo + +- Output "Hello, world!" to the console + - Enter something like ``print "Hello, World!`` and press return +- Calculate and output the square of all the integers between 1 and 10 + - This is best achieved with the following loop: + +:: + for i in range(1,11): + print i*i + + - A **blank line** will indicate to the scripting window that you've finished writing the loop and it can go ahead and execute it \ No newline at end of file From af3f24e1289237eabe0322cde979408d2f02b9a1 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Wed, 28 Jun 2017 12:05:19 +0100 Subject: [PATCH 0534/1813] Updated Ibex and genie_python: Introduction (rest) --- Ibex-and-genie_python:-Introduction.rest | 46 +----------------------- 1 file changed, 1 insertion(+), 45 deletions(-) diff --git a/Ibex-and-genie_python:-Introduction.rest b/Ibex-and-genie_python:-Introduction.rest index 63a8329..50f520e 100644 --- a/Ibex-and-genie_python:-Introduction.rest +++ b/Ibex-and-genie_python:-Introduction.rest @@ -24,48 +24,4 @@ We expect that most people will take this course in a linear fashion, but if you - Common ``genie_python`` commands - Scripting - Converting between ``OpenGENIE`` and ``genie_python`` - - - - - - - -Open Genie: Compare and contrast -================================ - -Commands --------- - -Arguments ---------- - -Procedures vs. functions ------------------------- - -Loops ------ - -Exercise notes -============== - -Exercise 1 ----------- -- Open a scripting window in Ibex - - Should be straightforward if Ibex is correctly installed. - - Ideally the instrument will appear as ``SETUP`` - - The output when the scripting window opens should look a bit like this: - -:: - IMAGE: StandardStartupOutputOnDemo - -- Output "Hello, world!" to the console - - Enter something like ``print "Hello, World!`` and press return -- Calculate and output the square of all the integers between 1 and 10 - - This is best achieved with the following loop: - -:: - for i in range(1,11): - print i*i - - - A **blank line** will indicate to the scripting window that you've finished writing the loop and it can go ahead and execute it \ No newline at end of file +- Solutions to the exercises \ No newline at end of file From 603ddf0f1158d71a20b9cfca7d60b3c579c775d8 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Wed, 28 Jun 2017 12:10:28 +0100 Subject: [PATCH 0535/1813] Updated Ibex and genie_python: Introduction (rest) --- Ibex-and-genie_python:-Introduction.rest | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/Ibex-and-genie_python:-Introduction.rest b/Ibex-and-genie_python:-Introduction.rest index 50f520e..890fc3f 100644 --- a/Ibex-and-genie_python:-Introduction.rest +++ b/Ibex-and-genie_python:-Introduction.rest @@ -11,9 +11,7 @@ Welcome to this introductory course on ``genie_python``, a Python module that en At each stage the course aims to assist learning with exercises and worked examples. -If you're looking for specific answers, please refer to the course contents below. Otherwise, let's `get started`__! - -__ GettingStarted_ +If you're looking for specific answers, please refer to the course contents below. Otherwise, let's [[get started|Ibex-and-genie_python:-Getting-started]] Contents ======== From d9357685ffa6cf01301304302fff35e84c37f92b Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Wed, 28 Jun 2017 12:10:48 +0100 Subject: [PATCH 0536/1813] Updated Ibex and genie_python: Introduction (rest) --- Ibex-and-genie_python:-Introduction.rest | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Ibex-and-genie_python:-Introduction.rest b/Ibex-and-genie_python:-Introduction.rest index 890fc3f..d7343cc 100644 --- a/Ibex-and-genie_python:-Introduction.rest +++ b/Ibex-and-genie_python:-Introduction.rest @@ -11,7 +11,7 @@ Welcome to this introductory course on ``genie_python``, a Python module that en At each stage the course aims to assist learning with exercises and worked examples. -If you're looking for specific answers, please refer to the course contents below. Otherwise, let's [[get started|Ibex-and-genie_python:-Getting-started]] +If you're looking for specific answers, please refer to the course contents below. Otherwise, let's [[get started|Ibex-and-genie_python\:-Getting-started]] Contents ======== From d81f2dcc94204e352458f2f104001a1ff06332e5 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Wed, 28 Jun 2017 12:11:28 +0100 Subject: [PATCH 0537/1813] Updated Ibex and genie_python: Introduction (rest) --- Ibex-and-genie_python:-Introduction.rest | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Ibex-and-genie_python:-Introduction.rest b/Ibex-and-genie_python:-Introduction.rest index d7343cc..4332fa1 100644 --- a/Ibex-and-genie_python:-Introduction.rest +++ b/Ibex-and-genie_python:-Introduction.rest @@ -11,7 +11,7 @@ Welcome to this introductory course on ``genie_python``, a Python module that en At each stage the course aims to assist learning with exercises and worked examples. -If you're looking for specific answers, please refer to the course contents below. Otherwise, let's [[get started|Ibex-and-genie_python\:-Getting-started]] +If you're looking for specific answers, please refer to the course contents below. Otherwise, let's [[get started|Ibex-and-genie_python:-Exercise-answers]] Contents ======== From 770f7a3ac249c64315089461486fe1394c377585 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Wed, 28 Jun 2017 12:12:15 +0100 Subject: [PATCH 0538/1813] Updated Scripting with genie_python: Getting started (markdown) --- ...etting-started.md => Ibex-and-genie_python:-Getting-started.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename Scripting-with-genie_python:-Getting-started.md => Ibex-and-genie_python:-Getting-started.md (100%) diff --git a/Scripting-with-genie_python:-Getting-started.md b/Ibex-and-genie_python:-Getting-started.md similarity index 100% rename from Scripting-with-genie_python:-Getting-started.md rename to Ibex-and-genie_python:-Getting-started.md From 068bab095e60666212bce5412ece089328682016 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Wed, 28 Jun 2017 12:14:13 +0100 Subject: [PATCH 0539/1813] Updated Ibex and genie_python: Introduction (rest) --- Ibex-and-genie_python:-Introduction.rest | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/Ibex-and-genie_python:-Introduction.rest b/Ibex-and-genie_python:-Introduction.rest index 4332fa1..1363e32 100644 --- a/Ibex-and-genie_python:-Introduction.rest +++ b/Ibex-and-genie_python:-Introduction.rest @@ -11,15 +11,15 @@ Welcome to this introductory course on ``genie_python``, a Python module that en At each stage the course aims to assist learning with exercises and worked examples. -If you're looking for specific answers, please refer to the course contents below. Otherwise, let's [[get started|Ibex-and-genie_python:-Exercise-answers]] +If you're looking for specific answers, please refer to the course contents below. Otherwise, let's [[get started|Ibex-and-genie_python:-Getting-started]] Contents ======== We expect that most people will take this course in a linear fashion, but if you have a specific query, the course is broadly split up into the following topics -- Getting started -- Common ``genie_python`` commands -- Scripting -- Converting between ``OpenGENIE`` and ``genie_python`` -- Solutions to the exercises \ No newline at end of file +- [[Getting started|Ibex-and-genie_python:-Getting-started]] +- [[Common commands|Ibex-and-genie_python:-Common-commands]] +- [[Scripting|Ibex-and-genie_python:-Scripting]] +- [[Converting from ``OpenGENIE``|Ibex-and-genie_python:-Converting-from-OpenGENIE]] +- [[Exercise solutions|Ibex-and-genie_python:-Exercise-notes]] \ No newline at end of file From bcf17346b1753caf26be353fa7dd24114424cbb2 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Wed, 28 Jun 2017 12:14:30 +0100 Subject: [PATCH 0540/1813] Updated Ibex and genie_python: Exercise answers (markdown) --- ...ise-answers.md => Ibex-and-genie_python:-Exercise-solutions.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename Ibex-and-genie_python:-Exercise-answers.md => Ibex-and-genie_python:-Exercise-solutions.md (100%) diff --git a/Ibex-and-genie_python:-Exercise-answers.md b/Ibex-and-genie_python:-Exercise-solutions.md similarity index 100% rename from Ibex-and-genie_python:-Exercise-answers.md rename to Ibex-and-genie_python:-Exercise-solutions.md From f36721d0862fb827f531e8fc4eccc722ceee33b8 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Wed, 28 Jun 2017 12:14:50 +0100 Subject: [PATCH 0541/1813] Updated Ibex and genie_python: Introduction (rest) --- Ibex-and-genie_python:-Introduction.rest | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Ibex-and-genie_python:-Introduction.rest b/Ibex-and-genie_python:-Introduction.rest index 1363e32..f596eb2 100644 --- a/Ibex-and-genie_python:-Introduction.rest +++ b/Ibex-and-genie_python:-Introduction.rest @@ -22,4 +22,4 @@ We expect that most people will take this course in a linear fashion, but if you - [[Common commands|Ibex-and-genie_python:-Common-commands]] - [[Scripting|Ibex-and-genie_python:-Scripting]] - [[Converting from ``OpenGENIE``|Ibex-and-genie_python:-Converting-from-OpenGENIE]] -- [[Exercise solutions|Ibex-and-genie_python:-Exercise-notes]] \ No newline at end of file +- [[Exercise solutions|Ibex-and-genie_python:-Exercise-solutions]] \ No newline at end of file From 6771489680a19f45d0c4d86bbe9a49d45f95891b Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Wed, 28 Jun 2017 12:14:59 +0100 Subject: [PATCH 0542/1813] Updated Ibex and genie_python: Introduction (rest) --- Ibex-and-genie_python:-Introduction.rest | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Ibex-and-genie_python:-Introduction.rest b/Ibex-and-genie_python:-Introduction.rest index f596eb2..09a4da9 100644 --- a/Ibex-and-genie_python:-Introduction.rest +++ b/Ibex-and-genie_python:-Introduction.rest @@ -11,7 +11,7 @@ Welcome to this introductory course on ``genie_python``, a Python module that en At each stage the course aims to assist learning with exercises and worked examples. -If you're looking for specific answers, please refer to the course contents below. Otherwise, let's [[get started|Ibex-and-genie_python:-Getting-started]] +If you're looking for specific answers, please refer to the course contents below. Otherwise, let's [[get started|Ibex-and-genie_python:-Getting-started]]! Contents ======== From f48c368360537f33b2e8f3fd79d5979959843798 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Wed, 28 Jun 2017 13:35:15 +0100 Subject: [PATCH 0543/1813] Updated Ibex and genie_python: Getting started (markdown) --- Ibex-and-genie_python:-Getting-started.md | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/Ibex-and-genie_python:-Getting-started.md b/Ibex-and-genie_python:-Getting-started.md index a5dc780..ad6b51a 100644 --- a/Ibex-and-genie_python:-Getting-started.md +++ b/Ibex-and-genie_python:-Getting-started.md @@ -3,6 +3,9 @@ Starting a scripting session ============================ +From Ibex +--------- + The best way to run ``genie_python`` commands is from the scripting perspective of the Ibex client. To open a scripting window: @@ -16,9 +19,13 @@ To open a scripting window: 3. From here, you can start entering Python code. It will be executed line by line as you enter it. **Exercise 1** --------------- +~~~~~~~~~~~~~~ + - Open a scripting window in Ibex - Output "Hello, world!" to the console - Calculate and output the square of all the integers between 1 and 10 +Outside Ibex +------------ + You can also open a scripting terminal by running ``C:\Instrument\Apps\Python\genie_python.bat``. This will not provide some advanced features such as auto-complete though, and is recommended for advanced users only. \ No newline at end of file From 6176904f5b8ab107a56572fd6c38cf962553533b Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Wed, 28 Jun 2017 13:38:00 +0100 Subject: [PATCH 0544/1813] Updated Ibex and genie_python: Getting started (markdown) --- Ibex-and-genie_python:-Getting-started.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Ibex-and-genie_python:-Getting-started.md b/Ibex-and-genie_python:-Getting-started.md index ad6b51a..1d4a04f 100644 --- a/Ibex-and-genie_python:-Getting-started.md +++ b/Ibex-and-genie_python:-Getting-started.md @@ -19,7 +19,7 @@ To open a scripting window: 3. From here, you can start entering Python code. It will be executed line by line as you enter it. **Exercise 1** -~~~~~~~~~~~~~~ +++++++++++++++++ - Open a scripting window in Ibex - Output "Hello, world!" to the console From 6c5ee3759e5d14171431ba8962d4bf0054b4f47e Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Wed, 28 Jun 2017 13:38:21 +0100 Subject: [PATCH 0545/1813] Updated Ibex and genie_python: Getting started (markdown) --- Ibex-and-genie_python:-Getting-started.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Ibex-and-genie_python:-Getting-started.md b/Ibex-and-genie_python:-Getting-started.md index 1d4a04f..b65490c 100644 --- a/Ibex-and-genie_python:-Getting-started.md +++ b/Ibex-and-genie_python:-Getting-started.md @@ -18,8 +18,9 @@ To open a scripting window: 3. From here, you can start entering Python code. It will be executed line by line as you enter it. +~~~~~~~~~~~~~~ **Exercise 1** -++++++++++++++++ +~~~~~~~~~~~~~~ - Open a scripting window in Ibex - Output "Hello, world!" to the console From 06096a7580e3b71e9ccda0b68425481bc5f956aa Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Wed, 28 Jun 2017 13:39:39 +0100 Subject: [PATCH 0546/1813] Updated Ibex and genie_python: Getting started (markdown) --- Ibex-and-genie_python:-Getting-started.md | 4 ---- 1 file changed, 4 deletions(-) diff --git a/Ibex-and-genie_python:-Getting-started.md b/Ibex-and-genie_python:-Getting-started.md index b65490c..3264f4f 100644 --- a/Ibex-and-genie_python:-Getting-started.md +++ b/Ibex-and-genie_python:-Getting-started.md @@ -1,5 +1,3 @@ - - Starting a scripting session ============================ @@ -18,9 +16,7 @@ To open a scripting window: 3. From here, you can start entering Python code. It will be executed line by line as you enter it. -~~~~~~~~~~~~~~ **Exercise 1** -~~~~~~~~~~~~~~ - Open a scripting window in Ibex - Output "Hello, world!" to the console From 06377168c9311af3898896784e6bb2063f52b7a8 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Wed, 28 Jun 2017 13:39:53 +0100 Subject: [PATCH 0547/1813] Updated Ibex and genie_python: Getting started (markdown) --- Ibex-and-genie_python:-Getting-started.md | 1 + 1 file changed, 1 insertion(+) diff --git a/Ibex-and-genie_python:-Getting-started.md b/Ibex-and-genie_python:-Getting-started.md index 3264f4f..cd2d4c1 100644 --- a/Ibex-and-genie_python:-Getting-started.md +++ b/Ibex-and-genie_python:-Getting-started.md @@ -17,6 +17,7 @@ To open a scripting window: 3. From here, you can start entering Python code. It will be executed line by line as you enter it. **Exercise 1** +-------------- - Open a scripting window in Ibex - Output "Hello, world!" to the console From d80f5d6a8100553668be58ff85acee1fc472ef8c Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Wed, 28 Jun 2017 13:40:11 +0100 Subject: [PATCH 0548/1813] Updated Ibex and genie_python: Getting started (markdown) --- Ibex-and-genie_python:-Getting-started.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Ibex-and-genie_python:-Getting-started.md b/Ibex-and-genie_python:-Getting-started.md index cd2d4c1..2b8859c 100644 --- a/Ibex-and-genie_python:-Getting-started.md +++ b/Ibex-and-genie_python:-Getting-started.md @@ -16,14 +16,14 @@ To open a scripting window: 3. From here, you can start entering Python code. It will be executed line by line as you enter it. +Outside Ibex +------------ + +You can also open a scripting terminal by running ``C:\Instrument\Apps\Python\genie_python.bat``. This will not provide some advanced features such as auto-complete though, and is recommended for advanced users only. + **Exercise 1** --------------- +============== - Open a scripting window in Ibex - Output "Hello, world!" to the console -- Calculate and output the square of all the integers between 1 and 10 - -Outside Ibex ------------- - -You can also open a scripting terminal by running ``C:\Instrument\Apps\Python\genie_python.bat``. This will not provide some advanced features such as auto-complete though, and is recommended for advanced users only. \ No newline at end of file +- Calculate and output the square of all the integers between 1 and 10 \ No newline at end of file From 241233edd23331a1693f0d79700c8bb06e9398a0 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Wed, 28 Jun 2017 13:41:19 +0100 Subject: [PATCH 0549/1813] Updated Ibex and genie_python: Getting started (markdown) --- Ibex-and-genie_python:-Getting-started.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Ibex-and-genie_python:-Getting-started.md b/Ibex-and-genie_python:-Getting-started.md index 2b8859c..1ce0e80 100644 --- a/Ibex-and-genie_python:-Getting-started.md +++ b/Ibex-and-genie_python:-Getting-started.md @@ -11,8 +11,7 @@ To open a scripting window: 1. Start the Ibex client 2. Open the scripting perspective -:: - IMAGE: OpenTheScriptingPerspective +.. image:: OpenTheScriptingPerspective.png 3. From here, you can start entering Python code. It will be executed line by line as you enter it. From a0e06fee1dc0ffdbfc527cd6f7d6c6fbdbe1693e Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Wed, 28 Jun 2017 13:42:15 +0100 Subject: [PATCH 0550/1813] Updated Ibex and genie_python: Getting started (markdown) --- Ibex-and-genie_python:-Getting-started.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Ibex-and-genie_python:-Getting-started.md b/Ibex-and-genie_python:-Getting-started.md index 1ce0e80..5320c7f 100644 --- a/Ibex-and-genie_python:-Getting-started.md +++ b/Ibex-and-genie_python:-Getting-started.md @@ -11,7 +11,8 @@ To open a scripting window: 1. Start the Ibex client 2. Open the scripting perspective -.. image:: OpenTheScriptingPerspective.png +.. image:: magnetic-balls.jpg + :width: 40pt 3. From here, you can start entering Python code. It will be executed line by line as you enter it. From dd1bb19f22ecf04487e86930a122c302923098b9 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Wed, 28 Jun 2017 13:43:21 +0100 Subject: [PATCH 0551/1813] Updated Ibex and genie_python: Getting started (markdown) --- Ibex-and-genie_python:-Getting-started.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Ibex-and-genie_python:-Getting-started.md b/Ibex-and-genie_python:-Getting-started.md index 5320c7f..a24090b 100644 --- a/Ibex-and-genie_python:-Getting-started.md +++ b/Ibex-and-genie_python:-Getting-started.md @@ -11,7 +11,7 @@ To open a scripting window: 1. Start the Ibex client 2. Open the scripting perspective -.. image:: magnetic-balls.jpg +.. image:: OpenTheScriptingPerspective.png :width: 40pt 3. From here, you can start entering Python code. It will be executed line by line as you enter it. From 6375e6b05bf95f60914585eb0d2442e062cadbe2 Mon Sep 17 00:00:00 2001 From: AdrianPotter Date: Wed, 28 Jun 2017 13:44:00 +0100 Subject: [PATCH 0552/1813] Add some images for scripting course --- AutoCompleteWindowBasic.png | Bin 0 -> 18652 bytes OpenTheScriptingPerspective.png | Bin 0 -> 38744 bytes StandardStartupOutputOnDemo.png | Bin 0 -> 29909 bytes 3 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 AutoCompleteWindowBasic.png create mode 100644 OpenTheScriptingPerspective.png create mode 100644 StandardStartupOutputOnDemo.png diff --git a/AutoCompleteWindowBasic.png b/AutoCompleteWindowBasic.png new file mode 100644 index 0000000000000000000000000000000000000000..c50a123f98972d58049317eb27673a799d250307 GIT binary patch literal 18652 zcmch<2UJtr_AeZdg(E1afGE8wAPN>j(|}T>iS$lDqzR!2F(8D13J8KoRWv9lAU&ZO zAk;(eqL4yI=@5!iLJ8&VpmNT=-~ImYp7Y*#dklx{o$R&dT5FcyY7zdeoa8FnC$x`&3!HN*Q>vlXa&&xsZDt&kO~5ZC#VVq1cuTXvw$d({?EJn^f$}i^FBF9l@5@QpgO|G2$}u^1?aQN!JtLP$mnP}-tcAxmuRN1F_l^JWPNLb8L`T#4i zCeT~MW;^xIDm*hO&YVP65(hZR&OKIm(`jWN{Zmn+-^GqDd872#X{PjhP{BTdQ~QkO zJJzLyd$OZe80gQwT(Sy@`?AM81P*txR$J~>A+oKJh<^R%34a+!Q!w=<@X3g?P06}z z&9nxoS9nUNOoaaa)y!d(`bp7sQiR!x`w?1b-qKK;j=W7{=N#p7JcoBTJ`cfJ}Mvns5*|5@IrX!moBi1S6- zN(6awIV4^C(ZB>}g7XqCJMH{LI~w+}E++wEv&cz)tsTQlpQDNS)Z&Ph-b0}wG!yOW z>!kGrIa!vB%hD7cf1e@K9qF zi~(5!JdV(BgILn=1l;)I3{~Z|b{1Shv=_r@<0+iu%2Wy7_@aT_Efl~reP_5F;>Xs4q%P{&0KDhHcAdkTHh5g6DgT65;{W#`3Q=#;Y@C zEy6yDv836=62#j1BS`wWA2I@1Y;y0d-oRUi?w04~DwCbpj(7$5D&+7s+{)z=P3Bc5 z*tU5?D-YEr(q~a-pH~h;eba&;c{+VK`&31hRHV>BXGL=2xTR@ic(s*`?kI9QaI*w; zA4~sw!6UN3shLmd6SJjq^PP3Pu$jRO1rF-^)~)&2d-K&+>7Od7oX858OYQ}ab~Vfe zm{;Tv{#frdqMzD>n%L&3dn)in9p-2^p=cE1?ObS#h2367bp<; zs^Ao_9+HC*!Kc9&sd0hy>g9+Z4B*YQD4gF4eTN>@7<5+2y3<88h!`_>6wGI=6xP_Q%q66h4H&85q|GYr2s>s>E~b-pUKU`f17TadSL8|_*TQ$$ck>}2 z+T3-uU-3KqzjZ!UIZXQS8kS4*TR;7ss{tnp1l~v872Q!TqTE4ozg_(ym;c@0gCTJ? z0c%y~7clIcKltbBSJ5Xr`i5VAXX05SC7+X>=zd> zs_&FTGoQep{m@9d=QXFj^$+a5{6N$ae)^|YtGTA0|5MqqaVUlDW!Jnh^6Q>iNpsKr zi8tOyj^>9B`qO4ZLrv|N4hp;nWyq)lN||{YC3GLYv2;XG@VJIjSjc3Q=Xh;^s!H9p z7g3KwP5lmv@hYibQ#qR$#HLa=tfl__h!UgV?eB+}#HJOUk8Ol#b1zc+uUb5%si<(@ z*!^-nqnIA88>ckjnBU$)ei#}YA2lqnGr|<3*tm`F+uxK43VRVr_0r7#RFDH`IY!=f>8)pj1CC)a*>%H6wh_bXsYPp&BKrdp^ ze4rN>WG4sJTk=ZeK}Yc+J{i7)A!C(3ZwkN zh2WP^X_v;52g!t)OURhEgpmw1Z^HHEVB(DwQqM?zXpwV8Yb_gk(YMF#PZydS%iT1U+1>G>1O+{? z%Gtwox}{V77Mew>MMS5&V$%{0JeM|g?2NU`o@Vw-u)e@)EGL9K!e@=Ut&Kh6@m#CJ zEmSk`2^&}ZQ8vzG|Bfp8yzxnB@aOcX+tbrM*V3# z$|HMb3c}N7M4XMzf3EGRZ5H@i4t_d+djB9e$(XDV+-qUhR8hnIlyfHcZ}KwGgD>=DTSio}QYfRS z(DkRQH*^J3`32V{cNP*Co-Wh;I%2-bz@jwpfqrqJi9AcvbFpyFvHI~j{=D+?%?BT5 z%`pkee8e~CvX2)qusRg7xgFd*piZ~d0Dt)EkJtE|#=k|f|0AD;uFoy2qo&;%;mr&8~$_eNdZ zz?zIc?7eA5CW+%PA!BMQ*qBqxZx)O@%%fh#hTCf+NtrfF5tG6EE5Dyp47ihGxm||y{EjntGO2tLXB*`r0D%hZj*6epd2Q#|C z@S>l#g24OY;^N4p?T>8uZ#Y3<2bF_ZKZAD%@v|=^r^-C{CA* zpg1fR`-NiYUWAqLP^rt&1T0Y-mcFm7`UEbxxAzKO#!98`ouI(}qZi74>hlbli3;S( z0mb#;P+3Dm;24Ws7d93))(8A!Vio(MbC3(prwR}qInQQ&*(7q-#mz5|LL!$I7N{#RBnbPtqyYax-yBR9|q31c|26_bL- zj^a26Y|lEY{&j^)EjP0sG5g%*Cfmc1i@6?EaaFyiQsQS{9A%N2CRo`mx zeI8vxq<5x{PH%6o-NeT?)$?zqz~JWW+{!Z;42I519rQ!06c`I(>a}x&=av)vEnA!i zUm&yk?5CN^?A@U8Ic}HF6k7F&n8dlaBld#gr0F(&MpONJl%G=A`aV^ZZzln+`K)sL zNn4gv{DtRz_B934nf{Bq=S_(H=c+98lqHf%q>Ile68OM}gtA_!KJF#=@hzaR3uca3 zvC*pNUafhPCRECa9GaNw@4q;2Er@Md$V#hdx#?M;$Y}SJ&im4_sEyRyvHg`LM%1N5 z=JBj)YEyU1X?$9a05Etmvv$3L?&0xG$K^^tp`=_$J36(ZenaL&%l4MukzMY39QSps z@6piZOqZGHVwN}2n~jRhkD6KLFwscka)}Tfe_@6ph&TmZX4h8UesS*A@wMT@i}36& zR>Z9{R2%2>^NQIkV_a)~vrZ)8*>mGn)w)|Nk&ghq@)G*PG+JJ%&=_~|Q%mgaqsF3f>4Gw`Cu~HFcORX~x&EJ$N8J zx0cihfOa|Q3Cm(mxC^y=aop4HaB%A$ghg;vJ^pa4nY=Qxayjo1EW0eCDksZAWfQM)^GY`PvqR= z+0>mw`eyfEne}lR@YX+l1#gCZQ+Zv2TTZCBRB~Or`^u45XFh>E24LlO1RJ}q;i|0P z>Nk8Dz%PS z>uduL4ONB$YIc-WpKXY{O4om*&m8YWJ&pG;uIN7xe`D#>xWNBmW8+;1E%o>89u(sM7nvd8u-G)~F?K_Oh>(WS z9{bJp>Xky5BgfNXBuzg0v!C1-~ za|8qh1?sgJkLqha`Epo3&~A#-GF_$jPPZdc>=1M1V>STlB+&7}brlt*u=qnbz%Pwr z30xkr+I)Tl(0z1YZpSFn?UaMbue0$POMD2HNg_BatHnnf|+KIIQV=uo35l*U>5xkggjV^Ebq;HVl2QY7hC{~K;xTDk_ z4;a7c+YfpR#Fl=N3b=IEF9+Fz;)Zg3#lL+VD|>X8?$Xe0P6vK_wQ*q^;~Lv{T&guU zX+R+0zH8E54$y;6p=^Qord5r}^WOY(0q3jI9+u}SLDT}*{9YcX_-kET?q^$E z6RTT^%gk0gX)Hr7ovx?5XHJ0C+&s2CVsYm6M(v{efv?I8vF`)$iFm*C^6q|=+nl1} zM%Gh*m)I-DLt?dVFO&M-OHNc?JJ;rJRXB&<3pxSBxq`dOJ06y7KiohcSX?_pSd=o2 z?5Rwu_QPs6-@YOlyj84GnuPWyt|Pbi?)XhXaobbR6q_HV1ui56_=vCSNo*c$soSr; z5D{Q1AS9w7X|h$7JvNta9ji*YJnFvP$B5s0czEI4iz$jl+uG9G>V9`2(%P(hXC)*~n;?6cK>Q4r6k%1_o=+Y)j&`;zx|2$(z z62BOk%TR?({;h?JrqlesYAa=9c9dgmg2gp%`{D{1KlL!)o)E_|nw6Oy7`5;ziQ1G` zRiRki>hs9GlY1N|=l;zBxhmKWkR&|5L?XL!!-BY~Lf4y7#lq0!l7 z`+i@*_a84eD@M-v6uOaX#%mkA+6jYN)_sc(1K1vvMnjrIq?{wCbnambz9NZsAUfOV zl>{xMVDZAhH!5+orPn>SWXlS#_L&Rr%Q&a*a%mUsZrQByaQcGS_1&z_=(s8HZ|f2T zpC5kXIZ9|Oa8t|mLu}};MXpo{7H_<}wzW8t+ak$}iBI6miRE(KTrTn(kT^*VxY04| znfN6^D#Qm9%Gn17HZ+Z(6lPYKJJNuql%N4wD;p=uy1dDjNkX@lEZflPG2vON%cbM9 zi61EK_&l6f6>phuG6_FUkOgSMWx`P1rNU%Ac$yxi)>#kc0!3cO6vI4hQLfG%Y8a+6 zX+(P;T#uHKpJ^uk;wSm{HOB$aIFi(Jh9%c6)_ag*7pmOH3V6B3d4I zo>w9)nQ{?rpVdCKh+k4zLUdy=5I(RmIn5!dC-z>>%IC++_3b^BS%oqOPLd-RnG1Zg zOxi`kIR~rVu23lAERp1!Plu;jQ48KI%_&?%FYeixl)jSX<>mUNx>=Ra4GKBhRZ9kVf6$@yx% z!@a3U+3^uxe9rQWi4Ib44&!g|7&Rt?hi-*!Mr0FTlBI#n#Dj-_Ojy5GTv>N&e>IY~ zmf;ZtNm++B%$~$qSAye%d&@rI{75Bj-h3wKW=JGp9U-$e=1rTH%X!OsWE*h24FbSB zva`MPSG#%B*05xp@XCd5y0>GbjvxK_rLo*!8ix8(m1KMlMu*lyd`lj*uZ0Vr!j7*c zY%hKAo4`KzTnSTLIVe^w#?8ffF5Zr>aEO%C2eE<0l{#P}rupc>#h5dxmRGJhU}Ke zfpf__vw$8bjlk8#z=34<#*M2lJ5YzmN3^mcBb`KBs+4#9RDj3g-@fy|M?ur9qO%=0 zG_dQ9@nbXta!av);f+d#b&Zo-e0-5#ZuPtk#*&cu~Rnb{15KZ9Mtj66>JK%$6UO9yyGpa<^`{BnJR06Tny<-fU0 zJt8pH*>ibRd<^q&niIqi+jWWlOOJBbq5ps3D*_mlPxTDH(~9`$=0usvyQIK}g3}%^ zTF9X0rj?;y@_e8lUp$QG*TRL9qLTgVV9iCmJs#hJxG!&J8WwZMBpJHI^l=ooBo1~} zTN(}Up0wx@CdYwCjhElQ4B@n9Hmu~G>C`=At$aL@Qq4a!(M+Bwj*1Nbi!XOba_IQR zpoYC|WI1Z`>5Sr*$B`TUcikiU3x^SMehWf!t8->%+(63jTxGuO z|LXp^-isXID;fmnPQ+0Ax)Bwpo6Upg@@ciCvhiihPJdRot7&fHCHGn&z$8&aW$dfn z`DR%jZ3c`*S6u(fnQ*##?yyB}qt`j@+!}Dvgk=fo=wJM2Nu5Da7B^Xbrs6rK-d1?0y;GB2zK%TDc9wT!F?=r?6G=?a3D-Ch1OgakPG-W7r@1h1CTBCAYS$XUfw z@8@ST=i`cfKWdUcvy4@y7q_%`CB~CbBK9@031hueu+f_6OP<*swtUBClpkgSE-aAZ zqKXas{_+%eJW8}md!r3?2^gGiqqLL9M?%e6y)b#OG>>kGo^3@sN!VH8pa-SRqto2b znhmP}PA7Jw^hQ#_2v^SFiksJVV_97KY$-{1VoEDS>^`qEyzdrcFg2+Mp zBWm=#%?dr-Ac7G~_60kUf`|m%07cMQF}NZOlpSW~w0TKc7)bfF zx*)r*oQXP&ZA|DOM+FCzDP8RDXuLJR_e;g4DhjABuFc%9C6fu<9=gIY1eD`bz`qYXW)7x2C%<(36zk|EoJ-Xo)u!%9Z+q zoEg|Xpn_e41uVn zT2fOE+UukN9(wvLEOuIkWk1}gePE$=|K-tzCop*S0lv)@*5s{cN&(vqk6@d(HU|!X zPF(q`&HWpZNaru1OpJQ(-c>ymbU_8I><3l->1YBq2(88YtGxAlx`o{NV${!8Z;>bb@zj9Ct0uipBoy8rRk<0pB`n*$u6 zjsL@lBf^?+%?ft=V+c{oAql``jBtgVw9gP~d5sYuGTpWyQRwdSos?VRMcm^UWVoY( zEmrnFw9~f_ltOSvPoIMpWYZvKeIHER&SghGOEkDxlx*yOA>B%1)yfPAYSu7+(_`2a zCNq*{o6X7c5zwwl9}|enVNe|JuHN||V805@ZQ6@_Q-H;oI9sr^M$SP`X-!`q!z31V zB9@f#^HUhl#Satj5knfUzKuHIz1BJLcSoNBCZ&#N9XxIdrHA=c(H@HaTGPN zkHoj=%;!e?z~t?&6OZHV2tuCiP;q-wmKPrG|He{kp{PHrQdq9LZx4SnCqQF2PB1I& z^CH%_n-e4o+1+6P)YboYDICuMH-Z5D;DU)Y<6tT-^9gKb+MvW)1H0#6g@(<#)GhJp z%REar)CawWcK2ut{~>-EMN^R>-eOaU^{qBblkKLJJnNY#pfsZC`0jaZ1+leHR9#Y) z*jTs2e}To0GR14Rw;zAJ#Z3)oXZu|g)DyU?9YUk@)d_os*g$_U>@KA;7$~{o+ZEsc z5EJ_U`HW34)p9qPz87S7co!%ID77>-dN-dFzx;j%$Lo{xPHh}K7r$UqX17!@aB=wS zxFrV=F8WjSWl}fpUQ1|moqHbN8>wa1-sh=G0 z9{*ZRjE=fq5)fV0LHpip{=A|XZ3dpbnC4k_!<2NI=+4VHo`o(Oi)Zp`8e=7o8=tC8 zuZpM{a^3?v{7XUqO$>UfHeUCZ0`ntA&|kRqpXDY-1X4i{B6o(NL@|m@AI2yq%E24t ztnYL^{`*TXEnJ5_}`plZqOl~9Zoi?U@rUE zyfzIi4v1KviR4qfunYF0mmMf-T3K`okn{DOx5`Pn0ZtHWz+<)uSb^Mk$Y-|{o zK3Y03`RUdH(B(rV4QtrXthdoY6bkacY&HH6od|g_WiN~N3Y(~)hiw^&ji?A3#cm# z4f*-)XZ*+LB4F|F8Qve1st2>t4!4=m{=59`j`lOkt))_Y1D51dGi1`XoaZ3A@?P*1wL<#H&vTN9Kcvo?0S?w7K*p5(kCh(v?Cwu2amvX%2j}n!4g=oOaeZ zjw7Kg@Q;NB>fX+RiI-0^yZMVDgJ+YfMCp;yMW{wp5-yhlamH z)~rJpeLsS8-P_F#b88T@<|)4?6hG-z>%fmgfsF2;5mN%W*rA=64Lm+*k?jtpy#y-6 zYH(Ix(SbiL60myI^|{E}8JWE|+K!qQipja)5rIPs!=!vM(#%NA6IfD- ze}q*!IKNSMeb-KQ{e4t-@N%6h4>iV89H^{}?ohCS=pn^oa)5~Mvs9qS4M+-)nn&M@ z6b`~@BQc>_uT+R{rFL-&AS{0$^ab$@$M7=NV%hajdX(fmWb6zpi4_+w*j$;NTv^&4>A=8%+4He#Z5 zbt3?Sr%}+Lk}ESY%gb73k^+>W4>*!)oyW@u_V)bJd%S3Obv?hSQlE>rYdrDGpRb>k zsZw=YLk0G4+-~V)XPDLGmkIKBJ=>vNU)H*kD?hd&X6c-&iA7f$crP%|6ESM@s zw!!)($8x=zC+*AZ>uTHa5&%T}rQYeAvi9|n^sBypaY-Csd;z+6EOFZF)q0KFD+}_e z?7n9$IVRL*b|9ZH00O<=1%^^Ua8lu#UQ(je^6QwC`2fK}=U)38V_vWFaFFO6&+Iwtc%z3S+URUA^)+1H$AJpg}!Dg1?@JA2AjukuSvkl{E>G z_s{i^gf25DM%kt-KA(P}ybv3v?MWLp?&(6xzs%0+6S5Ug7)2L6?$5GY^<6zvuWZxX zctzLRmQWd7-XV-UOdxmjwKdu)R%SF(M#wR{S=D!d)(9U% z^(ey%sR<%(6<;f&7!x?3_#Dv=z34FLaB}5FxZn53Yk1=KRo`!C>i7PQY3jQY>^?Sl zk7k}5xOSDEhI$jy(GsT`v2YvieZxg}D|Kg?YgV@>Qo zOTK9>#PRHPG~EQ$8ubg@0F-J5*aO@pI^)}IZjz)y=*IR0EoZ?DBIqf|GUqf-;9)P| zP&#pYMaoI9PL{pn#A4%LcFS-m9jB&uw$gyQTamytX|o_)2n5~h8xb`-Bm6B2pZQg zo9Kn)3GYOp5qjMfHn5TP_LRWW-Fy^%f^+KOV*dlp@kDQ z>ul85*<`>R7Bzr#??wO#(Z;$N9PM8FYn@I2JTM7i$v{o06O6O$z}_FA3rOin4Miod zb|Mz->Vn2RDJc;b-TcG*7ib6YYt`~=)RKD7&nu4Or5ld|p|X_wfD5Ve1kXXE&10Ftb;d+vRSy#S4eVQK#OSMmAPjCvxnb z|8c?8)u-}puYOahUO5=F8`N(11>msgzF)GVOGnvP{==R5x2T2mH){K7A^@=F|DpK- ztc!(vRvy!5yd|L2^1jf!$)v?%FA)s7O4^+kp!TVsUwnT-fkBHECAyK**UoChUn~Hp zbzQRWoDi?uN5mdboWideKlv%QuyA~6?jN`E$=oc7BbJ|AF)VH+aCo)$mr9roco{lW z6zE_@htQM*AW_#Hm=4suzN1$j9t>MwO3j>z<3??>zB1~Pusu`U8f5RPzd8Qy7B&lS z;g7!+VyWQa>SlD&Z;Ok4eCU(~058X#SQ*5x+-Zip*Eag{(MX5)u>{|T%EQb`#BS2@=COjvhy zD{HY%x0MYUoeBeETok=% z`5!@27ZJ#Z5GWmz>NU|s3Fd!^IRiZS59;=8LS|D#sDKtVv?i2_0{vyE;kguD*q&S8 zc0~vPvwx$cj=>Gnpb%8{C$KCbImG~m%P@DR66deu0{N`}ZOAd+I7c_(ab#WM(hG#W1-fy@Uz<-Cvs_gYAb1S+# z#%}co5KzJu+j*6@6$8F-*i^+P2ets=8@u{2_5u`*3f~hvqye;m(HnlyKx|ZT7-we@ zIU{>t>Dikt!z`csuj9m>voMebn_-lysKcN(e?Kmwheg zQZBomE#i#>1}NQ)p$MyBh_)s=1bHqa7D{AqBlgs6@Vjtkv1zrEnwro`ga!~HTcQ`R z0D!M{-dB}3V>S-qTA|*v@Mz7~{@`}2f!h$Mz~vn5DGrWMyk zZVDE19HmEgzi@b8HMGT?cGk9RmtrjA1xu)$%hHKXGl}+61Q6((pbQ+=yxWxxfS$}d zcyH#yA?}8>p z1_g1lw(m_Ve_(@hrs7)tjiW7y@p*yPggqCUae_nUY&{RubqMwAH2>ugTGU?6>O zmK5}1g~N+07%0C@!PYv5mFz56&ql}^np;R$jr5kwPe5bJVBFE8-&5e*8eg|2eczk{ zNIGr}oW}KFdW%eXf0_5Z91FKB|KY=jtF3Jk6$AXg@NInyQFz=gwElK$OUh`dW141; z3b1wR9T<3{X)>vvO+oB-cyhAq18sy(ko(_m-F-`$nmXt&(YIx9P^WK*a?hTJEpJA= zcXD^1cQg#h(AzY9u^zr~#xTP=hFqm{o8g(?y^4?YdW&#+Gh2#M%RA+eg-*XN6Zbit zE8pwzRW&(;?dF@9HMNc-D1(52GsJ5Kn{N({0qr=bIq$=t+=+a*4lS;JADJ-xsmy&>{LwHj1WFRlq8WF1Bk$rKx z7k7No0F|4)&8N%IyPxU!zM&ygbXI`Y=C=5>aRkvi#$@~BG(xkTUcM4SZ_R3#0V3c) zgV^L3(p*+UjB+2z5MQ+yco3?Bd2v ziyex5J8gx-pJM39**|6>+j>)T{No#OpzZDnQ0Q#^jyR+Z@DaTuik0c@x&@2;%Mz@S zx*i#edzp0Rt;Qheenbi)B>;Mx5!1Qp_dv!l3R>fXKQe850b9LDC z2?1zRRM^6V;+ONAw%d~#RQZ|T(JKlB0 zR&Qng)-v9n5XeUp+!-)KCkS!%Ytj5|QnNM>MIDHwT!Xmd4~4WT$4@MN$Q z0lV8&yOsT$wVImREdma9Zro8>Inbr|gV?G{6u<&m>g0euVEOn zhh3k5s#u@SuAbM(;L}h#t19Et%}*icvM9W#&wnNkDChjidl8IcRK5bO>3rM9kC}jk zAm{L3)a(h8JoDZ8LaTWHI(=i5V2NFG%oiG0VG83hhpTkh#7wv8fb`dF#a}1;y_}9P z+iZ$n*I}15|M2?-)~)Z60db0(Q#wg>Y8{~^%8?=vul{6+a_0-oXtZp%N_ z9o<>{zH&0}$zH1`?4Qwu>cdb#Nk3A_2O5$j_R0Wt1I*+AB%bJ9L7=K-lv?e6j? z|FWis?;fEZ5Nv68UyYiNpf5ei>H~v;E-qNtOuBkOx*%3$mNzUTzx1PHk{>p9>6OZI z>OgD5Uv}?Q>L0q-c!agV)IFDSbm%=_a@uHff+@7GG;bpIDUP#D&4!Af2I`lbxr;(- za32k0spdybx}1}JEpf8{x|@gCYnY>*SQ4bsq(WJ7gQ}JT|3-`68mX^OPxlh)z|53O6P76IPQTl~oEU#u33H3`!J$fjGUY5CFs=gHAuj5-D4PCF&0pUJ3nwhZ!7)t2Mz%C1Kyz<{T&ON1!!Ag zfQw~!UZ%rD?>x|rV3W+)}#LgC#ABw literal 0 HcmV?d00001 diff --git a/OpenTheScriptingPerspective.png b/OpenTheScriptingPerspective.png new file mode 100644 index 0000000000000000000000000000000000000000..76cee5c8768b1203510f6fb3f4b02f15d49ec3b6 GIT binary patch literal 38744 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 Date: Wed, 28 Jun 2017 13:44:42 +0100 Subject: [PATCH 0553/1813] Updated Ibex and genie_python: Getting started (markdown) --- Ibex-and-genie_python:-Getting-started.md | 1 - 1 file changed, 1 deletion(-) diff --git a/Ibex-and-genie_python:-Getting-started.md b/Ibex-and-genie_python:-Getting-started.md index a24090b..1ce0e80 100644 --- a/Ibex-and-genie_python:-Getting-started.md +++ b/Ibex-and-genie_python:-Getting-started.md @@ -12,7 +12,6 @@ To open a scripting window: 2. Open the scripting perspective .. image:: OpenTheScriptingPerspective.png - :width: 40pt 3. From here, you can start entering Python code. It will be executed line by line as you enter it. From af48eafb8d957d038822c02419b46d7d754b00e6 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Wed, 28 Jun 2017 13:45:23 +0100 Subject: [PATCH 0554/1813] Updated Ibex and genie_python: Getting started (markdown => rest) --- ...ting-started.md => Ibex-and-genie_python:-Getting-started.rest | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename Ibex-and-genie_python:-Getting-started.md => Ibex-and-genie_python:-Getting-started.rest (100%) diff --git a/Ibex-and-genie_python:-Getting-started.md b/Ibex-and-genie_python:-Getting-started.rest similarity index 100% rename from Ibex-and-genie_python:-Getting-started.md rename to Ibex-and-genie_python:-Getting-started.rest From 1e054a3ac8d37f496776ff97abcd95ed37f0db83 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Wed, 28 Jun 2017 13:46:16 +0100 Subject: [PATCH 0555/1813] Updated Ibex and genie_python: Getting started (rest) --- Ibex-and-genie_python:-Getting-started.rest | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Ibex-and-genie_python:-Getting-started.rest b/Ibex-and-genie_python:-Getting-started.rest index 1ce0e80..a8eab1f 100644 --- a/Ibex-and-genie_python:-Getting-started.rest +++ b/Ibex-and-genie_python:-Getting-started.rest @@ -25,4 +25,6 @@ You can also open a scripting terminal by running ``C:\Instrument\Apps\Python\ge - Open a scripting window in Ibex - Output "Hello, world!" to the console -- Calculate and output the square of all the integers between 1 and 10 \ No newline at end of file +- Calculate and output the square of all the integers between 1 and 10 + +[[Solution]|Exercise-solutions] \ No newline at end of file From e9605ec1b29290c8f84491242e7035d1f2e34ae1 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Wed, 28 Jun 2017 13:47:03 +0100 Subject: [PATCH 0556/1813] Updated Ibex and genie_python: Introduction (rest) --- Ibex-and-genie_python:-Introduction.rest | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Ibex-and-genie_python:-Introduction.rest b/Ibex-and-genie_python:-Introduction.rest index 09a4da9..550d7f2 100644 --- a/Ibex-and-genie_python:-Introduction.rest +++ b/Ibex-and-genie_python:-Introduction.rest @@ -22,4 +22,6 @@ We expect that most people will take this course in a linear fashion, but if you - [[Common commands|Ibex-and-genie_python:-Common-commands]] - [[Scripting|Ibex-and-genie_python:-Scripting]] - [[Converting from ``OpenGENIE``|Ibex-and-genie_python:-Converting-from-OpenGENIE]] -- [[Exercise solutions|Ibex-and-genie_python:-Exercise-solutions]] \ No newline at end of file +- [[Exercise solutions|Ibex-and-genie_python:-Exercise-solutions]] + +**Next**: [[Getting started|Ibex-and-genie_python:-Getting-started]]! \ No newline at end of file From f69af013098ddb52c780a891bd9d65c1ea29ab36 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Wed, 28 Jun 2017 13:47:08 +0100 Subject: [PATCH 0557/1813] Updated Ibex and genie_python: Introduction (rest) --- Ibex-and-genie_python:-Introduction.rest | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Ibex-and-genie_python:-Introduction.rest b/Ibex-and-genie_python:-Introduction.rest index 550d7f2..78e748a 100644 --- a/Ibex-and-genie_python:-Introduction.rest +++ b/Ibex-and-genie_python:-Introduction.rest @@ -24,4 +24,4 @@ We expect that most people will take this course in a linear fashion, but if you - [[Converting from ``OpenGENIE``|Ibex-and-genie_python:-Converting-from-OpenGENIE]] - [[Exercise solutions|Ibex-and-genie_python:-Exercise-solutions]] -**Next**: [[Getting started|Ibex-and-genie_python:-Getting-started]]! \ No newline at end of file +**Next**: [[Getting started|Ibex-and-genie_python:-Getting-started]] \ No newline at end of file From 27029cbbc02fd4bb865bef5e486a7352782c6479 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Wed, 28 Jun 2017 13:47:34 +0100 Subject: [PATCH 0558/1813] Updated Ibex and genie_python: Introduction (rest) --- Ibex-and-genie_python:-Introduction.rest | 1 + 1 file changed, 1 insertion(+) diff --git a/Ibex-and-genie_python:-Introduction.rest b/Ibex-and-genie_python:-Introduction.rest index 78e748a..d124b8c 100644 --- a/Ibex-and-genie_python:-Introduction.rest +++ b/Ibex-and-genie_python:-Introduction.rest @@ -24,4 +24,5 @@ We expect that most people will take this course in a linear fashion, but if you - [[Converting from ``OpenGENIE``|Ibex-and-genie_python:-Converting-from-OpenGENIE]] - [[Exercise solutions|Ibex-and-genie_python:-Exercise-solutions]] +----------------------------- **Next**: [[Getting started|Ibex-and-genie_python:-Getting-started]] \ No newline at end of file From ea65ab3f313e560ebc6a9230071b280750dbc97a Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Wed, 28 Jun 2017 13:47:45 +0100 Subject: [PATCH 0559/1813] Updated Ibex and genie_python: Introduction (rest) --- Ibex-and-genie_python:-Introduction.rest | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Ibex-and-genie_python:-Introduction.rest b/Ibex-and-genie_python:-Introduction.rest index d124b8c..2fca50e 100644 --- a/Ibex-and-genie_python:-Introduction.rest +++ b/Ibex-and-genie_python:-Introduction.rest @@ -24,5 +24,6 @@ We expect that most people will take this course in a linear fashion, but if you - [[Converting from ``OpenGENIE``|Ibex-and-genie_python:-Converting-from-OpenGENIE]] - [[Exercise solutions|Ibex-and-genie_python:-Exercise-solutions]] ------------------------------ +-------------------------------------------------------------------- + **Next**: [[Getting started|Ibex-and-genie_python:-Getting-started]] \ No newline at end of file From 860eb65277ec2b2bfe3abbc5c739835073aa9324 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Wed, 28 Jun 2017 13:55:47 +0100 Subject: [PATCH 0560/1813] Updated Ibex and genie_python: Getting started (rest) --- Ibex-and-genie_python:-Getting-started.rest | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/Ibex-and-genie_python:-Getting-started.rest b/Ibex-and-genie_python:-Getting-started.rest index a8eab1f..dc6040c 100644 --- a/Ibex-and-genie_python:-Getting-started.rest +++ b/Ibex-and-genie_python:-Getting-started.rest @@ -27,4 +27,8 @@ You can also open a scripting terminal by running ``C:\Instrument\Apps\Python\ge - Output "Hello, world!" to the console - Calculate and output the square of all the integers between 1 and 10 -[[Solution]|Exercise-solutions] \ No newline at end of file +[[Solution|Ibex-and-genie_python:-Exercise-solutions]] + +----------------------------------------------------------- + +**Previous**: [[Introduction|Ibex-and-genie_python:-Introduction]] **Next**: [[Common commands|Ibex-and-genie_python:-Common-commands]] \ No newline at end of file From b8066e7e5591ffb8c63f99b1da0b755d12b9bf75 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Wed, 28 Jun 2017 13:56:22 +0100 Subject: [PATCH 0561/1813] Updated Ibex and genie_python: Getting started (rest) --- Ibex-and-genie_python:-Getting-started.rest | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Ibex-and-genie_python:-Getting-started.rest b/Ibex-and-genie_python:-Getting-started.rest index dc6040c..1355c0f 100644 --- a/Ibex-and-genie_python:-Getting-started.rest +++ b/Ibex-and-genie_python:-Getting-started.rest @@ -31,4 +31,5 @@ You can also open a scripting terminal by running ``C:\Instrument\Apps\Python\ge ----------------------------------------------------------- -**Previous**: [[Introduction|Ibex-and-genie_python:-Introduction]] **Next**: [[Common commands|Ibex-and-genie_python:-Common-commands]] \ No newline at end of file +**Previous**: [[Introduction|Ibex-and-genie_python:-Introduction]] +**Next**: [[Common commands|Ibex-and-genie_python:-Common-commands]] \ No newline at end of file From 14c47744d34cd2413abccf18b0ef6502b3e5a9ee Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Wed, 28 Jun 2017 13:56:40 +0100 Subject: [PATCH 0562/1813] Updated Ibex and genie_python: Getting started (rest) --- Ibex-and-genie_python:-Getting-started.rest | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Ibex-and-genie_python:-Getting-started.rest b/Ibex-and-genie_python:-Getting-started.rest index 1355c0f..a825f6a 100644 --- a/Ibex-and-genie_python:-Getting-started.rest +++ b/Ibex-and-genie_python:-Getting-started.rest @@ -29,7 +29,8 @@ You can also open a scripting terminal by running ``C:\Instrument\Apps\Python\ge [[Solution|Ibex-and-genie_python:-Exercise-solutions]] ------------------------------------------------------------ +------------------------------------------------------------------------------- + +**Previous**: [[Introduction|Ibex-and-genie_python:-Introduction]] -**Previous**: [[Introduction|Ibex-and-genie_python:-Introduction]] **Next**: [[Common commands|Ibex-and-genie_python:-Common-commands]] \ No newline at end of file From 56223cb4aa9c72d59d46089a0895439e839da392 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Wed, 28 Jun 2017 13:57:05 +0100 Subject: [PATCH 0563/1813] Updated Ibex and genie_python: Getting started (rest) --- Ibex-and-genie_python:-Getting-started.rest | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Ibex-and-genie_python:-Getting-started.rest b/Ibex-and-genie_python:-Getting-started.rest index a825f6a..b297ac7 100644 --- a/Ibex-and-genie_python:-Getting-started.rest +++ b/Ibex-and-genie_python:-Getting-started.rest @@ -31,6 +31,6 @@ You can also open a scripting terminal by running ``C:\Instrument\Apps\Python\ge ------------------------------------------------------------------------------- -**Previous**: [[Introduction|Ibex-and-genie_python:-Introduction]] +**Previous**: [[Introduction|Ibex-and-genie_python:-Common-commands]] **Next**: [[Common commands|Ibex-and-genie_python:-Common-commands]] \ No newline at end of file From 0af5358da6199b8ec4ce0992f6acbf43c38a67b5 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Wed, 28 Jun 2017 13:57:18 +0100 Subject: [PATCH 0564/1813] Updated Ibex and genie_python: Getting started (rest) --- Ibex-and-genie_python:-Getting-started.rest | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Ibex-and-genie_python:-Getting-started.rest b/Ibex-and-genie_python:-Getting-started.rest index b297ac7..c9ffb9b 100644 --- a/Ibex-and-genie_python:-Getting-started.rest +++ b/Ibex-and-genie_python:-Getting-started.rest @@ -31,6 +31,6 @@ You can also open a scripting terminal by running ``C:\Instrument\Apps\Python\ge ------------------------------------------------------------------------------- -**Previous**: [[Introduction|Ibex-and-genie_python:-Common-commands]] +**Previous**: [[Common commands|Ibex-and-genie_python:-Common-commands]] **Next**: [[Common commands|Ibex-and-genie_python:-Common-commands]] \ No newline at end of file From 31eabeb365177cfaed3b63b3618e625bd97c8dc3 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Wed, 28 Jun 2017 13:57:38 +0100 Subject: [PATCH 0565/1813] Updated Ibex and genie_python: Getting started (rest) --- Ibex-and-genie_python:-Getting-started.rest | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Ibex-and-genie_python:-Getting-started.rest b/Ibex-and-genie_python:-Getting-started.rest index c9ffb9b..a825f6a 100644 --- a/Ibex-and-genie_python:-Getting-started.rest +++ b/Ibex-and-genie_python:-Getting-started.rest @@ -31,6 +31,6 @@ You can also open a scripting terminal by running ``C:\Instrument\Apps\Python\ge ------------------------------------------------------------------------------- -**Previous**: [[Common commands|Ibex-and-genie_python:-Common-commands]] +**Previous**: [[Introduction|Ibex-and-genie_python:-Introduction]] **Next**: [[Common commands|Ibex-and-genie_python:-Common-commands]] \ No newline at end of file From 397020ca18583a56ecff8c41dac52ce6fe14598e Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Wed, 28 Jun 2017 13:57:50 +0100 Subject: [PATCH 0566/1813] Updated Ibex and genie_python: Getting started (rest) --- Ibex-and-genie_python:-Getting-started.rest | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Ibex-and-genie_python:-Getting-started.rest b/Ibex-and-genie_python:-Getting-started.rest index a825f6a..7041829 100644 --- a/Ibex-and-genie_python:-Getting-started.rest +++ b/Ibex-and-genie_python:-Getting-started.rest @@ -31,6 +31,6 @@ You can also open a scripting terminal by running ``C:\Instrument\Apps\Python\ge ------------------------------------------------------------------------------- -**Previous**: [[Introduction|Ibex-and-genie_python:-Introduction]] +**Previous**: [[Common commands|Ibex-and-genie_python:-Introduction]] **Next**: [[Common commands|Ibex-and-genie_python:-Common-commands]] \ No newline at end of file From 88058667b2fe95916278cf5904c5aa9930566122 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Wed, 28 Jun 2017 13:58:05 +0100 Subject: [PATCH 0567/1813] Updated Ibex and genie_python: Getting started (rest) --- Ibex-and-genie_python:-Getting-started.rest | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Ibex-and-genie_python:-Getting-started.rest b/Ibex-and-genie_python:-Getting-started.rest index 7041829..a825f6a 100644 --- a/Ibex-and-genie_python:-Getting-started.rest +++ b/Ibex-and-genie_python:-Getting-started.rest @@ -31,6 +31,6 @@ You can also open a scripting terminal by running ``C:\Instrument\Apps\Python\ge ------------------------------------------------------------------------------- -**Previous**: [[Common commands|Ibex-and-genie_python:-Introduction]] +**Previous**: [[Introduction|Ibex-and-genie_python:-Introduction]] **Next**: [[Common commands|Ibex-and-genie_python:-Common-commands]] \ No newline at end of file From 7302e9ce294a13b352db8fa0eb482fe419de2b81 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Wed, 28 Jun 2017 13:58:26 +0100 Subject: [PATCH 0568/1813] Updated Ibex and genie_python: Getting started (rest) --- Ibex-and-genie_python:-Getting-started.rest | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Ibex-and-genie_python:-Getting-started.rest b/Ibex-and-genie_python:-Getting-started.rest index a825f6a..f781ec3 100644 --- a/Ibex-and-genie_python:-Getting-started.rest +++ b/Ibex-and-genie_python:-Getting-started.rest @@ -31,6 +31,6 @@ You can also open a scripting terminal by running ``C:\Instrument\Apps\Python\ge ------------------------------------------------------------------------------- -**Previous**: [[Introduction|Ibex-and-genie_python:-Introduction]] +**Previous**: [[Welcome|Ibex-and-genie_python:-Introduction]] **Next**: [[Common commands|Ibex-and-genie_python:-Common-commands]] \ No newline at end of file From cabf3a1082297041df969b6d933ba43d4c2b6ac9 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Wed, 28 Jun 2017 13:59:05 +0100 Subject: [PATCH 0569/1813] Updated Ibex and genie_python: Getting started (rest) --- Ibex-and-genie_python:-Getting-started.rest | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Ibex-and-genie_python:-Getting-started.rest b/Ibex-and-genie_python:-Getting-started.rest index f781ec3..e28bf69 100644 --- a/Ibex-and-genie_python:-Getting-started.rest +++ b/Ibex-and-genie_python:-Getting-started.rest @@ -31,6 +31,6 @@ You can also open a scripting terminal by running ``C:\Instrument\Apps\Python\ge ------------------------------------------------------------------------------- -**Previous**: [[Welcome|Ibex-and-genie_python:-Introduction]] +**Previous**: [[Introduction to ``genie_python``|Ibex-and-genie_python:-Introduction]] **Next**: [[Common commands|Ibex-and-genie_python:-Common-commands]] \ No newline at end of file From ff47c977e618a94fc8a2458fbf5b901f3b4422ef Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Wed, 28 Jun 2017 13:59:23 +0100 Subject: [PATCH 0570/1813] Updated Ibex and genie_python: Getting started (rest) --- Ibex-and-genie_python:-Getting-started.rest | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Ibex-and-genie_python:-Getting-started.rest b/Ibex-and-genie_python:-Getting-started.rest index e28bf69..f9a977b 100644 --- a/Ibex-and-genie_python:-Getting-started.rest +++ b/Ibex-and-genie_python:-Getting-started.rest @@ -31,6 +31,6 @@ You can also open a scripting terminal by running ``C:\Instrument\Apps\Python\ge ------------------------------------------------------------------------------- -**Previous**: [[Introduction to ``genie_python``|Ibex-and-genie_python:-Introduction]] +**Previous**: [[Course introduction|Ibex-and-genie_python:-Introduction]] **Next**: [[Common commands|Ibex-and-genie_python:-Common-commands]] \ No newline at end of file From f9e6d35cb6ea6bfd36b8b973790d981b4c240d7e Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Wed, 28 Jun 2017 13:59:38 +0100 Subject: [PATCH 0571/1813] Updated Ibex and genie_python: Common commands (markdown => rest) --- ...mon-commands.md => Ibex-and-genie_python:-Common-commands.rest | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename Ibex-and-genie_python:-Common-commands.md => Ibex-and-genie_python:-Common-commands.rest (100%) diff --git a/Ibex-and-genie_python:-Common-commands.md b/Ibex-and-genie_python:-Common-commands.rest similarity index 100% rename from Ibex-and-genie_python:-Common-commands.md rename to Ibex-and-genie_python:-Common-commands.rest From 1a0175b1d5167fe7bd5f059f2e15f2ac3659b512 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Wed, 28 Jun 2017 14:03:56 +0100 Subject: [PATCH 0572/1813] Updated Ibex and genie_python: Getting started (rest) From 5125bd568d579dda6de52694453b3935924558f2 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Wed, 28 Jun 2017 14:04:34 +0100 Subject: [PATCH 0573/1813] Updated Ibex and genie_python: Common commands (rest) --- Ibex-and-genie_python:-Common-commands.rest | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/Ibex-and-genie_python:-Common-commands.rest b/Ibex-and-genie_python:-Common-commands.rest index 30edcf8..908e897 100644 --- a/Ibex-and-genie_python:-Common-commands.rest +++ b/Ibex-and-genie_python:-Common-commands.rest @@ -97,4 +97,10 @@ Experiment setup - Resume the run - Set the value of "MY_BLOCK" to 20 - Confirm (using ``genie_python``) that the instrument has entered a waiting state -- End the run \ No newline at end of file +- End the run + +------------------------------------------------------------------------------- + +**Previous**: [[Getting started|Ibex-and-genie_python:-Getting-started]] + +**Next**: [[Common commands|Ibex-and-genie_python:-Scripting]] \ No newline at end of file From ffef5b1106daac561add66aebdf6d017fafe74e2 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Wed, 28 Jun 2017 14:05:03 +0100 Subject: [PATCH 0574/1813] Updated Ibex and genie_python: Common commands (rest) --- Ibex-and-genie_python:-Common-commands.rest | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Ibex-and-genie_python:-Common-commands.rest b/Ibex-and-genie_python:-Common-commands.rest index 908e897..56bf558 100644 --- a/Ibex-and-genie_python:-Common-commands.rest +++ b/Ibex-and-genie_python:-Common-commands.rest @@ -5,8 +5,7 @@ Where Ibex has been installed correctly on your machine, ``genie_python`` comman You should have noticed when you typed ``g.`` that an autocomplete window appeared: -:: - IMAGE: AutoCompleteWindowBasic +.. image:: AutoCompleteWindowBasic.png The window lists the available commands, and the arguments they take in brackets. You also notice that a description of the highlighted functions and its arguments is also given. From 71d504545e14f2179056a8ba3eff8bddb7875275 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Wed, 28 Jun 2017 14:06:10 +0100 Subject: [PATCH 0575/1813] Updated Ibex and genie_python: Common commands (rest) --- Ibex-and-genie_python:-Common-commands.rest | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Ibex-and-genie_python:-Common-commands.rest b/Ibex-and-genie_python:-Common-commands.rest index 56bf558..aa1d000 100644 --- a/Ibex-and-genie_python:-Common-commands.rest +++ b/Ibex-and-genie_python:-Common-commands.rest @@ -1,7 +1,7 @@ Accessing ``genie_python`` commands =================================== -Where Ibex has been installed correctly on your machine, ``genie_python`` commands can be accessed via the ``g`` namespace. Try entering ``g.get_version()``. +From an Ibex scripting terminal, ``genie_python`` commands can be accessed via the ``g`` namespace. For example: ``g.get_version()`` You should have noticed when you typed ``g.`` that an autocomplete window appeared: From 08508538e5fdd5fec4592d9fd87557bd23c9cdc7 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Wed, 28 Jun 2017 14:06:53 +0100 Subject: [PATCH 0576/1813] Updated Ibex and genie_python: Common commands (rest) --- Ibex-and-genie_python:-Common-commands.rest | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Ibex-and-genie_python:-Common-commands.rest b/Ibex-and-genie_python:-Common-commands.rest index aa1d000..1553529 100644 --- a/Ibex-and-genie_python:-Common-commands.rest +++ b/Ibex-and-genie_python:-Common-commands.rest @@ -3,11 +3,11 @@ Accessing ``genie_python`` commands From an Ibex scripting terminal, ``genie_python`` commands can be accessed via the ``g`` namespace. For example: ``g.get_version()`` -You should have noticed when you typed ``g.`` that an autocomplete window appeared: +You should have noticed immediately after you typed ``g.`` that an autocomplete window appeared: .. image:: AutoCompleteWindowBasic.png -The window lists the available commands, and the arguments they take in brackets. You also notice that a description of the highlighted functions and its arguments is also given. +The window lists the available commands, and the arguments they take in brackets. You also notice that a description of the highlighted functions and its arguments is also given. The list will be refined as you type more characters. Instrument control ------------------ From 98e0c70e7bf0730b57d2694d17f2fadfee50e9d6 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Wed, 28 Jun 2017 14:07:43 +0100 Subject: [PATCH 0577/1813] Updated Ibex and genie_python: Common commands (rest) --- Ibex-and-genie_python:-Common-commands.rest | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Ibex-and-genie_python:-Common-commands.rest b/Ibex-and-genie_python:-Common-commands.rest index 1553529..12c5da8 100644 --- a/Ibex-and-genie_python:-Common-commands.rest +++ b/Ibex-and-genie_python:-Common-commands.rest @@ -20,9 +20,9 @@ Instrument control commands let you switch between experimental states. The most - ``end``: Ends the current run - ``abort``: Aborts the current run -Each of the commands above accepts an optional ``boolean`` parameter. Setting it to ``True`` (e.g. ``g.begin(True)``) will give extra output from the DAE. +Each of the commands above accepts an optional ``boolean`` parameter. Setting it to ``True`` (e.g. ``g.begin(True)``) will give extra output from the DAE. The default is non-verbose output. -At each point you can get the state of the run as a string using the command: +If you need to get the current state, you can use: - ``get_runstate``: Gets the states of the current run From a026c372c59670c36cf5b5632f03a9750876e2dd Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Wed, 28 Jun 2017 14:09:24 +0100 Subject: [PATCH 0578/1813] Updated Ibex and genie_python: Common commands (rest) --- Ibex-and-genie_python:-Common-commands.rest | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Ibex-and-genie_python:-Common-commands.rest b/Ibex-and-genie_python:-Common-commands.rest index 12c5da8..12f8629 100644 --- a/Ibex-and-genie_python:-Common-commands.rest +++ b/Ibex-and-genie_python:-Common-commands.rest @@ -26,7 +26,7 @@ If you need to get the current state, you can use: - ``get_runstate``: Gets the states of the current run -**NOTE**: Switching run state is not guaranteed. Executing "g.begin()" could lead to a number of run states (e.g. running, waiting, vetoed, setup). It's a good idea to put checks into your scripts that you've reached the expected state before continuing. +**NOTE**: Switching states may not always lead to the assumed state. For example, you may run "g.begin()" and then expect the instrument to be running. It could be, but it could also be waiting, vetoing, or still setup. It's a good idea to put checks into your scripts that you've reached the expected state before continuing. You can update and store DAE results using: From c78cc3ba51e373abe74898296dea87f536d982f0 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Wed, 28 Jun 2017 14:09:59 +0100 Subject: [PATCH 0579/1813] Updated Ibex and genie_python: Common commands (rest) --- Ibex-and-genie_python:-Common-commands.rest | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/Ibex-and-genie_python:-Common-commands.rest b/Ibex-and-genie_python:-Common-commands.rest index 12f8629..00f86a6 100644 --- a/Ibex-and-genie_python:-Common-commands.rest +++ b/Ibex-and-genie_python:-Common-commands.rest @@ -10,7 +10,7 @@ You should have noticed immediately after you typed ``g.`` that an autocomplete The window lists the available commands, and the arguments they take in brackets. You also notice that a description of the highlighted functions and its arguments is also given. The list will be refined as you type more characters. Instrument control ------------------- +================== Instrument control commands let you switch between experimental states. The most common commands are: @@ -26,7 +26,9 @@ If you need to get the current state, you can use: - ``get_runstate``: Gets the states of the current run -**NOTE**: Switching states may not always lead to the assumed state. For example, you may run "g.begin()" and then expect the instrument to be running. It could be, but it could also be waiting, vetoing, or still setup. It's a good idea to put checks into your scripts that you've reached the expected state before continuing. +A word of warning +----------------- +Switching states may not always lead to the assumed state. For example, you may run "g.begin()" and then expect the instrument to be running. It could be, but it could also be waiting, vetoing, or still setup. It's a good idea to put checks into your scripts that you've reached the expected state before continuing. You can update and store DAE results using: From fc7e67bfc16cc3feed9e4ce10139591a9999b449 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Wed, 28 Jun 2017 14:10:23 +0100 Subject: [PATCH 0580/1813] Updated Ibex and genie_python: Common commands (rest) --- Ibex-and-genie_python:-Common-commands.rest | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Ibex-and-genie_python:-Common-commands.rest b/Ibex-and-genie_python:-Common-commands.rest index 00f86a6..0ec5c9b 100644 --- a/Ibex-and-genie_python:-Common-commands.rest +++ b/Ibex-and-genie_python:-Common-commands.rest @@ -26,8 +26,7 @@ If you need to get the current state, you can use: - ``get_runstate``: Gets the states of the current run -A word of warning ------------------ +**WARNING** Switching states may not always lead to the assumed state. For example, you may run "g.begin()" and then expect the instrument to be running. It could be, but it could also be waiting, vetoing, or still setup. It's a good idea to put checks into your scripts that you've reached the expected state before continuing. You can update and store DAE results using: From 291490a1068a418df165e465ffe4a54065843c92 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Wed, 28 Jun 2017 14:11:04 +0100 Subject: [PATCH 0581/1813] Updated Ibex and genie_python: Common commands (rest) --- Ibex-and-genie_python:-Common-commands.rest | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/Ibex-and-genie_python:-Common-commands.rest b/Ibex-and-genie_python:-Common-commands.rest index 0ec5c9b..75617ce 100644 --- a/Ibex-and-genie_python:-Common-commands.rest +++ b/Ibex-and-genie_python:-Common-commands.rest @@ -26,8 +26,7 @@ If you need to get the current state, you can use: - ``get_runstate``: Gets the states of the current run -**WARNING** -Switching states may not always lead to the assumed state. For example, you may run "g.begin()" and then expect the instrument to be running. It could be, but it could also be waiting, vetoing, or still setup. It's a good idea to put checks into your scripts that you've reached the expected state before continuing. +**WARNING**: Switching states may not always lead to the assumed state. For example, you may run "g.begin()" and then expect the instrument to be running. It could be, but it could also be waiting, vetoing, or still setup. It's a good idea to put checks into your scripts that you've reached the expected state before continuing. You can update and store DAE results using: @@ -35,7 +34,10 @@ You can update and store DAE results using: - ``store``: Write the updated DAE information to disk - ``updatestore``: Load the data from the DAE into memory and store it to disk -As an example, the following script will begin and run, then stop it once it reaches a running state: +Worked example +-------------- + +The following script will begin and run, then stop it once it reaches a running state: :: import time From d4dbe252ab9eaa2371f475abb77117aeda2227d7 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Wed, 28 Jun 2017 14:12:08 +0100 Subject: [PATCH 0582/1813] Updated Ibex and genie_python: Common commands (rest) --- Ibex-and-genie_python:-Common-commands.rest | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Ibex-and-genie_python:-Common-commands.rest b/Ibex-and-genie_python:-Common-commands.rest index 75617ce..df29ee4 100644 --- a/Ibex-and-genie_python:-Common-commands.rest +++ b/Ibex-and-genie_python:-Common-commands.rest @@ -37,9 +37,8 @@ You can update and store DAE results using: Worked example -------------- -The following script will begin and run, then stop it once it reaches a running state: +The following script will begin and run, then stop it once it reaches a running state:: -:: import time if g.get_runstate=="SETUP" g.begin() From 98fa156d99135dafc10e0b4868c0012febb7eb76 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Wed, 28 Jun 2017 14:13:28 +0100 Subject: [PATCH 0583/1813] Updated Ibex and genie_python: Common commands (rest) --- Ibex-and-genie_python:-Common-commands.rest | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/Ibex-and-genie_python:-Common-commands.rest b/Ibex-and-genie_python:-Common-commands.rest index df29ee4..b5f8ad7 100644 --- a/Ibex-and-genie_python:-Common-commands.rest +++ b/Ibex-and-genie_python:-Common-commands.rest @@ -40,12 +40,19 @@ Worked example The following script will begin and run, then stop it once it reaches a running state:: import time + + # Only start if we're in the correct state if g.get_runstate=="SETUP" g.begin() - for i in range(60): + + maximum_retries = 60 + for i in range(maximum_retries): if g.get_runstate()=="RUNNING": g.end() + # We're done, exit the loop break + + # Wait for a second before checking again time.sleep(1) else: "Could not reach a running state" From 8ded12783a0006d0ebe56185d33c441cc9172319 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Wed, 28 Jun 2017 14:15:09 +0100 Subject: [PATCH 0584/1813] Updated Ibex and genie_python: Common commands (rest) --- Ibex-and-genie_python:-Common-commands.rest | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/Ibex-and-genie_python:-Common-commands.rest b/Ibex-and-genie_python:-Common-commands.rest index b5f8ad7..0f32f70 100644 --- a/Ibex-and-genie_python:-Common-commands.rest +++ b/Ibex-and-genie_python:-Common-commands.rest @@ -48,12 +48,15 @@ The following script will begin and run, then stop it once it reaches a running maximum_retries = 60 for i in range(maximum_retries): if g.get_runstate()=="RUNNING": - g.end() + + # A function defined elsewhere that does the sequence of operations associated with the run + do_experimental_stuff() + # We're done, exit the loop break - - # Wait for a second before checking again - time.sleep(1) + else: + # Wait for a second before checking again + time.sleep(1) else: "Could not reach a running state" From 22641d39734c4f22ad024a8ceac2a430c67ac6cd Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Wed, 28 Jun 2017 14:15:24 +0100 Subject: [PATCH 0585/1813] Updated Ibex and genie_python: Common commands (rest) --- Ibex-and-genie_python:-Common-commands.rest | 1 + 1 file changed, 1 insertion(+) diff --git a/Ibex-and-genie_python:-Common-commands.rest b/Ibex-and-genie_python:-Common-commands.rest index 0f32f70..ae7653a 100644 --- a/Ibex-and-genie_python:-Common-commands.rest +++ b/Ibex-and-genie_python:-Common-commands.rest @@ -54,6 +54,7 @@ The following script will begin and run, then stop it once it reaches a running # We're done, exit the loop break + else: # Wait for a second before checking again time.sleep(1) From ed75c874bda8b89650e265987dfbd9903d1935ad Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Wed, 28 Jun 2017 14:15:40 +0100 Subject: [PATCH 0586/1813] Updated Ibex and genie_python: Common commands (rest) --- Ibex-and-genie_python:-Common-commands.rest | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Ibex-and-genie_python:-Common-commands.rest b/Ibex-and-genie_python:-Common-commands.rest index ae7653a..4484c3f 100644 --- a/Ibex-and-genie_python:-Common-commands.rest +++ b/Ibex-and-genie_python:-Common-commands.rest @@ -49,7 +49,7 @@ The following script will begin and run, then stop it once it reaches a running for i in range(maximum_retries): if g.get_runstate()=="RUNNING": - # A function defined elsewhere that does the sequence of operations associated with the run + # A function that does the sequence of operations associated with the run do_experimental_stuff() # We're done, exit the loop From 2b6b666604dad2cf66693b535582c2778c9563d9 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Wed, 28 Jun 2017 14:16:19 +0100 Subject: [PATCH 0587/1813] Updated Ibex and genie_python: Common commands (rest) --- Ibex-and-genie_python:-Common-commands.rest | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/Ibex-and-genie_python:-Common-commands.rest b/Ibex-and-genie_python:-Common-commands.rest index 4484c3f..46f9ba5 100644 --- a/Ibex-and-genie_python:-Common-commands.rest +++ b/Ibex-and-genie_python:-Common-commands.rest @@ -73,15 +73,14 @@ Blocks - ``cget``: - Returns settings for a named block as a dictionary of values (e.g. ``MY_BLOCK = 10 (runcontrol = NO, lowlimit = 0.0, highlimit = 0.0)``) - Unlike ``cshow``, a block name must be specified`` - - Properties can be accessed as standard Python: + - Properties can be accessed as standard Python:: -:: block_info = g.cget("MY_BLOCK") name = block_info("name") value = block_info("value") print "The value of block {0} is {1}".format(name, value) -- ``cset`` +- ``cset``: - Sets the value for a particular block - Assumes that either a setpoint exists for the underlying value or the block itself points at a setpoint - Can be called with block names as named arguments. This is useful for setting multiple blocks From 0b5c29296fcc05d62d41bb68d1fff7a67a116fbe Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Wed, 28 Jun 2017 14:17:09 +0100 Subject: [PATCH 0588/1813] Updated Ibex and genie_python: Common commands (rest) --- Ibex-and-genie_python:-Common-commands.rest | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/Ibex-and-genie_python:-Common-commands.rest b/Ibex-and-genie_python:-Common-commands.rest index 46f9ba5..3bf9dd5 100644 --- a/Ibex-and-genie_python:-Common-commands.rest +++ b/Ibex-and-genie_python:-Common-commands.rest @@ -66,11 +66,12 @@ The following script will begin and run, then stop it once it reaches a running Blocks ------ -- ``get_blocks``: Gets a list of the currently available blocks -- ``cshow``: - - Given the name of the block (e.g. `g.chsow("MY_BLOCK")`) it will give a string output of the current settings for that block (e.g. ``MY_BLOCK = 10 (runcontrol = NO, lowlimit = 0.0, highlimit = 0.0)``) +- ``get_blocks`` + - Gets a list of the currently available blocks +- ``cshow`` + - Given the name of the block (e.g. ``g.chsow("MY_BLOCK")``) it will give a string output of the current settings for that block (e.g. ``MY_BLOCK = 10 (runcontrol = NO, lowlimit = 0.0, highlimit = 0.0)``) - If called without arguments, it will show the same information for all blocks, with each block on a new line -- ``cget``: +- ``cget`` - Returns settings for a named block as a dictionary of values (e.g. ``MY_BLOCK = 10 (runcontrol = NO, lowlimit = 0.0, highlimit = 0.0)``) - Unlike ``cshow``, a block name must be specified`` - Properties can be accessed as standard Python:: From d904570b580ca4493daf9188d6be90e3488e6fe3 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Wed, 28 Jun 2017 14:17:25 +0100 Subject: [PATCH 0589/1813] Updated Ibex and genie_python: Common commands (rest) --- Ibex-and-genie_python:-Common-commands.rest | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Ibex-and-genie_python:-Common-commands.rest b/Ibex-and-genie_python:-Common-commands.rest index 3bf9dd5..65412ac 100644 --- a/Ibex-and-genie_python:-Common-commands.rest +++ b/Ibex-and-genie_python:-Common-commands.rest @@ -64,7 +64,7 @@ The following script will begin and run, then stop it once it reaches a running Blocks ------- +======== - ``get_blocks`` - Gets a list of the currently available blocks From 4be4518b9158abdc61306815ba8fbab4d840fe62 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Wed, 28 Jun 2017 14:19:15 +0100 Subject: [PATCH 0590/1813] Updated Ibex and genie_python: Common commands (rest) --- Ibex-and-genie_python:-Common-commands.rest | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Ibex-and-genie_python:-Common-commands.rest b/Ibex-and-genie_python:-Common-commands.rest index 65412ac..aaf9cc0 100644 --- a/Ibex-and-genie_python:-Common-commands.rest +++ b/Ibex-and-genie_python:-Common-commands.rest @@ -66,10 +66,10 @@ The following script will begin and run, then stop it once it reaches a running Blocks ======== -- ``get_blocks`` - - Gets a list of the currently available blocks -- ``cshow`` - - Given the name of the block (e.g. ``g.chsow("MY_BLOCK")``) it will give a string output of the current settings for that block (e.g. ``MY_BLOCK = 10 (runcontrol = NO, lowlimit = 0.0, highlimit = 0.0)``) +- ``get_blocks``: Gets a list of the currently available blocks +- ``cshow``: Shows the properties of a named block/all blocks: + - If given a name (e.g. ``MY_BLOCK``) it will return a string containing properties of the block + - Example ``MY_BLOCK = 10 (runcontrol = NO, lowlimit = 0.0, highlimit = 0.0)`` - If called without arguments, it will show the same information for all blocks, with each block on a new line - ``cget`` - Returns settings for a named block as a dictionary of values (e.g. ``MY_BLOCK = 10 (runcontrol = NO, lowlimit = 0.0, highlimit = 0.0)``) From 98c506b0ef3aabd14fce288df5a3cbf1cbfdf70f Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Wed, 28 Jun 2017 14:33:46 +0100 Subject: [PATCH 0591/1813] Updated Ibex and genie_python: Common commands (rest) --- Ibex-and-genie_python:-Common-commands.rest | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Ibex-and-genie_python:-Common-commands.rest b/Ibex-and-genie_python:-Common-commands.rest index aaf9cc0..462a791 100644 --- a/Ibex-and-genie_python:-Common-commands.rest +++ b/Ibex-and-genie_python:-Common-commands.rest @@ -67,7 +67,7 @@ Blocks ======== - ``get_blocks``: Gets a list of the currently available blocks -- ``cshow``: Shows the properties of a named block/all blocks: +- cshow: Shows the properties of a named block/all blocks: - If given a name (e.g. ``MY_BLOCK``) it will return a string containing properties of the block - Example ``MY_BLOCK = 10 (runcontrol = NO, lowlimit = 0.0, highlimit = 0.0)`` - If called without arguments, it will show the same information for all blocks, with each block on a new line From 928b6a25f6e1738c2c5d84d902c5e13d75738fde Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Wed, 28 Jun 2017 14:34:18 +0100 Subject: [PATCH 0592/1813] Updated Ibex and genie_python: Common commands (rest) --- Ibex-and-genie_python:-Common-commands.rest | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Ibex-and-genie_python:-Common-commands.rest b/Ibex-and-genie_python:-Common-commands.rest index 462a791..89fc79a 100644 --- a/Ibex-and-genie_python:-Common-commands.rest +++ b/Ibex-and-genie_python:-Common-commands.rest @@ -67,7 +67,7 @@ Blocks ======== - ``get_blocks``: Gets a list of the currently available blocks -- cshow: Shows the properties of a named block/all blocks: +- cshow: Shows the properties of a named block/all blocks - If given a name (e.g. ``MY_BLOCK``) it will return a string containing properties of the block - Example ``MY_BLOCK = 10 (runcontrol = NO, lowlimit = 0.0, highlimit = 0.0)`` - If called without arguments, it will show the same information for all blocks, with each block on a new line From 19f3ae226cf56313ac925cfea312358f131f7127 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Wed, 28 Jun 2017 14:34:35 +0100 Subject: [PATCH 0593/1813] Updated Ibex and genie_python: Common commands (rest) --- Ibex-and-genie_python:-Common-commands.rest | 50 +-------------------- 1 file changed, 1 insertion(+), 49 deletions(-) diff --git a/Ibex-and-genie_python:-Common-commands.rest b/Ibex-and-genie_python:-Common-commands.rest index 89fc79a..a5d5d10 100644 --- a/Ibex-and-genie_python:-Common-commands.rest +++ b/Ibex-and-genie_python:-Common-commands.rest @@ -67,52 +67,4 @@ Blocks ======== - ``get_blocks``: Gets a list of the currently available blocks -- cshow: Shows the properties of a named block/all blocks - - If given a name (e.g. ``MY_BLOCK``) it will return a string containing properties of the block - - Example ``MY_BLOCK = 10 (runcontrol = NO, lowlimit = 0.0, highlimit = 0.0)`` - - If called without arguments, it will show the same information for all blocks, with each block on a new line -- ``cget`` - - Returns settings for a named block as a dictionary of values (e.g. ``MY_BLOCK = 10 (runcontrol = NO, lowlimit = 0.0, highlimit = 0.0)``) - - Unlike ``cshow``, a block name must be specified`` - - Properties can be accessed as standard Python:: - - block_info = g.cget("MY_BLOCK") - name = block_info("name") - value = block_info("value") - print "The value of block {0} is {1}".format(name, value) - -- ``cset``: - - Sets the value for a particular block - - Assumes that either a setpoint exists for the underlying value or the block itself points at a setpoint - - Can be called with block names as named arguments. This is useful for setting multiple blocks - - Example: ``g.cset(MY_BLOCK=1, MY_OTHER_BLOCK=2)`` - - The block can also be passed in by name. This is useful when setting advanced block properties: - - Example: ``g.cset("MY_BLOCK", lowlimit=1, highlimit=10, runcontrol=True)`` - - -Run control ------------ - -Experiment setup ----------------- - -**Exercise 2** --------------- -- This exercise requires the following pre-requisites. These should be satisfied if you are following this as part of the Ibex-run training course: - - You have permission to begin and end runs on the instrument you're using. - - The instrument your using has been configured so it can successfully enter a running state - - You have a settable block called "MY_BLOCK" -- Change the title of the run to "Exercise 2" -- Begin a new run -- Pause the run -- Set the value of "MY_BLOCK" to 5, with a high limit of 10, a low limit of 1 and put it under run control -- Resume the run -- Set the value of "MY_BLOCK" to 20 -- Confirm (using ``genie_python``) that the instrument has entered a waiting state -- End the run - -------------------------------------------------------------------------------- - -**Previous**: [[Getting started|Ibex-and-genie_python:-Getting-started]] - -**Next**: [[Common commands|Ibex-and-genie_python:-Scripting]] \ No newline at end of file +- cshow: Shows the properties of a named block/all blocks \ No newline at end of file From e6d55c375f57d5c28858c91659c56e3092b322f4 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Wed, 28 Jun 2017 14:34:56 +0100 Subject: [PATCH 0594/1813] Updated Ibex and genie_python: Common commands (rest) --- Ibex-and-genie_python:-Common-commands.rest | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Ibex-and-genie_python:-Common-commands.rest b/Ibex-and-genie_python:-Common-commands.rest index a5d5d10..8fbe5cf 100644 --- a/Ibex-and-genie_python:-Common-commands.rest +++ b/Ibex-and-genie_python:-Common-commands.rest @@ -67,4 +67,7 @@ Blocks ======== - ``get_blocks``: Gets a list of the currently available blocks -- cshow: Shows the properties of a named block/all blocks \ No newline at end of file +- ``cshow``: Shows the properties of a named block/all blocks + - If given a name (e.g. ``MY_BLOCK``) it will return a string containing properties of the block + - Example ``MY_BLOCK = 10 (runcontrol = NO, lowlimit = 0.0, highlimit = 0.0)`` + - If called without arguments, it will show the same information for all blocks, with each block on a new line \ No newline at end of file From 7f0bace5f3fa9e6eb71fdc38dc23d4e74d60e1a3 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Wed, 28 Jun 2017 14:35:30 +0100 Subject: [PATCH 0595/1813] Updated Ibex and genie_python: Common commands (rest) --- Ibex-and-genie_python:-Common-commands.rest | 48 ++++++++++++++++++++- 1 file changed, 46 insertions(+), 2 deletions(-) diff --git a/Ibex-and-genie_python:-Common-commands.rest b/Ibex-and-genie_python:-Common-commands.rest index 8fbe5cf..fb83939 100644 --- a/Ibex-and-genie_python:-Common-commands.rest +++ b/Ibex-and-genie_python:-Common-commands.rest @@ -69,5 +69,49 @@ Blocks - ``get_blocks``: Gets a list of the currently available blocks - ``cshow``: Shows the properties of a named block/all blocks - If given a name (e.g. ``MY_BLOCK``) it will return a string containing properties of the block - - Example ``MY_BLOCK = 10 (runcontrol = NO, lowlimit = 0.0, highlimit = 0.0)`` - - If called without arguments, it will show the same information for all blocks, with each block on a new line \ No newline at end of file + - If called without arguments, it will show the same information for all blocks, with each block on a new line +- ``cget`` + - Returns settings for a named block as a dictionary of values (e.g. ``MY_BLOCK = 10 (runcontrol = NO, lowlimit = 0.0, highlimit = 0.0)``) + - Unlike ``cshow``, a block name must be specified`` + - Properties can be accessed as standard Python:: + + block_info = g.cget("MY_BLOCK") + name = block_info("name") + value = block_info("value") + print "The value of block {0} is {1}".format(name, value) + +- ``cset``: + - Sets the value for a particular block + - Assumes that either a setpoint exists for the underlying value or the block itself points at a setpoint + - Can be called with block names as named arguments. This is useful for setting multiple blocks + - Example: ``g.cset(MY_BLOCK=1, MY_OTHER_BLOCK=2)`` + - The block can also be passed in by name. This is useful when setting advanced block properties: + - Example: ``g.cset("MY_BLOCK", lowlimit=1, highlimit=10, runcontrol=True)`` + + +Run control +----------- + +Experiment setup +---------------- + +**Exercise 2** +-------------- +- This exercise requires the following pre-requisites. These should be satisfied if you are following this as part of the Ibex-run training course: + - You have permission to begin and end runs on the instrument you're using. + - The instrument your using has been configured so it can successfully enter a running state + - You have a settable block called "MY_BLOCK" +- Change the title of the run to "Exercise 2" +- Begin a new run +- Pause the run +- Set the value of "MY_BLOCK" to 5, with a high limit of 10, a low limit of 1 and put it under run control +- Resume the run +- Set the value of "MY_BLOCK" to 20 +- Confirm (using ``genie_python``) that the instrument has entered a waiting state +- End the run + +------------------------------------------------------------------------------- + +**Previous**: [[Getting started|Ibex-and-genie_python:-Getting-started]] + +**Next**: [[Common commands|Ibex-and-genie_python:-Scripting]] \ No newline at end of file From 15c6f2441ad23a588653ad89ed0b5e50b9276f42 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Wed, 28 Jun 2017 14:35:59 +0100 Subject: [PATCH 0596/1813] Updated Ibex and genie_python: Common commands (rest) --- Ibex-and-genie_python:-Common-commands.rest | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Ibex-and-genie_python:-Common-commands.rest b/Ibex-and-genie_python:-Common-commands.rest index fb83939..68b8188 100644 --- a/Ibex-and-genie_python:-Common-commands.rest +++ b/Ibex-and-genie_python:-Common-commands.rest @@ -69,10 +69,11 @@ Blocks - ``get_blocks``: Gets a list of the currently available blocks - ``cshow``: Shows the properties of a named block/all blocks - If given a name (e.g. ``MY_BLOCK``) it will return a string containing properties of the block + - Example ``MY_BLOCK = 10 (runcontrol = NO, lowlimit = 0.0, highlimit = 0.0)`` - If called without arguments, it will show the same information for all blocks, with each block on a new line - ``cget`` - Returns settings for a named block as a dictionary of values (e.g. ``MY_BLOCK = 10 (runcontrol = NO, lowlimit = 0.0, highlimit = 0.0)``) - - Unlike ``cshow``, a block name must be specified`` + - Unlike ``cshow``, a block name must be specified - Properties can be accessed as standard Python:: block_info = g.cget("MY_BLOCK") From 1a644daf2dc62650eea5286ecedab48086b3adfc Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Wed, 28 Jun 2017 14:37:52 +0100 Subject: [PATCH 0597/1813] Updated Ibex and genie_python: Common commands (rest) --- Ibex-and-genie_python:-Common-commands.rest | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Ibex-and-genie_python:-Common-commands.rest b/Ibex-and-genie_python:-Common-commands.rest index 68b8188..722d16f 100644 --- a/Ibex-and-genie_python:-Common-commands.rest +++ b/Ibex-and-genie_python:-Common-commands.rest @@ -71,22 +71,22 @@ Blocks - If given a name (e.g. ``MY_BLOCK``) it will return a string containing properties of the block - Example ``MY_BLOCK = 10 (runcontrol = NO, lowlimit = 0.0, highlimit = 0.0)`` - If called without arguments, it will show the same information for all blocks, with each block on a new line -- ``cget`` +- ``cget`` - Returns settings for a named block as a dictionary of values (e.g. ``MY_BLOCK = 10 (runcontrol = NO, lowlimit = 0.0, highlimit = 0.0)``) - Unlike ``cshow``, a block name must be specified - Properties can be accessed as standard Python:: - block_info = g.cget("MY_BLOCK") - name = block_info("name") - value = block_info("value") - print "The value of block {0} is {1}".format(name, value) + block_info = g.cget("MY_BLOCK") + name = block_info("name") + value = block_info("value") + print "The value of block {0} is {1}".format(name, value) -- ``cset``: +- ``cset`` - Sets the value for a particular block - Assumes that either a setpoint exists for the underlying value or the block itself points at a setpoint - Can be called with block names as named arguments. This is useful for setting multiple blocks - Example: ``g.cset(MY_BLOCK=1, MY_OTHER_BLOCK=2)`` - - The block can also be passed in by name. This is useful when setting advanced block properties: + - The block can also be passed in by name. This is useful when setting advanced block properties - Example: ``g.cset("MY_BLOCK", lowlimit=1, highlimit=10, runcontrol=True)`` From 793dcf963113b8a4a825b83652432e0be35875fe Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Wed, 28 Jun 2017 14:39:15 +0100 Subject: [PATCH 0598/1813] Updated Ibex and genie_python: Common commands (rest) --- Ibex-and-genie_python:-Common-commands.rest | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/Ibex-and-genie_python:-Common-commands.rest b/Ibex-and-genie_python:-Common-commands.rest index 722d16f..535dcbc 100644 --- a/Ibex-and-genie_python:-Common-commands.rest +++ b/Ibex-and-genie_python:-Common-commands.rest @@ -69,10 +69,10 @@ Blocks - ``get_blocks``: Gets a list of the currently available blocks - ``cshow``: Shows the properties of a named block/all blocks - If given a name (e.g. ``MY_BLOCK``) it will return a string containing properties of the block - - Example ``MY_BLOCK = 10 (runcontrol = NO, lowlimit = 0.0, highlimit = 0.0)`` + - Example: ``MY_BLOCK = 10 (runcontrol = NO, lowlimit = 0.0, highlimit = 0.0)`` - If called without arguments, it will show the same information for all blocks, with each block on a new line -- ``cget`` - - Returns settings for a named block as a dictionary of values (e.g. ``MY_BLOCK = 10 (runcontrol = NO, lowlimit = 0.0, highlimit = 0.0)``) +- ``cget``: Gets properties of a named block as a dictionary of values + - Example: ``MY_BLOCK = 10 (runcontrol = NO, lowlimit = 0.0, highlimit = 0.0)`` - Unlike ``cshow``, a block name must be specified - Properties can be accessed as standard Python:: @@ -81,8 +81,7 @@ Blocks value = block_info("value") print "The value of block {0} is {1}".format(name, value) -- ``cset`` - - Sets the value for a particular block +- ``cset``: Sets the value for a particular block - Assumes that either a setpoint exists for the underlying value or the block itself points at a setpoint - Can be called with block names as named arguments. This is useful for setting multiple blocks - Example: ``g.cset(MY_BLOCK=1, MY_OTHER_BLOCK=2)`` From 4702784aa1ae3dce804836d564415ed17c72071f Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Wed, 28 Jun 2017 14:40:06 +0100 Subject: [PATCH 0599/1813] Updated Ibex and genie_python: Common commands (rest) --- Ibex-and-genie_python:-Common-commands.rest | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Ibex-and-genie_python:-Common-commands.rest b/Ibex-and-genie_python:-Common-commands.rest index 535dcbc..c496e0b 100644 --- a/Ibex-and-genie_python:-Common-commands.rest +++ b/Ibex-and-genie_python:-Common-commands.rest @@ -97,7 +97,7 @@ Experiment setup **Exercise 2** -------------- -- This exercise requires the following pre-requisites. These should be satisfied if you are following this as part of the Ibex-run training course: +- This exercise requires the following pre-requisites. These should be satisfied if you are following this as part of the Ibex-run training course - You have permission to begin and end runs on the instrument you're using. - The instrument your using has been configured so it can successfully enter a running state - You have a settable block called "MY_BLOCK" From f15bb0829141dfdf50e827cbcea722e55753df37 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Wed, 28 Jun 2017 14:40:27 +0100 Subject: [PATCH 0600/1813] Updated Ibex and genie_python: Common commands (rest) --- Ibex-and-genie_python:-Common-commands.rest | 27 --------------------- 1 file changed, 27 deletions(-) diff --git a/Ibex-and-genie_python:-Common-commands.rest b/Ibex-and-genie_python:-Common-commands.rest index c496e0b..eb603f1 100644 --- a/Ibex-and-genie_python:-Common-commands.rest +++ b/Ibex-and-genie_python:-Common-commands.rest @@ -88,30 +88,3 @@ Blocks - The block can also be passed in by name. This is useful when setting advanced block properties - Example: ``g.cset("MY_BLOCK", lowlimit=1, highlimit=10, runcontrol=True)`` - -Run control ------------ - -Experiment setup ----------------- - -**Exercise 2** --------------- -- This exercise requires the following pre-requisites. These should be satisfied if you are following this as part of the Ibex-run training course - - You have permission to begin and end runs on the instrument you're using. - - The instrument your using has been configured so it can successfully enter a running state - - You have a settable block called "MY_BLOCK" -- Change the title of the run to "Exercise 2" -- Begin a new run -- Pause the run -- Set the value of "MY_BLOCK" to 5, with a high limit of 10, a low limit of 1 and put it under run control -- Resume the run -- Set the value of "MY_BLOCK" to 20 -- Confirm (using ``genie_python``) that the instrument has entered a waiting state -- End the run - -------------------------------------------------------------------------------- - -**Previous**: [[Getting started|Ibex-and-genie_python:-Getting-started]] - -**Next**: [[Common commands|Ibex-and-genie_python:-Scripting]] \ No newline at end of file From a8b1424b3e20e82dbbc16a07d9297b877e69a5fb Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Wed, 28 Jun 2017 14:40:43 +0100 Subject: [PATCH 0601/1813] Updated Ibex and genie_python: Common commands (rest) --- Ibex-and-genie_python:-Common-commands.rest | 32 +++++++++++++++++---- 1 file changed, 26 insertions(+), 6 deletions(-) diff --git a/Ibex-and-genie_python:-Common-commands.rest b/Ibex-and-genie_python:-Common-commands.rest index eb603f1..4cb17a9 100644 --- a/Ibex-and-genie_python:-Common-commands.rest +++ b/Ibex-and-genie_python:-Common-commands.rest @@ -81,10 +81,30 @@ Blocks value = block_info("value") print "The value of block {0} is {1}".format(name, value) -- ``cset``: Sets the value for a particular block - - Assumes that either a setpoint exists for the underlying value or the block itself points at a setpoint - - Can be called with block names as named arguments. This is useful for setting multiple blocks - - Example: ``g.cset(MY_BLOCK=1, MY_OTHER_BLOCK=2)`` - - The block can also be passed in by name. This is useful when setting advanced block properties - - Example: ``g.cset("MY_BLOCK", lowlimit=1, highlimit=10, runcontrol=True)`` +Run control +----------- + +Experiment setup +---------------- + +**Exercise 2** +-------------- +- This exercise requires the following pre-requisites. These should be satisfied if you are following this as part of the Ibex-run training course + - You have permission to begin and end runs on the instrument you're using. + - The instrument your using has been configured so it can successfully enter a running state + - You have a settable block called "MY_BLOCK" +- Change the title of the run to "Exercise 2" +- Begin a new run +- Pause the run +- Set the value of "MY_BLOCK" to 5, with a high limit of 10, a low limit of 1 and put it under run control +- Resume the run +- Set the value of "MY_BLOCK" to 20 +- Confirm (using ``genie_python``) that the instrument has entered a waiting state +- End the run + +------------------------------------------------------------------------------- + +**Previous**: [[Getting started|Ibex-and-genie_python:-Getting-started]] + +**Next**: [[Common commands|Ibex-and-genie_python:-Scripting]] From 3a4178a897e9d350d36dbefa67019292117f0a6d Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Wed, 28 Jun 2017 14:41:03 +0100 Subject: [PATCH 0602/1813] Updated Ibex and genie_python: Common commands (rest) --- Ibex-and-genie_python:-Common-commands.rest | 9 --------- 1 file changed, 9 deletions(-) diff --git a/Ibex-and-genie_python:-Common-commands.rest b/Ibex-and-genie_python:-Common-commands.rest index 4cb17a9..daf0a3d 100644 --- a/Ibex-and-genie_python:-Common-commands.rest +++ b/Ibex-and-genie_python:-Common-commands.rest @@ -71,15 +71,6 @@ Blocks - If given a name (e.g. ``MY_BLOCK``) it will return a string containing properties of the block - Example: ``MY_BLOCK = 10 (runcontrol = NO, lowlimit = 0.0, highlimit = 0.0)`` - If called without arguments, it will show the same information for all blocks, with each block on a new line -- ``cget``: Gets properties of a named block as a dictionary of values - - Example: ``MY_BLOCK = 10 (runcontrol = NO, lowlimit = 0.0, highlimit = 0.0)`` - - Unlike ``cshow``, a block name must be specified - - Properties can be accessed as standard Python:: - - block_info = g.cget("MY_BLOCK") - name = block_info("name") - value = block_info("value") - print "The value of block {0} is {1}".format(name, value) Run control ----------- From e77a4d51bd761c8a162bdf780eec4f47e5c7a337 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Wed, 28 Jun 2017 14:41:31 +0100 Subject: [PATCH 0603/1813] Updated Ibex and genie_python: Common commands (rest) --- Ibex-and-genie_python:-Common-commands.rest | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/Ibex-and-genie_python:-Common-commands.rest b/Ibex-and-genie_python:-Common-commands.rest index daf0a3d..ed9f6d4 100644 --- a/Ibex-and-genie_python:-Common-commands.rest +++ b/Ibex-and-genie_python:-Common-commands.rest @@ -67,10 +67,22 @@ Blocks ======== - ``get_blocks``: Gets a list of the currently available blocks -- ``cshow``: Shows the properties of a named block/all blocks - - If given a name (e.g. ``MY_BLOCK``) it will return a string containing properties of the block - - Example: ``MY_BLOCK = 10 (runcontrol = NO, lowlimit = 0.0, highlimit = 0.0)`` - - If called without arguments, it will show the same information for all blocks, with each block on a new line +- ``cget``: Gets properties of a named block as a dictionary of values + - Example: ``MY_BLOCK = 10 (runcontrol = NO, lowlimit = 0.0, highlimit = 0.0)`` + - Unlike ``cshow``, a block name must be specified + - Properties can be accessed as standard Python:: + + block_info = g.cget("MY_BLOCK") + name = block_info("name") + value = block_info("value") + print "The value of block {0} is {1}".format(name, value) + +- ``cset``: Sets the value for a particular block + - Assumes that either a setpoint exists for the underlying value or the block itself points at a setpoint + - Can be called with block names as named arguments. This is useful for setting multiple blocks + - Example: ``g.cset(MY_BLOCK=1, MY_OTHER_BLOCK=2)`` + - The block can also be passed in by name. This is useful when setting advanced block properties + - Example: ``g.cset("MY_BLOCK", lowlimit=1, highlimit=10, runcontrol=True)`` Run control ----------- From b95dc39015f98dc0cc6c9273b02bd8356828906e Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Wed, 28 Jun 2017 14:41:49 +0100 Subject: [PATCH 0604/1813] Updated Ibex and genie_python: Common commands (rest) --- Ibex-and-genie_python:-Common-commands.rest | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/Ibex-and-genie_python:-Common-commands.rest b/Ibex-and-genie_python:-Common-commands.rest index ed9f6d4..633512e 100644 --- a/Ibex-and-genie_python:-Common-commands.rest +++ b/Ibex-and-genie_python:-Common-commands.rest @@ -66,7 +66,11 @@ The following script will begin and run, then stop it once it reaches a running Blocks ======== -- ``get_blocks``: Gets a list of the currently available blocks +- ``get_blocks`` - Gets a list of the currently available blocks +- ``cshow`` - Shows the properties of a named block/all blocks + - If given a name (e.g. ``MY_BLOCK``) it will return a string containing properties of the block + - Example: ``MY_BLOCK = 10 (runcontrol = NO, lowlimit = 0.0, highlimit = 0.0)`` + - If called without arguments, it will show the same information for all blocks, with each block on a new line - ``cget``: Gets properties of a named block as a dictionary of values - Example: ``MY_BLOCK = 10 (runcontrol = NO, lowlimit = 0.0, highlimit = 0.0)`` - Unlike ``cshow``, a block name must be specified From eb6daf03cf35f409f09d0a5545cbc9791c96efe6 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Wed, 28 Jun 2017 14:43:27 +0100 Subject: [PATCH 0605/1813] Updated Ibex and genie_python: Common commands (rest) --- Ibex-and-genie_python:-Common-commands.rest | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Ibex-and-genie_python:-Common-commands.rest b/Ibex-and-genie_python:-Common-commands.rest index 633512e..7a2f77f 100644 --- a/Ibex-and-genie_python:-Common-commands.rest +++ b/Ibex-and-genie_python:-Common-commands.rest @@ -66,8 +66,8 @@ The following script will begin and run, then stop it once it reaches a running Blocks ======== -- ``get_blocks`` - Gets a list of the currently available blocks -- ``cshow`` - Shows the properties of a named block/all blocks +- ``get_blocks``: Gets a list of the currently available blocks +- ``cshow``: Shows the properties of a named block/all blocks - If given a name (e.g. ``MY_BLOCK``) it will return a string containing properties of the block - Example: ``MY_BLOCK = 10 (runcontrol = NO, lowlimit = 0.0, highlimit = 0.0)`` - If called without arguments, it will show the same information for all blocks, with each block on a new line From f40f21bc7579301d13330e638122b6ea5d54e808 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Wed, 28 Jun 2017 14:43:48 +0100 Subject: [PATCH 0606/1813] Created Test RST (markdown) --- Test-RST.md | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 Test-RST.md diff --git a/Test-RST.md b/Test-RST.md new file mode 100644 index 0000000..3bcd3c2 --- /dev/null +++ b/Test-RST.md @@ -0,0 +1,21 @@ +- ``get_blocks``: Gets a list of the currently available blocks +- ``cshow``: Shows the properties of a named block/all blocks + - If given a name (e.g. ``MY_BLOCK``) it will return a string containing properties of the block + - Example: ``MY_BLOCK = 10 (runcontrol = NO, lowlimit = 0.0, highlimit = 0.0)`` + - If called without arguments, it will show the same information for all blocks, with each block on a new line +- ``cget``: Gets properties of a named block as a dictionary of values + - Example: ``MY_BLOCK = 10 (runcontrol = NO, lowlimit = 0.0, highlimit = 0.0)`` + - Unlike ``cshow``, a block name must be specified + - Properties can be accessed as standard Python:: + + block_info = g.cget("MY_BLOCK") + name = block_info("name") + value = block_info("value") + print "The value of block {0} is {1}".format(name, value) + +- ``cset``: Sets the value for a particular block + - Assumes that either a setpoint exists for the underlying value or the block itself points at a setpoint + - Can be called with block names as named arguments. This is useful for setting multiple blocks + - Example: ``g.cset(MY_BLOCK=1, MY_OTHER_BLOCK=2)`` + - The block can also be passed in by name. This is useful when setting advanced block properties + - Example: ``g.cset("MY_BLOCK", lowlimit=1, highlimit=10, runcontrol=True)`` \ No newline at end of file From 9366ed53761883493327b002acbfd4dc72de6354 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Wed, 28 Jun 2017 14:44:06 +0100 Subject: [PATCH 0607/1813] Updated Test RST (markdown) --- Test-RST.md | 68 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 68 insertions(+) diff --git a/Test-RST.md b/Test-RST.md index 3bcd3c2..479753e 100644 --- a/Test-RST.md +++ b/Test-RST.md @@ -1,3 +1,71 @@ +Accessing ``genie_python`` commands +=================================== + +From an Ibex scripting terminal, ``genie_python`` commands can be accessed via the ``g`` namespace. For example: ``g.get_version()`` + +You should have noticed immediately after you typed ``g.`` that an autocomplete window appeared: + +.. image:: AutoCompleteWindowBasic.png + +The window lists the available commands, and the arguments they take in brackets. You also notice that a description of the highlighted functions and its arguments is also given. The list will be refined as you type more characters. + +Instrument control +================== + +Instrument control commands let you switch between experimental states. The most common commands are: + +- ``begin``: Begins a new run +- ``pause``: Pauses the current run +- ``resume``: Resumes the current run +- ``end``: Ends the current run +- ``abort``: Aborts the current run + +Each of the commands above accepts an optional ``boolean`` parameter. Setting it to ``True`` (e.g. ``g.begin(True)``) will give extra output from the DAE. The default is non-verbose output. + +If you need to get the current state, you can use: + +- ``get_runstate``: Gets the states of the current run + +**WARNING**: Switching states may not always lead to the assumed state. For example, you may run "g.begin()" and then expect the instrument to be running. It could be, but it could also be waiting, vetoing, or still setup. It's a good idea to put checks into your scripts that you've reached the expected state before continuing. + +You can update and store DAE results using: + +- ``update``: Load the data from the DAE into memory +- ``store``: Write the updated DAE information to disk +- ``updatestore``: Load the data from the DAE into memory and store it to disk + +Worked example +-------------- + +The following script will begin and run, then stop it once it reaches a running state:: + + import time + + # Only start if we're in the correct state + if g.get_runstate=="SETUP" + g.begin() + + maximum_retries = 60 + for i in range(maximum_retries): + if g.get_runstate()=="RUNNING": + + # A function that does the sequence of operations associated with the run + do_experimental_stuff() + + # We're done, exit the loop + break + + else: + # Wait for a second before checking again + time.sleep(1) + else: + "Could not reach a running state" + + + +Blocks +======== + - ``get_blocks``: Gets a list of the currently available blocks - ``cshow``: Shows the properties of a named block/all blocks - If given a name (e.g. ``MY_BLOCK``) it will return a string containing properties of the block From 7b53a4d1f976f315cf57d73b05fab08a03218955 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Wed, 28 Jun 2017 14:44:13 +0100 Subject: [PATCH 0608/1813] Updated Test RST (markdown) --- Test-RST.md | 30 +++++++++++++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/Test-RST.md b/Test-RST.md index 479753e..7a2f77f 100644 --- a/Test-RST.md +++ b/Test-RST.md @@ -86,4 +86,32 @@ Blocks - Can be called with block names as named arguments. This is useful for setting multiple blocks - Example: ``g.cset(MY_BLOCK=1, MY_OTHER_BLOCK=2)`` - The block can also be passed in by name. This is useful when setting advanced block properties - - Example: ``g.cset("MY_BLOCK", lowlimit=1, highlimit=10, runcontrol=True)`` \ No newline at end of file + - Example: ``g.cset("MY_BLOCK", lowlimit=1, highlimit=10, runcontrol=True)`` + +Run control +----------- + +Experiment setup +---------------- + +**Exercise 2** +-------------- +- This exercise requires the following pre-requisites. These should be satisfied if you are following this as part of the Ibex-run training course + - You have permission to begin and end runs on the instrument you're using. + - The instrument your using has been configured so it can successfully enter a running state + - You have a settable block called "MY_BLOCK" +- Change the title of the run to "Exercise 2" +- Begin a new run +- Pause the run +- Set the value of "MY_BLOCK" to 5, with a high limit of 10, a low limit of 1 and put it under run control +- Resume the run +- Set the value of "MY_BLOCK" to 20 +- Confirm (using ``genie_python``) that the instrument has entered a waiting state +- End the run + +------------------------------------------------------------------------------- + +**Previous**: [[Getting started|Ibex-and-genie_python:-Getting-started]] + +**Next**: [[Common commands|Ibex-and-genie_python:-Scripting]] + From 0ace2cc161b3f0fb2cdde0389f86491f1a63be28 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Wed, 28 Jun 2017 14:44:35 +0100 Subject: [PATCH 0609/1813] Updated Test RST (markdown => rest) --- Test-RST.md => Test-RST.rest | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename Test-RST.md => Test-RST.rest (100%) diff --git a/Test-RST.md b/Test-RST.rest similarity index 100% rename from Test-RST.md rename to Test-RST.rest From 35511a2e66a30c62917d28782df38c5d79143ee8 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Wed, 28 Jun 2017 14:44:48 +0100 Subject: [PATCH 0610/1813] Updated Test RST (rest) --- Test-RST.rest | 6 ------ 1 file changed, 6 deletions(-) diff --git a/Test-RST.rest b/Test-RST.rest index 7a2f77f..e2c82ba 100644 --- a/Test-RST.rest +++ b/Test-RST.rest @@ -108,10 +108,4 @@ Experiment setup - Set the value of "MY_BLOCK" to 20 - Confirm (using ``genie_python``) that the instrument has entered a waiting state - End the run - -------------------------------------------------------------------------------- - -**Previous**: [[Getting started|Ibex-and-genie_python:-Getting-started]] - -**Next**: [[Common commands|Ibex-and-genie_python:-Scripting]] From ab40e7767eea3b6a82f35ec4555bd484d39615f0 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Wed, 28 Jun 2017 14:45:01 +0100 Subject: [PATCH 0611/1813] Updated Test RST (rest) --- Test-RST.rest | 24 +----------------------- 1 file changed, 1 insertion(+), 23 deletions(-) diff --git a/Test-RST.rest b/Test-RST.rest index e2c82ba..479753e 100644 --- a/Test-RST.rest +++ b/Test-RST.rest @@ -86,26 +86,4 @@ Blocks - Can be called with block names as named arguments. This is useful for setting multiple blocks - Example: ``g.cset(MY_BLOCK=1, MY_OTHER_BLOCK=2)`` - The block can also be passed in by name. This is useful when setting advanced block properties - - Example: ``g.cset("MY_BLOCK", lowlimit=1, highlimit=10, runcontrol=True)`` - -Run control ------------ - -Experiment setup ----------------- - -**Exercise 2** --------------- -- This exercise requires the following pre-requisites. These should be satisfied if you are following this as part of the Ibex-run training course - - You have permission to begin and end runs on the instrument you're using. - - The instrument your using has been configured so it can successfully enter a running state - - You have a settable block called "MY_BLOCK" -- Change the title of the run to "Exercise 2" -- Begin a new run -- Pause the run -- Set the value of "MY_BLOCK" to 5, with a high limit of 10, a low limit of 1 and put it under run control -- Resume the run -- Set the value of "MY_BLOCK" to 20 -- Confirm (using ``genie_python``) that the instrument has entered a waiting state -- End the run - + - Example: ``g.cset("MY_BLOCK", lowlimit=1, highlimit=10, runcontrol=True)`` \ No newline at end of file From 2d6d3b385feaae18c626038380218c7e06286ef9 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Wed, 28 Jun 2017 14:45:11 +0100 Subject: [PATCH 0612/1813] Updated Test RST (rest) --- Test-RST.rest | 68 --------------------------------------------------- 1 file changed, 68 deletions(-) diff --git a/Test-RST.rest b/Test-RST.rest index 479753e..3bcd3c2 100644 --- a/Test-RST.rest +++ b/Test-RST.rest @@ -1,71 +1,3 @@ -Accessing ``genie_python`` commands -=================================== - -From an Ibex scripting terminal, ``genie_python`` commands can be accessed via the ``g`` namespace. For example: ``g.get_version()`` - -You should have noticed immediately after you typed ``g.`` that an autocomplete window appeared: - -.. image:: AutoCompleteWindowBasic.png - -The window lists the available commands, and the arguments they take in brackets. You also notice that a description of the highlighted functions and its arguments is also given. The list will be refined as you type more characters. - -Instrument control -================== - -Instrument control commands let you switch between experimental states. The most common commands are: - -- ``begin``: Begins a new run -- ``pause``: Pauses the current run -- ``resume``: Resumes the current run -- ``end``: Ends the current run -- ``abort``: Aborts the current run - -Each of the commands above accepts an optional ``boolean`` parameter. Setting it to ``True`` (e.g. ``g.begin(True)``) will give extra output from the DAE. The default is non-verbose output. - -If you need to get the current state, you can use: - -- ``get_runstate``: Gets the states of the current run - -**WARNING**: Switching states may not always lead to the assumed state. For example, you may run "g.begin()" and then expect the instrument to be running. It could be, but it could also be waiting, vetoing, or still setup. It's a good idea to put checks into your scripts that you've reached the expected state before continuing. - -You can update and store DAE results using: - -- ``update``: Load the data from the DAE into memory -- ``store``: Write the updated DAE information to disk -- ``updatestore``: Load the data from the DAE into memory and store it to disk - -Worked example --------------- - -The following script will begin and run, then stop it once it reaches a running state:: - - import time - - # Only start if we're in the correct state - if g.get_runstate=="SETUP" - g.begin() - - maximum_retries = 60 - for i in range(maximum_retries): - if g.get_runstate()=="RUNNING": - - # A function that does the sequence of operations associated with the run - do_experimental_stuff() - - # We're done, exit the loop - break - - else: - # Wait for a second before checking again - time.sleep(1) - else: - "Could not reach a running state" - - - -Blocks -======== - - ``get_blocks``: Gets a list of the currently available blocks - ``cshow``: Shows the properties of a named block/all blocks - If given a name (e.g. ``MY_BLOCK``) it will return a string containing properties of the block From 877e38c067d1025f8bbb57ce6f1472e22c082d81 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Wed, 28 Jun 2017 14:45:57 +0100 Subject: [PATCH 0613/1813] Updated Test RST (rest) --- Test-RST.rest | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Test-RST.rest b/Test-RST.rest index 3bcd3c2..fcb3b0e 100644 --- a/Test-RST.rest +++ b/Test-RST.rest @@ -1,9 +1,9 @@ -- ``get_blocks``: Gets a list of the currently available blocks -- ``cshow``: Shows the properties of a named block/all blocks +- get_blocks: Gets a list of the currently available blocks +- cshow: Shows the properties of a named block/all blocks - If given a name (e.g. ``MY_BLOCK``) it will return a string containing properties of the block - Example: ``MY_BLOCK = 10 (runcontrol = NO, lowlimit = 0.0, highlimit = 0.0)`` - If called without arguments, it will show the same information for all blocks, with each block on a new line -- ``cget``: Gets properties of a named block as a dictionary of values +- cget: Gets properties of a named block as a dictionary of values - Example: ``MY_BLOCK = 10 (runcontrol = NO, lowlimit = 0.0, highlimit = 0.0)`` - Unlike ``cshow``, a block name must be specified - Properties can be accessed as standard Python:: @@ -13,7 +13,7 @@ value = block_info("value") print "The value of block {0} is {1}".format(name, value) -- ``cset``: Sets the value for a particular block +- cset: Sets the value for a particular block - Assumes that either a setpoint exists for the underlying value or the block itself points at a setpoint - Can be called with block names as named arguments. This is useful for setting multiple blocks - Example: ``g.cset(MY_BLOCK=1, MY_OTHER_BLOCK=2)`` From d3a2f0ab909d066aadeb450097e81df6aed30443 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Wed, 28 Jun 2017 14:46:04 +0100 Subject: [PATCH 0614/1813] Updated Test RST (rest) --- Test-RST.rest | 1 - 1 file changed, 1 deletion(-) diff --git a/Test-RST.rest b/Test-RST.rest index fcb3b0e..e20bf18 100644 --- a/Test-RST.rest +++ b/Test-RST.rest @@ -1,4 +1,3 @@ -- get_blocks: Gets a list of the currently available blocks - cshow: Shows the properties of a named block/all blocks - If given a name (e.g. ``MY_BLOCK``) it will return a string containing properties of the block - Example: ``MY_BLOCK = 10 (runcontrol = NO, lowlimit = 0.0, highlimit = 0.0)`` From 242ffa346bcda04ff93e7e536dccccb44aab5795 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Wed, 28 Jun 2017 14:46:20 +0100 Subject: [PATCH 0615/1813] Updated Test RST (rest) --- Test-RST.rest | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Test-RST.rest b/Test-RST.rest index e20bf18..dfdfa61 100644 --- a/Test-RST.rest +++ b/Test-RST.rest @@ -1,8 +1,8 @@ -- cshow: Shows the properties of a named block/all blocks +- Shows the properties of a named block/all blocks - If given a name (e.g. ``MY_BLOCK``) it will return a string containing properties of the block - Example: ``MY_BLOCK = 10 (runcontrol = NO, lowlimit = 0.0, highlimit = 0.0)`` - If called without arguments, it will show the same information for all blocks, with each block on a new line -- cget: Gets properties of a named block as a dictionary of values +- Gets properties of a named block as a dictionary of values - Example: ``MY_BLOCK = 10 (runcontrol = NO, lowlimit = 0.0, highlimit = 0.0)`` - Unlike ``cshow``, a block name must be specified - Properties can be accessed as standard Python:: @@ -12,7 +12,7 @@ value = block_info("value") print "The value of block {0} is {1}".format(name, value) -- cset: Sets the value for a particular block +- Sets the value for a particular block - Assumes that either a setpoint exists for the underlying value or the block itself points at a setpoint - Can be called with block names as named arguments. This is useful for setting multiple blocks - Example: ``g.cset(MY_BLOCK=1, MY_OTHER_BLOCK=2)`` From 2a15188258b3f9f13b0a049c7ea7585621ba1eee Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Wed, 28 Jun 2017 14:46:28 +0100 Subject: [PATCH 0616/1813] Updated Test RST (rest) --- Test-RST.rest | 3 --- 1 file changed, 3 deletions(-) diff --git a/Test-RST.rest b/Test-RST.rest index dfdfa61..97924da 100644 --- a/Test-RST.rest +++ b/Test-RST.rest @@ -1,7 +1,4 @@ - Shows the properties of a named block/all blocks - - If given a name (e.g. ``MY_BLOCK``) it will return a string containing properties of the block - - Example: ``MY_BLOCK = 10 (runcontrol = NO, lowlimit = 0.0, highlimit = 0.0)`` - - If called without arguments, it will show the same information for all blocks, with each block on a new line - Gets properties of a named block as a dictionary of values - Example: ``MY_BLOCK = 10 (runcontrol = NO, lowlimit = 0.0, highlimit = 0.0)`` - Unlike ``cshow``, a block name must be specified From 2ff06c5b6482f4b9c727e00f660f9ef1e95a885c Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Wed, 28 Jun 2017 14:46:39 +0100 Subject: [PATCH 0617/1813] Updated Test RST (rest) --- Test-RST.rest | 8 -------- 1 file changed, 8 deletions(-) diff --git a/Test-RST.rest b/Test-RST.rest index 97924da..5c2d67d 100644 --- a/Test-RST.rest +++ b/Test-RST.rest @@ -1,13 +1,5 @@ - Shows the properties of a named block/all blocks - Gets properties of a named block as a dictionary of values - - Example: ``MY_BLOCK = 10 (runcontrol = NO, lowlimit = 0.0, highlimit = 0.0)`` - - Unlike ``cshow``, a block name must be specified - - Properties can be accessed as standard Python:: - - block_info = g.cget("MY_BLOCK") - name = block_info("name") - value = block_info("value") - print "The value of block {0} is {1}".format(name, value) - Sets the value for a particular block - Assumes that either a setpoint exists for the underlying value or the block itself points at a setpoint From 14c878e3a4383d780f4281937f555b0de71249b6 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Wed, 28 Jun 2017 14:46:45 +0100 Subject: [PATCH 0618/1813] Updated Test RST (rest) --- Test-RST.rest | 3 --- 1 file changed, 3 deletions(-) diff --git a/Test-RST.rest b/Test-RST.rest index 5c2d67d..fe63bde 100644 --- a/Test-RST.rest +++ b/Test-RST.rest @@ -1,6 +1,3 @@ -- Shows the properties of a named block/all blocks -- Gets properties of a named block as a dictionary of values - - Sets the value for a particular block - Assumes that either a setpoint exists for the underlying value or the block itself points at a setpoint - Can be called with block names as named arguments. This is useful for setting multiple blocks From f03d6dc27ba241dc7842351a7de976ba76ae8f0f Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Wed, 28 Jun 2017 14:46:53 +0100 Subject: [PATCH 0619/1813] Updated Test RST (rest) --- Test-RST.rest | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/Test-RST.rest b/Test-RST.rest index fe63bde..1880c21 100644 --- a/Test-RST.rest +++ b/Test-RST.rest @@ -1,6 +1,2 @@ - Sets the value for a particular block - - Assumes that either a setpoint exists for the underlying value or the block itself points at a setpoint - - Can be called with block names as named arguments. This is useful for setting multiple blocks - - Example: ``g.cset(MY_BLOCK=1, MY_OTHER_BLOCK=2)`` - - The block can also be passed in by name. This is useful when setting advanced block properties - - Example: ``g.cset("MY_BLOCK", lowlimit=1, highlimit=10, runcontrol=True)`` \ No newline at end of file + - Assumes that either a setpoint exists for the underlying value or the block itself points at a setpoint \ No newline at end of file From d246cda1981de4752b75adb0df8818289dbc31f3 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Wed, 28 Jun 2017 14:47:01 +0100 Subject: [PATCH 0620/1813] Updated Test RST (rest) --- Test-RST.rest | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Test-RST.rest b/Test-RST.rest index 1880c21..528b923 100644 --- a/Test-RST.rest +++ b/Test-RST.rest @@ -1,2 +1,2 @@ - Sets the value for a particular block - - Assumes that either a setpoint exists for the underlying value or the block itself points at a setpoint \ No newline at end of file + + Assumes that either a setpoint exists for the underlying value or the block itself points at a setpoint \ No newline at end of file From 494667298d0a29a07fc6de14a21f18a69e4d7dc7 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Wed, 28 Jun 2017 14:47:12 +0100 Subject: [PATCH 0621/1813] Updated Test RST (rest) --- Test-RST.rest | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Test-RST.rest b/Test-RST.rest index 528b923..4421504 100644 --- a/Test-RST.rest +++ b/Test-RST.rest @@ -1,2 +1,2 @@ -- Sets the value for a particular block +* Sets the value for a particular block + Assumes that either a setpoint exists for the underlying value or the block itself points at a setpoint \ No newline at end of file From 75b576358fe6ea6b29ce7ea5c359cf46a0f1f906 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Wed, 28 Jun 2017 14:47:59 +0100 Subject: [PATCH 0622/1813] Updated Test RST (rest) --- Test-RST.rest | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Test-RST.rest b/Test-RST.rest index 4421504..8d8bb8c 100644 --- a/Test-RST.rest +++ b/Test-RST.rest @@ -1,2 +1,2 @@ * Sets the value for a particular block - + Assumes that either a setpoint exists for the underlying value or the block itself points at a setpoint \ No newline at end of file ++ Assumes that either a setpoint exists for the underlying value or the block itself points at a setpoint \ No newline at end of file From a8b20b82ee1bf454af41d2849165ce15220f65af Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Wed, 28 Jun 2017 14:48:07 +0100 Subject: [PATCH 0623/1813] Updated Test RST (rest) --- Test-RST.rest | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Test-RST.rest b/Test-RST.rest index 8d8bb8c..7e1c11d 100644 --- a/Test-RST.rest +++ b/Test-RST.rest @@ -1,2 +1,2 @@ * Sets the value for a particular block -+ Assumes that either a setpoint exists for the underlying value or the block itself points at a setpoint \ No newline at end of file ++ Assumes that either a setpoint exists for the underlying value or the block itself points at a setpoint \ No newline at end of file From 0c6f536bd70db952f61c4536221bc50eb2b5dc1e Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Wed, 28 Jun 2017 14:48:16 +0100 Subject: [PATCH 0624/1813] Updated Test RST (rest) --- Test-RST.rest | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Test-RST.rest b/Test-RST.rest index 7e1c11d..5511ec3 100644 --- a/Test-RST.rest +++ b/Test-RST.rest @@ -1,2 +1,2 @@ * Sets the value for a particular block -+ Assumes that either a setpoint exists for the underlying value or the block itself points at a setpoint \ No newline at end of file + + Assumes that either a setpoint exists for the underlying value or the block itself points at a setpoint \ No newline at end of file From f220f6b62bd9a631ea48bc1c5ad6207c3dc9b278 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Wed, 28 Jun 2017 14:48:26 +0100 Subject: [PATCH 0625/1813] Updated Test RST (rest) --- Test-RST.rest | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Test-RST.rest b/Test-RST.rest index 5511ec3..180a22e 100644 --- a/Test-RST.rest +++ b/Test-RST.rest @@ -1,2 +1,2 @@ * Sets the value for a particular block - + Assumes that either a setpoint exists for the underlying value or the block itself points at a setpoint \ No newline at end of file +- Assumes that either a setpoint exists for the underlying value or the block itself points at a setpoint \ No newline at end of file From 5818e42d6cdd6d58bf0e3a407b70d0442357c31a Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Wed, 28 Jun 2017 14:48:32 +0100 Subject: [PATCH 0626/1813] Updated Test RST (rest) --- Test-RST.rest | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Test-RST.rest b/Test-RST.rest index 180a22e..a099ffd 100644 --- a/Test-RST.rest +++ b/Test-RST.rest @@ -1,2 +1,2 @@ * Sets the value for a particular block -- Assumes that either a setpoint exists for the underlying value or the block itself points at a setpoint \ No newline at end of file + - Assumes that either a setpoint exists for the underlying value or the block itself points at a setpoint \ No newline at end of file From 61392b808b729c37e7377f6a80a5153c80b61d5c Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Wed, 28 Jun 2017 14:49:17 +0100 Subject: [PATCH 0627/1813] Updated Test RST (rest) --- Test-RST.rest | 35 ++++++++++++++++++++++++++++++++++- 1 file changed, 34 insertions(+), 1 deletion(-) diff --git a/Test-RST.rest b/Test-RST.rest index a099ffd..4ae687a 100644 --- a/Test-RST.rest +++ b/Test-RST.rest @@ -1,2 +1,35 @@ * Sets the value for a particular block - - Assumes that either a setpoint exists for the underlying value or the block itself points at a setpoint \ No newline at end of file + - Assumes that either a setpoint exists for the underlying value or the block itself points at a setpoint + +The following two lists summarize and provide examples of the rules for +lists compatible with Markdown and reStructuredText:: + + * Mark bulleted lists with one of three symbols followed by a space: + + 1. asterisk (``*``) + 2. hyphen (``-``) + 3. plus sign (``+``) + + * Mark enumerated lists with a number, period (``.``) and a space. + + * The choice of symbol does not affect the output bullet style, + which is solely determined by nesting level. + Items can be continued on following lines indented at the same + level as the item text on the first line, and will flow and wrap + normally. + + * The source indentation of item text can vary for different items + (but continuation lines must be indented by the same amount as + the item text that they are continuing). + + Additional paragraphs of item text (after a blank line) also + require this indentation, with the extra requirement that it be + four to seven spaces more than the item symbol or number. + + * These indentation requirements are the same for sub-list items + (but apply to their symbol or number, not their item text). + + * Blank lines between list items are optional, avoid them. + + + If you *do* use them (for items with sub-lists or extra + paragraphs) put blank lines between *all* items at that level. From a8b3be91f461111e8bb27521eec38c4cb6b0c64b Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Wed, 28 Jun 2017 14:50:18 +0100 Subject: [PATCH 0628/1813] Updated Test RST (rest) --- Test-RST.rest | 35 ++--------------------------------- 1 file changed, 2 insertions(+), 33 deletions(-) diff --git a/Test-RST.rest b/Test-RST.rest index 4ae687a..a8241cb 100644 --- a/Test-RST.rest +++ b/Test-RST.rest @@ -1,35 +1,4 @@ -* Sets the value for a particular block - - Assumes that either a setpoint exists for the underlying value or the block itself points at a setpoint - -The following two lists summarize and provide examples of the rules for -lists compatible with Markdown and reStructuredText:: - - * Mark bulleted lists with one of three symbols followed by a space: - - 1. asterisk (``*``) - 2. hyphen (``-``) - 3. plus sign (``+``) - - * Mark enumerated lists with a number, period (``.``) and a space. - * The choice of symbol does not affect the output bullet style, - which is solely determined by nesting level. - Items can be continued on following lines indented at the same - level as the item text on the first line, and will flow and wrap - normally. - - * The source indentation of item text can vary for different items - (but continuation lines must be indented by the same amount as - the item text that they are continuing). - - Additional paragraphs of item text (after a blank line) also - require this indentation, with the extra requirement that it be - four to seven spaces more than the item symbol or number. - - * These indentation requirements are the same for sub-list items - (but apply to their symbol or number, not their item text). - - * Blank lines between list items are optional, avoid them. +* Sets the value for a particular block - + If you *do* use them (for items with sub-lists or extra - paragraphs) put blank lines between *all* items at that level. + - Assumes that either a setpoint exists for the underlying value or the block itself points at a setpoint From 0b47efae5fc60ab50669fcc8b2c8a63fe51d49d9 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Wed, 28 Jun 2017 14:50:25 +0100 Subject: [PATCH 0629/1813] Updated Test RST (rest) --- Test-RST.rest | 1 - 1 file changed, 1 deletion(-) diff --git a/Test-RST.rest b/Test-RST.rest index a8241cb..d64448d 100644 --- a/Test-RST.rest +++ b/Test-RST.rest @@ -1,4 +1,3 @@ * Sets the value for a particular block - - Assumes that either a setpoint exists for the underlying value or the block itself points at a setpoint From a35f870564bfa538bce3bf605489be1fdfb39b11 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Wed, 28 Jun 2017 14:50:32 +0100 Subject: [PATCH 0630/1813] Updated Test RST (rest) --- Test-RST.rest | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/Test-RST.rest b/Test-RST.rest index d64448d..d0032be 100644 --- a/Test-RST.rest +++ b/Test-RST.rest @@ -1,3 +1,33 @@ * Sets the value for a particular block - Assumes that either a setpoint exists for the underlying value or the block itself points at a setpoint + +* Mark bulleted lists with one of three symbols followed by a space: + + 1. asterisk (``*``) + 2. hyphen (``-``) + 3. plus sign (``+``) + +* Mark enumerated lists with a number, period (``.``) and a space. + +* The choice of symbol does not affect the output bullet style, + which is solely determined by nesting level. + Items can be continued on following lines indented at the same + level as the item text on the first line, and will flow and wrap + normally. + +* The source indentation of item text can vary for different items + (but continuation lines must be indented by the same amount as + the item text that they are continuing). + + Additional paragraphs of item text (after a blank line) also + require this indentation, with the extra requirement that it be + four to seven spaces more than the item symbol or number. + + * These indentation requirements are the same for sub-list items + (but apply to their symbol or number, not their item text). + +* Blank lines between list items are optional, avoid them. + + + If you *do* use them (for items with sub-lists or extra + paragraphs) put blank lines between *all* items at that level. \ No newline at end of file From 199b2d7e5cbe40e95be31017504ddf33e5e7437e Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Wed, 28 Jun 2017 14:50:58 +0100 Subject: [PATCH 0631/1813] Updated Test RST (rest) --- Test-RST.rest | 28 ++-------------------------- 1 file changed, 2 insertions(+), 26 deletions(-) diff --git a/Test-RST.rest b/Test-RST.rest index d0032be..d80e3af 100644 --- a/Test-RST.rest +++ b/Test-RST.rest @@ -1,31 +1,7 @@ -* Sets the value for a particular block - - Assumes that either a setpoint exists for the underlying value or the block itself points at a setpoint +* Sets the value for a particular block -* Mark bulleted lists with one of three symbols followed by a space: - - 1. asterisk (``*``) - 2. hyphen (``-``) - 3. plus sign (``+``) - -* Mark enumerated lists with a number, period (``.``) and a space. - -* The choice of symbol does not affect the output bullet style, - which is solely determined by nesting level. - Items can be continued on following lines indented at the same - level as the item text on the first line, and will flow and wrap - normally. - -* The source indentation of item text can vary for different items - (but continuation lines must be indented by the same amount as - the item text that they are continuing). - - Additional paragraphs of item text (after a blank line) also - require this indentation, with the extra requirement that it be - four to seven spaces more than the item symbol or number. - - * These indentation requirements are the same for sub-list items - (but apply to their symbol or number, not their item text). + + Assumes that either a setpoint exists for the underlying value or the block itself points at a setpoint. * Blank lines between list items are optional, avoid them. From 3e7c94fbfd433f6205cd4bafd431c34257aa4723 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Wed, 28 Jun 2017 14:51:06 +0100 Subject: [PATCH 0632/1813] Updated Test RST (rest) --- Test-RST.rest | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Test-RST.rest b/Test-RST.rest index d80e3af..f1730b9 100644 --- a/Test-RST.rest +++ b/Test-RST.rest @@ -1,5 +1,5 @@ -* Sets the value for a particular block +* Sets the value for a particular block + Assumes that either a setpoint exists for the underlying value or the block itself points at a setpoint. From cb5b944c4461d32f9c51b981749b8dedc710d5e5 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Wed, 28 Jun 2017 14:51:16 +0100 Subject: [PATCH 0633/1813] Updated Test RST (rest) --- Test-RST.rest | 1 - 1 file changed, 1 deletion(-) diff --git a/Test-RST.rest b/Test-RST.rest index f1730b9..fa83a59 100644 --- a/Test-RST.rest +++ b/Test-RST.rest @@ -1,6 +1,5 @@ * Sets the value for a particular block - + Assumes that either a setpoint exists for the underlying value or the block itself points at a setpoint. * Blank lines between list items are optional, avoid them. From 99429b33ceaf39afe93bb4b638d625d785627cc4 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Wed, 28 Jun 2017 14:51:25 +0100 Subject: [PATCH 0634/1813] Destroyed Test RST (rest) --- Test-RST.rest | 8 -------- 1 file changed, 8 deletions(-) delete mode 100644 Test-RST.rest diff --git a/Test-RST.rest b/Test-RST.rest deleted file mode 100644 index fa83a59..0000000 --- a/Test-RST.rest +++ /dev/null @@ -1,8 +0,0 @@ - -* Sets the value for a particular block - + Assumes that either a setpoint exists for the underlying value or the block itself points at a setpoint. - -* Blank lines between list items are optional, avoid them. - - + If you *do* use them (for items with sub-lists or extra - paragraphs) put blank lines between *all* items at that level. \ No newline at end of file From 046e794954c75d8b223602ba9ea58c9edc051407 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Wed, 28 Jun 2017 14:52:30 +0100 Subject: [PATCH 0635/1813] Updated Ibex and genie_python: Common commands (rest) --- Ibex-and-genie_python:-Common-commands.rest | 44 +++++++++++---------- 1 file changed, 23 insertions(+), 21 deletions(-) diff --git a/Ibex-and-genie_python:-Common-commands.rest b/Ibex-and-genie_python:-Common-commands.rest index 7a2f77f..d837ad4 100644 --- a/Ibex-and-genie_python:-Common-commands.rest +++ b/Ibex-and-genie_python:-Common-commands.rest @@ -66,27 +66,29 @@ The following script will begin and run, then stop it once it reaches a running Blocks ======== -- ``get_blocks``: Gets a list of the currently available blocks -- ``cshow``: Shows the properties of a named block/all blocks - - If given a name (e.g. ``MY_BLOCK``) it will return a string containing properties of the block - - Example: ``MY_BLOCK = 10 (runcontrol = NO, lowlimit = 0.0, highlimit = 0.0)`` - - If called without arguments, it will show the same information for all blocks, with each block on a new line -- ``cget``: Gets properties of a named block as a dictionary of values - - Example: ``MY_BLOCK = 10 (runcontrol = NO, lowlimit = 0.0, highlimit = 0.0)`` - - Unlike ``cshow``, a block name must be specified - - Properties can be accessed as standard Python:: - - block_info = g.cget("MY_BLOCK") - name = block_info("name") - value = block_info("value") - print "The value of block {0} is {1}".format(name, value) - -- ``cset``: Sets the value for a particular block - - Assumes that either a setpoint exists for the underlying value or the block itself points at a setpoint - - Can be called with block names as named arguments. This is useful for setting multiple blocks - - Example: ``g.cset(MY_BLOCK=1, MY_OTHER_BLOCK=2)`` - - The block can also be passed in by name. This is useful when setting advanced block properties - - Example: ``g.cset("MY_BLOCK", lowlimit=1, highlimit=10, runcontrol=True)`` +- ``get_blocks``: Gets a list of the currently available blocks +- ``cshow``: Shows the properties of a named block/all blocks + + - If given a name (e.g. ``MY_BLOCK``) it will return a string containing properties of the block + - Example: ``MY_BLOCK = 10 (runcontrol = NO, lowlimit = 0.0, highlimit = 0.0)`` + - If called without arguments, it will show the same information for all blocks, with each block on a new line + +- ``cget``: Gets properties of a named block as a dictionary of values + - Example: ``MY_BLOCK = 10 (runcontrol = NO, lowlimit = 0.0, highlimit = 0.0)`` + - Unlike ``cshow``, a block name must be specified + - Properties can be accessed as standard Python:: + + block_info = g.cget("MY_BLOCK") + name = block_info("name") + value = block_info("value") + print "The value of block {0} is {1}".format(name, value) + +- ``cset``: Sets the value for a particular block + - Assumes that either a setpoint exists for the underlying value or the block itself points at a setpoint + - Can be called with block names as named arguments. This is useful for setting multiple blocks + - Example: ``g.cset(MY_BLOCK=1, MY_OTHER_BLOCK=2)`` + - The block can also be passed in by name. This is useful when setting advanced block properties + - Example: ``g.cset("MY_BLOCK", lowlimit=1, highlimit=10, runcontrol=True)`` Run control ----------- From d8ba959fa2a2068c9a5f2855df906cdfbc53eae7 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Wed, 28 Jun 2017 14:53:00 +0100 Subject: [PATCH 0636/1813] Created Test RST (markdown) --- Test-RST.md | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 Test-RST.md diff --git a/Test-RST.md b/Test-RST.md new file mode 100644 index 0000000..6947074 --- /dev/null +++ b/Test-RST.md @@ -0,0 +1,23 @@ +- ``get_blocks``: Gets a list of the currently available blocks +- ``cshow``: Shows the properties of a named block/all blocks + + - If given a name (e.g. ``MY_BLOCK``) it will return a string containing properties of the block + - Example: ``MY_BLOCK = 10 (runcontrol = NO, lowlimit = 0.0, highlimit = 0.0)`` + - If called without arguments, it will show the same information for all blocks, with each block on a new line + +- ``cget``: Gets properties of a named block as a dictionary of values + - Example: ``MY_BLOCK = 10 (runcontrol = NO, lowlimit = 0.0, highlimit = 0.0)`` + - Unlike ``cshow``, a block name must be specified + - Properties can be accessed as standard Python:: + + block_info = g.cget("MY_BLOCK") + name = block_info("name") + value = block_info("value") + print "The value of block {0} is {1}".format(name, value) + +- ``cset``: Sets the value for a particular block + - Assumes that either a setpoint exists for the underlying value or the block itself points at a setpoint + - Can be called with block names as named arguments. This is useful for setting multiple blocks + - Example: ``g.cset(MY_BLOCK=1, MY_OTHER_BLOCK=2)`` + - The block can also be passed in by name. This is useful when setting advanced block properties + - Example: ``g.cset("MY_BLOCK", lowlimit=1, highlimit=10, runcontrol=True)`` \ No newline at end of file From e107fcf48d316f974273ae8de0a60b65ccb3d6c4 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Wed, 28 Jun 2017 14:53:23 +0100 Subject: [PATCH 0637/1813] Updated Test RST (markdown) --- Test-RST.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Test-RST.md b/Test-RST.md index 6947074..7366bb8 100644 --- a/Test-RST.md +++ b/Test-RST.md @@ -6,6 +6,7 @@ - If called without arguments, it will show the same information for all blocks, with each block on a new line - ``cget``: Gets properties of a named block as a dictionary of values + - Example: ``MY_BLOCK = 10 (runcontrol = NO, lowlimit = 0.0, highlimit = 0.0)`` - Unlike ``cshow``, a block name must be specified - Properties can be accessed as standard Python:: @@ -16,6 +17,7 @@ print "The value of block {0} is {1}".format(name, value) - ``cset``: Sets the value for a particular block + - Assumes that either a setpoint exists for the underlying value or the block itself points at a setpoint - Can be called with block names as named arguments. This is useful for setting multiple blocks - Example: ``g.cset(MY_BLOCK=1, MY_OTHER_BLOCK=2)`` From 5ae645b35e4e3479183e850d3fd449ae520f21a0 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Wed, 28 Jun 2017 14:53:53 +0100 Subject: [PATCH 0638/1813] Updated Ibex and genie_python: Common commands (rest) --- Ibex-and-genie_python:-Common-commands.rest | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/Ibex-and-genie_python:-Common-commands.rest b/Ibex-and-genie_python:-Common-commands.rest index d837ad4..e83d160 100644 --- a/Ibex-and-genie_python:-Common-commands.rest +++ b/Ibex-and-genie_python:-Common-commands.rest @@ -74,6 +74,7 @@ Blocks - If called without arguments, it will show the same information for all blocks, with each block on a new line - ``cget``: Gets properties of a named block as a dictionary of values + - Example: ``MY_BLOCK = 10 (runcontrol = NO, lowlimit = 0.0, highlimit = 0.0)`` - Unlike ``cshow``, a block name must be specified - Properties can be accessed as standard Python:: @@ -84,6 +85,7 @@ Blocks print "The value of block {0} is {1}".format(name, value) - ``cset``: Sets the value for a particular block + - Assumes that either a setpoint exists for the underlying value or the block itself points at a setpoint - Can be called with block names as named arguments. This is useful for setting multiple blocks - Example: ``g.cset(MY_BLOCK=1, MY_OTHER_BLOCK=2)`` @@ -98,10 +100,12 @@ Experiment setup **Exercise 2** -------------- -- This exercise requires the following pre-requisites. These should be satisfied if you are following this as part of the Ibex-run training course +- This exercise requires the following pre-requisites. These should be satisfied if you are following this as part of the Ibex-run training course + - You have permission to begin and end runs on the instrument you're using. - The instrument your using has been configured so it can successfully enter a running state - You have a settable block called "MY_BLOCK" + - Change the title of the run to "Exercise 2" - Begin a new run - Pause the run From 30c8c05484361686247c2807e20036a4c173b884 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Wed, 28 Jun 2017 14:54:10 +0100 Subject: [PATCH 0639/1813] Updated Ibex and genie_python: Common commands (rest) --- Ibex-and-genie_python:-Common-commands.rest | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Ibex-and-genie_python:-Common-commands.rest b/Ibex-and-genie_python:-Common-commands.rest index e83d160..0a83e6f 100644 --- a/Ibex-and-genie_python:-Common-commands.rest +++ b/Ibex-and-genie_python:-Common-commands.rest @@ -102,9 +102,9 @@ Experiment setup -------------- - This exercise requires the following pre-requisites. These should be satisfied if you are following this as part of the Ibex-run training course - - You have permission to begin and end runs on the instrument you're using. - - The instrument your using has been configured so it can successfully enter a running state - - You have a settable block called "MY_BLOCK" + - You have permission to begin and end runs on the instrument you're using. + - The instrument your using has been configured so it can successfully enter a running state + - You have a settable block called "MY_BLOCK" - Change the title of the run to "Exercise 2" - Begin a new run From dec2ab2d4504c850442e34fd26611590c33f9b03 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Wed, 28 Jun 2017 14:54:46 +0100 Subject: [PATCH 0640/1813] Updated Ibex and genie_python: Common commands (rest) --- Ibex-and-genie_python:-Common-commands.rest | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/Ibex-and-genie_python:-Common-commands.rest b/Ibex-and-genie_python:-Common-commands.rest index 0a83e6f..b3881e0 100644 --- a/Ibex-and-genie_python:-Common-commands.rest +++ b/Ibex-and-genie_python:-Common-commands.rest @@ -69,8 +69,7 @@ Blocks - ``get_blocks``: Gets a list of the currently available blocks - ``cshow``: Shows the properties of a named block/all blocks - - If given a name (e.g. ``MY_BLOCK``) it will return a string containing properties of the block - - Example: ``MY_BLOCK = 10 (runcontrol = NO, lowlimit = 0.0, highlimit = 0.0)`` + - If given a name (e.g. ``MY_BLOCK``) it will return a string containing properties of the block - Example: ``MY_BLOCK = 10 (runcontrol = NO, lowlimit = 0.0, highlimit = 0.0)`` - If called without arguments, it will show the same information for all blocks, with each block on a new line - ``cget``: Gets properties of a named block as a dictionary of values @@ -87,8 +86,7 @@ Blocks - ``cset``: Sets the value for a particular block - Assumes that either a setpoint exists for the underlying value or the block itself points at a setpoint - - Can be called with block names as named arguments. This is useful for setting multiple blocks - - Example: ``g.cset(MY_BLOCK=1, MY_OTHER_BLOCK=2)`` + - Can be called with block names as named arguments. This is useful for setting multiple blocks - Example: ``g.cset(MY_BLOCK=1, MY_OTHER_BLOCK=2)`` - The block can also be passed in by name. This is useful when setting advanced block properties - Example: ``g.cset("MY_BLOCK", lowlimit=1, highlimit=10, runcontrol=True)`` From 49f21c34b6015688d83a81b77b87a64aa3533124 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Wed, 28 Jun 2017 14:55:53 +0100 Subject: [PATCH 0641/1813] Updated Ibex and genie_python: Common commands (rest) --- Ibex-and-genie_python:-Common-commands.rest | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/Ibex-and-genie_python:-Common-commands.rest b/Ibex-and-genie_python:-Common-commands.rest index b3881e0..7c34413 100644 --- a/Ibex-and-genie_python:-Common-commands.rest +++ b/Ibex-and-genie_python:-Common-commands.rest @@ -69,7 +69,10 @@ Blocks - ``get_blocks``: Gets a list of the currently available blocks - ``cshow``: Shows the properties of a named block/all blocks - - If given a name (e.g. ``MY_BLOCK``) it will return a string containing properties of the block - Example: ``MY_BLOCK = 10 (runcontrol = NO, lowlimit = 0.0, highlimit = 0.0)`` + - If given a name (e.g. ``MY_BLOCK``) it will return a string containing properties of the block + + - Example: ``MY_BLOCK = 10 (runcontrol = NO, lowlimit = 0.0, highlimit = 0.0)`` + - If called without arguments, it will show the same information for all blocks, with each block on a new line - ``cget``: Gets properties of a named block as a dictionary of values @@ -86,10 +89,15 @@ Blocks - ``cset``: Sets the value for a particular block - Assumes that either a setpoint exists for the underlying value or the block itself points at a setpoint - - Can be called with block names as named arguments. This is useful for setting multiple blocks - Example: ``g.cset(MY_BLOCK=1, MY_OTHER_BLOCK=2)`` - - The block can also be passed in by name. This is useful when setting advanced block properties + - Can be called with block names as named arguments. This is useful for setting multiple blocks + + - Example: ``g.cset(MY_BLOCK=1, MY_OTHER_BLOCK=2)`` + + - The block can also be passed in by name. This is useful when setting advanced block properties + - Example: ``g.cset("MY_BLOCK", lowlimit=1, highlimit=10, runcontrol=True)`` + Run control ----------- From c7ab659e5b23ffaa307862f697b2bce7ebf7a87b Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Wed, 28 Jun 2017 15:09:49 +0100 Subject: [PATCH 0642/1813] Updated Ibex and genie_python: Common commands (rest) --- Ibex-and-genie_python:-Common-commands.rest | 42 +++++++++++++++++++-- 1 file changed, 39 insertions(+), 3 deletions(-) diff --git a/Ibex-and-genie_python:-Common-commands.rest b/Ibex-and-genie_python:-Common-commands.rest index 7c34413..29c6796 100644 --- a/Ibex-and-genie_python:-Common-commands.rest +++ b/Ibex-and-genie_python:-Common-commands.rest @@ -34,10 +34,10 @@ You can update and store DAE results using: - ``store``: Write the updated DAE information to disk - ``updatestore``: Load the data from the DAE into memory and store it to disk -Worked example --------------- +Worked example: Try it yourself! +-------------------------------- -The following script will begin and run, then stop it once it reaches a running state:: +The following script will begin and run, then stop it once it reaches a running state.:: import time @@ -98,6 +98,42 @@ Blocks - Example: ``g.cset("MY_BLOCK", lowlimit=1, highlimit=10, runcontrol=True)`` +Worked example: Try it yourself! +-------------------------------- + +The following script scans a block between its upper and lower limit + + import time + + # Set some parameters + interval_time = 0.1 + max_steps = 100 + high_limit = 10 + low_limit = 1 + block = "MY_BLOCK" + abs_step_size = 1 + + # Set the initial conditions + g.cset(block, lowlimit = low_limit, highlimit = high_limit) + step_size = abs_step_size + + # Run the scan + for i in range(max_steps) + block_properties = g.cget(block) + current_value = block_properties['value'] + + # Block at or below low limit: Set step positive + if current_value <= block_properties['lowlimit']: + step_size = abs_step_size + + # Block at or below high limit: Set step negative + if current_value >= block_properties['highlimit']: + step_size = -abs_step_size + + g.cset(block=current_value + step_size) + time.sleep(interval_time) + + Run control ----------- From dfb42e13eeec6719a367b2b9bad17f48c49ebd57 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Wed, 28 Jun 2017 15:10:16 +0100 Subject: [PATCH 0643/1813] Updated Ibex and genie_python: Common commands (rest) --- Ibex-and-genie_python:-Common-commands.rest | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Ibex-and-genie_python:-Common-commands.rest b/Ibex-and-genie_python:-Common-commands.rest index 29c6796..646737d 100644 --- a/Ibex-and-genie_python:-Common-commands.rest +++ b/Ibex-and-genie_python:-Common-commands.rest @@ -37,7 +37,7 @@ You can update and store DAE results using: Worked example: Try it yourself! -------------------------------- -The following script will begin and run, then stop it once it reaches a running state.:: +The following script will begin and run, then stop it once it reaches a running state:: import time @@ -101,7 +101,7 @@ Blocks Worked example: Try it yourself! -------------------------------- -The following script scans a block between its upper and lower limit +The following script scans a block between its upper and lower limit:: import time From 192611c0b49209a8d4d0203ec48ccf9278062e51 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Wed, 28 Jun 2017 15:18:50 +0100 Subject: [PATCH 0644/1813] Updated Ibex and genie_python: Common commands (rest) --- Ibex-and-genie_python:-Common-commands.rest | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/Ibex-and-genie_python:-Common-commands.rest b/Ibex-and-genie_python:-Common-commands.rest index 646737d..c3ce6ec 100644 --- a/Ibex-and-genie_python:-Common-commands.rest +++ b/Ibex-and-genie_python:-Common-commands.rest @@ -9,10 +9,10 @@ You should have noticed immediately after you typed ``g.`` that an autocomplete The window lists the available commands, and the arguments they take in brackets. You also notice that a description of the highlighted functions and its arguments is also given. The list will be refined as you type more characters. -Instrument control +Run control ================== -Instrument control commands let you switch between experimental states. The most common commands are: +``genie_python`` provides commands to switch between various run states: - ``begin``: Begins a new run - ``pause``: Pauses the current run @@ -20,14 +20,22 @@ Instrument control commands let you switch between experimental states. The most - ``end``: Ends the current run - ``abort``: Aborts the current run -Each of the commands above accepts an optional ``boolean`` parameter. Setting it to ``True`` (e.g. ``g.begin(True)``) will give extra output from the DAE. The default is non-verbose output. - -If you need to get the current state, you can use: +Each of the commands above accepts an optional ``boolean`` parameter. Setting it to ``True`` (e.g. ``g.begin(True)``) will give extra output from the DAE. The default is non-verbose output. You can get the current state with: - ``get_runstate``: Gets the states of the current run **WARNING**: Switching states may not always lead to the assumed state. For example, you may run "g.begin()" and then expect the instrument to be running. It could be, but it could also be waiting, vetoing, or still setup. It's a good idea to put checks into your scripts that you've reached the expected state before continuing. +If you want to wait for a specific event before executing an action, you can use a ``waitfor`` command: + +- ``waitfor``: Waits for the specified condition to be met. This function supports numerous types of wait. For a full list see [[the genie_python reference manual|http://shadow.nd.rl.ac.uk/genie_python/sphinx/genie_python.html]]. + + - Example: ``g.waitfor(seconds=10)``. Wait for 10 seconds + - Example: ``g.waitfor(minutes=10)``. Wait for 10 minutes + - Example: ``g.waitfor(uamps=10)``. Wait for the total received current to reach 10 uamps + - Example: ``g.waitfor(uamps=10, maxwait=10)``. Wait for the total received current to reach 10 uamps, but wait no more than 10 seconds + - Example: ``g.waitfor(block="MY_BLOCK", lowlimit=10)``. Wait for the block "MY_BLOCK" to be greater than or equal to 10 + You can update and store DAE results using: - ``update``: Load the data from the DAE into memory From 5aea6a0ddc485e5bc6df35544c0f6cde0c90accd Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Wed, 28 Jun 2017 15:24:40 +0100 Subject: [PATCH 0645/1813] Updated Ibex and genie_python: Common commands (rest) --- Ibex-and-genie_python:-Common-commands.rest | 27 +++++++++++++++------ 1 file changed, 20 insertions(+), 7 deletions(-) diff --git a/Ibex-and-genie_python:-Common-commands.rest b/Ibex-and-genie_python:-Common-commands.rest index c3ce6ec..bebbb80 100644 --- a/Ibex-and-genie_python:-Common-commands.rest +++ b/Ibex-and-genie_python:-Common-commands.rest @@ -12,6 +12,9 @@ The window lists the available commands, and the arguments they take in brackets Run control ================== +Switch run states +----------------- + ``genie_python`` provides commands to switch between various run states: - ``begin``: Begins a new run @@ -26,6 +29,9 @@ Each of the commands above accepts an optional ``boolean`` parameter. Setting it **WARNING**: Switching states may not always lead to the assumed state. For example, you may run "g.begin()" and then expect the instrument to be running. It could be, but it could also be waiting, vetoing, or still setup. It's a good idea to put checks into your scripts that you've reached the expected state before continuing. +Waiting for conditions +----------------------- + If you want to wait for a specific event before executing an action, you can use a ``waitfor`` command: - ``waitfor``: Waits for the specified condition to be met. This function supports numerous types of wait. For a full list see [[the genie_python reference manual|http://shadow.nd.rl.ac.uk/genie_python/sphinx/genie_python.html]]. @@ -36,6 +42,18 @@ If you want to wait for a specific event before executing an action, you can use - Example: ``g.waitfor(uamps=10, maxwait=10)``. Wait for the total received current to reach 10 uamps, but wait no more than 10 seconds - Example: ``g.waitfor(block="MY_BLOCK", lowlimit=10)``. Wait for the block "MY_BLOCK" to be greater than or equal to 10 +Many ``waitfor`` arguments also have a standalone function, so as to retain equivalence with OpenGENIE. Again, this list is only a subset of the available functions: + +- ``waitfor_block``: Wait for a block value to be in a certain range +- ``waitfor_frames``: Wait until the number of good frames reaches a certain value + +One special ``waitfor`` function is: + +- ``waitfor_move``: Waits for all motors, or a specific motor to finish moving + +Update and store +------------------ + You can update and store DAE results using: - ``update``: Load the data from the DAE into memory @@ -47,8 +65,6 @@ Worked example: Try it yourself! The following script will begin and run, then stop it once it reaches a running state:: - import time - # Only start if we're in the correct state if g.get_runstate=="SETUP" g.begin() @@ -65,7 +81,7 @@ The following script will begin and run, then stop it once it reaches a running else: # Wait for a second before checking again - time.sleep(1) + g.waitfor(seconds=1) else: "Could not reach a running state" @@ -111,10 +127,7 @@ Worked example: Try it yourself! The following script scans a block between its upper and lower limit:: - import time - # Set some parameters - interval_time = 0.1 max_steps = 100 high_limit = 10 low_limit = 1 @@ -139,7 +152,7 @@ The following script scans a block between its upper and lower limit:: step_size = -abs_step_size g.cset(block=current_value + step_size) - time.sleep(interval_time) + g.waitfor(seconds=0.1) Run control From 2462d05eefe2cb8c44dc9863766f679e61b8166e Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Wed, 28 Jun 2017 15:29:53 +0100 Subject: [PATCH 0646/1813] Updated Ibex and genie_python: Common commands (rest) --- Ibex-and-genie_python:-Common-commands.rest | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Ibex-and-genie_python:-Common-commands.rest b/Ibex-and-genie_python:-Common-commands.rest index bebbb80..cb99bff 100644 --- a/Ibex-and-genie_python:-Common-commands.rest +++ b/Ibex-and-genie_python:-Common-commands.rest @@ -154,13 +154,13 @@ The following script scans a block between its upper and lower limit:: g.cset(block=current_value + step_size) g.waitfor(seconds=0.1) - -Run control ------------ - Experiment setup ---------------- +You can change various experiment details. This is a list of some of the most common commands: + +`` + **Exercise 2** -------------- - This exercise requires the following pre-requisites. These should be satisfied if you are following this as part of the Ibex-run training course From 9f8abbd0059cdc332e3c7e535abd4c01650b7af6 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Wed, 28 Jun 2017 15:30:54 +0100 Subject: [PATCH 0647/1813] Updated Ibex and genie_python: Introduction (rest) --- Ibex-and-genie_python:-Introduction.rest | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Ibex-and-genie_python:-Introduction.rest b/Ibex-and-genie_python:-Introduction.rest index 2fca50e..8255ed9 100644 --- a/Ibex-and-genie_python:-Introduction.rest +++ b/Ibex-and-genie_python:-Introduction.rest @@ -9,9 +9,9 @@ Welcome to this introductory course on ``genie_python``, a Python module that en - Create specialised instrument and user scripts scripts - Convert ``OpenGENIE`` scripts to ``genie_python`` -At each stage the course aims to assist learning with exercises and worked examples. +At each stage the course aims to assist learning with exercises and worked examples. We will assume a basic working knowledge of Python. -If you're looking for specific answers, please refer to the course contents below. Otherwise, let's [[get started|Ibex-and-genie_python:-Getting-started]]! +If you're looking for a specific section, please refer to the course contents below. Otherwise, let's [[get started|Ibex-and-genie_python:-Getting-started]]! Contents ======== From 341b44a910294ea2f3321ff3734d1e6931d41206 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Wed, 28 Jun 2017 15:32:38 +0100 Subject: [PATCH 0648/1813] Updated Ibex and genie_python: Scripting (markdown) --- Ibex-and-genie_python:-Scripting.md | 21 ++++----------------- 1 file changed, 4 insertions(+), 17 deletions(-) diff --git a/Ibex-and-genie_python:-Scripting.md b/Ibex-and-genie_python:-Scripting.md index 6378df9..c2ab3ef 100644 --- a/Ibex-and-genie_python:-Scripting.md +++ b/Ibex-and-genie_python:-Scripting.md @@ -1,20 +1,7 @@ -Creating and running scripts -============================ -Instrument scripts ------------------- +------------------------------------------------------------------------------- -Create -~~~~~~ +**Previous**: [[Getting started|Ibex-and-genie_python:-Common-commands]] -Run -~~~ - -User scripts ------------- - -Create -~~~~~~ - -Run -~~~ \ No newline at end of file +**Next**: [[Converting from OpenGENIE|Ibex-and-genie_python:-Converting-from-OpenGENIE]] + \ No newline at end of file From d98e831a2e33ffa2936379427d9fc7e30d4077a8 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Wed, 28 Jun 2017 15:33:04 +0100 Subject: [PATCH 0649/1813] Updated Ibex and genie_python: Scripting (markdown) --- Ibex-and-genie_python:-Scripting.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Ibex-and-genie_python:-Scripting.md b/Ibex-and-genie_python:-Scripting.md index c2ab3ef..6f93d59 100644 --- a/Ibex-and-genie_python:-Scripting.md +++ b/Ibex-and-genie_python:-Scripting.md @@ -1,7 +1,7 @@ ------------------------------------------------------------------------------- -**Previous**: [[Getting started|Ibex-and-genie_python:-Common-commands]] +**Previous**: [[Common commands|Ibex-and-genie_python:-Common-commands]] **Next**: [[Converting from OpenGENIE|Ibex-and-genie_python:-Converting-from-OpenGENIE]] \ No newline at end of file From 75ee84ca2c19ce706360281e6ff97dda27f2dd00 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Wed, 28 Jun 2017 15:33:17 +0100 Subject: [PATCH 0650/1813] Updated Ibex and genie_python: Scripting (markdown) From 7ed415ae9bff6926afe5b1302e335d6121a0be3f Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Wed, 28 Jun 2017 15:34:47 +0100 Subject: [PATCH 0651/1813] Updated Ibex and genie_python: Converting from OpenGENIE (markdown) --- Ibex-and-genie_python:-Converting-from-OpenGENIE.md | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/Ibex-and-genie_python:-Converting-from-OpenGENIE.md b/Ibex-and-genie_python:-Converting-from-OpenGENIE.md index ccd3d98..0c62c42 100644 --- a/Ibex-and-genie_python:-Converting-from-OpenGENIE.md +++ b/Ibex-and-genie_python:-Converting-from-OpenGENIE.md @@ -11,4 +11,11 @@ Procedures vs. functions ------------------------ Loops ------ \ No newline at end of file +----- + +------------------------------------------------------------------------------- + +**Previous**: [[Scripting|Ibex-and-genie_python:-Scripting]] + +**Next**: [[Closing remarks|Ibex-and-genie_python:-Closing-remarks]] + \ No newline at end of file From 22561e17e01f104caeeeb7429c065157a66feae7 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Wed, 28 Jun 2017 15:35:15 +0100 Subject: [PATCH 0652/1813] Created Ibex and genie_python: Closing remarks (markdown) --- Ibex-and-genie_python:-Closing-remarks.md | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 Ibex-and-genie_python:-Closing-remarks.md diff --git a/Ibex-and-genie_python:-Closing-remarks.md b/Ibex-and-genie_python:-Closing-remarks.md new file mode 100644 index 0000000..b1e84dc --- /dev/null +++ b/Ibex-and-genie_python:-Closing-remarks.md @@ -0,0 +1,19 @@ +Open Genie: Compare and contrast +================================ + +Commands +-------- + +Arguments +--------- + +Procedures vs. functions +------------------------ + +Loops +----- + +------------------------------------------------------------------------------- + +**Previous**: [[Scripting|Ibex-and-genie_python:-Converting-from-OpenGENIE]] + \ No newline at end of file From 448b597008c254209be33ec24de5a749ba02524a Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Wed, 28 Jun 2017 15:35:34 +0100 Subject: [PATCH 0653/1813] Updated Ibex and genie_python: Closing remarks (markdown) --- Ibex-and-genie_python:-Closing-remarks.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Ibex-and-genie_python:-Closing-remarks.md b/Ibex-and-genie_python:-Closing-remarks.md index b1e84dc..07a5b79 100644 --- a/Ibex-and-genie_python:-Closing-remarks.md +++ b/Ibex-and-genie_python:-Closing-remarks.md @@ -15,5 +15,5 @@ Loops ------------------------------------------------------------------------------- -**Previous**: [[Scripting|Ibex-and-genie_python:-Converting-from-OpenGENIE]] +**Previous**: [[Converting from OpenGENIE|Ibex-and-genie_python:-Converting-from-OpenGENIE]] \ No newline at end of file From 4cb8c1c73819a1cc3f2b4c04669ebb1edde4d3d5 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Wed, 28 Jun 2017 15:35:47 +0100 Subject: [PATCH 0654/1813] Updated Ibex and genie_python: Converting from OpenGENIE (markdown) --- Ibex-and-genie_python:-Converting-from-OpenGENIE.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Ibex-and-genie_python:-Converting-from-OpenGENIE.md b/Ibex-and-genie_python:-Converting-from-OpenGENIE.md index 0c62c42..8eb74d2 100644 --- a/Ibex-and-genie_python:-Converting-from-OpenGENIE.md +++ b/Ibex-and-genie_python:-Converting-from-OpenGENIE.md @@ -15,7 +15,6 @@ Loops ------------------------------------------------------------------------------- -**Previous**: [[Scripting|Ibex-and-genie_python:-Scripting]] - **Next**: [[Closing remarks|Ibex-and-genie_python:-Closing-remarks]] +**Previous**: [[Scripting|Ibex-and-genie_python:-Scripting]] \ No newline at end of file From 402349e31bf2666c33d44ba5ba8a4c408780f00c Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Wed, 28 Jun 2017 15:35:57 +0100 Subject: [PATCH 0655/1813] Updated Ibex and genie_python: Converting from OpenGENIE (markdown) --- Ibex-and-genie_python:-Converting-from-OpenGENIE.md | 1 + 1 file changed, 1 insertion(+) diff --git a/Ibex-and-genie_python:-Converting-from-OpenGENIE.md b/Ibex-and-genie_python:-Converting-from-OpenGENIE.md index 8eb74d2..492cd8f 100644 --- a/Ibex-and-genie_python:-Converting-from-OpenGENIE.md +++ b/Ibex-and-genie_python:-Converting-from-OpenGENIE.md @@ -16,5 +16,6 @@ Loops ------------------------------------------------------------------------------- **Next**: [[Closing remarks|Ibex-and-genie_python:-Closing-remarks]] + **Previous**: [[Scripting|Ibex-and-genie_python:-Scripting]] \ No newline at end of file From bc2f10fa98c12457c877e8721485b1d55ceb72a2 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Wed, 28 Jun 2017 15:36:05 +0100 Subject: [PATCH 0656/1813] Updated Ibex and genie_python: Scripting (markdown) --- Ibex-and-genie_python:-Scripting.md | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/Ibex-and-genie_python:-Scripting.md b/Ibex-and-genie_python:-Scripting.md index 6f93d59..5448862 100644 --- a/Ibex-and-genie_python:-Scripting.md +++ b/Ibex-and-genie_python:-Scripting.md @@ -1,7 +1,6 @@ ------------------------------------------------------------------------------- -**Previous**: [[Common commands|Ibex-and-genie_python:-Common-commands]] - **Next**: [[Converting from OpenGENIE|Ibex-and-genie_python:-Converting-from-OpenGENIE]] - \ No newline at end of file + +**Previous**: [[Common commands|Ibex-and-genie_python:-Common-commands]] \ No newline at end of file From 38c714df34da5a069bf07eec825dc625d45e0090 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Wed, 28 Jun 2017 15:36:16 +0100 Subject: [PATCH 0657/1813] Updated Ibex and genie_python: Common commands (rest) --- Ibex-and-genie_python:-Common-commands.rest | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Ibex-and-genie_python:-Common-commands.rest b/Ibex-and-genie_python:-Common-commands.rest index cb99bff..dd687d1 100644 --- a/Ibex-and-genie_python:-Common-commands.rest +++ b/Ibex-and-genie_python:-Common-commands.rest @@ -180,7 +180,7 @@ You can change various experiment details. This is a list of some of the most co ------------------------------------------------------------------------------- -**Previous**: [[Getting started|Ibex-and-genie_python:-Getting-started]] - **Next**: [[Common commands|Ibex-and-genie_python:-Scripting]] + +**Previous**: [[Getting started|Ibex-and-genie_python:-Getting-started]] From bfa4d62a7b9ac25819966896c9b5dba67e211cd4 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Wed, 28 Jun 2017 15:36:30 +0100 Subject: [PATCH 0658/1813] Updated Ibex and genie_python: Getting started (rest) --- Ibex-and-genie_python:-Getting-started.rest | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Ibex-and-genie_python:-Getting-started.rest b/Ibex-and-genie_python:-Getting-started.rest index f9a977b..f04f18c 100644 --- a/Ibex-and-genie_python:-Getting-started.rest +++ b/Ibex-and-genie_python:-Getting-started.rest @@ -31,6 +31,6 @@ You can also open a scripting terminal by running ``C:\Instrument\Apps\Python\ge ------------------------------------------------------------------------------- -**Previous**: [[Course introduction|Ibex-and-genie_python:-Introduction]] +**Next**: [[Common commands|Ibex-and-genie_python:-Common-commands]] -**Next**: [[Common commands|Ibex-and-genie_python:-Common-commands]] \ No newline at end of file +**Previous**: [[Course introduction|Ibex-and-genie_python:-Introduction]] \ No newline at end of file From 6e029d433d393af9d5b67d47092cc6e3dc8189ca Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Wed, 28 Jun 2017 15:36:45 +0100 Subject: [PATCH 0659/1813] Updated Ibex and genie_python: Converting from OpenGENIE (markdown) --- Ibex-and-genie_python:-Converting-from-OpenGENIE.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Ibex-and-genie_python:-Converting-from-OpenGENIE.md b/Ibex-and-genie_python:-Converting-from-OpenGENIE.md index 492cd8f..97697f0 100644 --- a/Ibex-and-genie_python:-Converting-from-OpenGENIE.md +++ b/Ibex-and-genie_python:-Converting-from-OpenGENIE.md @@ -15,7 +15,7 @@ Loops ------------------------------------------------------------------------------- -**Next**: [[Closing remarks|Ibex-and-genie_python:-Closing-remarks]] - **Previous**: [[Scripting|Ibex-and-genie_python:-Scripting]] + +**Next**: [[Exercise solutions|Ibex-and-genie_python:-Exercise-solutions]] \ No newline at end of file From 03e0007ed2e390e6dc93dd7384cf56648120e16d Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Wed, 28 Jun 2017 15:37:20 +0100 Subject: [PATCH 0660/1813] Updated Ibex and genie_python: Introduction (rest) --- Ibex-and-genie_python:-Introduction.rest | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Ibex-and-genie_python:-Introduction.rest b/Ibex-and-genie_python:-Introduction.rest index 8255ed9..98e4d26 100644 --- a/Ibex-and-genie_python:-Introduction.rest +++ b/Ibex-and-genie_python:-Introduction.rest @@ -22,6 +22,9 @@ We expect that most people will take this course in a linear fashion, but if you - [[Common commands|Ibex-and-genie_python:-Common-commands]] - [[Scripting|Ibex-and-genie_python:-Scripting]] - [[Converting from ``OpenGENIE``|Ibex-and-genie_python:-Converting-from-OpenGENIE]] +- [[Closing remarks|Ibex-and-genie_python:-Closing-remarks]] + + - [[Exercise solutions|Ibex-and-genie_python:-Exercise-solutions]] -------------------------------------------------------------------- From f6dc1ede19963bdabc798cfe61db9e417b4e8dbe Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Wed, 28 Jun 2017 15:37:44 +0100 Subject: [PATCH 0661/1813] Updated Ibex and genie_python: Introduction (rest) --- Ibex-and-genie_python:-Introduction.rest | 1 + 1 file changed, 1 insertion(+) diff --git a/Ibex-and-genie_python:-Introduction.rest b/Ibex-and-genie_python:-Introduction.rest index 98e4d26..3942230 100644 --- a/Ibex-and-genie_python:-Introduction.rest +++ b/Ibex-and-genie_python:-Introduction.rest @@ -24,6 +24,7 @@ We expect that most people will take this course in a linear fashion, but if you - [[Converting from ``OpenGENIE``|Ibex-and-genie_python:-Converting-from-OpenGENIE]] - [[Closing remarks|Ibex-and-genie_python:-Closing-remarks]] +Sample solutions to each of the exercises can be found here: - [[Exercise solutions|Ibex-and-genie_python:-Exercise-solutions]] From a3e6225ab3f83e5175c1e67575ad819801b78cec Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Wed, 28 Jun 2017 15:38:01 +0100 Subject: [PATCH 0662/1813] Updated Ibex and genie_python: Exercise solutions (markdown) --- Ibex-and-genie_python:-Exercise-solutions.md | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/Ibex-and-genie_python:-Exercise-solutions.md b/Ibex-and-genie_python:-Exercise-solutions.md index 6d308b4..89d790a 100644 --- a/Ibex-and-genie_python:-Exercise-solutions.md +++ b/Ibex-and-genie_python:-Exercise-solutions.md @@ -1,10 +1,5 @@ - - -Exercise notes -============== - Exercise 1 ----------- +========== - Open a scripting window in Ibex - Should be straightforward if Ibex is correctly installed. - Ideally the instrument will appear as ``SETUP`` From 4530c017a27705b1d1f1b3268ab23d89aca6ea67 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Wed, 28 Jun 2017 15:38:46 +0100 Subject: [PATCH 0663/1813] Updated Ibex and genie_python: Getting started (rest) From 8a99f7cc10a14a62441da9ca37f816c6dd3e2f5d Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Wed, 28 Jun 2017 15:39:25 +0100 Subject: [PATCH 0664/1813] Updated Ibex and genie_python: Exercise solutions (markdown) --- Ibex-and-genie_python:-Exercise-solutions.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Ibex-and-genie_python:-Exercise-solutions.md b/Ibex-and-genie_python:-Exercise-solutions.md index 89d790a..fd823fc 100644 --- a/Ibex-and-genie_python:-Exercise-solutions.md +++ b/Ibex-and-genie_python:-Exercise-solutions.md @@ -1,5 +1,8 @@ Exercise 1 ========== + +From [[getting started|Ibex-and-genie_python:-Getting started]]. + - Open a scripting window in Ibex - Should be straightforward if Ibex is correctly installed. - Ideally the instrument will appear as ``SETUP`` From 2e66540155c2595e206b4f79e43f5d58a4525ae2 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Wed, 28 Jun 2017 15:40:16 +0100 Subject: [PATCH 0665/1813] Updated Ibex and genie_python: Exercise solutions (markdown => rest) --- ...-and-genie_python:-Exercise-solutions.rest | 21 +++++++++++-------- 1 file changed, 12 insertions(+), 9 deletions(-) rename Ibex-and-genie_python:-Exercise-solutions.md => Ibex-and-genie_python:-Exercise-solutions.rest (58%) diff --git a/Ibex-and-genie_python:-Exercise-solutions.md b/Ibex-and-genie_python:-Exercise-solutions.rest similarity index 58% rename from Ibex-and-genie_python:-Exercise-solutions.md rename to Ibex-and-genie_python:-Exercise-solutions.rest index fd823fc..d84040d 100644 --- a/Ibex-and-genie_python:-Exercise-solutions.md +++ b/Ibex-and-genie_python:-Exercise-solutions.rest @@ -1,9 +1,10 @@ Exercise 1 ========== -From [[getting started|Ibex-and-genie_python:-Getting started]]. +From [[Getting Started|Ibex-and-genie_python:-Getting started]]. + +- *Open a scripting window in Ibex* -- Open a scripting window in Ibex - Should be straightforward if Ibex is correctly installed. - Ideally the instrument will appear as ``SETUP`` - The output when the scripting window opens should look a bit like this: @@ -11,13 +12,15 @@ From [[getting started|Ibex-and-genie_python:-Getting started]]. :: IMAGE: StandardStartupOutputOnDemo -- Output "Hello, world!" to the console +- Output "Hello, world!" to the console + - Enter something like ``print "Hello, World!`` and press return -- Calculate and output the square of all the integers between 1 and 10 - - This is best achieved with the following loop: -:: - for i in range(1,11): - print i*i +- Calculate and output the square of all the integers between 1 and 10 + + - This is best achieved with the following loop:: + + for i in range(1,11): + print i*i - - A **blank line** will indicate to the scripting window that you've finished writing the loop and it can go ahead and execute it \ No newline at end of file + - A **blank line** will indicate to the scripting window that you've finished writing the loop and it can go ahead and execute it. \ No newline at end of file From 597269b29032591ce35f1fc20a416e0867e36c02 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Wed, 28 Jun 2017 15:40:27 +0100 Subject: [PATCH 0666/1813] Updated Ibex and genie_python: Getting started (rest) From 179bb69e751091ebd395acd1d7868ae6c017cb71 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Wed, 28 Jun 2017 15:40:41 +0100 Subject: [PATCH 0667/1813] Updated Ibex and genie_python: Exercise solutions (rest) --- Ibex-and-genie_python:-Exercise-solutions.rest | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Ibex-and-genie_python:-Exercise-solutions.rest b/Ibex-and-genie_python:-Exercise-solutions.rest index d84040d..46b4387 100644 --- a/Ibex-and-genie_python:-Exercise-solutions.rest +++ b/Ibex-and-genie_python:-Exercise-solutions.rest @@ -9,8 +9,7 @@ From [[Getting Started|Ibex-and-genie_python:-Getting started]]. - Ideally the instrument will appear as ``SETUP`` - The output when the scripting window opens should look a bit like this: -:: - IMAGE: StandardStartupOutputOnDemo +.. image:: StandardStartupOutputOnDemo.png - Output "Hello, world!" to the console From cabe492765ffac2e1d5a413a9d240cbcc32752b6 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Wed, 28 Jun 2017 15:41:06 +0100 Subject: [PATCH 0668/1813] Updated Ibex and genie_python: Exercise solutions (rest) --- Ibex-and-genie_python:-Exercise-solutions.rest | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Ibex-and-genie_python:-Exercise-solutions.rest b/Ibex-and-genie_python:-Exercise-solutions.rest index 46b4387..27687a8 100644 --- a/Ibex-and-genie_python:-Exercise-solutions.rest +++ b/Ibex-and-genie_python:-Exercise-solutions.rest @@ -22,4 +22,4 @@ From [[Getting Started|Ibex-and-genie_python:-Getting started]]. for i in range(1,11): print i*i - - A **blank line** will indicate to the scripting window that you've finished writing the loop and it can go ahead and execute it. \ No newline at end of file + - A **blank line** will indicate to the scripting window that you've finished writing the loop and it can go ahead and be executed. \ No newline at end of file From 0c41485611545f71a7fc6946d9ff2414e6a9a9fa Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Wed, 28 Jun 2017 16:00:10 +0100 Subject: [PATCH 0669/1813] Updated Ibex and genie_python: Common commands (rest) --- Ibex-and-genie_python:-Common-commands.rest | 32 +++++++++++++++++++-- 1 file changed, 30 insertions(+), 2 deletions(-) diff --git a/Ibex-and-genie_python:-Common-commands.rest b/Ibex-and-genie_python:-Common-commands.rest index dd687d1..6557403 100644 --- a/Ibex-and-genie_python:-Common-commands.rest +++ b/Ibex-and-genie_python:-Common-commands.rest @@ -157,9 +157,37 @@ The following script scans a block between its upper and lower limit:: Experiment setup ---------------- -You can change various experiment details. This is a list of some of the most common commands: +You can change various elements of the experiment setup using ``genie_python``. For example: + +``change_tcb``: Change the time channel binning +``change_tables``: Change the wiring, spectra and detector table locations +``change_monitor``: Change the monitor to a specified spectrum and range + +If used on their own, these methods will apply their changes immediately. If you want to apply several changes at once you can use the following commands: + +``change_start``: Marks the start of a change +``change_finish``: Marks that the current set of changes is complete. All changes recorded since ``g.change_start()`` will be applied + +Experiment details +------------------ + +You can change various experiment details with the ``change`` command. As with the ``waitfor`` command, it supports many options and allows for multiple details to be changed in a single command: + +- ``change``: Modify experiment details + + - Example: ``g.change(title="New title")`` + - Example: ``g.change(user="Adrian and John")`` + - Example: ``g.change(rb=10)`` + - Example: ``g.change(title="New title", user="Adrian and John")`` + +As with ``waitfor``, there are also standalone commands for these properties, as well as others: + +- ``change_user``: Change the current user +- ``change_title``: Change the current title +- ``change_rb``: Change the current RB number + +This is just a sample of the methods available. -`` **Exercise 2** -------------- From bc47d6b92a5eab7381fdcef6fdba76c023ed4fee Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Wed, 28 Jun 2017 16:00:39 +0100 Subject: [PATCH 0670/1813] Updated Ibex and genie_python: Common commands (rest) --- Ibex-and-genie_python:-Common-commands.rest | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Ibex-and-genie_python:-Common-commands.rest b/Ibex-and-genie_python:-Common-commands.rest index 6557403..1a87af6 100644 --- a/Ibex-and-genie_python:-Common-commands.rest +++ b/Ibex-and-genie_python:-Common-commands.rest @@ -159,14 +159,14 @@ Experiment setup You can change various elements of the experiment setup using ``genie_python``. For example: -``change_tcb``: Change the time channel binning -``change_tables``: Change the wiring, spectra and detector table locations -``change_monitor``: Change the monitor to a specified spectrum and range +- ``change_tcb``: Change the time channel binning +- ``change_tables``: Change the wiring, spectra and detector table locations +- ``change_monitor``: Change the monitor to a specified spectrum and range If used on their own, these methods will apply their changes immediately. If you want to apply several changes at once you can use the following commands: -``change_start``: Marks the start of a change -``change_finish``: Marks that the current set of changes is complete. All changes recorded since ``g.change_start()`` will be applied +- ``change_start``: Marks the start of a change +- ``change_finish``: Marks that the current set of changes is complete. All changes recorded since ``g.change_start()`` will be applied Experiment details ------------------ From 9bbe23c04a3350fec25e5f88a3e2fd747ca6cdb6 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Wed, 28 Jun 2017 16:39:45 +0100 Subject: [PATCH 0671/1813] Updated Ibex and genie_python: Common commands (rest) --- Ibex-and-genie_python:-Common-commands.rest | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/Ibex-and-genie_python:-Common-commands.rest b/Ibex-and-genie_python:-Common-commands.rest index 1a87af6..659be71 100644 --- a/Ibex-and-genie_python:-Common-commands.rest +++ b/Ibex-and-genie_python:-Common-commands.rest @@ -190,20 +190,19 @@ This is just a sample of the methods available. **Exercise 2** --------------- -- This exercise requires the following pre-requisites. These should be satisfied if you are following this as part of the Ibex-run training course +============== +- This exercise requires that: - You have permission to begin and end runs on the instrument you're using. - The instrument your using has been configured so it can successfully enter a running state - You have a settable block called "MY_BLOCK" - Change the title of the run to "Exercise 2" -- Begin a new run -- Pause the run +- Start a run and wait for 1 uamps (maximum wait 10 seconds) before pausing - Set the value of "MY_BLOCK" to 5, with a high limit of 10, a low limit of 1 and put it under run control - Resume the run -- Set the value of "MY_BLOCK" to 20 -- Confirm (using ``genie_python``) that the instrument has entered a waiting state +- Set the value of "MY_BLOCK" to 20 and confirm (using ``genie_python``) that the instrument has entered a waiting state +- Decrease the value of "MY_BLOCK" down in steps of 1 until it reaches 10. Wait for 1 second between steps. Notice how the run state changes back to running when the block value drops below 10. - End the run ------------------------------------------------------------------------------- From 034fcdc4a925310f3bb5cf721b6e57af6c621a8b Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Wed, 28 Jun 2017 16:40:24 +0100 Subject: [PATCH 0672/1813] Updated Ibex and genie_python: Common commands (rest) --- Ibex-and-genie_python:-Common-commands.rest | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Ibex-and-genie_python:-Common-commands.rest b/Ibex-and-genie_python:-Common-commands.rest index 659be71..4aeac75 100644 --- a/Ibex-and-genie_python:-Common-commands.rest +++ b/Ibex-and-genie_python:-Common-commands.rest @@ -207,7 +207,7 @@ This is just a sample of the methods available. ------------------------------------------------------------------------------- -**Next**: [[Common commands|Ibex-and-genie_python:-Scripting]] +**Next**: [[Scripting|Ibex-and-genie_python:-Scripting]] **Previous**: [[Getting started|Ibex-and-genie_python:-Getting-started]] From 288753797fce962016d7e4b0ef0e6ca43ea004f1 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Wed, 28 Jun 2017 16:40:39 +0100 Subject: [PATCH 0673/1813] Updated Ibex and genie_python: Getting started (rest) From 28ec588885e20b752af873ea2d334ec52d46bea1 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Wed, 28 Jun 2017 16:40:53 +0100 Subject: [PATCH 0674/1813] Updated Ibex and genie_python: Common commands (rest) --- Ibex-and-genie_python:-Common-commands.rest | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Ibex-and-genie_python:-Common-commands.rest b/Ibex-and-genie_python:-Common-commands.rest index 4aeac75..5ea3080 100644 --- a/Ibex-and-genie_python:-Common-commands.rest +++ b/Ibex-and-genie_python:-Common-commands.rest @@ -205,6 +205,8 @@ This is just a sample of the methods available. - Decrease the value of "MY_BLOCK" down in steps of 1 until it reaches 10. Wait for 1 second between steps. Notice how the run state changes back to running when the block value drops below 10. - End the run +[[Solution|Ibex-and-genie_python:-Exercise-solutions]] + ------------------------------------------------------------------------------- **Next**: [[Scripting|Ibex-and-genie_python:-Scripting]] From 27745e3e32ddb384e30c3061d36a07a4bcbac9a7 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Wed, 28 Jun 2017 16:41:25 +0100 Subject: [PATCH 0675/1813] Updated Ibex and genie_python: Exercise solutions (rest) --- Ibex-and-genie_python:-Exercise-solutions.rest | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/Ibex-and-genie_python:-Exercise-solutions.rest b/Ibex-and-genie_python:-Exercise-solutions.rest index 27687a8..26837a5 100644 --- a/Ibex-and-genie_python:-Exercise-solutions.rest +++ b/Ibex-and-genie_python:-Exercise-solutions.rest @@ -22,4 +22,9 @@ From [[Getting Started|Ibex-and-genie_python:-Getting started]]. for i in range(1,11): print i*i - - A **blank line** will indicate to the scripting window that you've finished writing the loop and it can go ahead and be executed. \ No newline at end of file + - A **blank line** will indicate to the scripting window that you've finished writing the loop and it can go ahead and be executed. + +Exercise 2 +========== + +From [[Common commands|Ibex-and-genie_python:-Common-commands]] \ No newline at end of file From 48df01869672b7c0c6a39f88ed405ecfcff13a9e Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Wed, 28 Jun 2017 16:41:39 +0100 Subject: [PATCH 0676/1813] Updated Ibex and genie_python: Common commands (rest) From d294856b2631e9e879aa827cd923823a507404d3 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Wed, 28 Jun 2017 16:44:51 +0100 Subject: [PATCH 0677/1813] Updated Ibex and genie_python: Exercise solutions (rest) --- ...-and-genie_python:-Exercise-solutions.rest | 27 ++++++++++++++++--- 1 file changed, 24 insertions(+), 3 deletions(-) diff --git a/Ibex-and-genie_python:-Exercise-solutions.rest b/Ibex-and-genie_python:-Exercise-solutions.rest index 26837a5..acc7979 100644 --- a/Ibex-and-genie_python:-Exercise-solutions.rest +++ b/Ibex-and-genie_python:-Exercise-solutions.rest @@ -11,11 +11,11 @@ From [[Getting Started|Ibex-and-genie_python:-Getting started]]. .. image:: StandardStartupOutputOnDemo.png -- Output "Hello, world!" to the console +- *Output "Hello, world!" to the console* - Enter something like ``print "Hello, World!`` and press return -- Calculate and output the square of all the integers between 1 and 10 +- *Calculate and output the square of all the integers between 1 and 10* - This is best achieved with the following loop:: @@ -27,4 +27,25 @@ From [[Getting Started|Ibex-and-genie_python:-Getting started]]. Exercise 2 ========== -From [[Common commands|Ibex-and-genie_python:-Common-commands]] \ No newline at end of file +From [[Common commands|Ibex-and-genie_python:-Common-commands]] + +- *Change the title of the run to "Exercise 2"* + + - Use either ``g.change_title("Exercise 2")`` or ``g.change(title="Exercise 2")`` + +- Start a run and wait for 1 uamps (maximum wait 10 seconds) before pausing:: + + g.begin() + g.waitfor(uamps=1, max_wait=10) + g.pause() + +- Set the value of "MY_BLOCK" to 5, with a high limit of 10, a low limit of 1 and put it under run control + + - The arguments may be named or un-named. If named, the ordering may differ, but named arguments must appear after un-named arguments for Python to accept the method call + + g.cset("MY_BLOCK", 5, lowlimit=1, highlimit=10, runcontrol=True) + +- Resume the run +- Set the value of "MY_BLOCK" to 20 and confirm (using ``genie_python``) that the instrument has entered a waiting state +- Decrease the value of "MY_BLOCK" down in steps of 1 until it reaches 10. Wait for 1 second between steps. Notice how the run state changes back to running when the block value drops below 10. +- End the run \ No newline at end of file From 022544328be700beb890c06082833b2e7d9c1d1d Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Wed, 28 Jun 2017 16:45:05 +0100 Subject: [PATCH 0678/1813] Updated Ibex and genie_python: Exercise solutions (rest) --- Ibex-and-genie_python:-Exercise-solutions.rest | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Ibex-and-genie_python:-Exercise-solutions.rest b/Ibex-and-genie_python:-Exercise-solutions.rest index acc7979..20d65be 100644 --- a/Ibex-and-genie_python:-Exercise-solutions.rest +++ b/Ibex-and-genie_python:-Exercise-solutions.rest @@ -41,9 +41,9 @@ From [[Common commands|Ibex-and-genie_python:-Common-commands]] - Set the value of "MY_BLOCK" to 5, with a high limit of 10, a low limit of 1 and put it under run control - - The arguments may be named or un-named. If named, the ordering may differ, but named arguments must appear after un-named arguments for Python to accept the method call + - The arguments may be named or un-named. If named, the ordering may differ, but named arguments must appear after un-named arguments for Python to accept the method call - g.cset("MY_BLOCK", 5, lowlimit=1, highlimit=10, runcontrol=True) + g.cset("MY_BLOCK", 5, lowlimit=1, highlimit=10, runcontrol=True) - Resume the run - Set the value of "MY_BLOCK" to 20 and confirm (using ``genie_python``) that the instrument has entered a waiting state From ff5149b676189fedbce9c69a9dbf2429958bfc16 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Wed, 28 Jun 2017 16:45:31 +0100 Subject: [PATCH 0679/1813] Updated Ibex and genie_python: Exercise solutions (rest) --- Ibex-and-genie_python:-Exercise-solutions.rest | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Ibex-and-genie_python:-Exercise-solutions.rest b/Ibex-and-genie_python:-Exercise-solutions.rest index 20d65be..f1bd2fa 100644 --- a/Ibex-and-genie_python:-Exercise-solutions.rest +++ b/Ibex-and-genie_python:-Exercise-solutions.rest @@ -39,12 +39,12 @@ From [[Common commands|Ibex-and-genie_python:-Common-commands]] g.waitfor(uamps=1, max_wait=10) g.pause() -- Set the value of "MY_BLOCK" to 5, with a high limit of 10, a low limit of 1 and put it under run control - - - The arguments may be named or un-named. If named, the ordering may differ, but named arguments must appear after un-named arguments for Python to accept the method call +- Set the value of "MY_BLOCK" to 5, with a high limit of 10, a low limit of 1 and put it under run control:: g.cset("MY_BLOCK", 5, lowlimit=1, highlimit=10, runcontrol=True) + - The arguments may be named or un-named. If named, the ordering may differ, but named arguments must appear after un-named arguments for Python to accept the method call + - Resume the run - Set the value of "MY_BLOCK" to 20 and confirm (using ``genie_python``) that the instrument has entered a waiting state - Decrease the value of "MY_BLOCK" down in steps of 1 until it reaches 10. Wait for 1 second between steps. Notice how the run state changes back to running when the block value drops below 10. From 3a0319b0b47fec55c8bd7156d8373183f216cd93 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Wed, 28 Jun 2017 16:45:45 +0100 Subject: [PATCH 0680/1813] Updated Ibex and genie_python: Exercise solutions (rest) --- Ibex-and-genie_python:-Exercise-solutions.rest | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Ibex-and-genie_python:-Exercise-solutions.rest b/Ibex-and-genie_python:-Exercise-solutions.rest index f1bd2fa..338d92e 100644 --- a/Ibex-and-genie_python:-Exercise-solutions.rest +++ b/Ibex-and-genie_python:-Exercise-solutions.rest @@ -41,7 +41,7 @@ From [[Common commands|Ibex-and-genie_python:-Common-commands]] - Set the value of "MY_BLOCK" to 5, with a high limit of 10, a low limit of 1 and put it under run control:: - g.cset("MY_BLOCK", 5, lowlimit=1, highlimit=10, runcontrol=True) + g.cset("MY_BLOCK", 5, lowlimit=1, highlimit=10, runcontrol=True) - The arguments may be named or un-named. If named, the ordering may differ, but named arguments must appear after un-named arguments for Python to accept the method call From d1288e2c982eadcee74737a20e0cfd419fad7a7a Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Wed, 28 Jun 2017 16:48:17 +0100 Subject: [PATCH 0681/1813] Updated Ibex and genie_python: Exercise solutions (rest) --- ...-and-genie_python:-Exercise-solutions.rest | 21 +++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/Ibex-and-genie_python:-Exercise-solutions.rest b/Ibex-and-genie_python:-Exercise-solutions.rest index 338d92e..5d055b2 100644 --- a/Ibex-and-genie_python:-Exercise-solutions.rest +++ b/Ibex-and-genie_python:-Exercise-solutions.rest @@ -33,19 +33,32 @@ From [[Common commands|Ibex-and-genie_python:-Common-commands]] - Use either ``g.change_title("Exercise 2")`` or ``g.change(title="Exercise 2")`` -- Start a run and wait for 1 uamps (maximum wait 10 seconds) before pausing:: +- *Start a run and wait for 1 uamps (maximum wait 10 seconds) before pausing*:: g.begin() g.waitfor(uamps=1, max_wait=10) g.pause() -- Set the value of "MY_BLOCK" to 5, with a high limit of 10, a low limit of 1 and put it under run control:: +- *Set the value of "MY_BLOCK" to 5, with a high limit of 10, a low limit of 1 and put it under run control*:: g.cset("MY_BLOCK", 5, lowlimit=1, highlimit=10, runcontrol=True) - The arguments may be named or un-named. If named, the ordering may differ, but named arguments must appear after un-named arguments for Python to accept the method call -- Resume the run -- Set the value of "MY_BLOCK" to 20 and confirm (using ``genie_python``) that the instrument has entered a waiting state +- *Resume the run*:: + + g.resume() + +- *Set the value of "MY_BLOCK" to 20 and confirm (using ``genie_python``) that the instrument has entered a waiting state* + + # Can use either way of specifying cset for a single block + g.cset(MY_BLOCK=20) + + # Can verify in any sensible way, so long as we're getting g.runstate() + if g.runstate()=="WAITING": + print "The instrument is waiting" + else: + print "The instrument is not waiting" + - Decrease the value of "MY_BLOCK" down in steps of 1 until it reaches 10. Wait for 1 second between steps. Notice how the run state changes back to running when the block value drops below 10. - End the run \ No newline at end of file From 5d42e672e655add0b25a6ad03f2ecd8bfdcc619c Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Wed, 28 Jun 2017 16:48:30 +0100 Subject: [PATCH 0682/1813] Updated Ibex and genie_python: Exercise solutions (rest) --- Ibex-and-genie_python:-Exercise-solutions.rest | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Ibex-and-genie_python:-Exercise-solutions.rest b/Ibex-and-genie_python:-Exercise-solutions.rest index 5d055b2..0f673bd 100644 --- a/Ibex-and-genie_python:-Exercise-solutions.rest +++ b/Ibex-and-genie_python:-Exercise-solutions.rest @@ -49,7 +49,7 @@ From [[Common commands|Ibex-and-genie_python:-Common-commands]] g.resume() -- *Set the value of "MY_BLOCK" to 20 and confirm (using ``genie_python``) that the instrument has entered a waiting state* +- *Set the value of "MY_BLOCK" to 20 and confirm (using ``genie_python``) that the instrument has entered a waiting state*:: # Can use either way of specifying cset for a single block g.cset(MY_BLOCK=20) From 1696513e37a2aab01e7383c749af1108713773bf Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Thu, 29 Jun 2017 09:04:12 +0100 Subject: [PATCH 0683/1813] Updated Ibex and genie_python: Exercise solutions (rest) --- Ibex-and-genie_python:-Exercise-solutions.rest | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/Ibex-and-genie_python:-Exercise-solutions.rest b/Ibex-and-genie_python:-Exercise-solutions.rest index 0f673bd..3dee221 100644 --- a/Ibex-and-genie_python:-Exercise-solutions.rest +++ b/Ibex-and-genie_python:-Exercise-solutions.rest @@ -60,5 +60,12 @@ From [[Common commands|Ibex-and-genie_python:-Common-commands]] else: print "The instrument is not waiting" -- Decrease the value of "MY_BLOCK" down in steps of 1 until it reaches 10. Wait for 1 second between steps. Notice how the run state changes back to running when the block value drops below 10. -- End the run \ No newline at end of file +- *Decrease the value of "MY_BLOCK" down in steps of 1 until it reaches 5. Wait for 1 second between steps. Notice how the run state changes back to running when the block value drops below 10*:: + + for i in range(g.cget("MY_BLOCK")['value'], 4, -1): + g.cset(MY_BLOCK=i) + g.waitfor(seconds=1) + +- *End the run*:: + + g.end() \ No newline at end of file From 4de68074f315ce42d255c53002187ce81b3a8a67 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Thu, 29 Jun 2017 09:05:00 +0100 Subject: [PATCH 0684/1813] Updated Ibex and genie_python: Common commands (rest) --- Ibex-and-genie_python:-Common-commands.rest | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Ibex-and-genie_python:-Common-commands.rest b/Ibex-and-genie_python:-Common-commands.rest index 5ea3080..b987594 100644 --- a/Ibex-and-genie_python:-Common-commands.rest +++ b/Ibex-and-genie_python:-Common-commands.rest @@ -194,7 +194,7 @@ This is just a sample of the methods available. - This exercise requires that: - You have permission to begin and end runs on the instrument you're using. - - The instrument your using has been configured so it can successfully enter a running state + - The instrument you're using has been configured so it can successfully enter a running state - You have a settable block called "MY_BLOCK" - Change the title of the run to "Exercise 2" From de6db667d57f4ef18abf56a639c628223051188e Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Thu, 29 Jun 2017 14:34:33 +0100 Subject: [PATCH 0685/1813] Updated Ibex and genie_python: Scripting (markdown) --- Ibex-and-genie_python:-Scripting.md | 65 +++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) diff --git a/Ibex-and-genie_python:-Scripting.md b/Ibex-and-genie_python:-Scripting.md index 5448862..fa49bf9 100644 --- a/Ibex-and-genie_python:-Scripting.md +++ b/Ibex-and-genie_python:-Scripting.md @@ -1,3 +1,68 @@ +Introduction +============ + +So far we have run ``genie_python`` commands by entering them via a terminal. However, there may be cases where we want to reuse common sets of commands multiple times. These cases are where creating a script can be very useful. + +Creating scripts +================ + +Python scripts have the extension ``.py``. You can create them from any number of editors. A good editor will do syntax highlighting, and will make it easy to work with Python's indented blocks without accidentally mixing spaces and tabs. Notepad++ is a good choice. + +We generally classify scripts as: + +1. **Instrument scripts**. These are either aimed at instrument scientists, or put the instrument in a particular state that multiple users may wish to access. +2. **User scripts**. These are scripts that specific users need for particular experiments. They may be reused to an extent but they don't generally need to be accessed quite so readily. + +**NOTE**: Ibex puts all configurations and **Instrument scripts** under version control. That means if you change or delete them and want to restore a previous version, you can. The same isn't true for user scripts. + +- Instrument scripts are placed in the folder: ``C:\Instrument\Settings\config\NDX[Instrument name]\Python\inst`` +- User scripts are placed in the folder: ``C:\scripts`` + +Exercise 3a +=========== + +Create two empty scripts: + +- An **instrument** script called ``set_up_instrument.py`` +- A **user** script called ``run_my_experiment.py`` + +Writing scripts +=============== + +When writing scripts, you can use any Python and ``genie_python`` functionality that you've already learnt. + +In general, we recommend all executable code within a script should be contained within functions and classes. For example:: + + def my_function(arg1, arg2): + print The first argument is {0}, the second argument is {1} + +This gives much greater control over when and how custom code is executed. + +Exercise 3b +=========== + +- Update your instrument script, ``set_up_instrument.py``, so that it contains a single function + + - The function should be called "set_up_instrument" + - It should set the title to "My experiment" + - It should set the username to your name + +- Update your user script, ``run_my_experiment.py`` which contains a function that does the following + + - Begins the run + - Prints the current uamps for the current period over 10 seconds at 1 second intervals + - Ends the run + +Loading scripts +=============== + +Once you've created your scripts, you need to make sure they're available to use. This works differently for instrument scripts and user scripts. + +- **Instrument scripts** are loaded automatically when you open the scripting perspective +- **User scripts** can be loaded by using the ``load_script`` method in genie_python. For example, ``g.load_script('C:\script\my_script.py')`` + +**IMPORTANT**: When a script is loaded, Python runs all the commands contained within. We strongly recommend keeping all executable code within functions, so that it runs when you call it rather than executing immediately. + ------------------------------------------------------------------------------- From 7b6fbb66bb681c0b1516b739fa192edf8fbe239c Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Thu, 29 Jun 2017 14:43:46 +0100 Subject: [PATCH 0686/1813] Updated Ibex and genie_python: Scripting (markdown) --- Ibex-and-genie_python:-Scripting.md | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/Ibex-and-genie_python:-Scripting.md b/Ibex-and-genie_python:-Scripting.md index fa49bf9..ae4532d 100644 --- a/Ibex-and-genie_python:-Scripting.md +++ b/Ibex-and-genie_python:-Scripting.md @@ -63,6 +63,31 @@ Once you've created your scripts, you need to make sure they're available to use **IMPORTANT**: When a script is loaded, Python runs all the commands contained within. We strongly recommend keeping all executable code within functions, so that it runs when you call it rather than executing immediately. +Exercise 3c +=========== + +- Load your user script ``run_my_experiment.py`` + +Running scripts +=============== + +Remember, scripts are executed when they are loaded. Functions will be loaded immediately, but will only be run when you call them as described below. + +Instrument scripts +------------------ + +Methods defined in instrument scripts are available via the ``inst`` namespace. For example, if we define a method called ``my_method`` in an instrument script which takes 1 argument, a block name, then I can make it run in the scripting perspective by entering:: + + inst.my_method("MY_BLOCK") + +As with ``genie_python`` commands, the Ibex scripting perspective will provide auto-completion for instrument methods so you can see what is available + +User scripts +------------ + +Modifying scripts +================= + ------------------------------------------------------------------------------- From 3d90efc21f27f51a59791d4ca19fc505bc852cf4 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Thu, 29 Jun 2017 14:57:13 +0100 Subject: [PATCH 0687/1813] Updated Ibex and genie_python: Scripting (markdown) --- Ibex-and-genie_python:-Scripting.md | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/Ibex-and-genie_python:-Scripting.md b/Ibex-and-genie_python:-Scripting.md index ae4532d..f781bf6 100644 --- a/Ibex-and-genie_python:-Scripting.md +++ b/Ibex-and-genie_python:-Scripting.md @@ -82,12 +82,38 @@ Methods defined in instrument scripts are available via the ``inst`` namespace. As with ``genie_python`` commands, the Ibex scripting perspective will provide auto-completion for instrument methods so you can see what is available +Exercise 3d +----------- + +- Run the instrument method you wrote in exercise 3c + User scripts ------------ +Functions loaded from user scripts using the ``g.load_script(...)`` command will be available to call like any other user-defined function. For example, if I defined a function ``my_function``:: + + Code example + Modifying scripts ================= +Every new scripting perspective will be a clean slate. Any previously loaded scripts will be forgotten. When they are loaded, they will be up to date with the current file contents. + +Sometimes you might want to change a script and update it without having to change scripting terminal. + +- Instrument scripts: Run the command ``reload(inst)`` +- User scripts: Run ``g.load_script("C:\scripts\file_to_reload.py")`` with the appropriate file name + +Exercise 3e +----------- + +- Modify your instrument script to output the current at 0.1 second intervals +- Reload the script +- Run it again and confirm the behaviour has changed + +Using functions from other files +================================ + ------------------------------------------------------------------------------- From 634c926e161c0d9ba6959a68064b315023b02a25 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Thu, 29 Jun 2017 14:58:19 +0100 Subject: [PATCH 0688/1813] Updated Ibex and genie_python: Scripting (markdown) --- Ibex-and-genie_python:-Scripting.md | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/Ibex-and-genie_python:-Scripting.md b/Ibex-and-genie_python:-Scripting.md index f781bf6..a13cf00 100644 --- a/Ibex-and-genie_python:-Scripting.md +++ b/Ibex-and-genie_python:-Scripting.md @@ -19,7 +19,7 @@ We generally classify scripts as: - User scripts are placed in the folder: ``C:\scripts`` Exercise 3a -=========== +----------- Create two empty scripts: @@ -39,7 +39,7 @@ In general, we recommend all executable code within a script should be contained This gives much greater control over when and how custom code is executed. Exercise 3b -=========== +----------- - Update your instrument script, ``set_up_instrument.py``, so that it contains a single function @@ -64,7 +64,7 @@ Once you've created your scripts, you need to make sure they're available to use **IMPORTANT**: When a script is loaded, Python runs all the commands contained within. We strongly recommend keeping all executable code within functions, so that it runs when you call it rather than executing immediately. Exercise 3c -=========== +----------- - Load your user script ``run_my_experiment.py`` @@ -85,7 +85,7 @@ As with ``genie_python`` commands, the Ibex scripting perspective will provide a Exercise 3d ----------- -- Run the instrument method you wrote in exercise 3c +- Run the instrument method you wrote in exercise 3b User scripts ------------ @@ -94,6 +94,11 @@ Functions loaded from user scripts using the ``g.load_script(...)`` command will Code example +Exercise 3e +----------- + +- Run the user script method you wrote in exercise 3b + Modifying scripts ================= @@ -104,7 +109,7 @@ Sometimes you might want to change a script and update it without having to chan - Instrument scripts: Run the command ``reload(inst)`` - User scripts: Run ``g.load_script("C:\scripts\file_to_reload.py")`` with the appropriate file name -Exercise 3e +Exercise 3f ----------- - Modify your instrument script to output the current at 0.1 second intervals From 3aac3c848f98eabbb47c01515544de37b1df17bd Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Thu, 29 Jun 2017 15:11:46 +0100 Subject: [PATCH 0689/1813] Updated Ibex and genie_python: Scripting (markdown) --- Ibex-and-genie_python:-Scripting.md | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/Ibex-and-genie_python:-Scripting.md b/Ibex-and-genie_python:-Scripting.md index a13cf00..30c5d78 100644 --- a/Ibex-and-genie_python:-Scripting.md +++ b/Ibex-and-genie_python:-Scripting.md @@ -119,6 +119,23 @@ Exercise 3f Using functions from other files ================================ +Exercise 4 +========== + +- Create a new instrument script containing a function + + - The function sets the title to "Ramping [block name] from [initial value] to [final value]" + - The method begins a run and then changes the value of the block incrementally in steps of size 1 + - Once the target is reached, the method ends the run + +- Put a line at the top of your instrument script **outside the function definition** that prints the current title + +- Create a new user script containing a function + + - The function runs the new instrument script on two different blocks + +- Load and run your new user-script function +- Where was the print statement at the top of your instrument script executed? ------------------------------------------------------------------------------- From 87fa30c84869be8d9474b39dde19108fc6520a20 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Thu, 29 Jun 2017 16:05:02 +0100 Subject: [PATCH 0690/1813] Updated Ibex and genie_python: Scripting (markdown) --- Ibex-and-genie_python:-Scripting.md | 38 +++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/Ibex-and-genie_python:-Scripting.md b/Ibex-and-genie_python:-Scripting.md index 30c5d78..5b11553 100644 --- a/Ibex-and-genie_python:-Scripting.md +++ b/Ibex-and-genie_python:-Scripting.md @@ -119,6 +119,44 @@ Exercise 3f Using functions from other files ================================ +You may find yourself wanting to call a function from one file in another file. + +Calling an instrument function from a different instrument script +----------------------------------------------------------------- + +It is recommended that you ``import`` it using standard Python rather than trying to call it with the ``inst.`` prefix. As you don't know the order in which the scripts are loaded, this avoids potential errors in the load order. It also helps to prevent circular dependencies. + +For example, if I have one instrument script, ``counts.py``:: + + def vanadium(title, duration): + g.change(title=title) + g.begin() + g.waitfor(seconds=duration) + g.end() + +and another called ``calibrate.py`` that uses the ``vanadium`` function then I would write:: + + from counts import vanadium + def calibration(): + for title, duration in [("10 second run", 10), ("1 minute run", 60), ("1 hour run", 3600)]: + vanadium(title, duration) + +Calling an instrument function from a user script +------------------------------------------------- + +Here you can just use ``inst.`` prefix, for example ``inst.my_function(arg1, arg2)`` + +Calling a user function from an instrument script +------------------------------------------------- + +This is feasible, but generally not recommended. The user script won't be kept in version control like the instrument script and could be moved or changed unexpectedly. + +Calling a user function from a different user script +---------------------------------------------------- + +Exactly the same as calling a function in one instrument script from another + + Exercise 4 ========== From 9cbb5b4049d92caa6d77ef89d069576f413f855a Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Thu, 29 Jun 2017 16:05:44 +0100 Subject: [PATCH 0691/1813] Updated Ibex and genie_python: Common commands (rest) From 90dd4dce0f61f1318f7f5c2058780b6d0e3016ce Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Thu, 29 Jun 2017 16:06:32 +0100 Subject: [PATCH 0692/1813] Updated Ibex and genie_python: Scripting (markdown) --- Ibex-and-genie_python:-Scripting.md | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/Ibex-and-genie_python:-Scripting.md b/Ibex-and-genie_python:-Scripting.md index 5b11553..d60812b 100644 --- a/Ibex-and-genie_python:-Scripting.md +++ b/Ibex-and-genie_python:-Scripting.md @@ -26,6 +26,8 @@ Create two empty scripts: - An **instrument** script called ``set_up_instrument.py`` - A **user** script called ``run_my_experiment.py`` +[[Solution|Ibex-and-genie_python:-Exercise-solutions]] + Writing scripts =============== @@ -53,6 +55,8 @@ Exercise 3b - Prints the current uamps for the current period over 10 seconds at 1 second intervals - Ends the run +[[Solution|Ibex-and-genie_python:-Exercise-solutions]] + Loading scripts =============== @@ -68,6 +72,8 @@ Exercise 3c - Load your user script ``run_my_experiment.py`` +[[Solution|Ibex-and-genie_python:-Exercise-solutions]] + Running scripts =============== @@ -87,6 +93,8 @@ Exercise 3d - Run the instrument method you wrote in exercise 3b +[[Solution|Ibex-and-genie_python:-Exercise-solutions]] + User scripts ------------ @@ -99,6 +107,8 @@ Exercise 3e - Run the user script method you wrote in exercise 3b +[[Solution|Ibex-and-genie_python:-Exercise-solutions]] + Modifying scripts ================= @@ -116,6 +126,8 @@ Exercise 3f - Reload the script - Run it again and confirm the behaviour has changed +[[Solution|Ibex-and-genie_python:-Exercise-solutions]] + Using functions from other files ================================ @@ -175,6 +187,8 @@ Exercise 4 - Load and run your new user-script function - Where was the print statement at the top of your instrument script executed? +[[Solution|Ibex-and-genie_python:-Exercise-solutions]] + ------------------------------------------------------------------------------- **Next**: [[Converting from OpenGENIE|Ibex-and-genie_python:-Converting-from-OpenGENIE]] From 347d04787611a32b8ef1da2a04aad0200291d070 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Thu, 29 Jun 2017 16:19:53 +0100 Subject: [PATCH 0693/1813] Updated Ibex and genie_python: Exercise solutions (rest) --- ...-and-genie_python:-Exercise-solutions.rest | 37 ++++++++++++++++++- 1 file changed, 36 insertions(+), 1 deletion(-) diff --git a/Ibex-and-genie_python:-Exercise-solutions.rest b/Ibex-and-genie_python:-Exercise-solutions.rest index 3dee221..5f57411 100644 --- a/Ibex-and-genie_python:-Exercise-solutions.rest +++ b/Ibex-and-genie_python:-Exercise-solutions.rest @@ -68,4 +68,39 @@ From [[Common commands|Ibex-and-genie_python:-Common-commands]] - *End the run*:: - g.end() \ No newline at end of file + g.end() + +Exercise 4 +========== +- *Create a new instrument script containing a function* + + - You should create a Python file in "C:\Instrument\Settings\config\[Machine name]\Python\inst" + + - *The function sets the title to "Ramping [block name] from [initial value] to [final value]" + - The method begins a run and then changes the value of the block incrementally in steps of size 1 + - Once the target is reached, the method ends the run*:: + + def ramp(block, target): + g.begin() + + try: + initial = g.cget(block)['value'] + except: + print "Problem getting value for block {0}. Make sure it exists".format(block) + else: + current = initial + small = 0.0001 + while abs(current-target) > small: + current = min(target, current + 1) if initial < final else max(target, current -1) + g.cset(block, current) + + g.end() + +- Put a line at the top of your instrument script **outside the function definition** that prints the current title + +- Create a new user script containing a function + + - The function runs the new instrument script on two different blocks + +- Load and run your new user-script function +- Where was the print statement at the top of your instrument script executed? \ No newline at end of file From 841967c56936c78c27e1db7ea90abf7c0826277a Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Thu, 29 Jun 2017 16:20:31 +0100 Subject: [PATCH 0694/1813] Updated Ibex and genie_python: Exercise solutions (rest) --- Ibex-and-genie_python:-Exercise-solutions.rest | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Ibex-and-genie_python:-Exercise-solutions.rest b/Ibex-and-genie_python:-Exercise-solutions.rest index 5f57411..f839b50 100644 --- a/Ibex-and-genie_python:-Exercise-solutions.rest +++ b/Ibex-and-genie_python:-Exercise-solutions.rest @@ -93,8 +93,8 @@ Exercise 4 while abs(current-target) > small: current = min(target, current + 1) if initial < final else max(target, current -1) g.cset(block, current) - - g.end() + finally: + g.end() - Put a line at the top of your instrument script **outside the function definition** that prints the current title From c05588b8043688c4ee162a346883366e6b6047b5 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Thu, 29 Jun 2017 16:22:16 +0100 Subject: [PATCH 0695/1813] Updated Ibex and genie_python: Exercise solutions (rest) --- Ibex-and-genie_python:-Exercise-solutions.rest | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/Ibex-and-genie_python:-Exercise-solutions.rest b/Ibex-and-genie_python:-Exercise-solutions.rest index f839b50..7ff556c 100644 --- a/Ibex-and-genie_python:-Exercise-solutions.rest +++ b/Ibex-and-genie_python:-Exercise-solutions.rest @@ -76,18 +76,19 @@ Exercise 4 - You should create a Python file in "C:\Instrument\Settings\config\[Machine name]\Python\inst" - - *The function sets the title to "Ramping [block name] from [initial value] to [final value]" - - The method begins a run and then changes the value of the block incrementally in steps of size 1 - - Once the target is reached, the method ends the run*:: + - *The function sets the title to "Ramping [block name] from [initial value] to [final value]"* + - *The method begins a run and then changes the value of the block incrementally in steps of size 1* + - *Once the target is reached, the method ends the run*:: def ramp(block, target): - g.begin() - try: initial = g.cget(block)['value'] except: print "Problem getting value for block {0}. Make sure it exists".format(block) else: + g.change(title="Ramping {0} from {1} to {2}".format(block, initial, target)) + g.begin() + current = initial small = 0.0001 while abs(current-target) > small: From 6d39bd35c4cd983f79509464f9f089d7f2b408b5 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Thu, 29 Jun 2017 16:28:01 +0100 Subject: [PATCH 0696/1813] Updated Ibex and genie_python: Exercise solutions (rest) --- ...-and-genie_python:-Exercise-solutions.rest | 24 +++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/Ibex-and-genie_python:-Exercise-solutions.rest b/Ibex-and-genie_python:-Exercise-solutions.rest index 7ff556c..061fe6e 100644 --- a/Ibex-and-genie_python:-Exercise-solutions.rest +++ b/Ibex-and-genie_python:-Exercise-solutions.rest @@ -97,11 +97,27 @@ Exercise 4 finally: g.end() -- Put a line at the top of your instrument script **outside the function definition** that prints the current title +- *Put a line at the top of your instrument script **outside the function definition** that prints the current title*:: -- Create a new user script containing a function + print g.get_title() - - The function runs the new instrument script on two different blocks + def ramp(block, target): + ... + +- *Create a new user script containing a function that runs the new instrument function on two different blocks*:: + + def ramp_two_blocks(): + for block, target in [("MY_BLOCK", 10), ("MY_OTHER_BLOCK", -10)]: + inst.ramp(block, target) - Load and run your new user-script function -- Where was the print statement at the top of your instrument script executed? \ No newline at end of file + + - From a scripting perspective, assuming the file is called "ramp_blocks.py", run the following:: + + g.load_script("C:\scripts\ramp_blocks.py") + ramp_two_blocks() + +- Where was the print statement at the top of your instrument script executed? + + - You should have seen the current title printed during the initialisation of the scripting window + - **PUT AN IMAGE HERE** \ No newline at end of file From db3fd0a0f60c3718b355e0ffab6eb3e365c238eb Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Thu, 29 Jun 2017 16:28:33 +0100 Subject: [PATCH 0697/1813] Updated Ibex and genie_python: Exercise solutions (rest) --- Ibex-and-genie_python:-Exercise-solutions.rest | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Ibex-and-genie_python:-Exercise-solutions.rest b/Ibex-and-genie_python:-Exercise-solutions.rest index 061fe6e..4f5dadc 100644 --- a/Ibex-and-genie_python:-Exercise-solutions.rest +++ b/Ibex-and-genie_python:-Exercise-solutions.rest @@ -110,14 +110,14 @@ Exercise 4 for block, target in [("MY_BLOCK", 10), ("MY_OTHER_BLOCK", -10)]: inst.ramp(block, target) -- Load and run your new user-script function +- *Load and run your new user-script function* - From a scripting perspective, assuming the file is called "ramp_blocks.py", run the following:: g.load_script("C:\scripts\ramp_blocks.py") ramp_two_blocks() -- Where was the print statement at the top of your instrument script executed? +- *Where was the print statement at the top of your instrument script executed?* - You should have seen the current title printed during the initialisation of the scripting window - **PUT AN IMAGE HERE** \ No newline at end of file From 87f6474dff5a96c9eb6a428b2fbb42d907b00d41 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Thu, 29 Jun 2017 16:28:59 +0100 Subject: [PATCH 0698/1813] Updated Ibex and genie_python: Exercise solutions (rest) --- Ibex-and-genie_python:-Exercise-solutions.rest | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Ibex-and-genie_python:-Exercise-solutions.rest b/Ibex-and-genie_python:-Exercise-solutions.rest index 4f5dadc..307bf07 100644 --- a/Ibex-and-genie_python:-Exercise-solutions.rest +++ b/Ibex-and-genie_python:-Exercise-solutions.rest @@ -97,7 +97,7 @@ Exercise 4 finally: g.end() -- *Put a line at the top of your instrument script **outside the function definition** that prints the current title*:: +- *Put a line at the top of your instrument script outside the function definition that prints the current title*:: print g.get_title() From fa7e3eb534e864a2fe9541e9334ed356a3afcb35 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Thu, 29 Jun 2017 16:29:30 +0100 Subject: [PATCH 0699/1813] Updated Ibex and genie_python: Exercise solutions (rest) --- Ibex-and-genie_python:-Exercise-solutions.rest | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/Ibex-and-genie_python:-Exercise-solutions.rest b/Ibex-and-genie_python:-Exercise-solutions.rest index 307bf07..deae3e0 100644 --- a/Ibex-and-genie_python:-Exercise-solutions.rest +++ b/Ibex-and-genie_python:-Exercise-solutions.rest @@ -99,10 +99,9 @@ Exercise 4 - *Put a line at the top of your instrument script outside the function definition that prints the current title*:: - print g.get_title() - - def ramp(block, target): - ... + print g.get_title() + def ramp(block, target): + ... - *Create a new user script containing a function that runs the new instrument function on two different blocks*:: From 614e398a6d8c6751939b7b76972b5e16d7249609 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Thu, 29 Jun 2017 16:29:54 +0100 Subject: [PATCH 0700/1813] Updated Ibex and genie_python: Exercise solutions (rest) --- Ibex-and-genie_python:-Exercise-solutions.rest | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Ibex-and-genie_python:-Exercise-solutions.rest b/Ibex-and-genie_python:-Exercise-solutions.rest index deae3e0..c8e2229 100644 --- a/Ibex-and-genie_python:-Exercise-solutions.rest +++ b/Ibex-and-genie_python:-Exercise-solutions.rest @@ -105,16 +105,16 @@ Exercise 4 - *Create a new user script containing a function that runs the new instrument function on two different blocks*:: - def ramp_two_blocks(): - for block, target in [("MY_BLOCK", 10), ("MY_OTHER_BLOCK", -10)]: - inst.ramp(block, target) + def ramp_two_blocks(): + for block, target in [("MY_BLOCK", 10), ("MY_OTHER_BLOCK", -10)]: + inst.ramp(block, target) - *Load and run your new user-script function* - From a scripting perspective, assuming the file is called "ramp_blocks.py", run the following:: - g.load_script("C:\scripts\ramp_blocks.py") - ramp_two_blocks() + g.load_script("C:\scripts\ramp_blocks.py") + ramp_two_blocks() - *Where was the print statement at the top of your instrument script executed?* From c2bc622bca5dc94bf918ff5ec4e90d51c0742cbf Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Thu, 29 Jun 2017 16:30:14 +0100 Subject: [PATCH 0701/1813] Updated Ibex and genie_python: Exercise solutions (rest) --- Ibex-and-genie_python:-Exercise-solutions.rest | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Ibex-and-genie_python:-Exercise-solutions.rest b/Ibex-and-genie_python:-Exercise-solutions.rest index c8e2229..859695c 100644 --- a/Ibex-and-genie_python:-Exercise-solutions.rest +++ b/Ibex-and-genie_python:-Exercise-solutions.rest @@ -116,7 +116,7 @@ Exercise 4 g.load_script("C:\scripts\ramp_blocks.py") ramp_two_blocks() -- *Where was the print statement at the top of your instrument script executed?* +- *Where was the print statement at the top of your instrument script executed?* - You should have seen the current title printed during the initialisation of the scripting window - **PUT AN IMAGE HERE** \ No newline at end of file From 2ccc34b8ca263bd67e90e178f11498a8d706819c Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Thu, 29 Jun 2017 16:39:53 +0100 Subject: [PATCH 0702/1813] Updated Ibex and genie_python: Exercise solutions (rest) --- ...-and-genie_python:-Exercise-solutions.rest | 51 ++++++++++++++++++- 1 file changed, 50 insertions(+), 1 deletion(-) diff --git a/Ibex-and-genie_python:-Exercise-solutions.rest b/Ibex-and-genie_python:-Exercise-solutions.rest index 859695c..5280821 100644 --- a/Ibex-and-genie_python:-Exercise-solutions.rest +++ b/Ibex-and-genie_python:-Exercise-solutions.rest @@ -1,7 +1,7 @@ Exercise 1 ========== -From [[Getting Started|Ibex-and-genie_python:-Getting started]]. +From [[Getting Started|Ibex-and-genie_python:-Getting-started]]. - *Open a scripting window in Ibex* @@ -70,8 +70,57 @@ From [[Common commands|Ibex-and-genie_python:-Common-commands]] g.end() +Exercise 3 +========== + +From [[Scripting|Ibex-and-genie_python:-Scripting]]. + +- *Create two empty scripts:* + + - *An instrument script called ``set_up_instrument.py``* + - *A user script called ``run_my_experiment.py``* + - **PUT IMAGES OF THE TWO FOLDERS HERE** + +- *Update your instrument script, ``set_up_instrument.py``, so that it contains a single function* + + - *The function should be called "set_up_instrument"* + - *It should set the title to "My experiment"* + - *It should set the username to your name*:: + + def set_up_instrument(): + g.change(title="My experiment", user="Adrian") + +- *Update your user script, ``run_my_experiment.py`` which contains a function that does the following* + + - *Begins the run* + - *Prints the current uamps for the current period over 10 seconds at 1 second intervals* + - *Ends the run*:: + + def get_uamps_run(): + g.begin() + # Assume this doesn't change + period = g.get_period() + for i in range(10): + print "Total current after {0}s: {1}.format(i+1, g.get_uamps(period)) + g.end() + +- *Load your user script ``run_my_experiment.py``* + + - Run something like this in the scripting perspective: ``g.load_script("C:\scripts\run_my_experiment.py")`` + +- *Run the instrument method you wrote in exercise 3b* + + - Run something like this in the scripting perspective: ``inst.set_up_instrument()`` + +- *Run the user script method you wrote in exercise 3b* + + - Run something like this in the scripting perspective: ``get_uamps_run()`` + Exercise 4 ========== + +From [[Scripting|Ibex-and-genie_python:-Scripting]]. + - *Create a new instrument script containing a function* - You should create a Python file in "C:\Instrument\Settings\config\[Machine name]\Python\inst" From 5180653e111ca2bf5ab1eb3625553c2b2e0047e9 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Thu, 29 Jun 2017 16:40:58 +0100 Subject: [PATCH 0703/1813] Updated Ibex and genie_python: Exercise solutions (rest) From 86d56f861ef23d34db5f1ba409608a4d5461c7b9 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Fri, 30 Jun 2017 09:42:46 +0100 Subject: [PATCH 0704/1813] Updated Ibex and genie_python: Converting from OpenGENIE (markdown) --- ...genie_python:-Converting-from-OpenGENIE.md | 60 ++++++++++++++++++- 1 file changed, 58 insertions(+), 2 deletions(-) diff --git a/Ibex-and-genie_python:-Converting-from-OpenGENIE.md b/Ibex-and-genie_python:-Converting-from-OpenGENIE.md index 97697f0..4a3c8e0 100644 --- a/Ibex-and-genie_python:-Converting-from-OpenGENIE.md +++ b/Ibex-and-genie_python:-Converting-from-OpenGENIE.md @@ -4,8 +4,64 @@ Open Genie: Compare and contrast Commands -------- -Arguments ---------- +The majority of ``OpenGENIE`` instrument control commands have a very close equivalence in ``genie_python``. + +For example, the ``OpenGENIE`` command:: + + BEGIN + +in ``genie_python`` becomes:: + + g.begin() + +Similarly, the ``OpenGENIE`` command:: + + CHANGE TITLE="New title" + +in ``genie_python`` becomes:: + + g.change_title("New title") + +or alternatively:: + + g.change(title="New title") + +Notably, ``genie_python`` does not cover data analysis. If you wish to do analysis in Python there are several options available: + +- Python: The base Python language is very powerful and can do a lot of common mathematical functions. In particular, refer to the ``math`` module. +- Numpy: This is a numerical analysis module that is very powerful and comes bundled with the distribution of ``genie_python`` +- Mantid: This has extensive coverage of the tools required by neutron and muon experiments. We will not cover it in this course but there is dedicated training available from the Mantid team if you'd like to learn more. + +Passing arguments to commands +============================= + +We have already seen how many ``OpenGENIE`` commands have equivalent function calls in ``genie_python``. The arguments for these commands are also often equivalent, but they have to be passed in a way that follows Python syntax. You should already be somewhat familiar with this syntax. To review briefly: + +- Arguments are passed to functions as a comma separated list within brackets (e.g. ``my_function(arg1, arg2)``) +- Arguments may be named or not (e.g. ``my_function(first_arg=arg1, second_arg=arg2)``) +- Named and un-named arguments can be mixed but the named arguments must appear last (e.g. ``my_function(arg1, second_arg=arg2``) +- Named arguments will be interpreted in the order of the function definition. Un-named arguments can be in any order. So ``my_function(second_arg=arg2, first_arg=arg1)`` would be valid but ``my_function(arg2, first_arg=arg1)`` would not. +- Some arguments may be defaulted in which case they do not need to be included in the argument list. + +As an example, the following three calls are all equivalent:: + + g.begin() + g.begin(False) + g.begin(verbose=False) + +Some commands support special syntax as we have already seen in the [[common commands|Ibex-and-genie_python:-Common-commands]] chapter. For example, ``cset`` can either take the block name as an argument value, or as a named argument. The following two commands are equivalent:: + + g.cset(MY_BLOCK=2) + g.cset("MY_BLOCK", 2) + +This is a special case, and is not necessarily supported by other commands. For more information, consult the [[common commands|Ibex-and-genie_python:-Common-commands]] chapter or the [[genie_python reference manual|http://shadow.nd.rl.ac.uk/genie\_python/sphinx/genie\_python.html]]. + +Worked example +-------------- + +Take the following sequence of ``OpenGENIE`` + + Procedures vs. functions ------------------------ From 74e40c9e0ab1e1d0e9112cc0c500e7f3ac3b7d4a Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Fri, 30 Jun 2017 09:43:27 +0100 Subject: [PATCH 0705/1813] Updated Ibex and genie_python: Converting from OpenGENIE (markdown) --- Ibex-and-genie_python:-Converting-from-OpenGENIE.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/Ibex-and-genie_python:-Converting-from-OpenGENIE.md b/Ibex-and-genie_python:-Converting-from-OpenGENIE.md index 4a3c8e0..e48456d 100644 --- a/Ibex-and-genie_python:-Converting-from-OpenGENIE.md +++ b/Ibex-and-genie_python:-Converting-from-OpenGENIE.md @@ -6,11 +6,11 @@ Commands The majority of ``OpenGENIE`` instrument control commands have a very close equivalence in ``genie_python``. -For example, the ``OpenGENIE`` command:: +For example, the ``OpenGENIE`` command BEGIN -in ``genie_python`` becomes:: +in ``genie_python`` becomes g.begin() @@ -18,11 +18,11 @@ Similarly, the ``OpenGENIE`` command:: CHANGE TITLE="New title" -in ``genie_python`` becomes:: +in ``genie_python`` becomes g.change_title("New title") -or alternatively:: +or alternatively g.change(title="New title") @@ -43,13 +43,13 @@ We have already seen how many ``OpenGENIE`` commands have equivalent function ca - Named arguments will be interpreted in the order of the function definition. Un-named arguments can be in any order. So ``my_function(second_arg=arg2, first_arg=arg1)`` would be valid but ``my_function(arg2, first_arg=arg1)`` would not. - Some arguments may be defaulted in which case they do not need to be included in the argument list. -As an example, the following three calls are all equivalent:: +As an example, the following three calls are all equivalent g.begin() g.begin(False) g.begin(verbose=False) -Some commands support special syntax as we have already seen in the [[common commands|Ibex-and-genie_python:-Common-commands]] chapter. For example, ``cset`` can either take the block name as an argument value, or as a named argument. The following two commands are equivalent:: +Some commands support special syntax as we have already seen in the [[common commands|Ibex-and-genie_python:-Common-commands]] chapter. For example, ``cset`` can either take the block name as an argument value, or as a named argument. The following two commands are equivalent g.cset(MY_BLOCK=2) g.cset("MY_BLOCK", 2) From 2bb91fc64eebc50fad3eadb3aef5fdc5f70ea6ea Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Fri, 30 Jun 2017 09:43:51 +0100 Subject: [PATCH 0706/1813] Updated Ibex and genie_python: Converting from OpenGENIE (markdown => rest) --- ...-and-genie_python:-Converting-from-OpenGENIE.rest | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) rename Ibex-and-genie_python:-Converting-from-OpenGENIE.md => Ibex-and-genie_python:-Converting-from-OpenGENIE.rest (93%) diff --git a/Ibex-and-genie_python:-Converting-from-OpenGENIE.md b/Ibex-and-genie_python:-Converting-from-OpenGENIE.rest similarity index 93% rename from Ibex-and-genie_python:-Converting-from-OpenGENIE.md rename to Ibex-and-genie_python:-Converting-from-OpenGENIE.rest index e48456d..4a3c8e0 100644 --- a/Ibex-and-genie_python:-Converting-from-OpenGENIE.md +++ b/Ibex-and-genie_python:-Converting-from-OpenGENIE.rest @@ -6,11 +6,11 @@ Commands The majority of ``OpenGENIE`` instrument control commands have a very close equivalence in ``genie_python``. -For example, the ``OpenGENIE`` command +For example, the ``OpenGENIE`` command:: BEGIN -in ``genie_python`` becomes +in ``genie_python`` becomes:: g.begin() @@ -18,11 +18,11 @@ Similarly, the ``OpenGENIE`` command:: CHANGE TITLE="New title" -in ``genie_python`` becomes +in ``genie_python`` becomes:: g.change_title("New title") -or alternatively +or alternatively:: g.change(title="New title") @@ -43,13 +43,13 @@ We have already seen how many ``OpenGENIE`` commands have equivalent function ca - Named arguments will be interpreted in the order of the function definition. Un-named arguments can be in any order. So ``my_function(second_arg=arg2, first_arg=arg1)`` would be valid but ``my_function(arg2, first_arg=arg1)`` would not. - Some arguments may be defaulted in which case they do not need to be included in the argument list. -As an example, the following three calls are all equivalent +As an example, the following three calls are all equivalent:: g.begin() g.begin(False) g.begin(verbose=False) -Some commands support special syntax as we have already seen in the [[common commands|Ibex-and-genie_python:-Common-commands]] chapter. For example, ``cset`` can either take the block name as an argument value, or as a named argument. The following two commands are equivalent +Some commands support special syntax as we have already seen in the [[common commands|Ibex-and-genie_python:-Common-commands]] chapter. For example, ``cset`` can either take the block name as an argument value, or as a named argument. The following two commands are equivalent:: g.cset(MY_BLOCK=2) g.cset("MY_BLOCK", 2) From 655d80b1400b51825418ca7e2b1afa8d81e58071 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Fri, 30 Jun 2017 09:47:10 +0100 Subject: [PATCH 0707/1813] Updated Ibex and genie_python: Converting from OpenGENIE (rest) --- ...-and-genie_python:-Converting-from-OpenGENIE.rest | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/Ibex-and-genie_python:-Converting-from-OpenGENIE.rest b/Ibex-and-genie_python:-Converting-from-OpenGENIE.rest index 4a3c8e0..3141153 100644 --- a/Ibex-and-genie_python:-Converting-from-OpenGENIE.rest +++ b/Ibex-and-genie_python:-Converting-from-OpenGENIE.rest @@ -37,13 +37,13 @@ Passing arguments to commands We have already seen how many ``OpenGENIE`` commands have equivalent function calls in ``genie_python``. The arguments for these commands are also often equivalent, but they have to be passed in a way that follows Python syntax. You should already be somewhat familiar with this syntax. To review briefly: -- Arguments are passed to functions as a comma separated list within brackets (e.g. ``my_function(arg1, arg2)``) -- Arguments may be named or not (e.g. ``my_function(first_arg=arg1, second_arg=arg2)``) -- Named and un-named arguments can be mixed but the named arguments must appear last (e.g. ``my_function(arg1, second_arg=arg2``) -- Named arguments will be interpreted in the order of the function definition. Un-named arguments can be in any order. So ``my_function(second_arg=arg2, first_arg=arg1)`` would be valid but ``my_function(arg2, first_arg=arg1)`` would not. -- Some arguments may be defaulted in which case they do not need to be included in the argument list. +- Arguments are passed to functions as a comma separated list within brackets. For example ``g.add_spectrum(1, 2)`` +- Arguments may be named or not. For example ``g.add_spectrum(spectrum=1, period=2)`` +- Named and un-named arguments can be mixed but the named arguments must appear last. For example ``g.add_spectrum(1, period=2)`` +- Named arguments will be interpreted in the order of the function definition. Un-named arguments can be in any order. So ``g.add_spectrum(period=2, spectrum=1)`` would be valid but ``g.add_spectrum(2, spectrum=1)`` would not. +- Some arguments may be defaulted in which case they do not need to be included in the argument list. For example ``g.add_spectrum(1)`` is equivalent to ``g.add_spectrum(1, 1)``. -As an example, the following three calls are all equivalent:: +As another example, the following three calls are all equivalent:: g.begin() g.begin(False) From 6fe10a55faba8f484af4bca1a1020be2646c541d Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Fri, 30 Jun 2017 09:47:49 +0100 Subject: [PATCH 0708/1813] Updated Ibex and genie_python: Converting from OpenGENIE (rest) --- ...nie_python:-Converting-from-OpenGENIE.rest | 24 ------------------- 1 file changed, 24 deletions(-) diff --git a/Ibex-and-genie_python:-Converting-from-OpenGENIE.rest b/Ibex-and-genie_python:-Converting-from-OpenGENIE.rest index 3141153..485f961 100644 --- a/Ibex-and-genie_python:-Converting-from-OpenGENIE.rest +++ b/Ibex-and-genie_python:-Converting-from-OpenGENIE.rest @@ -32,30 +32,6 @@ Notably, ``genie_python`` does not cover data analysis. If you wish to do analys - Numpy: This is a numerical analysis module that is very powerful and comes bundled with the distribution of ``genie_python`` - Mantid: This has extensive coverage of the tools required by neutron and muon experiments. We will not cover it in this course but there is dedicated training available from the Mantid team if you'd like to learn more. -Passing arguments to commands -============================= - -We have already seen how many ``OpenGENIE`` commands have equivalent function calls in ``genie_python``. The arguments for these commands are also often equivalent, but they have to be passed in a way that follows Python syntax. You should already be somewhat familiar with this syntax. To review briefly: - -- Arguments are passed to functions as a comma separated list within brackets. For example ``g.add_spectrum(1, 2)`` -- Arguments may be named or not. For example ``g.add_spectrum(spectrum=1, period=2)`` -- Named and un-named arguments can be mixed but the named arguments must appear last. For example ``g.add_spectrum(1, period=2)`` -- Named arguments will be interpreted in the order of the function definition. Un-named arguments can be in any order. So ``g.add_spectrum(period=2, spectrum=1)`` would be valid but ``g.add_spectrum(2, spectrum=1)`` would not. -- Some arguments may be defaulted in which case they do not need to be included in the argument list. For example ``g.add_spectrum(1)`` is equivalent to ``g.add_spectrum(1, 1)``. - -As another example, the following three calls are all equivalent:: - - g.begin() - g.begin(False) - g.begin(verbose=False) - -Some commands support special syntax as we have already seen in the [[common commands|Ibex-and-genie_python:-Common-commands]] chapter. For example, ``cset`` can either take the block name as an argument value, or as a named argument. The following two commands are equivalent:: - - g.cset(MY_BLOCK=2) - g.cset("MY_BLOCK", 2) - -This is a special case, and is not necessarily supported by other commands. For more information, consult the [[common commands|Ibex-and-genie_python:-Common-commands]] chapter or the [[genie_python reference manual|http://shadow.nd.rl.ac.uk/genie\_python/sphinx/genie\_python.html]]. - Worked example -------------- From cf408b440f24129ede30460f3ec7f6226b70d1c8 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Fri, 30 Jun 2017 10:23:15 +0100 Subject: [PATCH 0709/1813] Updated Ibex and genie_python: Common commands (rest) --- Ibex-and-genie_python:-Common-commands.rest | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/Ibex-and-genie_python:-Common-commands.rest b/Ibex-and-genie_python:-Common-commands.rest index b987594..d551c7a 100644 --- a/Ibex-and-genie_python:-Common-commands.rest +++ b/Ibex-and-genie_python:-Common-commands.rest @@ -9,6 +9,24 @@ You should have noticed immediately after you typed ``g.`` that an autocomplete The window lists the available commands, and the arguments they take in brackets. You also notice that a description of the highlighted functions and its arguments is also given. The list will be refined as you type more characters. + +Passing arguments to commands +============================= + +Arguments are passed to functions using standard Python syntax. You should already be somewhat familiar with this but here is a quick recap: + +- Arguments are passed to functions as a comma separated list within brackets. For example ``g.add_spectrum(1, 2)`` +- Arguments may be named or not. For example ``g.add_spectrum(spectrum=1, period=2)`` +- Named and un-named arguments can be mixed but the named arguments must appear last. For example ``g.add_spectrum(1, period=2)`` +- Named arguments will be interpreted in the order of the function definition. Un-named arguments can be in any order. So ``g.add_spectrum(period=2, spectrum=1)`` would be valid but ``g.add_spectrum(2, spectrum=1)`` would not. +- Some arguments may be defaulted in which case they do not need to be included in the argument list. For example ``g.add_spectrum(1)`` is equivalent to ``g.add_spectrum(1, 1)``. + +As another example, the following three calls are all equivalent:: + + g.begin() + g.begin(False) + g.begin(verbose=False) + Run control ================== From cd78de1613552606d5762e93e11390da3ec0f485 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Fri, 30 Jun 2017 10:25:48 +0100 Subject: [PATCH 0710/1813] Updated Scripting (rest) From bc48dbec31fc45252edd10bbb19aa39f1c547e38 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Fri, 30 Jun 2017 10:26:07 +0100 Subject: [PATCH 0711/1813] Updated Ibex and genie_python: Introduction (rest) --- Ibex-and-genie_python:-Introduction.rest | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Ibex-and-genie_python:-Introduction.rest b/Ibex-and-genie_python:-Introduction.rest index 3942230..a9b6624 100644 --- a/Ibex-and-genie_python:-Introduction.rest +++ b/Ibex-and-genie_python:-Introduction.rest @@ -11,6 +11,12 @@ Welcome to this introductory course on ``genie_python``, a Python module that en At each stage the course aims to assist learning with exercises and worked examples. We will assume a basic working knowledge of Python. +Notably, ``genie_python`` does not cover data analysis. If you wish to do analysis in Python there are several options available: + +- Python: The base Python language is very powerful and can do a lot of common mathematical functions. In particular, refer to the ``math`` module. +- Numpy: This is a numerical analysis module that is very powerful and comes bundled with the distribution of ``genie_python`` +- Mantid: This has extensive coverage of the tools required by neutron and muon experiments. We will not cover it in this course but there is dedicated training available from the Mantid team if you'd like to learn more. + If you're looking for a specific section, please refer to the course contents below. Otherwise, let's [[get started|Ibex-and-genie_python:-Getting-started]]! Contents From 5c33503e41dcdfa0906c38437abee1817137cb24 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Fri, 30 Jun 2017 10:27:42 +0100 Subject: [PATCH 0712/1813] Updated Ibex and genie_python: Introduction (rest) --- Ibex-and-genie_python:-Introduction.rest | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/Ibex-and-genie_python:-Introduction.rest b/Ibex-and-genie_python:-Introduction.rest index a9b6624..630a38c 100644 --- a/Ibex-and-genie_python:-Introduction.rest +++ b/Ibex-and-genie_python:-Introduction.rest @@ -11,11 +11,7 @@ Welcome to this introductory course on ``genie_python``, a Python module that en At each stage the course aims to assist learning with exercises and worked examples. We will assume a basic working knowledge of Python. -Notably, ``genie_python`` does not cover data analysis. If you wish to do analysis in Python there are several options available: - -- Python: The base Python language is very powerful and can do a lot of common mathematical functions. In particular, refer to the ``math`` module. -- Numpy: This is a numerical analysis module that is very powerful and comes bundled with the distribution of ``genie_python`` -- Mantid: This has extensive coverage of the tools required by neutron and muon experiments. We will not cover it in this course but there is dedicated training available from the Mantid team if you'd like to learn more. +Notably, ``genie_python`` does not cover data analysis. If you wish to do analysis that can't be achieved with basic Python, we recommend the [[Mantid with Python training course|https://www.mantidproject.org/Python_In_Mantid]]. If you're looking for a specific section, please refer to the course contents below. Otherwise, let's [[get started|Ibex-and-genie_python:-Getting-started]]! From 5cf12f634ce47ef215d514d6703fe1b06911c6be Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Fri, 30 Jun 2017 10:28:39 +0100 Subject: [PATCH 0713/1813] Updated Ibex and genie_python: Introduction (rest) --- Ibex-and-genie_python:-Introduction.rest | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Ibex-and-genie_python:-Introduction.rest b/Ibex-and-genie_python:-Introduction.rest index 630a38c..9488d88 100644 --- a/Ibex-and-genie_python:-Introduction.rest +++ b/Ibex-and-genie_python:-Introduction.rest @@ -9,7 +9,7 @@ Welcome to this introductory course on ``genie_python``, a Python module that en - Create specialised instrument and user scripts scripts - Convert ``OpenGENIE`` scripts to ``genie_python`` -At each stage the course aims to assist learning with exercises and worked examples. We will assume a basic working knowledge of Python. +At each stage the course aims to assist learning with exercises and worked examples. We will assume a basic working knowledge of Python. If you've never programmed in Python before, we recommend the [[Introduction to Python|https://www.mantidproject.org/Introduction_To_Python]] from the Mantid project. Notably, ``genie_python`` does not cover data analysis. If you wish to do analysis that can't be achieved with basic Python, we recommend the [[Mantid with Python training course|https://www.mantidproject.org/Python_In_Mantid]]. From 21e0a32658fe4c402ee42c0ad8814a8c93438c24 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Fri, 30 Jun 2017 10:47:47 +0100 Subject: [PATCH 0714/1813] Updated Ibex and genie_python: Converting from OpenGENIE (rest) --- ...-and-genie_python:-Converting-from-OpenGENIE.rest | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/Ibex-and-genie_python:-Converting-from-OpenGENIE.rest b/Ibex-and-genie_python:-Converting-from-OpenGENIE.rest index 485f961..dbc5de7 100644 --- a/Ibex-and-genie_python:-Converting-from-OpenGENIE.rest +++ b/Ibex-and-genie_python:-Converting-from-OpenGENIE.rest @@ -26,11 +26,15 @@ or alternatively:: g.change(title="New title") -Notably, ``genie_python`` does not cover data analysis. If you wish to do analysis in Python there are several options available: +Similarly, most arguments will be very similar between ``OpenGENIE`` and ``genie_python``. For example, the following ``OpenGENIE`` command:: -- Python: The base Python language is very powerful and can do a lot of common mathematical functions. In particular, refer to the ``math`` module. -- Numpy: This is a numerical analysis module that is very powerful and comes bundled with the distribution of ``genie_python`` -- Mantid: This has extensive coverage of the tools required by neutron and muon experiments. We will not cover it in this course but there is dedicated training available from the Mantid team if you'd like to learn more. + CSET/CONTROL TEMP1=5 LOWLIMIT=1 HIGHLIMIT=10 + +becomes the following in ``genie_python``:: + + g.cset(TEMP1=5, lowlimit=1, highlimit=10) + +**NOTE** Python is case sensitive and the arguments, apart from the block name, are in lower case Worked example -------------- From 2a72ac4ff40f66dec0912d5408baad9d6c850ece Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Fri, 30 Jun 2017 10:48:16 +0100 Subject: [PATCH 0715/1813] Updated Ibex and genie_python: Converting from OpenGENIE (rest) --- Ibex-and-genie_python:-Converting-from-OpenGENIE.rest | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Ibex-and-genie_python:-Converting-from-OpenGENIE.rest b/Ibex-and-genie_python:-Converting-from-OpenGENIE.rest index dbc5de7..ed8b705 100644 --- a/Ibex-and-genie_python:-Converting-from-OpenGENIE.rest +++ b/Ibex-and-genie_python:-Converting-from-OpenGENIE.rest @@ -32,7 +32,7 @@ Similarly, most arguments will be very similar between ``OpenGENIE`` and ``genie becomes the following in ``genie_python``:: - g.cset(TEMP1=5, lowlimit=1, highlimit=10) + g.cset(TEMP1=5, runcontrol=True, lowlimit=1, highlimit=10) **NOTE** Python is case sensitive and the arguments, apart from the block name, are in lower case From 98901df18496ebcbb4bfa90e41b32d86ca69dcc9 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Fri, 30 Jun 2017 11:34:05 +0100 Subject: [PATCH 0716/1813] Updated Ibex and genie_python: Converting from OpenGENIE (rest) --- ...nie_python:-Converting-from-OpenGENIE.rest | 158 +++++++++++++++++- 1 file changed, 155 insertions(+), 3 deletions(-) diff --git a/Ibex-and-genie_python:-Converting-from-OpenGENIE.rest b/Ibex-and-genie_python:-Converting-from-OpenGENIE.rest index ed8b705..df84399 100644 --- a/Ibex-and-genie_python:-Converting-from-OpenGENIE.rest +++ b/Ibex-and-genie_python:-Converting-from-OpenGENIE.rest @@ -1,6 +1,34 @@ Open Genie: Compare and contrast ================================ +Procedures vs. functions +------------------------ + +in ``OpenGENIE``, procedures are defined by the keyword ``PROCEDURE`` and end with the ``ENDPROCEDURE`` statement. In Python, we instead define functions using the ``def`` keyword. For example:: + + PROCEDURE my_function + ... + ENDPROCEDURE + +becomes:: + + def my_function(): + ... + +Note that, using Python syntax, we don't need a statement to show where the function ends, the indentation takes care of that for us. + +We can also pass arguments into procedures in ``OpenGENIE`` as below:: + + PROCEDURE my_function + PARAMETERS x = Integer y = Real z = String + ... + ENDPROCEDURE + +We can do the same thing in ``genie_python``, but notably we don't need to define the type of the parameters. Python will only complain at run time if you call an unsupported operation on the input arguments. In ``genie_python``, the code above becomes:: + + def my_function(x, y, z): + ... + Commands -------- @@ -39,12 +67,136 @@ becomes the following in ``genie_python``:: Worked example -------------- -Take the following sequence of ``OpenGENIE`` +Take the following ``OpenGENIE`` procedure:: + + PROCEDURE my_function + + GLOBAL temp high low pow count + + temp = 20 + low = 1 + high = 50 + + CSET/CONTROL TEMP1=temp LOWLIMIT=low HIGHLIMIT=high + CSET/CONTROL TEMP2=temp LOWLIMIT=low HIGHLIMIT=high + + CHANGE TITLE= "Running at temperature "+As_string(temp) + BEGIN + WAITFOR UAMPS=0.2 + ABORT + PRINTN "waiting 10 minutes" + WAITFOR SECONDS=60*10 + BEGIN + WAITFOR SECONDS=10 + PRINTN "Waiting for "+As_string(count)+"uAh" + WAITFOR UAMPS=count + END + + ENDPROCEDURE +Let's convert it to ``genie_python``. First of all we start off by making the ``PROCEDURE`` into a Python function:: + + def my_function(): + +We haven't given any arguments, because the procedure has no parameters. + +The variable definitions remain the same, except we don't need the ``GLOBAL`` line to define our variables. + +On inspection, we might consider that this function will be reused with different temperatures and limits, in which case we could change:: + + def my_function(): + temp = 20 + low = 1 + high = 50 + +to:: + + def my_function(temp, low, high): + +and I can always create a function to call specific parameters if I need to: + + def my_specific_function(): + my_function(temp=20, low=1, high=50) + +Further, I can see that my ``WAITFOR`` later in the function waits for 50 microamps. Let's assume we almost always want to wait for 50 microamps but we'd like the possibility to override it sometimes. In that case, we can make it a 4th parameter with a default value, like so:: + + def my_function(temp, low, high, count=50): + +Let's start looking at the content of the PROCEDURE:: + + CSET/CONTROL TEMP1=temp LOWLIMIT=low HIGHLIMIT=high + +In ``genie_python``, this becomes: + + g.cset(TEMP1=temp, lowlimit=low, highlight=high, runcontrol=True) + +The same goes for ``TEMP2``, but that gives us two commands that do exactly the same thing. That's not generally a good idea because it's prone to typos and changes to one line might not be applied to the other. It would be much better to do the following:: + + for block in [TEMP1, TEMP2]: + g.cset(block, temp, lowlimit=low, highlimit=high, runcontrol=True) + +Notably we've had to use the alternate ``cset`` argument syntax in this case. + +The next block of commands is:: + + CHANGE TITLE= "Running at temperature "+As_string(temp) + BEGIN + WAITFOR UAMPS=0.2 + ABORT + PRINTN "waiting 10 minutes" + WAITFOR SECONDS=60*10 + BEGIN + WAITFOR SECONDS=10 + PRINTN "Waiting for "+As_string(count)+"uAh" + WAITFOR UAMPS=count + END + +These translate very directly into ``genie_python``:: + + g.change_title("Running at temperature {0}".format(temp)) + g.begin() + g.waitfor_uamps(0.2) + g.abort() + minutes_to_wait = 10 + print "Waiting {0} minutes".format(minutes_to_wait) + g.waitfor_time(minutes=minutes_to_wait) + g.begin() + g.waitfor_time(seconds=10) + print "Waiting for {0}uAh".format(count) + g.waitfor_uamps(count) + g.end() + +We've changed a couple of things: + +- Rather than use the value ``10`` for the number of minutes to wait, we've set it as a variable. That means if we change the value, we only need to change it in one place. +- We've used the ``minutes`` argument in ``waitfor_time`` rather than having to apply the conversion factor between minutes and seconds ourselves. +- We've used the syntax ``"...".format(arg1, arg2)`` to build our output strings. There are lots of ways to build strings in Python, you can just use ``"..." + str(arg1) + "..." + str(arg2) + "..."`` but we like this way because it makes it easier to read and you don't have to remember to use ``str(...)`` to convert the types + +As mentioned, the final ``ENDPROCEDURE`` command doesn't need converting. Our final script is therefore:: + + def my_function(temp, low, high, count=50): + for block in [TEMP1, TEMP2]: + g.cset(block, temp, lowlimit=low, highlimit=high, runcontrol=True) + + g.change_title("Running at temperature {0}".format(temp)) + g.begin() + g.waitfor_uamps(0.2) + g.abort() + + minutes_to_wait = 10 + print "Waiting {0} minutes".format(minutes_to_wait) + g.waitfor_time(minutes=minutes_to_wait) + + g.begin() + g.waitfor_time(seconds=10) + print "Waiting for {0}uAh".format(count) + g.waitfor_uamps(count) + g.end() + + def my_specific_function(): + my_function(temp=20, low=1, high=50) -Procedures vs. functions ------------------------- Loops ----- From d517a6f1303fcf885ca18e6ab17141077877d506 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Fri, 30 Jun 2017 11:34:30 +0100 Subject: [PATCH 0717/1813] Updated Ibex and genie_python: Converting from OpenGENIE (rest) --- Ibex-and-genie_python:-Converting-from-OpenGENIE.rest | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Ibex-and-genie_python:-Converting-from-OpenGENIE.rest b/Ibex-and-genie_python:-Converting-from-OpenGENIE.rest index df84399..246d4fd 100644 --- a/Ibex-and-genie_python:-Converting-from-OpenGENIE.rest +++ b/Ibex-and-genie_python:-Converting-from-OpenGENIE.rest @@ -113,7 +113,7 @@ to:: def my_function(temp, low, high): -and I can always create a function to call specific parameters if I need to: +and I can always create a function to call specific parameters if I need to:: def my_specific_function(): my_function(temp=20, low=1, high=50) From 36a4a4387b2190d2341917c43253a9e43bebf7b0 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Fri, 30 Jun 2017 11:34:57 +0100 Subject: [PATCH 0718/1813] Updated Ibex and genie_python: Converting from OpenGENIE (rest) --- Ibex-and-genie_python:-Converting-from-OpenGENIE.rest | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Ibex-and-genie_python:-Converting-from-OpenGENIE.rest b/Ibex-and-genie_python:-Converting-from-OpenGENIE.rest index 246d4fd..98f5013 100644 --- a/Ibex-and-genie_python:-Converting-from-OpenGENIE.rest +++ b/Ibex-and-genie_python:-Converting-from-OpenGENIE.rest @@ -126,7 +126,7 @@ Let's start looking at the content of the PROCEDURE:: CSET/CONTROL TEMP1=temp LOWLIMIT=low HIGHLIMIT=high -In ``genie_python``, this becomes: +In ``genie_python``, this becomes:: g.cset(TEMP1=temp, lowlimit=low, highlight=high, runcontrol=True) From 0914905e02ee22c4f1bc88af04387f4ca11cf03c Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Fri, 30 Jun 2017 11:39:43 +0100 Subject: [PATCH 0719/1813] Updated Ibex and genie_python: Converting from OpenGENIE (rest) --- ...nd-genie_python:-Converting-from-OpenGENIE.rest | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/Ibex-and-genie_python:-Converting-from-OpenGENIE.rest b/Ibex-and-genie_python:-Converting-from-OpenGENIE.rest index 98f5013..3800172 100644 --- a/Ibex-and-genie_python:-Converting-from-OpenGENIE.rest +++ b/Ibex-and-genie_python:-Converting-from-OpenGENIE.rest @@ -196,11 +196,21 @@ As mentioned, the final ``ENDPROCEDURE`` command doesn't need converting. Our fi def my_specific_function(): my_function(temp=20, low=1, high=50) - - Loops ----- +In ``OpenGENIE`` a loop is defined using:: + + LOOP I FROM start TO end + ... + ENDLOOP + +You should already be familiar with defining loops in Python but, as a reminder, the code above would translate into Python as:: + + for i in range(start, end+1): + ... + + ------------------------------------------------------------------------------- **Previous**: [[Scripting|Ibex-and-genie_python:-Scripting]] From 7a3d51a4273f286c7d3c4a9f780442a846fc56e5 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Fri, 30 Jun 2017 11:54:22 +0100 Subject: [PATCH 0720/1813] Updated Ibex and genie_python: Converting from OpenGENIE (rest) --- ...nie_python:-Converting-from-OpenGENIE.rest | 94 ++++++++++++++++--- 1 file changed, 80 insertions(+), 14 deletions(-) diff --git a/Ibex-and-genie_python:-Converting-from-OpenGENIE.rest b/Ibex-and-genie_python:-Converting-from-OpenGENIE.rest index 3800172..4317d01 100644 --- a/Ibex-and-genie_python:-Converting-from-OpenGENIE.rest +++ b/Ibex-and-genie_python:-Converting-from-OpenGENIE.rest @@ -29,6 +29,40 @@ We can do the same thing in ``genie_python``, but notably we don't need to defin def my_function(x, y, z): ... +Loops +----- + +In ``OpenGENIE`` a loop is defined using:: + + LOOP I FROM start TO end + ... + ENDLOOP + +You should already be familiar with defining loops in Python but, as a reminder, the code above would translate into Python as:: + + for i in range(start, end+1): + ... + +Conditionals +------------ + +As with loops, you should already be familiar with conditionals in Python. In ``OpenGENIE`` these look like:: + + IF [CONDITION] + ... + ELSE + ... + ENDIF + +In Python this is written as:: + + if [CONDITION]: + ... + else: + ... + +No ``ENDIF`` is needed because the indentation makes it implicit. + Commands -------- @@ -196,21 +230,53 @@ As mentioned, the final ``ENDPROCEDURE`` command doesn't need converting. Our fi def my_specific_function(): my_function(temp=20, low=1, high=50) -Loops ------ - -In ``OpenGENIE`` a loop is defined using:: - - LOOP I FROM start TO end - ... - ENDLOOP - -You should already be familiar with defining loops in Python but, as a reminder, the code above would translate into Python as:: - - for i in range(start, end+1): - ... - +Exercise 5 +========== + +- Translate the following ``OpenGENIE`` script into ``genie_python``:: + + PROCEDURE Scan + LOCAL i setpoint max min start step_size title nframes nimages multip + + max = 200.0 + min = 100.0 + + setpoint = 0.0 + start = -100.0 + setpoint = start + nframes = 10000 + nimages = 100 + + step_size = 20.0 + + LOOP i FROM 1 TO nimages + + setpoint = setpoint + step_size + multip = As_Integer(setpoint/360) + setpoint = setpoint - 360*multip + PRINTN "New angle is: " + as_string(setpoint) + + IF (setpoint>=min) OR (setpoint<=max) + + tempTitle="Image "+as_string(i)+", "+as_string(setpoint)+" degrees" + CHANGE TITLE=tempTitle + + cset POSITION=setpoint + waitformove + PRINTN "Move Compete. Counting for frames =" + As_String(nframes) + BEGIN + WAITFOR frames=nframes + END + PRINTN setpoint + ELSE + PRINTIN "Would be out of bounds. NOT in interval " +As_String(min)+ "<=" As_String(setpoint)+ " >= " +As_String(max) + ENDIF + + ENDLOOP + ENDPROCEDURE +- State any simplifications you've made + ------------------------------------------------------------------------------- **Previous**: [[Scripting|Ibex-and-genie_python:-Scripting]] From e1bf9e98bbd4cc8e0d64c4f0838370fd072d0633 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Fri, 30 Jun 2017 11:54:35 +0100 Subject: [PATCH 0721/1813] Updated Ibex and genie_python: Scripting (markdown) From ce4d775f7cb20f0abf644bcf603dd65b5a159c5a Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Fri, 30 Jun 2017 11:55:31 +0100 Subject: [PATCH 0722/1813] Updated Ibex and genie_python: Converting from OpenGENIE (rest) --- ...nie_python:-Converting-from-OpenGENIE.rest | 89 ++++++++++--------- 1 file changed, 46 insertions(+), 43 deletions(-) diff --git a/Ibex-and-genie_python:-Converting-from-OpenGENIE.rest b/Ibex-and-genie_python:-Converting-from-OpenGENIE.rest index 4317d01..5b1f55a 100644 --- a/Ibex-and-genie_python:-Converting-from-OpenGENIE.rest +++ b/Ibex-and-genie_python:-Converting-from-OpenGENIE.rest @@ -233,49 +233,52 @@ As mentioned, the final ``ENDPROCEDURE`` command doesn't need converting. Our fi Exercise 5 ========== -- Translate the following ``OpenGENIE`` script into ``genie_python``:: - - PROCEDURE Scan - LOCAL i setpoint max min start step_size title nframes nimages multip - - max = 200.0 - min = 100.0 - - setpoint = 0.0 - start = -100.0 - setpoint = start - nframes = 10000 - nimages = 100 - - step_size = 20.0 - - LOOP i FROM 1 TO nimages - - setpoint = setpoint + step_size - multip = As_Integer(setpoint/360) - setpoint = setpoint - 360*multip - PRINTN "New angle is: " + as_string(setpoint) - - IF (setpoint>=min) OR (setpoint<=max) - - tempTitle="Image "+as_string(i)+", "+as_string(setpoint)+" degrees" - CHANGE TITLE=tempTitle - - cset POSITION=setpoint - waitformove - PRINTN "Move Compete. Counting for frames =" + As_String(nframes) - BEGIN - WAITFOR frames=nframes - END - PRINTN setpoint - ELSE - PRINTIN "Would be out of bounds. NOT in interval " +As_String(min)+ "<=" As_String(setpoint)+ " >= " +As_String(max) - ENDIF - - ENDLOOP - ENDPROCEDURE - -- State any simplifications you've made +- Translate the following ``OpenGENIE`` script into ``genie_python``:: + + PROCEDURE Scan + LOCAL i setpoint max min start step_size title nframes nimages multip + + max = 200.0 + min = 100.0 + + setpoint = 0.0 + start = -100.0 + setpoint = start + nframes = 10000 + nimages = 100 + + step_size = 20.0 + + LOOP i FROM 1 TO nimages + + setpoint = setpoint + step_size + multip = As_Integer(setpoint/360) + setpoint = setpoint - 360*multip + PRINTN "New angle is: " + as_string(setpoint) + + IF (setpoint>=min) OR (setpoint<=max) + + tempTitle="Image "+as_string(i)+", "+as_string(setpoint)+" degrees" + CHANGE TITLE=tempTitle + + cset POSITION=setpoint + waitformove + PRINTN "Move Compete. Counting for frames =" + As_String(nframes) + BEGIN + WAITFOR frames=nframes + END + PRINTN setpoint + ELSE + PRINTIN "Would be out of bounds. NOT in interval " +As_String(min)+ "<=" As_String(setpoint)+ " >= " +As_String(max) + ENDIF + + ENDLOOP + ENDPROCEDURE + +- State any simplifications you've made + + +[[Solution|Ibex-and-genie_python:-Exercise-solutions]] ------------------------------------------------------------------------------- From 58b6510c1375c469669c3435f9e6bd8af8d4b79d Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Fri, 30 Jun 2017 11:55:49 +0100 Subject: [PATCH 0723/1813] Updated Ibex and genie_python: Converting from OpenGENIE (rest) --- Ibex-and-genie_python:-Converting-from-OpenGENIE.rest | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Ibex-and-genie_python:-Converting-from-OpenGENIE.rest b/Ibex-and-genie_python:-Converting-from-OpenGENIE.rest index 5b1f55a..e80123f 100644 --- a/Ibex-and-genie_python:-Converting-from-OpenGENIE.rest +++ b/Ibex-and-genie_python:-Converting-from-OpenGENIE.rest @@ -233,7 +233,7 @@ As mentioned, the final ``ENDPROCEDURE`` command doesn't need converting. Our fi Exercise 5 ========== -- Translate the following ``OpenGENIE`` script into ``genie_python``:: +- Translate the following ``OpenGENIE`` script into ``genie_python``:: PROCEDURE Scan LOCAL i setpoint max min start step_size title nframes nimages multip From 0eca2f3df7e1195bf3ef40871f803fab5909bb2e Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Fri, 30 Jun 2017 11:56:24 +0100 Subject: [PATCH 0724/1813] Updated Ibex and genie_python: Converting from OpenGENIE (rest) --- Ibex-and-genie_python:-Converting-from-OpenGENIE.rest | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Ibex-and-genie_python:-Converting-from-OpenGENIE.rest b/Ibex-and-genie_python:-Converting-from-OpenGENIE.rest index e80123f..1b67fe5 100644 --- a/Ibex-and-genie_python:-Converting-from-OpenGENIE.rest +++ b/Ibex-and-genie_python:-Converting-from-OpenGENIE.rest @@ -269,7 +269,7 @@ Exercise 5 END PRINTN setpoint ELSE - PRINTIN "Would be out of bounds. NOT in interval " +As_String(min)+ "<=" As_String(setpoint)+ " >= " +As_String(max) + PRINTIN "Not in interval " +As_String(min)+ "<=" As_String(setpoint)+ " >= " +As_String(max) ENDIF ENDLOOP From 2d03ed6215dd26a3018e0e03da2621073dc72b2b Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Fri, 30 Jun 2017 12:09:51 +0100 Subject: [PATCH 0725/1813] Updated Ibex and genie_python: Exercise solutions (rest) --- ...-and-genie_python:-Exercise-solutions.rest | 78 ++++++++++++++++++- 1 file changed, 77 insertions(+), 1 deletion(-) diff --git a/Ibex-and-genie_python:-Exercise-solutions.rest b/Ibex-and-genie_python:-Exercise-solutions.rest index 5280821..20fe880 100644 --- a/Ibex-and-genie_python:-Exercise-solutions.rest +++ b/Ibex-and-genie_python:-Exercise-solutions.rest @@ -168,4 +168,80 @@ From [[Scripting|Ibex-and-genie_python:-Scripting]]. - *Where was the print statement at the top of your instrument script executed?* - You should have seen the current title printed during the initialisation of the scripting window - - **PUT AN IMAGE HERE** \ No newline at end of file + - **PUT AN IMAGE HERE** + +Exercise 5 +========== + +From [[Scripting|Ibex-and-genie_python:-Converting-from-Open-GENIE]]. + +- *Translate the following ``OpenGENIE`` script into ``genie_python``::* + + PROCEDURE Scan + LOCAL i setpoint max min start step_size title nframes nimages multip + + max = 200.0 + min = 100.0 + + setpoint = 0.0 + start = -100.0 + setpoint = start + nframes = 10000 + nimages = 100 + + step_size = 20.0 + + LOOP i FROM 1 TO nimages + + setpoint = setpoint + step_size + multip = As_Integer(setpoint/360) + setpoint = setpoint - 360*multip + PRINTN "New angle is: " + as_string(setpoint) + + IF (setpoint>=min) OR (setpoint<=max) + + tempTitle="Image "+as_string(i)+", "+as_string(setpoint)+" degrees" + CHANGE TITLE=tempTitle + + cset POSITION=setpoint + waitformove + PRINTN "Move complete. Counting for " + As_String(nframes) + " frames" + BEGIN + WAITFOR frames=nframes + END + ELSE + PRINTIN "Not in interval " +As_String(min)+ "<=" As_String(setpoint)+ " >= " +As_String(max) + ENDIF + + ENDLOOP + ENDPROCEDURE + +- In **genie_python** this could be written as:: + + def scan(start=-100, min=100, max=200, step_size=20, nframes=10000, nimages=100): + for i in range(1, nimages): + setpoint = (start + i*step_size) % 360 + print "New angle is: {0}".format(setpoint) + + if min <= setpoint <= max: + g.change_title("Image {0}: {1} degrees".format(i, setpoint) + g.cset(POSTITION=setpoint) + g.waitformove() + + print "Move complete. Counting for {0} frames".format(nframes) + g.begin() + g.waitfor(frames=nframes) + g.end() + else: + print "Not in interval {1}<={0}<={2}".format(setpoint, min, max)" + +- *State any simplifications you've made* + + - We've put the key variables as defaulted input arguments. This allows for maximal flexibility. In reality, which variables we put as arguments and which we default will depend on context. It's not recommended to put everything as an argument and always provide defaults + - We've taken advantage of several pieces of Python syntax to simplify the logic + + - ``"...".format(*args)`` for constructing strings + - Defining a range as a single condition ``a <= b <= c`` + - Taking the modulo of a number using ``%`` to avoid extra calculations + - Removing the unused line ``setpoint = 0.0`` + - Several commands are unnecessary in Python, namely ``LOCAL``, ``ENDLOOP``, ``ENDIF``, ``ENDPROCEDURE`` \ No newline at end of file From 216611038634a51e1619c0f2f3a3c5da75d1672b Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Fri, 30 Jun 2017 12:09:56 +0100 Subject: [PATCH 0726/1813] Updated Ibex and genie_python: Converting from OpenGENIE (rest) --- Ibex-and-genie_python:-Converting-from-OpenGENIE.rest | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Ibex-and-genie_python:-Converting-from-OpenGENIE.rest b/Ibex-and-genie_python:-Converting-from-OpenGENIE.rest index 1b67fe5..4ffb895 100644 --- a/Ibex-and-genie_python:-Converting-from-OpenGENIE.rest +++ b/Ibex-and-genie_python:-Converting-from-OpenGENIE.rest @@ -263,11 +263,10 @@ Exercise 5 cset POSITION=setpoint waitformove - PRINTN "Move Compete. Counting for frames =" + As_String(nframes) + PRINTN "Move complete. Counting for "+As_String(nframes)+" frames" BEGIN WAITFOR frames=nframes END - PRINTN setpoint ELSE PRINTIN "Not in interval " +As_String(min)+ "<=" As_String(setpoint)+ " >= " +As_String(max) ENDIF From a133cb469a01f21239c896ad8a1ae2b03a2b97e0 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Fri, 30 Jun 2017 12:10:33 +0100 Subject: [PATCH 0727/1813] Updated Ibex and genie_python: Exercise solutions (rest) --- Ibex-and-genie_python:-Exercise-solutions.rest | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Ibex-and-genie_python:-Exercise-solutions.rest b/Ibex-and-genie_python:-Exercise-solutions.rest index 20fe880..31121a0 100644 --- a/Ibex-and-genie_python:-Exercise-solutions.rest +++ b/Ibex-and-genie_python:-Exercise-solutions.rest @@ -175,7 +175,7 @@ Exercise 5 From [[Scripting|Ibex-and-genie_python:-Converting-from-Open-GENIE]]. -- *Translate the following ``OpenGENIE`` script into ``genie_python``::* +- *Translate the following ``OpenGENIE`` script into ``genie_python``*:: PROCEDURE Scan LOCAL i setpoint max min start step_size title nframes nimages multip From f1703403f3031acd6f6efbca9fa4050ffc751f9a Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Fri, 30 Jun 2017 12:11:10 +0100 Subject: [PATCH 0728/1813] Updated Ibex and genie_python: Exercise solutions (rest) --- Ibex-and-genie_python:-Exercise-solutions.rest | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Ibex-and-genie_python:-Exercise-solutions.rest b/Ibex-and-genie_python:-Exercise-solutions.rest index 31121a0..6c3396c 100644 --- a/Ibex-and-genie_python:-Exercise-solutions.rest +++ b/Ibex-and-genie_python:-Exercise-solutions.rest @@ -216,7 +216,7 @@ From [[Scripting|Ibex-and-genie_python:-Converting-from-Open-GENIE]]. ENDLOOP ENDPROCEDURE -- In **genie_python** this could be written as:: +- In ``genie_python`` this could be written as:: def scan(start=-100, min=100, max=200, step_size=20, nframes=10000, nimages=100): for i in range(1, nimages): From 99b64c4d7041e8c5317b4780c09f34e76a63bd57 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Fri, 30 Jun 2017 13:42:18 +0100 Subject: [PATCH 0729/1813] Updated Ibex and genie_python: Exercise solutions (rest) --- Ibex-and-genie_python:-Exercise-solutions.rest | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Ibex-and-genie_python:-Exercise-solutions.rest b/Ibex-and-genie_python:-Exercise-solutions.rest index 6c3396c..9bb3174 100644 --- a/Ibex-and-genie_python:-Exercise-solutions.rest +++ b/Ibex-and-genie_python:-Exercise-solutions.rest @@ -173,9 +173,9 @@ From [[Scripting|Ibex-and-genie_python:-Scripting]]. Exercise 5 ========== -From [[Scripting|Ibex-and-genie_python:-Converting-from-Open-GENIE]]. +From [[Converting from OpenGENIE|Ibex-and-genie_python:-Converting-from-OpenGENIE]]. -- *Translate the following ``OpenGENIE`` script into ``genie_python``*:: +- *Translate the following* ``OpenGENIE`` *script into* ``genie_python``:: PROCEDURE Scan LOCAL i setpoint max min start step_size title nframes nimages multip From c2e37c87f2507d761ffa4a3db578ad40f74f9bca Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Fri, 30 Jun 2017 13:42:55 +0100 Subject: [PATCH 0730/1813] Updated Ibex and genie_python: Converting from OpenGENIE (rest) --- Ibex-and-genie_python:-Converting-from-OpenGENIE.rest | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Ibex-and-genie_python:-Converting-from-OpenGENIE.rest b/Ibex-and-genie_python:-Converting-from-OpenGENIE.rest index 4ffb895..e88993b 100644 --- a/Ibex-and-genie_python:-Converting-from-OpenGENIE.rest +++ b/Ibex-and-genie_python:-Converting-from-OpenGENIE.rest @@ -281,7 +281,6 @@ Exercise 5 ------------------------------------------------------------------------------- -**Previous**: [[Scripting|Ibex-and-genie_python:-Scripting]] - **Next**: [[Exercise solutions|Ibex-and-genie_python:-Exercise-solutions]] +**Previous**: [[Scripting|Ibex-and-genie_python:-Scripting]] \ No newline at end of file From 1c0eaadcb55e480d3d2f9c79723d70baaba2a891 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Fri, 30 Jun 2017 13:43:06 +0100 Subject: [PATCH 0731/1813] Updated Ibex and genie_python: Converting from OpenGENIE (rest) --- Ibex-and-genie_python:-Converting-from-OpenGENIE.rest | 1 + 1 file changed, 1 insertion(+) diff --git a/Ibex-and-genie_python:-Converting-from-OpenGENIE.rest b/Ibex-and-genie_python:-Converting-from-OpenGENIE.rest index e88993b..7b912ad 100644 --- a/Ibex-and-genie_python:-Converting-from-OpenGENIE.rest +++ b/Ibex-and-genie_python:-Converting-from-OpenGENIE.rest @@ -282,5 +282,6 @@ Exercise 5 ------------------------------------------------------------------------------- **Next**: [[Exercise solutions|Ibex-and-genie_python:-Exercise-solutions]] + **Previous**: [[Scripting|Ibex-and-genie_python:-Scripting]] \ No newline at end of file From 2261142a02d51a1a37254d1adbe848f64cf43d45 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Fri, 30 Jun 2017 13:44:34 +0100 Subject: [PATCH 0732/1813] Updated Ibex and genie_python: Introduction (rest) --- Ibex-and-genie_python:-Introduction.rest | 3 --- 1 file changed, 3 deletions(-) diff --git a/Ibex-and-genie_python:-Introduction.rest b/Ibex-and-genie_python:-Introduction.rest index 9488d88..8a47fed 100644 --- a/Ibex-and-genie_python:-Introduction.rest +++ b/Ibex-and-genie_python:-Introduction.rest @@ -25,9 +25,6 @@ We expect that most people will take this course in a linear fashion, but if you - [[Scripting|Ibex-and-genie_python:-Scripting]] - [[Converting from ``OpenGENIE``|Ibex-and-genie_python:-Converting-from-OpenGENIE]] - [[Closing remarks|Ibex-and-genie_python:-Closing-remarks]] - -Sample solutions to each of the exercises can be found here: - - [[Exercise solutions|Ibex-and-genie_python:-Exercise-solutions]] -------------------------------------------------------------------- From bab6c36b8625c7114d963d5a60f644c8cbf92b2b Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Fri, 30 Jun 2017 13:44:58 +0100 Subject: [PATCH 0733/1813] Updated Ibex and genie_python: Converting from OpenGENIE (rest) --- Ibex-and-genie_python:-Converting-from-OpenGENIE.rest | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Ibex-and-genie_python:-Converting-from-OpenGENIE.rest b/Ibex-and-genie_python:-Converting-from-OpenGENIE.rest index 7b912ad..bf755ee 100644 --- a/Ibex-and-genie_python:-Converting-from-OpenGENIE.rest +++ b/Ibex-and-genie_python:-Converting-from-OpenGENIE.rest @@ -281,7 +281,7 @@ Exercise 5 ------------------------------------------------------------------------------- -**Next**: [[Exercise solutions|Ibex-and-genie_python:-Exercise-solutions]] +**Next**: [[Closing remarks|Ibex-and-genie_python:-Closing-remarks]] **Previous**: [[Scripting|Ibex-and-genie_python:-Scripting]] \ No newline at end of file From 76d5b71e8c3a03b2e84ae1fbc034d010d54c113c Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Fri, 30 Jun 2017 13:45:37 +0100 Subject: [PATCH 0734/1813] Updated Ibex and genie_python: Closing remarks (markdown) From 567eab1cc67b78c3559bad05b5692d45b4ec4c72 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Fri, 30 Jun 2017 13:50:38 +0100 Subject: [PATCH 0735/1813] Updated Ibex and genie_python: Converting from OpenGENIE (rest) From 11ef55f01695dfadb99e0b671b563ff7dcaf59a5 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Fri, 30 Jun 2017 13:50:53 +0100 Subject: [PATCH 0736/1813] Created Ibex and genie_python test page (markdown) --- Ibex-and-genie_python-test-page.md | 287 +++++++++++++++++++++++++++++ 1 file changed, 287 insertions(+) create mode 100644 Ibex-and-genie_python-test-page.md diff --git a/Ibex-and-genie_python-test-page.md b/Ibex-and-genie_python-test-page.md new file mode 100644 index 0000000..bf755ee --- /dev/null +++ b/Ibex-and-genie_python-test-page.md @@ -0,0 +1,287 @@ +Open Genie: Compare and contrast +================================ + +Procedures vs. functions +------------------------ + +in ``OpenGENIE``, procedures are defined by the keyword ``PROCEDURE`` and end with the ``ENDPROCEDURE`` statement. In Python, we instead define functions using the ``def`` keyword. For example:: + + PROCEDURE my_function + ... + ENDPROCEDURE + +becomes:: + + def my_function(): + ... + +Note that, using Python syntax, we don't need a statement to show where the function ends, the indentation takes care of that for us. + +We can also pass arguments into procedures in ``OpenGENIE`` as below:: + + PROCEDURE my_function + PARAMETERS x = Integer y = Real z = String + ... + ENDPROCEDURE + +We can do the same thing in ``genie_python``, but notably we don't need to define the type of the parameters. Python will only complain at run time if you call an unsupported operation on the input arguments. In ``genie_python``, the code above becomes:: + + def my_function(x, y, z): + ... + +Loops +----- + +In ``OpenGENIE`` a loop is defined using:: + + LOOP I FROM start TO end + ... + ENDLOOP + +You should already be familiar with defining loops in Python but, as a reminder, the code above would translate into Python as:: + + for i in range(start, end+1): + ... + +Conditionals +------------ + +As with loops, you should already be familiar with conditionals in Python. In ``OpenGENIE`` these look like:: + + IF [CONDITION] + ... + ELSE + ... + ENDIF + +In Python this is written as:: + + if [CONDITION]: + ... + else: + ... + +No ``ENDIF`` is needed because the indentation makes it implicit. + +Commands +-------- + +The majority of ``OpenGENIE`` instrument control commands have a very close equivalence in ``genie_python``. + +For example, the ``OpenGENIE`` command:: + + BEGIN + +in ``genie_python`` becomes:: + + g.begin() + +Similarly, the ``OpenGENIE`` command:: + + CHANGE TITLE="New title" + +in ``genie_python`` becomes:: + + g.change_title("New title") + +or alternatively:: + + g.change(title="New title") + +Similarly, most arguments will be very similar between ``OpenGENIE`` and ``genie_python``. For example, the following ``OpenGENIE`` command:: + + CSET/CONTROL TEMP1=5 LOWLIMIT=1 HIGHLIMIT=10 + +becomes the following in ``genie_python``:: + + g.cset(TEMP1=5, runcontrol=True, lowlimit=1, highlimit=10) + +**NOTE** Python is case sensitive and the arguments, apart from the block name, are in lower case + +Worked example +-------------- + +Take the following ``OpenGENIE`` procedure:: + + PROCEDURE my_function + + GLOBAL temp high low pow count + + temp = 20 + low = 1 + high = 50 + + CSET/CONTROL TEMP1=temp LOWLIMIT=low HIGHLIMIT=high + CSET/CONTROL TEMP2=temp LOWLIMIT=low HIGHLIMIT=high + + CHANGE TITLE= "Running at temperature "+As_string(temp) + BEGIN + WAITFOR UAMPS=0.2 + ABORT + PRINTN "waiting 10 minutes" + WAITFOR SECONDS=60*10 + BEGIN + WAITFOR SECONDS=10 + PRINTN "Waiting for "+As_string(count)+"uAh" + WAITFOR UAMPS=count + END + + ENDPROCEDURE + +Let's convert it to ``genie_python``. First of all we start off by making the ``PROCEDURE`` into a Python function:: + + def my_function(): + +We haven't given any arguments, because the procedure has no parameters. + +The variable definitions remain the same, except we don't need the ``GLOBAL`` line to define our variables. + +On inspection, we might consider that this function will be reused with different temperatures and limits, in which case we could change:: + + def my_function(): + temp = 20 + low = 1 + high = 50 + +to:: + + def my_function(temp, low, high): + +and I can always create a function to call specific parameters if I need to:: + + def my_specific_function(): + my_function(temp=20, low=1, high=50) + +Further, I can see that my ``WAITFOR`` later in the function waits for 50 microamps. Let's assume we almost always want to wait for 50 microamps but we'd like the possibility to override it sometimes. In that case, we can make it a 4th parameter with a default value, like so:: + + def my_function(temp, low, high, count=50): + +Let's start looking at the content of the PROCEDURE:: + + CSET/CONTROL TEMP1=temp LOWLIMIT=low HIGHLIMIT=high + +In ``genie_python``, this becomes:: + + g.cset(TEMP1=temp, lowlimit=low, highlight=high, runcontrol=True) + +The same goes for ``TEMP2``, but that gives us two commands that do exactly the same thing. That's not generally a good idea because it's prone to typos and changes to one line might not be applied to the other. It would be much better to do the following:: + + for block in [TEMP1, TEMP2]: + g.cset(block, temp, lowlimit=low, highlimit=high, runcontrol=True) + +Notably we've had to use the alternate ``cset`` argument syntax in this case. + +The next block of commands is:: + + CHANGE TITLE= "Running at temperature "+As_string(temp) + BEGIN + WAITFOR UAMPS=0.2 + ABORT + PRINTN "waiting 10 minutes" + WAITFOR SECONDS=60*10 + BEGIN + WAITFOR SECONDS=10 + PRINTN "Waiting for "+As_string(count)+"uAh" + WAITFOR UAMPS=count + END + +These translate very directly into ``genie_python``:: + + g.change_title("Running at temperature {0}".format(temp)) + g.begin() + g.waitfor_uamps(0.2) + g.abort() + minutes_to_wait = 10 + print "Waiting {0} minutes".format(minutes_to_wait) + g.waitfor_time(minutes=minutes_to_wait) + g.begin() + g.waitfor_time(seconds=10) + print "Waiting for {0}uAh".format(count) + g.waitfor_uamps(count) + g.end() + +We've changed a couple of things: + +- Rather than use the value ``10`` for the number of minutes to wait, we've set it as a variable. That means if we change the value, we only need to change it in one place. +- We've used the ``minutes`` argument in ``waitfor_time`` rather than having to apply the conversion factor between minutes and seconds ourselves. +- We've used the syntax ``"...".format(arg1, arg2)`` to build our output strings. There are lots of ways to build strings in Python, you can just use ``"..." + str(arg1) + "..." + str(arg2) + "..."`` but we like this way because it makes it easier to read and you don't have to remember to use ``str(...)`` to convert the types + +As mentioned, the final ``ENDPROCEDURE`` command doesn't need converting. Our final script is therefore:: + + def my_function(temp, low, high, count=50): + for block in [TEMP1, TEMP2]: + g.cset(block, temp, lowlimit=low, highlimit=high, runcontrol=True) + + g.change_title("Running at temperature {0}".format(temp)) + g.begin() + g.waitfor_uamps(0.2) + g.abort() + + minutes_to_wait = 10 + print "Waiting {0} minutes".format(minutes_to_wait) + g.waitfor_time(minutes=minutes_to_wait) + + g.begin() + g.waitfor_time(seconds=10) + print "Waiting for {0}uAh".format(count) + g.waitfor_uamps(count) + g.end() + + def my_specific_function(): + my_function(temp=20, low=1, high=50) + +Exercise 5 +========== + +- Translate the following ``OpenGENIE`` script into ``genie_python``:: + + PROCEDURE Scan + LOCAL i setpoint max min start step_size title nframes nimages multip + + max = 200.0 + min = 100.0 + + setpoint = 0.0 + start = -100.0 + setpoint = start + nframes = 10000 + nimages = 100 + + step_size = 20.0 + + LOOP i FROM 1 TO nimages + + setpoint = setpoint + step_size + multip = As_Integer(setpoint/360) + setpoint = setpoint - 360*multip + PRINTN "New angle is: " + as_string(setpoint) + + IF (setpoint>=min) OR (setpoint<=max) + + tempTitle="Image "+as_string(i)+", "+as_string(setpoint)+" degrees" + CHANGE TITLE=tempTitle + + cset POSITION=setpoint + waitformove + PRINTN "Move complete. Counting for "+As_String(nframes)+" frames" + BEGIN + WAITFOR frames=nframes + END + ELSE + PRINTIN "Not in interval " +As_String(min)+ "<=" As_String(setpoint)+ " >= " +As_String(max) + ENDIF + + ENDLOOP + ENDPROCEDURE + +- State any simplifications you've made + + +[[Solution|Ibex-and-genie_python:-Exercise-solutions]] + +------------------------------------------------------------------------------- + +**Next**: [[Closing remarks|Ibex-and-genie_python:-Closing-remarks]] + +**Previous**: [[Scripting|Ibex-and-genie_python:-Scripting]] + \ No newline at end of file From 9e198b9f49fa153b165b7a58ad76ff0b4ab0d674 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Fri, 30 Jun 2017 13:51:12 +0100 Subject: [PATCH 0737/1813] Created Ibex and genie_python test page 2 (rest) --- Ibex-and-genie_python-test-page-2.rest | 287 +++++++++++++++++++++++++ 1 file changed, 287 insertions(+) create mode 100644 Ibex-and-genie_python-test-page-2.rest diff --git a/Ibex-and-genie_python-test-page-2.rest b/Ibex-and-genie_python-test-page-2.rest new file mode 100644 index 0000000..bf755ee --- /dev/null +++ b/Ibex-and-genie_python-test-page-2.rest @@ -0,0 +1,287 @@ +Open Genie: Compare and contrast +================================ + +Procedures vs. functions +------------------------ + +in ``OpenGENIE``, procedures are defined by the keyword ``PROCEDURE`` and end with the ``ENDPROCEDURE`` statement. In Python, we instead define functions using the ``def`` keyword. For example:: + + PROCEDURE my_function + ... + ENDPROCEDURE + +becomes:: + + def my_function(): + ... + +Note that, using Python syntax, we don't need a statement to show where the function ends, the indentation takes care of that for us. + +We can also pass arguments into procedures in ``OpenGENIE`` as below:: + + PROCEDURE my_function + PARAMETERS x = Integer y = Real z = String + ... + ENDPROCEDURE + +We can do the same thing in ``genie_python``, but notably we don't need to define the type of the parameters. Python will only complain at run time if you call an unsupported operation on the input arguments. In ``genie_python``, the code above becomes:: + + def my_function(x, y, z): + ... + +Loops +----- + +In ``OpenGENIE`` a loop is defined using:: + + LOOP I FROM start TO end + ... + ENDLOOP + +You should already be familiar with defining loops in Python but, as a reminder, the code above would translate into Python as:: + + for i in range(start, end+1): + ... + +Conditionals +------------ + +As with loops, you should already be familiar with conditionals in Python. In ``OpenGENIE`` these look like:: + + IF [CONDITION] + ... + ELSE + ... + ENDIF + +In Python this is written as:: + + if [CONDITION]: + ... + else: + ... + +No ``ENDIF`` is needed because the indentation makes it implicit. + +Commands +-------- + +The majority of ``OpenGENIE`` instrument control commands have a very close equivalence in ``genie_python``. + +For example, the ``OpenGENIE`` command:: + + BEGIN + +in ``genie_python`` becomes:: + + g.begin() + +Similarly, the ``OpenGENIE`` command:: + + CHANGE TITLE="New title" + +in ``genie_python`` becomes:: + + g.change_title("New title") + +or alternatively:: + + g.change(title="New title") + +Similarly, most arguments will be very similar between ``OpenGENIE`` and ``genie_python``. For example, the following ``OpenGENIE`` command:: + + CSET/CONTROL TEMP1=5 LOWLIMIT=1 HIGHLIMIT=10 + +becomes the following in ``genie_python``:: + + g.cset(TEMP1=5, runcontrol=True, lowlimit=1, highlimit=10) + +**NOTE** Python is case sensitive and the arguments, apart from the block name, are in lower case + +Worked example +-------------- + +Take the following ``OpenGENIE`` procedure:: + + PROCEDURE my_function + + GLOBAL temp high low pow count + + temp = 20 + low = 1 + high = 50 + + CSET/CONTROL TEMP1=temp LOWLIMIT=low HIGHLIMIT=high + CSET/CONTROL TEMP2=temp LOWLIMIT=low HIGHLIMIT=high + + CHANGE TITLE= "Running at temperature "+As_string(temp) + BEGIN + WAITFOR UAMPS=0.2 + ABORT + PRINTN "waiting 10 minutes" + WAITFOR SECONDS=60*10 + BEGIN + WAITFOR SECONDS=10 + PRINTN "Waiting for "+As_string(count)+"uAh" + WAITFOR UAMPS=count + END + + ENDPROCEDURE + +Let's convert it to ``genie_python``. First of all we start off by making the ``PROCEDURE`` into a Python function:: + + def my_function(): + +We haven't given any arguments, because the procedure has no parameters. + +The variable definitions remain the same, except we don't need the ``GLOBAL`` line to define our variables. + +On inspection, we might consider that this function will be reused with different temperatures and limits, in which case we could change:: + + def my_function(): + temp = 20 + low = 1 + high = 50 + +to:: + + def my_function(temp, low, high): + +and I can always create a function to call specific parameters if I need to:: + + def my_specific_function(): + my_function(temp=20, low=1, high=50) + +Further, I can see that my ``WAITFOR`` later in the function waits for 50 microamps. Let's assume we almost always want to wait for 50 microamps but we'd like the possibility to override it sometimes. In that case, we can make it a 4th parameter with a default value, like so:: + + def my_function(temp, low, high, count=50): + +Let's start looking at the content of the PROCEDURE:: + + CSET/CONTROL TEMP1=temp LOWLIMIT=low HIGHLIMIT=high + +In ``genie_python``, this becomes:: + + g.cset(TEMP1=temp, lowlimit=low, highlight=high, runcontrol=True) + +The same goes for ``TEMP2``, but that gives us two commands that do exactly the same thing. That's not generally a good idea because it's prone to typos and changes to one line might not be applied to the other. It would be much better to do the following:: + + for block in [TEMP1, TEMP2]: + g.cset(block, temp, lowlimit=low, highlimit=high, runcontrol=True) + +Notably we've had to use the alternate ``cset`` argument syntax in this case. + +The next block of commands is:: + + CHANGE TITLE= "Running at temperature "+As_string(temp) + BEGIN + WAITFOR UAMPS=0.2 + ABORT + PRINTN "waiting 10 minutes" + WAITFOR SECONDS=60*10 + BEGIN + WAITFOR SECONDS=10 + PRINTN "Waiting for "+As_string(count)+"uAh" + WAITFOR UAMPS=count + END + +These translate very directly into ``genie_python``:: + + g.change_title("Running at temperature {0}".format(temp)) + g.begin() + g.waitfor_uamps(0.2) + g.abort() + minutes_to_wait = 10 + print "Waiting {0} minutes".format(minutes_to_wait) + g.waitfor_time(minutes=minutes_to_wait) + g.begin() + g.waitfor_time(seconds=10) + print "Waiting for {0}uAh".format(count) + g.waitfor_uamps(count) + g.end() + +We've changed a couple of things: + +- Rather than use the value ``10`` for the number of minutes to wait, we've set it as a variable. That means if we change the value, we only need to change it in one place. +- We've used the ``minutes`` argument in ``waitfor_time`` rather than having to apply the conversion factor between minutes and seconds ourselves. +- We've used the syntax ``"...".format(arg1, arg2)`` to build our output strings. There are lots of ways to build strings in Python, you can just use ``"..." + str(arg1) + "..." + str(arg2) + "..."`` but we like this way because it makes it easier to read and you don't have to remember to use ``str(...)`` to convert the types + +As mentioned, the final ``ENDPROCEDURE`` command doesn't need converting. Our final script is therefore:: + + def my_function(temp, low, high, count=50): + for block in [TEMP1, TEMP2]: + g.cset(block, temp, lowlimit=low, highlimit=high, runcontrol=True) + + g.change_title("Running at temperature {0}".format(temp)) + g.begin() + g.waitfor_uamps(0.2) + g.abort() + + minutes_to_wait = 10 + print "Waiting {0} minutes".format(minutes_to_wait) + g.waitfor_time(minutes=minutes_to_wait) + + g.begin() + g.waitfor_time(seconds=10) + print "Waiting for {0}uAh".format(count) + g.waitfor_uamps(count) + g.end() + + def my_specific_function(): + my_function(temp=20, low=1, high=50) + +Exercise 5 +========== + +- Translate the following ``OpenGENIE`` script into ``genie_python``:: + + PROCEDURE Scan + LOCAL i setpoint max min start step_size title nframes nimages multip + + max = 200.0 + min = 100.0 + + setpoint = 0.0 + start = -100.0 + setpoint = start + nframes = 10000 + nimages = 100 + + step_size = 20.0 + + LOOP i FROM 1 TO nimages + + setpoint = setpoint + step_size + multip = As_Integer(setpoint/360) + setpoint = setpoint - 360*multip + PRINTN "New angle is: " + as_string(setpoint) + + IF (setpoint>=min) OR (setpoint<=max) + + tempTitle="Image "+as_string(i)+", "+as_string(setpoint)+" degrees" + CHANGE TITLE=tempTitle + + cset POSITION=setpoint + waitformove + PRINTN "Move complete. Counting for "+As_String(nframes)+" frames" + BEGIN + WAITFOR frames=nframes + END + ELSE + PRINTIN "Not in interval " +As_String(min)+ "<=" As_String(setpoint)+ " >= " +As_String(max) + ENDIF + + ENDLOOP + ENDPROCEDURE + +- State any simplifications you've made + + +[[Solution|Ibex-and-genie_python:-Exercise-solutions]] + +------------------------------------------------------------------------------- + +**Next**: [[Closing remarks|Ibex-and-genie_python:-Closing-remarks]] + +**Previous**: [[Scripting|Ibex-and-genie_python:-Scripting]] + \ No newline at end of file From 8651b6df891d9068cf3804de8a89a1d1ebbb2548 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Fri, 30 Jun 2017 13:51:36 +0100 Subject: [PATCH 0738/1813] Destroyed Ibex and genie_python test page 2 (rest) --- Ibex-and-genie_python-test-page-2.rest | 287 ------------------------- 1 file changed, 287 deletions(-) delete mode 100644 Ibex-and-genie_python-test-page-2.rest diff --git a/Ibex-and-genie_python-test-page-2.rest b/Ibex-and-genie_python-test-page-2.rest deleted file mode 100644 index bf755ee..0000000 --- a/Ibex-and-genie_python-test-page-2.rest +++ /dev/null @@ -1,287 +0,0 @@ -Open Genie: Compare and contrast -================================ - -Procedures vs. functions ------------------------- - -in ``OpenGENIE``, procedures are defined by the keyword ``PROCEDURE`` and end with the ``ENDPROCEDURE`` statement. In Python, we instead define functions using the ``def`` keyword. For example:: - - PROCEDURE my_function - ... - ENDPROCEDURE - -becomes:: - - def my_function(): - ... - -Note that, using Python syntax, we don't need a statement to show where the function ends, the indentation takes care of that for us. - -We can also pass arguments into procedures in ``OpenGENIE`` as below:: - - PROCEDURE my_function - PARAMETERS x = Integer y = Real z = String - ... - ENDPROCEDURE - -We can do the same thing in ``genie_python``, but notably we don't need to define the type of the parameters. Python will only complain at run time if you call an unsupported operation on the input arguments. In ``genie_python``, the code above becomes:: - - def my_function(x, y, z): - ... - -Loops ------ - -In ``OpenGENIE`` a loop is defined using:: - - LOOP I FROM start TO end - ... - ENDLOOP - -You should already be familiar with defining loops in Python but, as a reminder, the code above would translate into Python as:: - - for i in range(start, end+1): - ... - -Conditionals ------------- - -As with loops, you should already be familiar with conditionals in Python. In ``OpenGENIE`` these look like:: - - IF [CONDITION] - ... - ELSE - ... - ENDIF - -In Python this is written as:: - - if [CONDITION]: - ... - else: - ... - -No ``ENDIF`` is needed because the indentation makes it implicit. - -Commands --------- - -The majority of ``OpenGENIE`` instrument control commands have a very close equivalence in ``genie_python``. - -For example, the ``OpenGENIE`` command:: - - BEGIN - -in ``genie_python`` becomes:: - - g.begin() - -Similarly, the ``OpenGENIE`` command:: - - CHANGE TITLE="New title" - -in ``genie_python`` becomes:: - - g.change_title("New title") - -or alternatively:: - - g.change(title="New title") - -Similarly, most arguments will be very similar between ``OpenGENIE`` and ``genie_python``. For example, the following ``OpenGENIE`` command:: - - CSET/CONTROL TEMP1=5 LOWLIMIT=1 HIGHLIMIT=10 - -becomes the following in ``genie_python``:: - - g.cset(TEMP1=5, runcontrol=True, lowlimit=1, highlimit=10) - -**NOTE** Python is case sensitive and the arguments, apart from the block name, are in lower case - -Worked example --------------- - -Take the following ``OpenGENIE`` procedure:: - - PROCEDURE my_function - - GLOBAL temp high low pow count - - temp = 20 - low = 1 - high = 50 - - CSET/CONTROL TEMP1=temp LOWLIMIT=low HIGHLIMIT=high - CSET/CONTROL TEMP2=temp LOWLIMIT=low HIGHLIMIT=high - - CHANGE TITLE= "Running at temperature "+As_string(temp) - BEGIN - WAITFOR UAMPS=0.2 - ABORT - PRINTN "waiting 10 minutes" - WAITFOR SECONDS=60*10 - BEGIN - WAITFOR SECONDS=10 - PRINTN "Waiting for "+As_string(count)+"uAh" - WAITFOR UAMPS=count - END - - ENDPROCEDURE - -Let's convert it to ``genie_python``. First of all we start off by making the ``PROCEDURE`` into a Python function:: - - def my_function(): - -We haven't given any arguments, because the procedure has no parameters. - -The variable definitions remain the same, except we don't need the ``GLOBAL`` line to define our variables. - -On inspection, we might consider that this function will be reused with different temperatures and limits, in which case we could change:: - - def my_function(): - temp = 20 - low = 1 - high = 50 - -to:: - - def my_function(temp, low, high): - -and I can always create a function to call specific parameters if I need to:: - - def my_specific_function(): - my_function(temp=20, low=1, high=50) - -Further, I can see that my ``WAITFOR`` later in the function waits for 50 microamps. Let's assume we almost always want to wait for 50 microamps but we'd like the possibility to override it sometimes. In that case, we can make it a 4th parameter with a default value, like so:: - - def my_function(temp, low, high, count=50): - -Let's start looking at the content of the PROCEDURE:: - - CSET/CONTROL TEMP1=temp LOWLIMIT=low HIGHLIMIT=high - -In ``genie_python``, this becomes:: - - g.cset(TEMP1=temp, lowlimit=low, highlight=high, runcontrol=True) - -The same goes for ``TEMP2``, but that gives us two commands that do exactly the same thing. That's not generally a good idea because it's prone to typos and changes to one line might not be applied to the other. It would be much better to do the following:: - - for block in [TEMP1, TEMP2]: - g.cset(block, temp, lowlimit=low, highlimit=high, runcontrol=True) - -Notably we've had to use the alternate ``cset`` argument syntax in this case. - -The next block of commands is:: - - CHANGE TITLE= "Running at temperature "+As_string(temp) - BEGIN - WAITFOR UAMPS=0.2 - ABORT - PRINTN "waiting 10 minutes" - WAITFOR SECONDS=60*10 - BEGIN - WAITFOR SECONDS=10 - PRINTN "Waiting for "+As_string(count)+"uAh" - WAITFOR UAMPS=count - END - -These translate very directly into ``genie_python``:: - - g.change_title("Running at temperature {0}".format(temp)) - g.begin() - g.waitfor_uamps(0.2) - g.abort() - minutes_to_wait = 10 - print "Waiting {0} minutes".format(minutes_to_wait) - g.waitfor_time(minutes=minutes_to_wait) - g.begin() - g.waitfor_time(seconds=10) - print "Waiting for {0}uAh".format(count) - g.waitfor_uamps(count) - g.end() - -We've changed a couple of things: - -- Rather than use the value ``10`` for the number of minutes to wait, we've set it as a variable. That means if we change the value, we only need to change it in one place. -- We've used the ``minutes`` argument in ``waitfor_time`` rather than having to apply the conversion factor between minutes and seconds ourselves. -- We've used the syntax ``"...".format(arg1, arg2)`` to build our output strings. There are lots of ways to build strings in Python, you can just use ``"..." + str(arg1) + "..." + str(arg2) + "..."`` but we like this way because it makes it easier to read and you don't have to remember to use ``str(...)`` to convert the types - -As mentioned, the final ``ENDPROCEDURE`` command doesn't need converting. Our final script is therefore:: - - def my_function(temp, low, high, count=50): - for block in [TEMP1, TEMP2]: - g.cset(block, temp, lowlimit=low, highlimit=high, runcontrol=True) - - g.change_title("Running at temperature {0}".format(temp)) - g.begin() - g.waitfor_uamps(0.2) - g.abort() - - minutes_to_wait = 10 - print "Waiting {0} minutes".format(minutes_to_wait) - g.waitfor_time(minutes=minutes_to_wait) - - g.begin() - g.waitfor_time(seconds=10) - print "Waiting for {0}uAh".format(count) - g.waitfor_uamps(count) - g.end() - - def my_specific_function(): - my_function(temp=20, low=1, high=50) - -Exercise 5 -========== - -- Translate the following ``OpenGENIE`` script into ``genie_python``:: - - PROCEDURE Scan - LOCAL i setpoint max min start step_size title nframes nimages multip - - max = 200.0 - min = 100.0 - - setpoint = 0.0 - start = -100.0 - setpoint = start - nframes = 10000 - nimages = 100 - - step_size = 20.0 - - LOOP i FROM 1 TO nimages - - setpoint = setpoint + step_size - multip = As_Integer(setpoint/360) - setpoint = setpoint - 360*multip - PRINTN "New angle is: " + as_string(setpoint) - - IF (setpoint>=min) OR (setpoint<=max) - - tempTitle="Image "+as_string(i)+", "+as_string(setpoint)+" degrees" - CHANGE TITLE=tempTitle - - cset POSITION=setpoint - waitformove - PRINTN "Move complete. Counting for "+As_String(nframes)+" frames" - BEGIN - WAITFOR frames=nframes - END - ELSE - PRINTIN "Not in interval " +As_String(min)+ "<=" As_String(setpoint)+ " >= " +As_String(max) - ENDIF - - ENDLOOP - ENDPROCEDURE - -- State any simplifications you've made - - -[[Solution|Ibex-and-genie_python:-Exercise-solutions]] - -------------------------------------------------------------------------------- - -**Next**: [[Closing remarks|Ibex-and-genie_python:-Closing-remarks]] - -**Previous**: [[Scripting|Ibex-and-genie_python:-Scripting]] - \ No newline at end of file From 8e99caf30d7a909d0e121dab2f5d909e3bd5eb9c Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Fri, 30 Jun 2017 13:51:47 +0100 Subject: [PATCH 0739/1813] Destroyed Ibex and genie_python test page (markdown) --- Ibex-and-genie_python-test-page.md | 287 ----------------------------- 1 file changed, 287 deletions(-) delete mode 100644 Ibex-and-genie_python-test-page.md diff --git a/Ibex-and-genie_python-test-page.md b/Ibex-and-genie_python-test-page.md deleted file mode 100644 index bf755ee..0000000 --- a/Ibex-and-genie_python-test-page.md +++ /dev/null @@ -1,287 +0,0 @@ -Open Genie: Compare and contrast -================================ - -Procedures vs. functions ------------------------- - -in ``OpenGENIE``, procedures are defined by the keyword ``PROCEDURE`` and end with the ``ENDPROCEDURE`` statement. In Python, we instead define functions using the ``def`` keyword. For example:: - - PROCEDURE my_function - ... - ENDPROCEDURE - -becomes:: - - def my_function(): - ... - -Note that, using Python syntax, we don't need a statement to show where the function ends, the indentation takes care of that for us. - -We can also pass arguments into procedures in ``OpenGENIE`` as below:: - - PROCEDURE my_function - PARAMETERS x = Integer y = Real z = String - ... - ENDPROCEDURE - -We can do the same thing in ``genie_python``, but notably we don't need to define the type of the parameters. Python will only complain at run time if you call an unsupported operation on the input arguments. In ``genie_python``, the code above becomes:: - - def my_function(x, y, z): - ... - -Loops ------ - -In ``OpenGENIE`` a loop is defined using:: - - LOOP I FROM start TO end - ... - ENDLOOP - -You should already be familiar with defining loops in Python but, as a reminder, the code above would translate into Python as:: - - for i in range(start, end+1): - ... - -Conditionals ------------- - -As with loops, you should already be familiar with conditionals in Python. In ``OpenGENIE`` these look like:: - - IF [CONDITION] - ... - ELSE - ... - ENDIF - -In Python this is written as:: - - if [CONDITION]: - ... - else: - ... - -No ``ENDIF`` is needed because the indentation makes it implicit. - -Commands --------- - -The majority of ``OpenGENIE`` instrument control commands have a very close equivalence in ``genie_python``. - -For example, the ``OpenGENIE`` command:: - - BEGIN - -in ``genie_python`` becomes:: - - g.begin() - -Similarly, the ``OpenGENIE`` command:: - - CHANGE TITLE="New title" - -in ``genie_python`` becomes:: - - g.change_title("New title") - -or alternatively:: - - g.change(title="New title") - -Similarly, most arguments will be very similar between ``OpenGENIE`` and ``genie_python``. For example, the following ``OpenGENIE`` command:: - - CSET/CONTROL TEMP1=5 LOWLIMIT=1 HIGHLIMIT=10 - -becomes the following in ``genie_python``:: - - g.cset(TEMP1=5, runcontrol=True, lowlimit=1, highlimit=10) - -**NOTE** Python is case sensitive and the arguments, apart from the block name, are in lower case - -Worked example --------------- - -Take the following ``OpenGENIE`` procedure:: - - PROCEDURE my_function - - GLOBAL temp high low pow count - - temp = 20 - low = 1 - high = 50 - - CSET/CONTROL TEMP1=temp LOWLIMIT=low HIGHLIMIT=high - CSET/CONTROL TEMP2=temp LOWLIMIT=low HIGHLIMIT=high - - CHANGE TITLE= "Running at temperature "+As_string(temp) - BEGIN - WAITFOR UAMPS=0.2 - ABORT - PRINTN "waiting 10 minutes" - WAITFOR SECONDS=60*10 - BEGIN - WAITFOR SECONDS=10 - PRINTN "Waiting for "+As_string(count)+"uAh" - WAITFOR UAMPS=count - END - - ENDPROCEDURE - -Let's convert it to ``genie_python``. First of all we start off by making the ``PROCEDURE`` into a Python function:: - - def my_function(): - -We haven't given any arguments, because the procedure has no parameters. - -The variable definitions remain the same, except we don't need the ``GLOBAL`` line to define our variables. - -On inspection, we might consider that this function will be reused with different temperatures and limits, in which case we could change:: - - def my_function(): - temp = 20 - low = 1 - high = 50 - -to:: - - def my_function(temp, low, high): - -and I can always create a function to call specific parameters if I need to:: - - def my_specific_function(): - my_function(temp=20, low=1, high=50) - -Further, I can see that my ``WAITFOR`` later in the function waits for 50 microamps. Let's assume we almost always want to wait for 50 microamps but we'd like the possibility to override it sometimes. In that case, we can make it a 4th parameter with a default value, like so:: - - def my_function(temp, low, high, count=50): - -Let's start looking at the content of the PROCEDURE:: - - CSET/CONTROL TEMP1=temp LOWLIMIT=low HIGHLIMIT=high - -In ``genie_python``, this becomes:: - - g.cset(TEMP1=temp, lowlimit=low, highlight=high, runcontrol=True) - -The same goes for ``TEMP2``, but that gives us two commands that do exactly the same thing. That's not generally a good idea because it's prone to typos and changes to one line might not be applied to the other. It would be much better to do the following:: - - for block in [TEMP1, TEMP2]: - g.cset(block, temp, lowlimit=low, highlimit=high, runcontrol=True) - -Notably we've had to use the alternate ``cset`` argument syntax in this case. - -The next block of commands is:: - - CHANGE TITLE= "Running at temperature "+As_string(temp) - BEGIN - WAITFOR UAMPS=0.2 - ABORT - PRINTN "waiting 10 minutes" - WAITFOR SECONDS=60*10 - BEGIN - WAITFOR SECONDS=10 - PRINTN "Waiting for "+As_string(count)+"uAh" - WAITFOR UAMPS=count - END - -These translate very directly into ``genie_python``:: - - g.change_title("Running at temperature {0}".format(temp)) - g.begin() - g.waitfor_uamps(0.2) - g.abort() - minutes_to_wait = 10 - print "Waiting {0} minutes".format(minutes_to_wait) - g.waitfor_time(minutes=minutes_to_wait) - g.begin() - g.waitfor_time(seconds=10) - print "Waiting for {0}uAh".format(count) - g.waitfor_uamps(count) - g.end() - -We've changed a couple of things: - -- Rather than use the value ``10`` for the number of minutes to wait, we've set it as a variable. That means if we change the value, we only need to change it in one place. -- We've used the ``minutes`` argument in ``waitfor_time`` rather than having to apply the conversion factor between minutes and seconds ourselves. -- We've used the syntax ``"...".format(arg1, arg2)`` to build our output strings. There are lots of ways to build strings in Python, you can just use ``"..." + str(arg1) + "..." + str(arg2) + "..."`` but we like this way because it makes it easier to read and you don't have to remember to use ``str(...)`` to convert the types - -As mentioned, the final ``ENDPROCEDURE`` command doesn't need converting. Our final script is therefore:: - - def my_function(temp, low, high, count=50): - for block in [TEMP1, TEMP2]: - g.cset(block, temp, lowlimit=low, highlimit=high, runcontrol=True) - - g.change_title("Running at temperature {0}".format(temp)) - g.begin() - g.waitfor_uamps(0.2) - g.abort() - - minutes_to_wait = 10 - print "Waiting {0} minutes".format(minutes_to_wait) - g.waitfor_time(minutes=minutes_to_wait) - - g.begin() - g.waitfor_time(seconds=10) - print "Waiting for {0}uAh".format(count) - g.waitfor_uamps(count) - g.end() - - def my_specific_function(): - my_function(temp=20, low=1, high=50) - -Exercise 5 -========== - -- Translate the following ``OpenGENIE`` script into ``genie_python``:: - - PROCEDURE Scan - LOCAL i setpoint max min start step_size title nframes nimages multip - - max = 200.0 - min = 100.0 - - setpoint = 0.0 - start = -100.0 - setpoint = start - nframes = 10000 - nimages = 100 - - step_size = 20.0 - - LOOP i FROM 1 TO nimages - - setpoint = setpoint + step_size - multip = As_Integer(setpoint/360) - setpoint = setpoint - 360*multip - PRINTN "New angle is: " + as_string(setpoint) - - IF (setpoint>=min) OR (setpoint<=max) - - tempTitle="Image "+as_string(i)+", "+as_string(setpoint)+" degrees" - CHANGE TITLE=tempTitle - - cset POSITION=setpoint - waitformove - PRINTN "Move complete. Counting for "+As_String(nframes)+" frames" - BEGIN - WAITFOR frames=nframes - END - ELSE - PRINTIN "Not in interval " +As_String(min)+ "<=" As_String(setpoint)+ " >= " +As_String(max) - ENDIF - - ENDLOOP - ENDPROCEDURE - -- State any simplifications you've made - - -[[Solution|Ibex-and-genie_python:-Exercise-solutions]] - -------------------------------------------------------------------------------- - -**Next**: [[Closing remarks|Ibex-and-genie_python:-Closing-remarks]] - -**Previous**: [[Scripting|Ibex-and-genie_python:-Scripting]] - \ No newline at end of file From 6c93f89dbcaa61e0904ec0f5ab1f8a5fa4781a31 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Fri, 30 Jun 2017 13:52:54 +0100 Subject: [PATCH 0740/1813] Updated Ibex and genie_python: Introduction (rest) --- ...n:-Introduction.rest => Learn-genie_python---Introduction.rest | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename Ibex-and-genie_python:-Introduction.rest => Learn-genie_python---Introduction.rest (100%) diff --git a/Ibex-and-genie_python:-Introduction.rest b/Learn-genie_python---Introduction.rest similarity index 100% rename from Ibex-and-genie_python:-Introduction.rest rename to Learn-genie_python---Introduction.rest From 39ce622b5b5af2dbc9264b5039109a885e9fd475 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Fri, 30 Jun 2017 13:53:22 +0100 Subject: [PATCH 0741/1813] Updated Learn genie_python Introduction (rest) --- ...Introduction.rest => Genie-Python-and-Ibex-(Introduction).rest | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename Learn-genie_python---Introduction.rest => Genie-Python-and-Ibex-(Introduction).rest (100%) diff --git a/Learn-genie_python---Introduction.rest b/Genie-Python-and-Ibex-(Introduction).rest similarity index 100% rename from Learn-genie_python---Introduction.rest rename to Genie-Python-and-Ibex-(Introduction).rest From 056189b695316103e31d814c4ffaec65987cb62a Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Fri, 30 Jun 2017 13:54:40 +0100 Subject: [PATCH 0742/1813] Updated Genie Python and Ibex (Introduction) (rest) --- Genie-Python-and-Ibex-(Introduction).rest | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/Genie-Python-and-Ibex-(Introduction).rest b/Genie-Python-and-Ibex-(Introduction).rest index 8a47fed..b56bc20 100644 --- a/Genie-Python-and-Ibex-(Introduction).rest +++ b/Genie-Python-and-Ibex-(Introduction).rest @@ -13,20 +13,20 @@ At each stage the course aims to assist learning with exercises and worked examp Notably, ``genie_python`` does not cover data analysis. If you wish to do analysis that can't be achieved with basic Python, we recommend the [[Mantid with Python training course|https://www.mantidproject.org/Python_In_Mantid]]. -If you're looking for a specific section, please refer to the course contents below. Otherwise, let's [[get started|Ibex-and-genie_python:-Getting-started]]! +If you're looking for a specific section, please refer to the course contents below. Otherwise, let's [[get started|Ibex-and-genie_python-(Getting-started)]]! Contents ======== We expect that most people will take this course in a linear fashion, but if you have a specific query, the course is broadly split up into the following topics -- [[Getting started|Ibex-and-genie_python:-Getting-started]] -- [[Common commands|Ibex-and-genie_python:-Common-commands]] -- [[Scripting|Ibex-and-genie_python:-Scripting]] -- [[Converting from ``OpenGENIE``|Ibex-and-genie_python:-Converting-from-OpenGENIE]] -- [[Closing remarks|Ibex-and-genie_python:-Closing-remarks]] -- [[Exercise solutions|Ibex-and-genie_python:-Exercise-solutions]] +- [[Getting started|Ibex-and-genie_python-(Getting-started)]] +- [[Common commands|Ibex-and-genie_python-(Common-commands)]] +- [[Scripting|Ibex-and-genie_python-(Scripting)]] +- [[Converting from ``OpenGENIE``|Ibex-and-genie_python-(Converting-from-OpenGENIE)]] +- [[Closing remarks|Ibex-and-genie_python-(Closing-remarks)]] +- [[Exercise solutions|Ibex-and-genie_python-(Exercise-solutions)]] -------------------------------------------------------------------- -**Next**: [[Getting started|Ibex-and-genie_python:-Getting-started]] \ No newline at end of file +**Next**: [[Getting started|Ibex-and-genie_python-(Getting-started)]] \ No newline at end of file From 0a6daaa45015e7f87a8053269bdd579dfb7da231 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Fri, 30 Jun 2017 13:55:29 +0100 Subject: [PATCH 0743/1813] Updated Genie Python and Ibex (Introduction) (rest) --- Genie-Python-and-Ibex-(Introduction).rest | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/Genie-Python-and-Ibex-(Introduction).rest b/Genie-Python-and-Ibex-(Introduction).rest index b56bc20..8306b09 100644 --- a/Genie-Python-and-Ibex-(Introduction).rest +++ b/Genie-Python-and-Ibex-(Introduction).rest @@ -13,20 +13,20 @@ At each stage the course aims to assist learning with exercises and worked examp Notably, ``genie_python`` does not cover data analysis. If you wish to do analysis that can't be achieved with basic Python, we recommend the [[Mantid with Python training course|https://www.mantidproject.org/Python_In_Mantid]]. -If you're looking for a specific section, please refer to the course contents below. Otherwise, let's [[get started|Ibex-and-genie_python-(Getting-started)]]! +If you're looking for a specific section, please refer to the course contents below. Otherwise, let's [[get started|genie_python-and-Ibex-(Getting-started)]]! Contents ======== We expect that most people will take this course in a linear fashion, but if you have a specific query, the course is broadly split up into the following topics -- [[Getting started|Ibex-and-genie_python-(Getting-started)]] -- [[Common commands|Ibex-and-genie_python-(Common-commands)]] -- [[Scripting|Ibex-and-genie_python-(Scripting)]] -- [[Converting from ``OpenGENIE``|Ibex-and-genie_python-(Converting-from-OpenGENIE)]] -- [[Closing remarks|Ibex-and-genie_python-(Closing-remarks)]] -- [[Exercise solutions|Ibex-and-genie_python-(Exercise-solutions)]] +- [[Getting started|genie_python-and-Ibex-(Getting-started)]] +- [[Common commands|genie_python-and-Ibex-(Common-commands)]] +- [[Scripting|genie_python-and-Ibex-(Scripting)]] +- [[Converting from ``OpenGENIE``|genie_python-and-Ibex-(Converting-from-OpenGENIE)]] +- [[Closing remarks|genie_python-and-Ibex-(Closing-remarks)]] +- [[Exercise solutions|genie_python-and-Ibex-(Exercise-solutions)]] -------------------------------------------------------------------- -**Next**: [[Getting started|Ibex-and-genie_python-(Getting-started)]] \ No newline at end of file +**Next**: [[Getting started|genie_python-and-Ibex-(Getting-started)]] \ No newline at end of file From fd3261044451105acfe09d2be85c5a00eefa3f78 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Fri, 30 Jun 2017 13:56:18 +0100 Subject: [PATCH 0744/1813] Updated Ibex and genie_python: Getting started (rest) --- ...ted.rest => genie_python-and-Ibex-(Getting-started).rest | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) rename Ibex-and-genie_python:-Getting-started.rest => genie_python-and-Ibex-(Getting-started).rest (82%) diff --git a/Ibex-and-genie_python:-Getting-started.rest b/genie_python-and-Ibex-(Getting-started).rest similarity index 82% rename from Ibex-and-genie_python:-Getting-started.rest rename to genie_python-and-Ibex-(Getting-started).rest index f04f18c..f28ced9 100644 --- a/Ibex-and-genie_python:-Getting-started.rest +++ b/genie_python-and-Ibex-(Getting-started).rest @@ -27,10 +27,10 @@ You can also open a scripting terminal by running ``C:\Instrument\Apps\Python\ge - Output "Hello, world!" to the console - Calculate and output the square of all the integers between 1 and 10 -[[Solution|Ibex-and-genie_python:-Exercise-solutions]] +[[Solution|genie_python-and-Ibex-(Exercise-solutions)]] ------------------------------------------------------------------------------- -**Next**: [[Common commands|Ibex-and-genie_python:-Common-commands]] +**Next**: [[Common commands|genie_python-and-Ibex-(Common-commands)]] -**Previous**: [[Course introduction|Ibex-and-genie_python:-Introduction]] \ No newline at end of file +**Previous**: [[Course introduction|genie_python-and-Ibex-(Introduction)]] \ No newline at end of file From df538a2f28181bdc0345b7ce6a2e580485969d67 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Fri, 30 Jun 2017 13:56:43 +0100 Subject: [PATCH 0745/1813] Updated Ibex and genie_python: Common commands (rest) --- Ibex-and-genie_python:-Common-commands.rest | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Ibex-and-genie_python:-Common-commands.rest b/Ibex-and-genie_python:-Common-commands.rest index d551c7a..3c56653 100644 --- a/Ibex-and-genie_python:-Common-commands.rest +++ b/Ibex-and-genie_python:-Common-commands.rest @@ -223,11 +223,11 @@ This is just a sample of the methods available. - Decrease the value of "MY_BLOCK" down in steps of 1 until it reaches 10. Wait for 1 second between steps. Notice how the run state changes back to running when the block value drops below 10. - End the run -[[Solution|Ibex-and-genie_python:-Exercise-solutions]] +[[Solution|genie_python-and-Ibex-(Exercise-solutions)]] ------------------------------------------------------------------------------- -**Next**: [[Scripting|Ibex-and-genie_python:-Scripting]] +**Next**: [[Scripting|genie_python-and-Ibex-(Scripting)]] -**Previous**: [[Getting started|Ibex-and-genie_python:-Getting-started]] +**Previous**: [[Getting started|genie_python-and-Ibex-(Getting-started)]] From 2283d7cd05b62bf8441fa19e8e8b3760e8897d0e Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Fri, 30 Jun 2017 13:57:27 +0100 Subject: [PATCH 0746/1813] Updated Ibex and genie_python: Scripting (markdown) --- Ibex-and-genie_python:-Scripting.md | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/Ibex-and-genie_python:-Scripting.md b/Ibex-and-genie_python:-Scripting.md index d60812b..b9d0061 100644 --- a/Ibex-and-genie_python:-Scripting.md +++ b/Ibex-and-genie_python:-Scripting.md @@ -26,7 +26,7 @@ Create two empty scripts: - An **instrument** script called ``set_up_instrument.py`` - A **user** script called ``run_my_experiment.py`` -[[Solution|Ibex-and-genie_python:-Exercise-solutions]] +[[Solution|genie_python-and-Ibex-(Exercise-solutions)]] Writing scripts =============== @@ -55,7 +55,7 @@ Exercise 3b - Prints the current uamps for the current period over 10 seconds at 1 second intervals - Ends the run -[[Solution|Ibex-and-genie_python:-Exercise-solutions]] +[[Solution|genie_python-and-Ibex-(Exercise-solutions)]] Loading scripts =============== @@ -72,7 +72,7 @@ Exercise 3c - Load your user script ``run_my_experiment.py`` -[[Solution|Ibex-and-genie_python:-Exercise-solutions]] +[[Solution|genie_python-and-Ibex-(Exercise-solutions)]] Running scripts =============== @@ -93,7 +93,7 @@ Exercise 3d - Run the instrument method you wrote in exercise 3b -[[Solution|Ibex-and-genie_python:-Exercise-solutions]] +[[Solution|genie_python-and-Ibex-(Exercise-solutions)]] User scripts ------------ @@ -107,7 +107,7 @@ Exercise 3e - Run the user script method you wrote in exercise 3b -[[Solution|Ibex-and-genie_python:-Exercise-solutions]] +[[Solution|genie_python-and-Ibex-(Exercise-solutions)]] Modifying scripts ================= @@ -126,7 +126,7 @@ Exercise 3f - Reload the script - Run it again and confirm the behaviour has changed -[[Solution|Ibex-and-genie_python:-Exercise-solutions]] +[[Solution|genie_python-and-Ibex-(Exercise-solutions)]] Using functions from other files ================================ @@ -187,10 +187,10 @@ Exercise 4 - Load and run your new user-script function - Where was the print statement at the top of your instrument script executed? -[[Solution|Ibex-and-genie_python:-Exercise-solutions]] +[[Solution|genie_python-and-Ibex-(Exercise-solutions)]] ------------------------------------------------------------------------------- -**Next**: [[Converting from OpenGENIE|Ibex-and-genie_python:-Converting-from-OpenGENIE]] +**Next**: [[Converting from OpenGENIE|genie_python-and-Ibex-(Converting-from-OpenGENIE)]] -**Previous**: [[Common commands|Ibex-and-genie_python:-Common-commands]] \ No newline at end of file +**Previous**: [[Common commands|genie_python-and-Ibex-(Common-commands)]] \ No newline at end of file From a068e15055e70139bbfa4a7c3e60251f51823c3b Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Fri, 30 Jun 2017 13:57:40 +0100 Subject: [PATCH 0747/1813] Updated Ibex and genie_python: Scripting (markdown) --- ...e_python:-Scripting.md => genie_python-and-Ibex-(Scripting).md | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename Ibex-and-genie_python:-Scripting.md => genie_python-and-Ibex-(Scripting).md (100%) diff --git a/Ibex-and-genie_python:-Scripting.md b/genie_python-and-Ibex-(Scripting).md similarity index 100% rename from Ibex-and-genie_python:-Scripting.md rename to genie_python-and-Ibex-(Scripting).md From 849c6d54ef7f05bcbe06fd14026f0dce5acc9425 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Fri, 30 Jun 2017 13:57:58 +0100 Subject: [PATCH 0748/1813] Updated Ibex and genie_python: Common commands (rest) --- ...-commands.rest => Genie-Python-and-Ibex-(common-commands).rest | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename Ibex-and-genie_python:-Common-commands.rest => Genie-Python-and-Ibex-(common-commands).rest (100%) diff --git a/Ibex-and-genie_python:-Common-commands.rest b/Genie-Python-and-Ibex-(common-commands).rest similarity index 100% rename from Ibex-and-genie_python:-Common-commands.rest rename to Genie-Python-and-Ibex-(common-commands).rest From 4bcabcc1271971d970ba94204c6c84a3eb7e99af Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Fri, 30 Jun 2017 13:58:05 +0100 Subject: [PATCH 0749/1813] Updated Genie Python and Ibex (common commands) (rest) --- ...commands).rest => Genie-Python-and-Ibex-(Common-commands).rest | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename Genie-Python-and-Ibex-(common-commands).rest => Genie-Python-and-Ibex-(Common-commands).rest (100%) diff --git a/Genie-Python-and-Ibex-(common-commands).rest b/Genie-Python-and-Ibex-(Common-commands).rest similarity index 100% rename from Genie-Python-and-Ibex-(common-commands).rest rename to Genie-Python-and-Ibex-(Common-commands).rest From fccc563d042b846a55dba95196557deeb2167e52 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Fri, 30 Jun 2017 13:58:41 +0100 Subject: [PATCH 0750/1813] Updated genie_python and Ibex (Getting started) (rest) From 962794579a744f608b06bc8295aa5c50ede01221 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Fri, 30 Jun 2017 13:59:38 +0100 Subject: [PATCH 0751/1813] Updated Ibex and genie_python: Exercise solutions (rest) --- Ibex-and-genie_python:-Exercise-solutions.rest | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Ibex-and-genie_python:-Exercise-solutions.rest b/Ibex-and-genie_python:-Exercise-solutions.rest index 9bb3174..dc45b7e 100644 --- a/Ibex-and-genie_python:-Exercise-solutions.rest +++ b/Ibex-and-genie_python:-Exercise-solutions.rest @@ -1,7 +1,7 @@ Exercise 1 ========== -From [[Getting Started|Ibex-and-genie_python:-Getting-started]]. +From [[Getting Started|genie_python-and-Ibex-(Getting-started)]]. - *Open a scripting window in Ibex* @@ -27,7 +27,7 @@ From [[Getting Started|Ibex-and-genie_python:-Getting-started]]. Exercise 2 ========== -From [[Common commands|Ibex-and-genie_python:-Common-commands]] +From [[Common commands|genie_python-and-Ibex-(Common-commands)]] - *Change the title of the run to "Exercise 2"* @@ -73,7 +73,7 @@ From [[Common commands|Ibex-and-genie_python:-Common-commands]] Exercise 3 ========== -From [[Scripting|Ibex-and-genie_python:-Scripting]]. +From [[Scripting|genie_python-and-Ibex-(Scripting)]]. - *Create two empty scripts:* @@ -119,7 +119,7 @@ From [[Scripting|Ibex-and-genie_python:-Scripting]]. Exercise 4 ========== -From [[Scripting|Ibex-and-genie_python:-Scripting]]. +From [[Scripting|genie_python-and-Ibex-(Scripting)]]. - *Create a new instrument script containing a function* @@ -173,7 +173,7 @@ From [[Scripting|Ibex-and-genie_python:-Scripting]]. Exercise 5 ========== -From [[Converting from OpenGENIE|Ibex-and-genie_python:-Converting-from-OpenGENIE]]. +From [[Converting from OpenGENIE|genie_python-and-Ibex-(Converting-from-OpenGENIE)]]. - *Translate the following* ``OpenGENIE`` *script into* ``genie_python``:: From 3e625f1811afa88f77d97525a96693b277f66473 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Fri, 30 Jun 2017 14:00:19 +0100 Subject: [PATCH 0752/1813] Updated Ibex and genie_python: Converting from OpenGENIE (rest) --- Ibex-and-genie_python:-Converting-from-OpenGENIE.rest | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Ibex-and-genie_python:-Converting-from-OpenGENIE.rest b/Ibex-and-genie_python:-Converting-from-OpenGENIE.rest index bf755ee..85725a3 100644 --- a/Ibex-and-genie_python:-Converting-from-OpenGENIE.rest +++ b/Ibex-and-genie_python:-Converting-from-OpenGENIE.rest @@ -277,11 +277,11 @@ Exercise 5 - State any simplifications you've made -[[Solution|Ibex-and-genie_python:-Exercise-solutions]] +[[Solution|genie_python-and-Ibex-(Exercise-solutions)]] ------------------------------------------------------------------------------- -**Next**: [[Closing remarks|Ibex-and-genie_python:-Closing-remarks]] +**Next**: [[Closing remarks|genie_python-and-Ibex-(Closing-remarks)]] -**Previous**: [[Scripting|Ibex-and-genie_python:-Scripting]] +**Previous**: [[Scripting|genie_python-and-Ibex-(Scripting)]] \ No newline at end of file From 2aece2d88eff980b36545d20a320bb5d698ed599 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Fri, 30 Jun 2017 14:00:31 +0100 Subject: [PATCH 0753/1813] Updated Ibex and genie_python: Converting from OpenGENIE (rest) --- ...rest => genie_python-and-Ibex-(Converting-from-OpenGENIE).rest | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename Ibex-and-genie_python:-Converting-from-OpenGENIE.rest => genie_python-and-Ibex-(Converting-from-OpenGENIE).rest (100%) diff --git a/Ibex-and-genie_python:-Converting-from-OpenGENIE.rest b/genie_python-and-Ibex-(Converting-from-OpenGENIE).rest similarity index 100% rename from Ibex-and-genie_python:-Converting-from-OpenGENIE.rest rename to genie_python-and-Ibex-(Converting-from-OpenGENIE).rest From d06f0602c7ccd93bef5197d8d88f6b0618c1c2ea Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Fri, 30 Jun 2017 14:01:06 +0100 Subject: [PATCH 0754/1813] Updated Ibex and genie_python: Closing remarks (markdown) --- ...ing-remarks.md => genie_python-and-Ibex-(Closing-remarks).md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename Ibex-and-genie_python:-Closing-remarks.md => genie_python-and-Ibex-(Closing-remarks).md (73%) diff --git a/Ibex-and-genie_python:-Closing-remarks.md b/genie_python-and-Ibex-(Closing-remarks).md similarity index 73% rename from Ibex-and-genie_python:-Closing-remarks.md rename to genie_python-and-Ibex-(Closing-remarks).md index 07a5b79..63875f4 100644 --- a/Ibex-and-genie_python:-Closing-remarks.md +++ b/genie_python-and-Ibex-(Closing-remarks).md @@ -15,5 +15,5 @@ Loops ------------------------------------------------------------------------------- -**Previous**: [[Converting from OpenGENIE|Ibex-and-genie_python:-Converting-from-OpenGENIE]] +**Previous**: [[Converting from OpenGENIE|genie_python-and-Ibex-(Converting-from-OpenGENIE)]] \ No newline at end of file From cfa72f394a7c47529dcdb01df5f5917b877dbe1c Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Fri, 30 Jun 2017 14:01:32 +0100 Subject: [PATCH 0755/1813] Updated Ibex and genie_python: Exercise solutions (rest) --- ...utions.rest => genie_python-and-Ibex-(Exercise-solutions).rest | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename Ibex-and-genie_python:-Exercise-solutions.rest => genie_python-and-Ibex-(Exercise-solutions).rest (100%) diff --git a/Ibex-and-genie_python:-Exercise-solutions.rest b/genie_python-and-Ibex-(Exercise-solutions).rest similarity index 100% rename from Ibex-and-genie_python:-Exercise-solutions.rest rename to genie_python-and-Ibex-(Exercise-solutions).rest From f7039f46480d2530087637f5efab3a9b08dbd5a9 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Fri, 30 Jun 2017 14:02:33 +0100 Subject: [PATCH 0756/1813] Updated Genie Python and Ibex (Common commands) (rest) --- ...commands).rest => genie_python-and-Ibex-(Common-commands).rest | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename Genie-Python-and-Ibex-(Common-commands).rest => genie_python-and-Ibex-(Common-commands).rest (100%) diff --git a/Genie-Python-and-Ibex-(Common-commands).rest b/genie_python-and-Ibex-(Common-commands).rest similarity index 100% rename from Genie-Python-and-Ibex-(Common-commands).rest rename to genie_python-and-Ibex-(Common-commands).rest From f48d6af5febaf4f4a5307051204bca5de3fd1b5f Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Fri, 30 Jun 2017 14:02:41 +0100 Subject: [PATCH 0757/1813] Updated Genie Python and Ibex (Introduction) (rest) --- ...ntroduction).rest => genie_python-and-Ibex-(Introduction).rest | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename Genie-Python-and-Ibex-(Introduction).rest => genie_python-and-Ibex-(Introduction).rest (100%) diff --git a/Genie-Python-and-Ibex-(Introduction).rest b/genie_python-and-Ibex-(Introduction).rest similarity index 100% rename from Genie-Python-and-Ibex-(Introduction).rest rename to genie_python-and-Ibex-(Introduction).rest From ee2b57dcc918e8c4a0bca4dbcb7935d6d44339d8 Mon Sep 17 00:00:00 2001 From: AdrianPotter Date: Fri, 30 Jun 2017 14:06:42 +0100 Subject: [PATCH 0758/1813] Add script to convert genie_python course to pdf --- convert_genie_python_and_ibex_to_pdf.py | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 convert_genie_python_and_ibex_to_pdf.py diff --git a/convert_genie_python_and_ibex_to_pdf.py b/convert_genie_python_and_ibex_to_pdf.py new file mode 100644 index 0000000..e69de29 From b4b7630e45ed1d3e69ead858570dede91d6626c9 Mon Sep 17 00:00:00 2001 From: AdrianPotter Date: Fri, 30 Jun 2017 14:09:08 +0100 Subject: [PATCH 0759/1813] Move genie_python course to separate folder --- .idea/ibex_user_manual.wiki.iml | 11 + .idea/misc.xml | 4 + .idea/modules.xml | 8 + .idea/vcs.xml | 6 + .idea/workspace.xml | 217 ++++++++++++++++++ convert_genie_python_and_ibex_to_pdf.py | 28 +++ ...genie_python-and-Ibex-(Closing-remarks).md | 0 ...nie_python-and-Ibex-(Common-commands).rest | 0 ...-and-Ibex-(Converting-from-OpenGENIE).rest | 0 ..._python-and-Ibex-(Exercise-solutions).rest | 0 ...nie_python-and-Ibex-(Getting-started).rest | 0 .../genie_python-and-Ibex-(Introduction).rest | 0 .../genie_python-and-Ibex-(Scripting).md | 0 13 files changed, 274 insertions(+) create mode 100644 .idea/ibex_user_manual.wiki.iml create mode 100644 .idea/misc.xml create mode 100644 .idea/modules.xml create mode 100644 .idea/vcs.xml create mode 100644 .idea/workspace.xml rename genie_python-and-Ibex-(Closing-remarks).md => genie_python_and_ibex/genie_python-and-Ibex-(Closing-remarks).md (100%) rename genie_python-and-Ibex-(Common-commands).rest => genie_python_and_ibex/genie_python-and-Ibex-(Common-commands).rest (100%) rename genie_python-and-Ibex-(Converting-from-OpenGENIE).rest => genie_python_and_ibex/genie_python-and-Ibex-(Converting-from-OpenGENIE).rest (100%) rename genie_python-and-Ibex-(Exercise-solutions).rest => genie_python_and_ibex/genie_python-and-Ibex-(Exercise-solutions).rest (100%) rename genie_python-and-Ibex-(Getting-started).rest => genie_python_and_ibex/genie_python-and-Ibex-(Getting-started).rest (100%) rename genie_python-and-Ibex-(Introduction).rest => genie_python_and_ibex/genie_python-and-Ibex-(Introduction).rest (100%) rename genie_python-and-Ibex-(Scripting).md => genie_python_and_ibex/genie_python-and-Ibex-(Scripting).md (100%) diff --git a/.idea/ibex_user_manual.wiki.iml b/.idea/ibex_user_manual.wiki.iml new file mode 100644 index 0000000..6711606 --- /dev/null +++ b/.idea/ibex_user_manual.wiki.iml @@ -0,0 +1,11 @@ + + + + + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..e2f5a1e --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..08c4dea --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..94a25f7 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/workspace.xml b/.idea/workspace.xml new file mode 100644 index 0000000..593544e --- /dev/null +++ b/.idea/workspace.xml @@ -0,0 +1,217 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1498827913302 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/convert_genie_python_and_ibex_to_pdf.py b/convert_genie_python_and_ibex_to_pdf.py index e69de29..6e414ed 100644 --- a/convert_genie_python_and_ibex_to_pdf.py +++ b/convert_genie_python_and_ibex_to_pdf.py @@ -0,0 +1,28 @@ +import os + +from src.file_access import FileAccess +from src.local_logger import LocalLogger +from src.upgrade import Upgrade +from src.upgrade_step_from_3p2p1 import UpgradeStepFrom3p2p1 +from src.upgrade_step_noop import UpgradeStepNoOp + +# A list of upgrade step tuples tuple is name of version to apply the upgrade to and upgrade class. +# The last step should have an upgrade class of None (this is how it knows it has reached the end) +# Upgrade steps will be executed in order from the configuration set in the configuration file. +# To add a step which does nothing use UpgradeStepNoOp this is often used to get from the latest dev +# configuration to the latest production configuration +UPGRADE_STEPS = [ + ("3.2.1", UpgradeStepFrom3p2p1()), + ("3.2.1.1", None), +] + +if __name__ == "__main__": + + config_root = os.path.abspath(os.path.join(os.environ["ICPCONFIGROOT"], os.pardir)) + log_dir = os.path.join(os.environ["ICPVARDIR"], "logs", "upgrade") + + logger = LocalLogger(log_dir) + file_access = FileAccess(logger, config_root) + + upgrade = Upgrade(file_access=file_access, logger=logger, upgrade_steps=UPGRADE_STEPS) + exit(upgrade.upgrade()) diff --git a/genie_python-and-Ibex-(Closing-remarks).md b/genie_python_and_ibex/genie_python-and-Ibex-(Closing-remarks).md similarity index 100% rename from genie_python-and-Ibex-(Closing-remarks).md rename to genie_python_and_ibex/genie_python-and-Ibex-(Closing-remarks).md diff --git a/genie_python-and-Ibex-(Common-commands).rest b/genie_python_and_ibex/genie_python-and-Ibex-(Common-commands).rest similarity index 100% rename from genie_python-and-Ibex-(Common-commands).rest rename to genie_python_and_ibex/genie_python-and-Ibex-(Common-commands).rest diff --git a/genie_python-and-Ibex-(Converting-from-OpenGENIE).rest b/genie_python_and_ibex/genie_python-and-Ibex-(Converting-from-OpenGENIE).rest similarity index 100% rename from genie_python-and-Ibex-(Converting-from-OpenGENIE).rest rename to genie_python_and_ibex/genie_python-and-Ibex-(Converting-from-OpenGENIE).rest diff --git a/genie_python-and-Ibex-(Exercise-solutions).rest b/genie_python_and_ibex/genie_python-and-Ibex-(Exercise-solutions).rest similarity index 100% rename from genie_python-and-Ibex-(Exercise-solutions).rest rename to genie_python_and_ibex/genie_python-and-Ibex-(Exercise-solutions).rest diff --git a/genie_python-and-Ibex-(Getting-started).rest b/genie_python_and_ibex/genie_python-and-Ibex-(Getting-started).rest similarity index 100% rename from genie_python-and-Ibex-(Getting-started).rest rename to genie_python_and_ibex/genie_python-and-Ibex-(Getting-started).rest diff --git a/genie_python-and-Ibex-(Introduction).rest b/genie_python_and_ibex/genie_python-and-Ibex-(Introduction).rest similarity index 100% rename from genie_python-and-Ibex-(Introduction).rest rename to genie_python_and_ibex/genie_python-and-Ibex-(Introduction).rest diff --git a/genie_python-and-Ibex-(Scripting).md b/genie_python_and_ibex/genie_python-and-Ibex-(Scripting).md similarity index 100% rename from genie_python-and-Ibex-(Scripting).md rename to genie_python_and_ibex/genie_python-and-Ibex-(Scripting).md From c63bbdfe1e87dab201eeceb009301a370c07949e Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Fri, 30 Jun 2017 14:09:21 +0100 Subject: [PATCH 0760/1813] Updated genie_python and Ibex (Scripting) (markdown => rest) --- ...-Ibex-(Scripting).md => genie_python-and-Ibex-(Scripting).rest | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename genie_python_and_ibex/genie_python-and-Ibex-(Scripting).md => genie_python-and-Ibex-(Scripting).rest (100%) diff --git a/genie_python_and_ibex/genie_python-and-Ibex-(Scripting).md b/genie_python-and-Ibex-(Scripting).rest similarity index 100% rename from genie_python_and_ibex/genie_python-and-Ibex-(Scripting).md rename to genie_python-and-Ibex-(Scripting).rest From 6fbc5365396a7eb252e0c5eb2c83cccc9ee7410a Mon Sep 17 00:00:00 2001 From: AdrianPotter Date: Fri, 30 Jun 2017 14:09:49 +0100 Subject: [PATCH 0761/1813] Move genie_python course to separate folder --- .../convert_genie_python_and_ibex_to_pdf.py | 0 .../genie_python-and-Ibex-(Scripting).rest | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename convert_genie_python_and_ibex_to_pdf.py => genie_python_and_ibex/convert_genie_python_and_ibex_to_pdf.py (100%) rename genie_python-and-Ibex-(Scripting).rest => genie_python_and_ibex/genie_python-and-Ibex-(Scripting).rest (100%) diff --git a/convert_genie_python_and_ibex_to_pdf.py b/genie_python_and_ibex/convert_genie_python_and_ibex_to_pdf.py similarity index 100% rename from convert_genie_python_and_ibex_to_pdf.py rename to genie_python_and_ibex/convert_genie_python_and_ibex_to_pdf.py diff --git a/genie_python-and-Ibex-(Scripting).rest b/genie_python_and_ibex/genie_python-and-Ibex-(Scripting).rest similarity index 100% rename from genie_python-and-Ibex-(Scripting).rest rename to genie_python_and_ibex/genie_python-and-Ibex-(Scripting).rest From 15c80de856bc78ef2281437c052b9d0fb7677f89 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Fri, 30 Jun 2017 14:50:56 +0100 Subject: [PATCH 0762/1813] Updated genie_python and Ibex (Closing remarks) (markdown => rest) --- ...ng-remarks).md => genie_python-and-Ibex-(Closing-remarks).rest | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename genie_python_and_ibex/genie_python-and-Ibex-(Closing-remarks).md => genie_python-and-Ibex-(Closing-remarks).rest (100%) diff --git a/genie_python_and_ibex/genie_python-and-Ibex-(Closing-remarks).md b/genie_python-and-Ibex-(Closing-remarks).rest similarity index 100% rename from genie_python_and_ibex/genie_python-and-Ibex-(Closing-remarks).md rename to genie_python-and-Ibex-(Closing-remarks).rest From ad34bac06433629dbc8d2380a0fd9adf58a7c960 Mon Sep 17 00:00:00 2001 From: AdrianPotter Date: Fri, 30 Jun 2017 14:51:43 +0100 Subject: [PATCH 0763/1813] Move genie_python course to separate folder --- .idea/workspace.xml | 60 ++++++++++-- .../convert_genie_python_and_ibex_to_pdf.py | 91 ++++++++++++++----- ...nie_python-and-Ibex-(Closing-remarks).rest | 0 3 files changed, 123 insertions(+), 28 deletions(-) rename genie_python-and-Ibex-(Closing-remarks).rest => genie_python_and_ibex/genie_python-and-Ibex-(Closing-remarks).rest (100%) diff --git a/.idea/workspace.xml b/.idea/workspace.xml index 593544e..19129c8 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -2,7 +2,7 @@ - + Hc#i3y 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 yQP0B1HSL^-QFJgzclsS?HpU+e#-|}vS@ Date: Fri, 30 Jun 2017 16:29:47 +0100 Subject: [PATCH 0777/1813] Updated genie_python and Ibex (Common commands) (rest) --- .../genie_python-and-Ibex-(Common-commands).rest | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/genie_python_and_ibex/genie_python-and-Ibex-(Common-commands).rest b/genie_python_and_ibex/genie_python-and-Ibex-(Common-commands).rest index 10430c7..907ade1 100644 --- a/genie_python_and_ibex/genie_python-and-Ibex-(Common-commands).rest +++ b/genie_python_and_ibex/genie_python-and-Ibex-(Common-commands).rest @@ -3,7 +3,7 @@ Accessing ``genie_python`` commands From an Ibex scripting terminal, ``genie_python`` commands can be accessed via the ``g`` namespace. For example: ``g.get_version()`` -You should have noticed immediately after you typed ``g.`` that an autocomplete window appeared: +You should have noticed immediately after you typed ``g.`` that an auto-complete window appeared: .. image:: genie_python_and_ibex/AutoCompleteWindowBasic.png From 57e70695e5da28e0bf2d1c765b7affecf4ccde9f Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Fri, 30 Jun 2017 16:30:37 +0100 Subject: [PATCH 0778/1813] Updated genie_python and Ibex (Common commands) (rest) --- .../genie_python-and-Ibex-(Common-commands).rest | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/genie_python_and_ibex/genie_python-and-Ibex-(Common-commands).rest b/genie_python_and_ibex/genie_python-and-Ibex-(Common-commands).rest index 907ade1..91b099f 100644 --- a/genie_python_and_ibex/genie_python-and-Ibex-(Common-commands).rest +++ b/genie_python_and_ibex/genie_python-and-Ibex-(Common-commands).rest @@ -7,7 +7,7 @@ You should have noticed immediately after you typed ``g.`` that an auto-complete .. image:: genie_python_and_ibex/AutoCompleteWindowBasic.png -The window lists the available commands, and the arguments they take in brackets. You also notice that a description of the highlighted functions and its arguments is also given. The list will be refined as you type more characters. +The window lists the available commands, and the arguments they take, in brackets. A description of the highlighted functions and its arguments is also given. The list will be refined as you type more characters. Passing arguments to commands @@ -15,7 +15,7 @@ Passing arguments to commands Arguments are passed to functions using standard Python syntax. You should already be somewhat familiar with this but here is a quick recap: -- Arguments are passed to functions as a comma separated list within brackets. For example ``g.add_spectrum(1, 2)`` +- Arguments are passed to functions as a comma-separated list within brackets. For example ``g.add_spectrum(1, 2)`` - Arguments may be named or not. For example ``g.add_spectrum(spectrum=1, period=2)`` - Named and un-named arguments can be mixed but the named arguments must appear last. For example ``g.add_spectrum(1, period=2)`` - Named arguments will be interpreted in the order of the function definition. Un-named arguments can be in any order. So ``g.add_spectrum(period=2, spectrum=1)`` would be valid but ``g.add_spectrum(2, spectrum=1)`` would not. From 3d0b96a3f9c2db1272cd6a9b878b14cdccf6e915 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Fri, 30 Jun 2017 16:31:32 +0100 Subject: [PATCH 0779/1813] Updated genie_python and Ibex (Common commands) (rest) From 438a646222efed8e41c050394540f892a0c6865f Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Fri, 30 Jun 2017 16:33:02 +0100 Subject: [PATCH 0780/1813] Updated genie_python and Ibex (Common commands) (rest) --- .../genie_python-and-Ibex-(Common-commands).rest | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/genie_python_and_ibex/genie_python-and-Ibex-(Common-commands).rest b/genie_python_and_ibex/genie_python-and-Ibex-(Common-commands).rest index 91b099f..1ae53a8 100644 --- a/genie_python_and_ibex/genie_python-and-Ibex-(Common-commands).rest +++ b/genie_python_and_ibex/genie_python-and-Ibex-(Common-commands).rest @@ -41,11 +41,11 @@ Switch run states - ``end``: Ends the current run - ``abort``: Aborts the current run -Each of the commands above accepts an optional ``boolean`` parameter. Setting it to ``True`` (e.g. ``g.begin(True)``) will give extra output from the DAE. The default is non-verbose output. You can get the current state with: +You can get the current state with: - ``get_runstate``: Gets the states of the current run -**WARNING**: Switching states may not always lead to the assumed state. For example, you may run "g.begin()" and then expect the instrument to be running. It could be, but it could also be waiting, vetoing, or still setup. It's a good idea to put checks into your scripts that you've reached the expected state before continuing. +**WARNING**: Be careful not to assume the resultant state when using these commands. For example, you may run ``g.begin()`` and then expect the instrument to be running. That may be true, but it could also be waiting, vetoing, or still setup. It's a good idea to put checks into your scripts that you've reached the expected state. Waiting for conditions ----------------------- From 2df974022c2c3e9bc1b9f07a8dc3bb9abb5e89ca Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Fri, 30 Jun 2017 16:33:22 +0100 Subject: [PATCH 0781/1813] Updated genie_python and Ibex (Common commands) (rest) --- .../genie_python-and-Ibex-(Common-commands).rest | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/genie_python_and_ibex/genie_python-and-Ibex-(Common-commands).rest b/genie_python_and_ibex/genie_python-and-Ibex-(Common-commands).rest index 1ae53a8..5fb53ad 100644 --- a/genie_python_and_ibex/genie_python-and-Ibex-(Common-commands).rest +++ b/genie_python_and_ibex/genie_python-and-Ibex-(Common-commands).rest @@ -47,8 +47,8 @@ You can get the current state with: **WARNING**: Be careful not to assume the resultant state when using these commands. For example, you may run ``g.begin()`` and then expect the instrument to be running. That may be true, but it could also be waiting, vetoing, or still setup. It's a good idea to put checks into your scripts that you've reached the expected state. -Waiting for conditions ------------------------ +Waiting +------- If you want to wait for a specific event before executing an action, you can use a ``waitfor`` command: From c4074ad1f301ab698ef230f33f28d58806d412da Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Fri, 30 Jun 2017 16:34:15 +0100 Subject: [PATCH 0782/1813] Updated genie_python and Ibex (Common commands) (rest) --- .../genie_python-and-Ibex-(Common-commands).rest | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/genie_python_and_ibex/genie_python-and-Ibex-(Common-commands).rest b/genie_python_and_ibex/genie_python-and-Ibex-(Common-commands).rest index 5fb53ad..81a9a85 100644 --- a/genie_python_and_ibex/genie_python-and-Ibex-(Common-commands).rest +++ b/genie_python_and_ibex/genie_python-and-Ibex-(Common-commands).rest @@ -67,7 +67,7 @@ Many ``waitfor`` arguments also have a standalone function, so as to retain equi One special ``waitfor`` function is: -- ``waitfor_move``: Waits for all motors, or a specific motor to finish moving +- ``waitfor_move``: Waits for all motors, or a specific motor, to finish moving Update and store ------------------ From 1a97fbd8fecb2840735f5ea797f89ae96c03b67a Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Fri, 30 Jun 2017 16:34:40 +0100 Subject: [PATCH 0783/1813] Updated genie_python and Ibex (Common commands) (rest) --- .../genie_python-and-Ibex-(Common-commands).rest | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/genie_python_and_ibex/genie_python-and-Ibex-(Common-commands).rest b/genie_python_and_ibex/genie_python-and-Ibex-(Common-commands).rest index 81a9a85..650b387 100644 --- a/genie_python_and_ibex/genie_python-and-Ibex-(Common-commands).rest +++ b/genie_python_and_ibex/genie_python-and-Ibex-(Common-commands).rest @@ -78,8 +78,8 @@ You can update and store DAE results using: - ``store``: Write the updated DAE information to disk - ``updatestore``: Load the data from the DAE into memory and store it to disk -Worked example: Try it yourself! --------------------------------- +Worked example +-------------- The following script will begin and run, then stop it once it reaches a running state:: From c2508f42e8c07847839c8c78bfb6c5a992fca1b0 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Fri, 30 Jun 2017 16:35:15 +0100 Subject: [PATCH 0784/1813] Updated genie_python and Ibex (Common commands) (rest) --- .../genie_python-and-Ibex-(Common-commands).rest | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/genie_python_and_ibex/genie_python-and-Ibex-(Common-commands).rest b/genie_python_and_ibex/genie_python-and-Ibex-(Common-commands).rest index 650b387..9279de4 100644 --- a/genie_python_and_ibex/genie_python-and-Ibex-(Common-commands).rest +++ b/genie_python_and_ibex/genie_python-and-Ibex-(Common-commands).rest @@ -140,8 +140,8 @@ Blocks - Example: ``g.cset("MY_BLOCK", lowlimit=1, highlimit=10, runcontrol=True)`` -Worked example: Try it yourself! --------------------------------- +Worked example +---------------- The following script scans a block between its upper and lower limit:: From 7dca69a76b2c0cc568707d9d1a88e1de1046e8c1 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Fri, 30 Jun 2017 16:36:21 +0100 Subject: [PATCH 0785/1813] Updated genie_python and Ibex (Common commands) (rest) --- .../genie_python-and-Ibex-(Common-commands).rest | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/genie_python_and_ibex/genie_python-and-Ibex-(Common-commands).rest b/genie_python_and_ibex/genie_python-and-Ibex-(Common-commands).rest index 9279de4..d94ead3 100644 --- a/genie_python_and_ibex/genie_python-and-Ibex-(Common-commands).rest +++ b/genie_python_and_ibex/genie_python-and-Ibex-(Common-commands).rest @@ -198,14 +198,12 @@ You can change various experiment details with the ``change`` command. As with t - Example: ``g.change(rb=10)`` - Example: ``g.change(title="New title", user="Adrian and John")`` -As with ``waitfor``, there are also standalone commands for these properties, as well as others: +As with ``waitfor``, there are also standalone commands for many properties. For example: - ``change_user``: Change the current user - ``change_title``: Change the current title - ``change_rb``: Change the current RB number -This is just a sample of the methods available. - **Exercise 2** ============== From 09b2c15d284d7f4e3b2169956ae5de2a7a9cff2b Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Fri, 30 Jun 2017 16:36:38 +0100 Subject: [PATCH 0786/1813] Updated genie_python and Ibex (Common commands) (rest) --- .../genie_python-and-Ibex-(Common-commands).rest | 1 + 1 file changed, 1 insertion(+) diff --git a/genie_python_and_ibex/genie_python-and-Ibex-(Common-commands).rest b/genie_python_and_ibex/genie_python-and-Ibex-(Common-commands).rest index d94ead3..035a2d4 100644 --- a/genie_python_and_ibex/genie_python-and-Ibex-(Common-commands).rest +++ b/genie_python_and_ibex/genie_python-and-Ibex-(Common-commands).rest @@ -207,6 +207,7 @@ As with ``waitfor``, there are also standalone commands for many properties. For **Exercise 2** ============== + - This exercise requires that: - You have permission to begin and end runs on the instrument you're using. From 3f9823f870c23b16f6c6f34dc86043e063e421a2 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Fri, 30 Jun 2017 16:38:41 +0100 Subject: [PATCH 0787/1813] Updated genie_python and Ibex (Exercise solutions) (rest) --- ...enie_python-and-Ibex-(Exercise-solutions).rest | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) diff --git a/genie_python_and_ibex/genie_python-and-Ibex-(Exercise-solutions).rest b/genie_python_and_ibex/genie_python-and-Ibex-(Exercise-solutions).rest index 66c5c30..6123bce 100644 --- a/genie_python_and_ibex/genie_python-and-Ibex-(Exercise-solutions).rest +++ b/genie_python_and_ibex/genie_python-and-Ibex-(Exercise-solutions).rest @@ -22,27 +22,22 @@ Exercise 2 From [[Common commands|genie_python-and-Ibex-(Common-commands)]] -- *Change the title of the run to "Exercise 2"* - - - Use either ``g.change_title("Exercise 2")`` or ``g.change(title="Exercise 2")`` - -- *Start a run and wait for 1 uamps (maximum wait 10 seconds) before pausing*:: +- Use either ``g.change_title("Exercise 2")`` or ``g.change(title="Exercise 2")`` to change the title +- The following code will start the run, wait, and then pause:: g.begin() g.waitfor(uamps=1, max_wait=10) g.pause() -- *Set the value of "MY_BLOCK" to 5, with a high limit of 10, a low limit of 1 and put it under run control*:: +- This code sets the value, run control, and limits on "MY_BLOCK". Your code may look slightly different depending how you've chosen to pass in the arguments:: g.cset("MY_BLOCK", 5, lowlimit=1, highlimit=10, runcontrol=True) - - The arguments may be named or un-named. If named, the ordering may differ, but named arguments must appear after un-named arguments for Python to accept the method call - -- *Resume the run*:: +- The following resumes the run:: g.resume() -- *Set the value of "MY_BLOCK" to 20 and confirm (using ``genie_python``) that the instrument has entered a waiting state*:: +- This code will set the block value and check the subsequent state:: # Can use either way of specifying cset for a single block g.cset(MY_BLOCK=20) From 9e5020b18ef05ff394c0aa3b66f05594d55acc8c Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Fri, 30 Jun 2017 16:40:03 +0100 Subject: [PATCH 0788/1813] Updated genie_python and Ibex (Exercise solutions) (rest) --- .../genie_python-and-Ibex-(Exercise-solutions).rest | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/genie_python_and_ibex/genie_python-and-Ibex-(Exercise-solutions).rest b/genie_python_and_ibex/genie_python-and-Ibex-(Exercise-solutions).rest index 6123bce..a342f4b 100644 --- a/genie_python_and_ibex/genie_python-and-Ibex-(Exercise-solutions).rest +++ b/genie_python_and_ibex/genie_python-and-Ibex-(Exercise-solutions).rest @@ -48,13 +48,13 @@ From [[Common commands|genie_python-and-Ibex-(Common-commands)]] else: print "The instrument is not waiting" -- *Decrease the value of "MY_BLOCK" down in steps of 1 until it reaches 5. Wait for 1 second between steps. Notice how the run state changes back to running when the block value drops below 10*:: +- The following code will scan the block from its original value down to 4. It assumes the initial value is greater than 4:: for i in range(g.cget("MY_BLOCK")['value'], 4, -1): g.cset(MY_BLOCK=i) g.waitfor(seconds=1) -- *End the run*:: +- This function will end the run:: g.end() From 34266da2dde45204143114aa66a20e25c3d586fa Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Fri, 30 Jun 2017 16:41:24 +0100 Subject: [PATCH 0789/1813] Updated genie_python and Ibex (Scripting) (rest) --- genie_python_and_ibex/genie_python-and-Ibex-(Scripting).rest | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/genie_python_and_ibex/genie_python-and-Ibex-(Scripting).rest b/genie_python_and_ibex/genie_python-and-Ibex-(Scripting).rest index b9d0061..040e27d 100644 --- a/genie_python_and_ibex/genie_python-and-Ibex-(Scripting).rest +++ b/genie_python_and_ibex/genie_python-and-Ibex-(Scripting).rest @@ -15,8 +15,8 @@ We generally classify scripts as: **NOTE**: Ibex puts all configurations and **Instrument scripts** under version control. That means if you change or delete them and want to restore a previous version, you can. The same isn't true for user scripts. -- Instrument scripts are placed in the folder: ``C:\Instrument\Settings\config\NDX[Instrument name]\Python\inst`` -- User scripts are placed in the folder: ``C:\scripts`` +- Instrument scripts are located in: ``C:\Instrument\Settings\config\NDX[Instrument name]\Python\inst`` +- User scripts are located in: ``C:\scripts`` Exercise 3a ----------- From 82f8a023c91cb244778d5bfb1454c3c6d0d0fea4 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Fri, 30 Jun 2017 16:43:01 +0100 Subject: [PATCH 0790/1813] Updated genie_python and Ibex (Scripting) (rest) --- genie_python_and_ibex/genie_python-and-Ibex-(Scripting).rest | 2 -- 1 file changed, 2 deletions(-) diff --git a/genie_python_and_ibex/genie_python-and-Ibex-(Scripting).rest b/genie_python_and_ibex/genie_python-and-Ibex-(Scripting).rest index 040e27d..1360097 100644 --- a/genie_python_and_ibex/genie_python-and-Ibex-(Scripting).rest +++ b/genie_python_and_ibex/genie_python-and-Ibex-(Scripting).rest @@ -77,8 +77,6 @@ Exercise 3c Running scripts =============== -Remember, scripts are executed when they are loaded. Functions will be loaded immediately, but will only be run when you call them as described below. - Instrument scripts ------------------ From e1db0a5e12c2387b5d63dc17ca3c45eb29973617 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Fri, 30 Jun 2017 16:43:45 +0100 Subject: [PATCH 0791/1813] Updated genie_python and Ibex (Scripting) (rest) --- genie_python_and_ibex/genie_python-and-Ibex-(Scripting).rest | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/genie_python_and_ibex/genie_python-and-Ibex-(Scripting).rest b/genie_python_and_ibex/genie_python-and-Ibex-(Scripting).rest index 1360097..8176806 100644 --- a/genie_python_and_ibex/genie_python-and-Ibex-(Scripting).rest +++ b/genie_python_and_ibex/genie_python-and-Ibex-(Scripting).rest @@ -70,7 +70,7 @@ Once you've created your scripts, you need to make sure they're available to use Exercise 3c ----------- -- Load your user script ``run_my_experiment.py`` +Load your user script ``run_my_experiment.py`` [[Solution|genie_python-and-Ibex-(Exercise-solutions)]] @@ -89,7 +89,7 @@ As with ``genie_python`` commands, the Ibex scripting perspective will provide a Exercise 3d ----------- -- Run the instrument method you wrote in exercise 3b +Run the instrument method you wrote in exercise 3b [[Solution|genie_python-and-Ibex-(Exercise-solutions)]] From d86b4059795f8db4ac4e4cc21ba7aadbc9562553 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Fri, 30 Jun 2017 16:44:37 +0100 Subject: [PATCH 0792/1813] Updated genie_python and Ibex (Scripting) (rest) --- genie_python_and_ibex/genie_python-and-Ibex-(Scripting).rest | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/genie_python_and_ibex/genie_python-and-Ibex-(Scripting).rest b/genie_python_and_ibex/genie_python-and-Ibex-(Scripting).rest index 8176806..955ef75 100644 --- a/genie_python_and_ibex/genie_python-and-Ibex-(Scripting).rest +++ b/genie_python_and_ibex/genie_python-and-Ibex-(Scripting).rest @@ -98,7 +98,8 @@ User scripts Functions loaded from user scripts using the ``g.load_script(...)`` command will be available to call like any other user-defined function. For example, if I defined a function ``my_function``:: - Code example + g.load_script("my_script_file.py") + my_function() Exercise 3e ----------- From 9ab929e486dcdd24f2a1a889419583588d5d0923 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Fri, 30 Jun 2017 16:44:55 +0100 Subject: [PATCH 0793/1813] Updated genie_python and Ibex (Scripting) (rest) --- genie_python_and_ibex/genie_python-and-Ibex-(Scripting).rest | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/genie_python_and_ibex/genie_python-and-Ibex-(Scripting).rest b/genie_python_and_ibex/genie_python-and-Ibex-(Scripting).rest index 955ef75..c8e6a05 100644 --- a/genie_python_and_ibex/genie_python-and-Ibex-(Scripting).rest +++ b/genie_python_and_ibex/genie_python-and-Ibex-(Scripting).rest @@ -104,7 +104,7 @@ Functions loaded from user scripts using the ``g.load_script(...)`` command will Exercise 3e ----------- -- Run the user script method you wrote in exercise 3b +Run the user script method you wrote in exercise 3b [[Solution|genie_python-and-Ibex-(Exercise-solutions)]] From d74b7d0972b5059c39ff5a40a86733978c6ad404 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Fri, 30 Jun 2017 16:46:00 +0100 Subject: [PATCH 0794/1813] Updated genie_python and Ibex (Scripting) (rest) --- genie_python_and_ibex/genie_python-and-Ibex-(Scripting).rest | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/genie_python_and_ibex/genie_python-and-Ibex-(Scripting).rest b/genie_python_and_ibex/genie_python-and-Ibex-(Scripting).rest index c8e6a05..b171eeb 100644 --- a/genie_python_and_ibex/genie_python-and-Ibex-(Scripting).rest +++ b/genie_python_and_ibex/genie_python-and-Ibex-(Scripting).rest @@ -130,7 +130,7 @@ Exercise 3f Using functions from other files ================================ -You may find yourself wanting to call a function from one file in another file. +You may want to call a function from one file in another file. Calling an instrument function from a different instrument script ----------------------------------------------------------------- From 4bb5857d6e969dd16cd3f2a0bfba05d3e141bfa4 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Fri, 30 Jun 2017 16:47:38 +0100 Subject: [PATCH 0795/1813] Updated genie_python and Ibex (Scripting) (rest) --- .../genie_python-and-Ibex-(Scripting).rest | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/genie_python_and_ibex/genie_python-and-Ibex-(Scripting).rest b/genie_python_and_ibex/genie_python-and-Ibex-(Scripting).rest index b171eeb..33dde70 100644 --- a/genie_python_and_ibex/genie_python-and-Ibex-(Scripting).rest +++ b/genie_python_and_ibex/genie_python-and-Ibex-(Scripting).rest @@ -135,9 +135,7 @@ You may want to call a function from one file in another file. Calling an instrument function from a different instrument script ----------------------------------------------------------------- -It is recommended that you ``import`` it using standard Python rather than trying to call it with the ``inst.`` prefix. As you don't know the order in which the scripts are loaded, this avoids potential errors in the load order. It also helps to prevent circular dependencies. - -For example, if I have one instrument script, ``counts.py``:: +It is recommended that you ``import`` it using standard Python rather than trying to call it with the ``inst.`` because you don't know the order in which the scripts are loaded. For example, if I have one instrument script, ``counts.py``:: def vanadium(title, duration): g.change(title=title) @@ -165,7 +163,7 @@ This is feasible, but generally not recommended. The user script won't be kept i Calling a user function from a different user script ---------------------------------------------------- -Exactly the same as calling a function in one instrument script from another +The same as calling a function in one instrument script from another. Exercise 4 From 870c88394aeae44338200e8880ee19ba31f64c38 Mon Sep 17 00:00:00 2001 From: Adrian Potter Date: Fri, 30 Jun 2017 16:58:31 +0100 Subject: [PATCH 0796/1813] Updated genie_python and Ibex (Exercise solutions) (rest) --- ..._python-and-Ibex-(Exercise-solutions).rest | 96 +++---------------- 1 file changed, 13 insertions(+), 83 deletions(-) diff --git a/genie_python_and_ibex/genie_python-and-Ibex-(Exercise-solutions).rest b/genie_python_and_ibex/genie_python-and-Ibex-(Exercise-solutions).rest index a342f4b..82ae6e7 100644 --- a/genie_python_and_ibex/genie_python-and-Ibex-(Exercise-solutions).rest +++ b/genie_python_and_ibex/genie_python-and-Ibex-(Exercise-solutions).rest @@ -63,26 +63,14 @@ Exercise 3 From [[Scripting|genie_python-and-Ibex-(Scripting)]]. -- *Create two empty scripts:* +- After creating the files, you should have one new file in ``C:\scripts`` and another in ``C:\Instrument\Settings\config\[Instrument name]\Python\inst`` - - *An instrument script called ``set_up_instrument.py``* - - *A user script called ``run_my_experiment.py``* - - **PUT IMAGES OF THE TWO FOLDERS HERE** - -- *Update your instrument script, ``set_up_instrument.py``, so that it contains a single function* - - - *The function should be called "set_up_instrument"* - - *It should set the title to "My experiment"* - - *It should set the username to your name*:: +- The function in ``set_up_instrument.py`` should look something like this:: def set_up_instrument(): g.change(title="My experiment", user="Adrian") -- *Update your user script, ``run_my_experiment.py`` which contains a function that does the following* - - - *Begins the run* - - *Prints the current uamps for the current period over 10 seconds at 1 second intervals* - - *Ends the run*:: +- The function in ``run_my_experiment.py`` should look something like this:: def get_uamps_run(): g.begin() @@ -92,30 +80,18 @@ From [[Scripting|genie_python-and-Ibex-(Scripting)]]. print "Total current after {0}s: {1}.format(i+1, g.get_uamps(period)) g.end() -- *Load your user script ``run_my_experiment.py``* - - - Run something like this in the scripting perspective: ``g.load_script("C:\scripts\run_my_experiment.py")`` - -- *Run the instrument method you wrote in exercise 3b* +- This will load the user script: ``g.load_script("run_my_experiment.py")`` - - Run something like this in the scripting perspective: ``inst.set_up_instrument()`` +- This will run the instrument script: ``inst.set_up_instrument()`` -- *Run the user script method you wrote in exercise 3b* - - - Run something like this in the scripting perspective: ``get_uamps_run()`` +- This will run the function from the user script ``get_uamps_run()`` Exercise 4 ========== From [[Scripting|genie_python-and-Ibex-(Scripting)]]. -- *Create a new instrument script containing a function* - - - You should create a Python file in "C:\Instrument\Settings\config\[Machine name]\Python\inst" - - - *The function sets the title to "Ramping [block name] from [initial value] to [final value]"* - - *The method begins a run and then changes the value of the block incrementally in steps of size 1* - - *Once the target is reached, the method ends the run*:: +- You should have created a Python file in ``C:\Instrument\Settings\config\[Machine name]\Python\inst`` that contains something like the following:: def ramp(block, target): try: @@ -134,77 +110,31 @@ From [[Scripting|genie_python-and-Ibex-(Scripting)]]. finally: g.end() -- *Put a line at the top of your instrument script outside the function definition that prints the current title*:: +- Once you add the line to output the current title, the top of your file should look like this:: print g.get_title() def ramp(block, target): ... -- *Create a new user script containing a function that runs the new instrument function on two different blocks*:: +- This user-defined function will ramp the two blocks using the instrument function:: def ramp_two_blocks(): for block, target in [("MY_BLOCK", 10), ("MY_OTHER_BLOCK", -10)]: inst.ramp(block, target) -- *Load and run your new user-script function* - - - From a scripting perspective, assuming the file is called "ramp_blocks.py", run the following:: +- To load the user script, assuming the file is called "ramp_blocks.py", run the following from the scripting perspective:: g.load_script("C:\scripts\ramp_blocks.py") ramp_two_blocks() -- *Where was the print statement at the top of your instrument script executed?* - - - You should have seen the current title printed during the initialisation of the scripting window - - **PUT AN IMAGE HERE** +- You should have seen the current title printed during the initialisation of the scripting window Exercise 5 ========== From [[Converting from OpenGENIE|genie_python-and-Ibex-(Converting-from-OpenGENIE)]]. -- *Translate the following* ``OpenGENIE`` *script into* ``genie_python``:: - - PROCEDURE Scan - LOCAL i setpoint max min start step_size title nframes nimages multip - - max = 200.0 - min = 100.0 - - setpoint = 0.0 - start = -100.0 - setpoint = start - nframes = 10000 - nimages = 100 - - step_size = 20.0 - - LOOP i FROM 1 TO nimages - - setpoint = setpoint + step_size - multip = As_Integer(setpoint/360) - setpoint = setpoint - 360*multip - PRINTN "New angle is: " + as_string(setpoint) - - IF (setpoint>=min) OR (setpoint<=max) - - tempTitle="Image "+as_string(i)+", "+as_string(setpoint)+" degrees" - CHANGE TITLE=tempTitle - - cset POSITION=setpoint - waitformove - PRINTN "Move complete. Counting for " + As_String(nframes) + " frames" - BEGIN - WAITFOR frames=nframes - END - ELSE - PRINTIN "Not in interval " +As_String(min)+ "<=" As_String(setpoint)+ " >= " +As_String(max) - ENDIF - - ENDLOOP - ENDPROCEDURE - -- In ``genie_python`` this could be written as:: +- In ``genie_python``, the ``OpenGENIE`` procedure could be written as:: def scan(start=-100, min=100, max=200, step_size=20, nframes=10000, nimages=100): for i in range(1, nimages): @@ -223,7 +153,7 @@ From [[Converting from OpenGENIE|genie_python-and-Ibex-(Converting-from-OpenGENI else: print "Not in interval {1}<={0}<={2}".format(setpoint, min, max)" -- *State any simplifications you've made* +- We've made the following simplifications: - We've put the key variables as defaulted input arguments. This allows for maximal flexibility. In reality, which variables we put as arguments and which we default will depend on context. It's not recommended to put everything as an argument and always provide defaults - We've taken advantage of several pieces of Python syntax to simplify the logic From 44b2b9b1e670695443171f02f3eed7ee5fd922bc Mon Sep 17 00:00:00 2001 From: AdrianPotter Date: Fri, 30 Jun 2017 17:04:05 +0100 Subject: [PATCH 0797/1813] Correct some translation errors --- .idea/workspace.xml | 9 ++++----- .../AutoCompleteWindowBasic.png | Bin 18652 -> 36533 bytes .../StandardStartupOutputOnDemo.png | Bin 29909 -> 17095 bytes .../convert_genie_python_and_ibex_to_pdf.py | 4 ++++ 4 files changed, 8 insertions(+), 5 deletions(-) diff --git a/.idea/workspace.xml b/.idea/workspace.xml index e36561d..ce69ac8 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -2,7 +2,6 @@ -

3}b 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±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%0D+!0VK#U_&au z`xwLc?z4Xmhs1CYryqHFZC(7CUGvxpBFV+%;~_>}V7C~0)}x;cM-V;2Pb-}(a zeu>my`BvPY?(Z}b_9|>CN`?#(3lH7~>-;fX-btuXtx8=l?|d`n0G>JQ$G9PgNgQ*G zc>NNu#r(KGq;~6oi;VtsLKrX;gnc84$4rSu{(9Jbd`)HbHKKFl&Nl(xjhE2O=^20S z=%7U0hKH!`PWrXYGPnmWSwGrgpljfcy*|R67k--%dC#L$bpg9joOO=!N9<_YmzJW@ zHX9V7q5+6kHg7;VK)Hw}F-2%$yN~MMfdA@^>$?G~N{GJy>aHBe0Hhgu;@`ti|0WH3 z@j#lPG=;76uO+1tC>xrhf9v=UaEt)~j=BdtcK+D)oCyRGzCJE7WpKDfVAt zVDD~NtU0t{U(swn)IaznG%W7~Q!GJU>P5eAaUF4x)Qb9fo-09i+PNKT~Occ>XDUYraELs(a;45&xevrMS$OllnY7~Qje zTnkvv>#r}4A(`Yd6S_zbt)mw96r74N>?I@e8^jtfhnq(O>Q2`Jzo|I|v!MV-WICZ0 zBV}wLz&gn~392*1y7$qo0;E(y76$|EnS9eJp)-_a=?~d^>AvP!YnbHyCCYYJB6kPB z&=N`?G(gNW#*b^?p%=gA%G8&0t|zS$CaO7{TiwT0E~ja0Huw+PA0dAoD=fL1K_h1a zQJ?xJt_ktdC_vQ|#M+3MZpST?xrOfe$D7fLpq40GpqQ&^ve8e^HI1HwE^;TZ0mxza z617D!+*v!bWv|?@sOk_VC1lM7mGU=Nx9ir-rka?Liuc1(caAScvqt@W zg&GpPvPQz^jgH#(R{RQ+HvdXMnt$igDQyPGfD`0G0K3!R_SnXEi+q1U&`_kZxE0!>nq|mT;OQvryV*}DFn4s$2xzE>XB2%+=>2tY3ZNk;iNWA$l{4Xv&G@-2G~AAP#%t%%^KMw)YmPt6UgX3{wkg!Hc0}o)rWBLSeQ<--jOzhK(X~>uDa9|#GWEd zr*bFjp9yL$80QVZwGD7fDE85;25QB@7By!CU#5W$A4^oSzgn|^VWbnq9gl$=40rl- z2vFC~-mU{qnzKaBkj-k=3jmp^!`ie&qA{n!#G% zaaVI9&4RZryQEMS`mEqr%A)c%6r;UqKY(a1)VG`?~u^^K+#^S!iTj;K2uLu^4mEI}s7Imhw-(BghF0!b!PJVS(4_7Q<{O-q8<>pO^5T%|7y zxHr;XgT(tNA7btvKgKBBHC6NsVzgbx@3AZspY5}ogGrw=;!7}a5F(B*dsjFRSJ;$Un6Gm&6S4I0kHS}C2+x<)ClU-HVGBs2no(f115GB) z4dYPk+SLM?#`$7s_z+hiJ1KiPHfOun4Ff;1WNc&Yf(+L<-pp3Be{|^ENxSqM=ak?Y zaZ)RZ)0YGzh@JVCmy@5UimFC8=rQ#6j>T^PmeI1^*Su z|3Dv(<0*j-)Kkn14tduMiUZWX{bLGf`RH}St|8_CArsDbL<6v->ijfjlu>kqnTp(X z-zIL8!D|7Ty%|Zmk&OlVXbjKo;Gay~>X{GFUYyZHf-3F0e6O+I4^E&u2jP3ArTL`r zu=;^4Q|UxB?I_^zJ`l|n)yU^g4DjE!UEn5aKmVzX_5*EuFJ@esZwBKo|fcz^7bDo2K32dvm1@E*I_H3YFfCd|A?eCo>$N`NqbPZhpywD)w)lsrpmWY}O7y2yfGYKl{oXl9tIWvW_{c2^W~unLH5LJ{4y3NitO!d0z-cx4YaWXcAt)?7d^I*7 zQL~|AcSqyY8xKAInnUt_l#vLLp@+7#=BMC9GdodaNCCP%q!6K*4TFmuc@}9rhHCeS zdP&H$&!b5p7GHy~ypw;DQ%t|H@*p~TtIbBr0VSo_L^ zDmUi520hK4KgOJNr?Whr>ZdK0Rs(#hFlKIg_2)tVpQ|(u5 zyq%^QVU6Cw3+1_9|HauURbP)VSZ5Z!S4LY%17W6^Bf)W#Zp~3IWh*@8xtIML)W4u& zkkHCgR|A&)zj6ek2WuPq%aHeYyqXYx3oi}v^3jR+o6kiP5AL_%za(fqe*C3={*s`E ze8B>NnaVceHNV{Jm#T!V7t0GA8ut2iZX`5r`d=5bT*QID5G(XM?qr=;2=XA*;1%$* z=3gp+4)?2FLa-mX&&vtmXK?Em=o}a9jT8wQH$Nzk0$x%iaewItXz(7ay|3`|Uk)5N z1uYRZKgMVJXl$HU@VQupTBTIHycu2bC`spY`70lDN;sk zYH3|{usfc(7KuTFzwp}X{xbw7WK!e29J0PVC6jU>njf2AcDj$X3&6{@@NX1$eTecL zMCYA_=<{D!Nn0-E$saYz&T23rQ{UFq;oP4dLhizs~75ET}uo)Zgk73Mv-a=l`v(sjsqhf4Ex$E4oa#S6w zVw*(=YrjiTR(<8)qCHgHEYb+6F=xUS9dd@BhoyIdV4F7o#FDq>I>!|+H;VgwKks@5C zXPSMvz+sIy!Nwol$b{-RVe%<~zr54{IALzk?iz)6TW`hsYpyVI#SxWD(;A46qReaidwoowsg`>A+lB zoRpSPqjyaWk#9ziev0f&d-5hf!qHUvtvh6zt+67iZkc0Ldc2ia^O}E1#{%p}ue(Sx z;iyusm_iba)2l>(i|bF4vhuk7z+sFN|ViiPa!(a)yE{wDhoFX{Ir(^Ipk#=W>Or^_<@v~*5oiI^T=Q9 zms*b2^}I}4mpE`cB1+);va&b{2dZi65_0*>%}hxew9)P>f+eTcHEY87Ol9DuSnqvq zhggKERfcR5kVVd@nz@?vuet0kA zJIPdeKYsp-oKO_sH`VEfB|und)kP>(AW^ewfg4BbW0FXevVI-BKYDZZeJ|y$>Ise8 z%Ek{_DSkd9FbSwsRzC0&5Ar1qN1^@(DJus49j6glibc9&|Geq!&a1MT1QoiT>|g9q zQ-?Zes;xr9%9EAyluJt9Lp^$pQc&;2NM0M;t_smbq`?K{RhAD6vobgrsCleVWemeijJ(aO?(H_YpSof+#U?UMwB+u#x@Z@nSW)X66{K#ZA}?P zI^TcaI}ITwRPyVaKOi|mt~GuX_)Iq@A44HK0aRD0%fM;nNq9>;`S$m~eojyp)gutg z<%r+XU0i#WLlj|1=>4P>xdo04zG(amjTI$6+UHMk*rOd2B`*D|zN)ah*SdMi-($s^ zkSn3Gl3~WqY!(zB-%r{%0Lb9V+Q9+1l&EV4tV~So9C@L$mR=JU_77o4sjhNFQs9q= z5qSnp27FW2hx@q~p|(IM1k~I0gqqAr6IC7}7bx!eGwnRMP>0_<{sFFoi{AX%{ay}k zQv<0)-od$AX#IH&oVB*7JnDi5r0NM82QpPCPx>l&DYKp4nYE^ z``x;r<4#w9N|nQjEo|OT^Y!X$^R1qG4kS?F*z=Vq`0lzzx0;RD9;`d3HX3@lGK5ja zhg8fYU;oYREY-Dk(cPUka~k855t>aw0`$+9N#Ew!cU{?bo9sV#ZiZC5!nc zYz(8fs;v}f107s(XH#Pv;xLuZbO+&g-|`|ml39!P54aTc7xVQMH9AXdasXMBSy5eG z?$KxSrg?R<$&7QUIzi_(g}V{>hvT#6Z=@WJ6)3mt!bg9J9xGn&zU4-adrwnH&mY?c zWEtpd%wv_=4KHX6FV?FdkhrG`O-qqI?7CZ?hod*iqKHl=%sd$!@%|`Qo*$f2;T@sr zu|>YO)BO6;Flr6X9`-_!&7XI2t)8QDR{W0T<1Mzx^j4)Dk9Uf+N|ZR2388Ae*17h# z>l*xoW63AI^XrSQ8-6oudS{-c*wJg`?Bqc<&73=2P~Nq z-`%9Yxg=kd<&#s(dDO`oMM#&w3hHP>F-$L*?OXH*cp-_wH6&gD4 z^vKTByJ@0f8X)vI=HT$eP!|2{yP_?%kFLpVGc6(ZG1t1g+}aI_AT)?_KEg~Ctb4dv zlxdhQ40zllX~?o)|Gv#?&VHvdt>k#T^XOdty01d<-YK80rKOp_O1M8w)^L(zxRKEs zi(&e0KqRG-d6D579s|km^0TEqU-*t)F?PG#x9WU*Bq94){bWhV8iCLzP!6qIC5D*< ziG(bB>0~fDgH<7Ct>a=7ZTYevz6muEHDjbO>APPMkj!w8XWnBow^tM@aMkO{vmCk# zg}iYN1vh0diFNzfFt;4WG`29K5ova-uFZF9twaD;GpcjQ&RepKIgYt*@w(_^m6CXZp0J#|W7n8%@!g-|` z2WC{W1&xs{1)ORAt&UjFIIpjcdk}N*|IA z#%?yW`8?m!AYyNKftE-(8{PSR)mXb~HT6=mum-Dg!sz?XSiK6#B<^rqwr!M+QO(12 zUR;xc6~qOcU|}<{r2Dlg?&<4x{#Aw_`Nc41Z3TK@WutnlpCxI8|!>7U{O(HT9EP^FATmqoiG}n z`H^TM)~##G4*E1`q}%N<2Q&WJtB;Db>u()NaYe)F`%372&Nw-7@e8WGFG>ju!Q9R} zFH;COT{&X=a1W53dw@K*U-+y3hH@k?IGGVaErakp?IFPC==tg4%Nnjyja10rQyXsId~; z;r0|VQFb*a3&HMeYz}{H7GcN6mQA^q4=T!jFk+^k+Z_-i&6OqI=(DikK z!gkD=wC!-1p#}*yz63AemBTFFyUMUfpZsXHrH6%B+Mm34ZX*41tLmpHz;(&xw9?q1 z^HoL}F@D((Bd-4uLs8EDW->d>%YPoStbeI>z=Ax3_PRnhyQSe!kt5W`w7% z>gZh+m}aU-&V1Fe4(aSYUf6J#lcyx+BuWBxaYJG#$%M}(@~F$U%${9wLfs@6SVfJi zWWxx=pd@lJv9qZd@04jli?ghD)>B+Z%|6w`k7zcT>QU`Wm|ukN#Bg7X!x2fRY<>_j z6`iSv$t>~0F_LiM!HIASZ&7r`UC3JCc5jB1*mp;P)d1^u9kJF!n+VH{TuNk59*vrN z@aji7dP_tgHR=K_)ZZq2w-rs)3QTeVKPvZXu-Yff2iBm#yiIK<{^u8u4hWKoV}HY( zEVdNK{fx!{|0hKv%WMFT2CB{xhrXKVT@QXw2&zPSk`cbLrS*2IR^xqUcu4YGV)Yco)hv>ru~qE}FWb9g$+=KRctAJTCvWaXRu(pg zK80V=f_`}uMkMo0EB`XE!&JokXE2iruvpdI(r&=J@NFF)qsQ-9o`Z1uYPHRhC&F4fI)|+ zvu$PtI*y@KTlt(R#jgAn1~+q^oVgjB1Ezz zEJyz}?!6_UIKdcYE1HkucyeP{b3RlNpd{}HLZg5ezox3~X~r`0qTr;)D$WS+;?9%B zAEyR48u!5p;yMilkrpR!YQ=;aR`^mV{#2iP_r@_ZxB@)gR2QMb1JlnOBzh&$*IYVw zDrskt8uC7^3KtpA2Bk>ht+l&8@$%L4X+%qEd66Fn-63*1#G8md53vn@Bl%55#QLe| zC}u7NBD9ID_65}Y2>(ej`Cd8yN3r`S;SsCc+;e|p{jOZ)E*d-O9*;4iw(%hLPZY~7 z413i8+9Tc_>&y!M#WmI9*)j&n-=m5(+}LdIO#0m*z#?><1{=1>^dy0iDyI9c1F;jV z=Fg_{17n0};ago-cpH_CSi*VX7dG#d6nd-<4$xpo!M~Z><&UZ%^J! z^MXe8J@^00Ml*ScTp0~w$01OE*%Dsh`xCum**xdou2|U8v}j&WSlY z>ejA1H-^Td3lrP==x6MztcSD?j1eiRC(UGl9Nd*TT23%15#+@d0d8jgnkT*=6(t8D z+itf`#h->X5(7MozHA>j5S_H5Pc690>v2ji{m0c}wa~9M?beHJ$!c z`sc%kHWr>yFV9xMyP!M?y<(~#uzT;1SfBR1_psv02hX~Na6$`eV$Bwj4_cgn`G)M_ zBMDxRnx)S%2k1JAp@WX=TVn-reef3KT$ruhar=%!l92AKG;8&4c^6Ir~4WDGiacJ z$gKdx>Ty=9uxG|5@lW8U<%fav0SVtc4T*qQT|@v`_Z+L!L9u$mg8RA4?*A*B0Vq22 z-d&`(RKk*GsC>Nxm$b_lxIotLd)&{5`pQ!n5BLbNz)aaXv-_P7Qp!z@wSj^Gq0-Hu z>+<6_m{mQ{8IgYUESwN_3`9JsFDXow^XeaRCeSKQ!w&s`fp5g{~{p z4Q~Y$yv0a?&-eP+4NDYe#9ln;ZpBM1)7IQJ$nG#ZdsYOh36MUs-h7FGfQKSd(ah3A zk4RP$a0`_XN+@?34lX9fbRYaQ!b)YwEWxsIyqHL5RzS;DHuE&o@Qr2!{rT$C0pQ_S zeyqKyX|(}>E!^!j>#N7tHCH9~;X=j-ho90J5sa0?>zLhIPpZ}WPsO8-hMeK@0s?XS z`>2jgESz(u1O_~b$0@YHvxv7BAlRxE86P;F`^?6uizfW~2b>e6p%xq{>4II=7VDZr z1^(_vD)Hn^tsb_k8U85XS>!WfxT#T`*RWq38G1b2E0((bleIX;MhF&yqZ|c{+AB|Z z;20zP76vXL@RUste3&0j^T>_t`wWdvk4F9RIx9GpLgr((0)*Y^+A+uf-4 zQ2%;v^%iIM=6eC6okj&k!LEfxQMqwlTI)v9W&(m3k+?bym2q!qj$>gS6f50B*)Eol zo}xw-)}KOyj0Kl76%@$4`&+Ms=SN}n-HW_Plyr=q97Z|8)ji(-)6jL&tL%&1`Zd}Rls8TPrH6%YE6lnROV?9sC?4VE}jB5KFKeRycLoavqxlwHo z5O{=BY^0f<=%WI9F+dsC7$*H8k^?aau{%3^bgo;mD3;0runW+Bf7&HaIg4{?mg(0Ad8$40OR zTKF9&zf&aMpIY=e%%pFK5ofF3Efxy?#?_;Hs2%mGnUPCOhZdz>RWur6s`*xVtZKC- zB|@DpVLfs|y<@atuBEwJ*MfQ$o4(b89yl6lK^PYA@9x3|;G#ywSt~KuF>Oi|`mrg} zV009X?QcKSj@#NKXS~%WmBbT-{Vm1v-OVGw5_$ivsBQcA3LsC)Rw93LL!}COFUMuM zR4^RsG|bQUgsv80?0l%Es#!6RN@ZHVk;s5&B(7HU$VmNm%iVRG5|j_R_Q?M6tQfH| zzP3B6V52gm_-455nq%aA^h1!LbVfcVblxb7x&%nw>+|jB`_osq=UX1?STh3U7eZt` z6&Al$JDe6lDMoB67jSNp^{JsdEzd~^I2>F8<;*kwkk!1FeYe~E$@|%9JCYf3obssg z8TcNYrLB()4n$Pyd3){2K7$EtUM(?xHnlRh46wgfvy;AW`bZZ>2+F3|G=5Gx5rPi~=!@`B;XDMD%&I_-e8OfK%rzeKdA)V#A;D2Lb?r9scw@o zuO`#B_E#W!tG9&9D~0>{3$Vws-zR=my1&0G%Vn8g?LZ~NDALYq(wd*l62GmoUx+YI zoq%{~XEM(+acnnd<8U~%F%~zMh^bjm;WqaJq72W?@Z(|VWZL*+z&C5mw2RxFSV<^x zbrs7U&+F_d7{}ZX|~%d z4!hGHYlHeY*J_n#v=UtR__OAF7uCYYKt|fan%n@v$tudXV!uWegf`xe*Ni6=7YZH* zyUb;{W5lFd+E&aRF3?eAfnwwD-sP=|X_1&Fapi$TJ%4lbGyCfaZHe~Gs$eBfO~JE$ z&(W9}%;YE^FFQ}3$cs3Rz?O%0$aEXmp_-O>VqI$_uaq~3o$m;$;raH0j-GsDOQlE( zw>s|`tm7{`lhhV-1Bxpmez)i>_dcWZkz8M0fk4imbuP+}Y^5Q*4cTl3hj1#cK1?bqO^R7M2^sz(=5ldIuU+0t3xq`9NhI z`b@KR_uAAPPt(?9(q8mv2HUFq?%Z~V18WDU*y{W2GsETM7YYpfjBpSc;`*X4+}Q?Y5b#J-lVHz+2AgOD1_ zkIQ+94VSWD%}CyNQ{%XaO*U3xnhVhx;Ak{fOx>DbDW!p*Gp<~42G<|Sq9M5#)2H73 z5;$GgjihA74uEsU2^A{Rrgs%46HGn!Y8SfmUt5zIT0Trr5GuPiaGtd%87a}_LnCBc zjL;&sohN?CG{vQZW152I;#bhoFQ#&k@6E_upw3fDW63uAS;Gc^5RcieAK4qTix}p( zFmd*B?Y?KHh3=;s;RXfl3SpKWOJkImE?C`dKjbQ+<58)}F^Lxo+CwkKG!BI`Q|aUO zoaMU;j7e!#RYb9+?3y;g>3RRumx$#MlhvP#XFPOWD?p5CJr*0&M*X1wp*BRQsPj)V zkjwl+guptpoS)4>QS2e)4E;Xu! zE=@8-IN4urW0Y!sKrV`^v5CN9soU&61I3l*{yP+xDz7aVLfoyX>qIc{i`%*-p=`Cq zoteGfMTh)?gU<|Q{2l8eR*2AX36gCWBP$IUjf{+;AfRKIQ7okh7Thhnpj!n{v6tcUZ4UYbVzgLd4pVM)<8r!m+-$mQoFuII(sMdw3)HkBoQ0q3W}5HqFrKFT3mS<>aT1p0dr*LfeLt1dgTb| z_`x5E*2>OM%!sn1@IUO5(_D;qf>Rm$JHh!{ZT7mqzC*IuYSj9DL6cE67Bu-ei$C!g zM~pA0%(w_*4BYLd5bo!eFwaX%>+j&IUaFOK6|b-?A}WSR7jS-Rizwtna{V2?Ou+kr zVmGpEQSjW3G(k1V#Q@4sMYD6$KK2-1lZX7qq-a~wN)Y9jShoiYMi6m!;(ow)1ToZZoD_S zYhfgQC`VDs6lXWIDn>FDPWrg4LKqRH8JrVWzs70tCEBXhGF0(XPKLOz-ko|V$WU$L zE)9}H;Ja2Rp51Nl!J%htD!007{){rD7hx8W)9 zSA}TJ{Ak;oO37WjF2yV}8)l&}W1EymO|76*lAGfQ2f++Td=^Ot_>6V2lgOZ!PS@Z! z9Iab*$nq0o10AL}7B(vscxzqV-B3}I0na45n+bM_B6`t*)CXqyKTBlz+zQFki5_IT z?*WS&wm06!Snj;oQCccm4MtQsQHwk4Ub=xc?HZ-fFBsA(G4&^?&s@EPjnw9|kb9{E zxESIX02O){n9Ggg5jN5X4#(6 zF99kLQ1|OAfc5{RpW7w}EgRMa0RkOUW$q`?GUO*eK$rNM5e$;Bd2pKnpR?i%eC{v$ ze`BL;-sJVTc2=fRV4swJ9yhnQd2SjZ@SE}XJgf`P2ody)x1 z5pxl*vf}O^S5_Lj7wr>HMQQks3f$3MWU~`xQfSa_c$(aWJU3&P{AKUo(sF|@_3k#4 zN9{2!X|uiL#>tZ%2j8#fU%was0v18|;3%YDeVi-!W4Di>lR7~b6X|ti06&&f;K6Zt zaJ-C5#zTSE_<-cR^F4G`xP9E&AR!|ud+fxKHI{Uau-LGUTG2fPv>5x;rnz;`;TW zoq;vJYL#8|$zuIeronMUVTitbgcPKV)Dy!F3vZq&;8w=CW=Pu_l4L=&C`;! zyDjKyL|5`Rt~>H$&4Pb=YbaHP6O5y{?HjLx@7^ObU*t`jtt3B5vtMAISNNY`JbELJ z4|kDnoHK$au>w+<8-<&bdTL89NFWLJIz`*N*$i13Aq+sdDG4%}I`pB*DNZej)-U1l zp#zKfw7HUBL)R(U9?Vy}HzDMRAVcAoH9)x>rGTk5yK1N3^iZuUynNe{if ziTUtO!bN}Px5^=OzVh0hbM8)ceJRHu^H$8k@5P3 z7m+$X>>RDocQNQEmW!QQ@{fe(R5F<~)K?0(T!v7Rq0*Y`uylw2`t7m<5nstB375jQ zs63t+xj|7!GV)nA2k*oeo2iYW1=eoxq+Cdra|A*pnaxm&k`J2$ezPB@U!^M|qD<_+ z<-0wZ4r$N_3NR`tA9AkcZ=9IYX|bJzRUYznm9^ukgw&>Wl{M;CLfm^FLWVdqjU)4P ztTPb^&Z|`HeHTK)VbyafWp+G)hzTFfvzW`qnN!0^YY{`p1S2;Cj&5ozXGZPHR?vcJ24R=!No^^sEdLMo-ZH3;uiX<3 z?rtGKaCZ;x9^9P-cXx*X0fJj_cMI+k2o{37ySqEw-sFGIotk;4YUa$`_tULPK6Gt* zclYk@wVw6-EOhT0+=T7KfX__-GddSHH5}9txaGFsW*5K0UJ#1t-hG;_FRT3BHWi`? zHNmG}*q_bP?=EB(0{{&AWMu~T0D6CBZ-N>ur_FajPg3p-@8k9GKsPNAjI$g2AT2C# z8r1Z`L2E@^Myqr}C#_wbZcyiku${$GQ7z;d9O?v{wKEDiFHUBAMjUd*fU4DOPmV;Y z(=A^3m$mu+&Ig+n5>q2NL=A$DBYMcP$ntxeJ%R-hIhV|KhPFad-M+cFfsSTSIhxBAgPENT%&G!S|v^ znW$&`2ui4>p+eJecXk(^YcQW@k~dWjPkd;nbKD=_bvE2-Y>`O zne0ek;3EFsr6F;bW+%eP2>+*)J)|QhCvfhHQyU7qkSxtHd$D_LUwb@a*mCowppW*l z7dKi-7wkwxx>7CF_GsnCIHupDw1$Y`+8M&D`NZSs{j*f^J^5C!)DZj-v$II+Qnt+g z73Wdh>KeOs`PlQC8&1-EL~<~HwJ%LZujm!Q5}ns%FddyMlQFyLhsd^%ueI#<_GTg) zyqa^Q)ujV;0KU0Rjy;Ep#u43CWS@-DFf`Uk8iVKeg5lY-{^HKtebEY>)QZ9s*6xt5 zWbld&$l{J3MOsCUJt|?e(r%@?>3MIN4yp$kprTb=0V>){TEuO&8rz=wP00+e$9Y?7 zpbl-{ida0MftIpXhq<_*VmB-STM;-E=lg-dz8up(2@$$(EO+%RPapTUybXc)ZEACq zS{u~2wfWx_xXEN)xylb-min5_w_y#0k-PpUgx6j2yM$-BiEdIzHgsm^mKm*MB;ka( zjs5ZTi|r^}HNi#~-KtJr(!Ab|`h_jsXRyx+Im5SV#lJ)me@RN^Z_Od#MrS}-zx>!= z6~+3O1+GNFEkS#`q_SJTEt>l;h8bS@;(W4_*~R^n!@_G7H2J_EvR;k!42sGdm?l#d zYF@5QDs^`;x@})I;Ks>SLv)0O$nJgOzYqHS$c)?!)ql=8z#Du--y(uC<5l4}5V{LuIbHdi#3va8C;Vjo%l7VuNI zbBEy{M$eqGWn!aOJoj~jk z{~0-b>M@v@MbeYAJi5!IdfHJ@QOz$T-Bl#aO_Aaf7$-O>RLev7j0wKvt+#dip^rvr z1c?C=h}5-NWQHvfyGIIaO&{(?vB&E>!wRQ}%DL(Gf8|uAh2^ok47{yZSmEo#vJH!J z&Ez3R_Kd?`o#~6oCdYLSGaNNX$+-Nv{7q}5Af*-pZRVaF`ne}G@z9gjS=c2*U`pBl zc;jHChqVq+f{i3CXo_X#|%eXjJ*`|=7VBF2kk-1o-+srw>>>^!Cc66VDKhxb$ey+m)CGoSNa zjCO;Zd)U59-E(xf?d?0ILLVBv`!APXcm&y5r1j32)R|CAw~=m99)FzdNtMmzQL%%Q zIuur(^dZxAo0lSyv9r9D8d%$DoO8Rm0(5dOE@2Q1A9)8taJ+ckojCuq*OC{iA#$4`{EeowxHUL~3|%b(coW)Nor7D9 z^DK>Dt(z1o^I=DFl;)Q5?)rHc{KmSCuYs2o37rOXMUP~0r(NME7e*O!3>gqwX^9%=s3casC;C~s0gx^VweAp?>KU3Cb0k5}kYjO2~8 zQr?)jKB#3+#0dalP1#}~y%CWD8L%Pt&ieAzsmp;B(52vMsl3uR|Nou-eLuuJFAYE6 zt@WPx-N4Ue0P+K|efJh7cvGq>l|$_}j7Ofa<6D12BD*f$jV@$|DlT(12ehf`Ze)I% z#(C*vypb5{*qs#Ef!r6B#k{&%_}K(LKnQJ$=!*_nZi|S?<1ujcef2g@kaKdp_~kJc zXwLI7Uka=jmg!w}aW;d0*F~5t-X2=bTp&SUHB!ruWwmh`PS`H)7dBV>qoWUtjl4>d z?25cW)1tL9NF1372a%q*sPy7P@nvl_>bM&6p-u%YN9kVdtG@IgT+ml7Ds;7&EVp^M zxUA4Tu_yqq`f_o&mgc?zHOO^gXIQQ(e;58kg|cE%lOaBB#ja%APHk?=T^8^7bPP3pts|w8G32n=2txYQr(9@q)}1#K-Zk~e z-W|0Z83X#D0pC)UB=8HPC6WgJ zZieO0uwySi0|h?@NTAIb;{CX#7W7H6;UA<6>Nn?pA{4gNo3_XUYWSMc5jTO9$1>Yo zIkOp}#Pq8k72OY@rt*}SV!Jv<`3SMdez|8I7=Z|MEoX$BaZ50gE#&EWqNf8%gwNzc z?YsCNd?6z#pB(dTr&;NuABnA%;*D7hHZkYjbNNxUJ?r4us^#`oW*JPaQxIm~FD=DY z9QjXR0eoe;xT-=^>j)ilr(6D!Jae1hAMwmb7wxP2CX1m)IeRa4=R$Nd3Zg64 z*kbEZW4v8MOxnmr8x)aHlxOA8YeUU1sy`(lSxJTraCzWHPbd-GyH_9|*BLva@vOuk z1dWg-3s9JqP1hPyAc}10_l@d*;ql6za+!<@N=DL}Y+E6EN_oB?MXIdgz*soUqKt|a z_1${%S%Sl-EX3DuBD6lDa30bE7~#*Ms24Ni1V1&frjCECnVrdfX|n`)k^?sVxz5i| z8ci^E`4n~l zj60F^CGiJL=CLJLR0_Fi&uGe0uZM5o$x(eK=Y7;1cJs@;GgY-(DS~m-QmJz~mhIJM zzJ+e1aQgy39B#2D`D9RaF~^M8eD^&=l2ybQ=bAX(dUtQerP-Cp6oH4W$U92Y{ZOvU zUNnTDdT@7A%TJ4mL#VYt$0qBzNxAEDms1*yKiZ`a+Wfuj1Y`m433@5}EbM_bl}x zU{RcFU%w)JO}Okr5FNx_%O9bD4pw6b%J&gIsB3eNRwL1M+rEB+AIc%*r#|m9Lzy@n z+OK{>#8cZD@sUtDUY=~hST@plx3xR7l?o2M^~cR>1ldJ9;b?_V zy6D>bo~|C#O3pLgO|&=QFq!=+=SL=-n|sK&ZhiE$_Z_*rO2_=cbBVubzi5g?z-ZcA z+fx)2fb)fn|E)R)*Te@ZqMn{+OX(CF!yF@x+v zoc1_GObKG%!5%WXo#d<8dE-`LIXLb&p*ZfhG<|dw3{#=UcAy|XIYHR!bVt4Px7`$0 ztT?N>6=GqzRZm^2K+XuRB<%ooFWpQ!k*ig5TjiD3Wu zu;&SPe`sz6e`|PcO5Y_ zpO|lb&Z}sYyG1;mBO09!m1q!{+~gIZ_$5d@kJ7xXD;|KUQu5;WFpt4Q0&2P znH-+?#PGx2_@RGy-~3eY<3y&-ihish+MktHwgb#ieKf;hrGwZp7G>xsm#u!jVl3gu z12-)N`NKT4rz-Cxm*cNu9Co?9>$A=z`Drc*DDl<$RBl_JS`>EeX;WQbAiT!q-lk6H z{H6*ty~H|#RWJ@2D7N;iIyg0RM{(^ptG#wR{e)Az5$BOnHW`YT;eG-ufPU8GhJCXL z7t)RdX?7-LI=bA`4(L}6OD?GEj$mi1yaJ~qw;me4X;k`waSzpu3iZx24Ke3da4zs~ za~pg@;rpIml?G>0efgtlq3Rqv1WxLJHN+e#Tt-TP50}d6l1bYNLvVul=qC=+>?0YV zNo2=ihap80jiE+=)>_}~GId@U=Jmmwsp1^y zVDPQR%)Wii7#cA_2g06=g#B*%*#aYqSUH2oNz^`Iz&TVH{RrgZ{JKw>;fEMm=<0Q= zZO5sz3`?4076hA~zobZ`iI~6Z&08A@Sx#;v^ePGL4?+Kd+*`v=T(=S$~`g| zjeiyi*`W25aCVIJ{6&w%GP9fmg5@7wI}sSz!9-~0xnz4C&us>a5<0i8E*0t94jrv_ ziV0bxhsKxn@;`_t+mB}Bcn8j(ll|(8=m^0Yd;ET0(1g_>^*ZvmoNXY*r5C|_eHMv-eD!4I|1Rb0mJWhGj@R;A}&$Ff3SjV4wWsmJ+xmt}nz7h^e07CAsLG|BFm8s(B z%*SP^AJp=bC-)S&oZCEcLpiJ+KJ711t=$=XzM~F6c+CsQ`T$ur6?zipdxAg1m!2&N zrF+ILb5NNd)~Cp`Oik@dQY$kxAN@EGS|aobbci?pt#BHp82YHmUz84gzX4oSJzBW2 z7lw_-alOrJP%pBujo{|5!I=&!=%S?5KzvP-bb3+OkH$>21m^YEyj)?sw(t$J>)d6dRIy0oHfyt*$0WRYn+WDATk)G-#o-pm z`(0s;x2hUXe;mLY)RCVmpRlvV-u8e+A>-e!<50X-qYr@-s;M8 z`;pBB+4|Rp>(veW0HECANcuB2n9$oA{0QPzpd6!EX-VLMZsS`yfXaW`w&X)axIVXH zB224iog~v>vr-96ig1~R)%m_2r;B^jDK<2iip#MUq;@Wf^h(S0<0^ds$iW4$EVZeZ zTAewI7=15W28UhBr_@qbPaRjxW7og6{?;C1U$Y>cZvT9Aw*O5V&`c2OMTwts16Bn3 zE*X3(p@Z9MzB`9Tp4c8mty>2hfEzvaFJ80xRx zdY@|^GVTLB=9Xqf3|-Tn`Ig+gop;hR&T_`@!eO3}IIt*G^UsZn$#EeNY+iYgZ@^@n zNgBpmd9Z)0b`CbTKTfHAO+G*%VfDn}!t*k{f}H{9+}B?cS6w3aM)bXh&aZ_y$!NQM zZW?brz1#xCkeWM635UAn?M%Z+5Y{m@U(PXRIBL_wteo0xJ@eq52qTuops6L*Lu?I< zW(IBc(of{2M>);u*~p~qXkUlXPFO&}`lX!BYYf^eV{xpa)IgH}-K`GmVx|@s`vHFUYV2bu@~TEO zG0-?d6bxtw$Jj@yMI~LGIyD&8wdajmm@8{xZf;KICU%%=>~!8_#@E_hyozCmGwu%jQZR*|tW(r)=hC##QDhqf}?h zee9m(L8GmQ*oDK!_drYWHR6N}q!Xm)eeD__McR1tkGi}kR$nj>Wt_8Psc}U@1RP0) zhfR@3*a;@@-ydcE;LC#4ojA;oM)q~TKHvE6Y*bV2TJ`QC(l}YRaIKdizx1Q6f~Y~4 z0@p6r+kBZvLs=7++*f%Sz-LFF7=Ssl*oJDGBD!eNk#d(RUxJ&p+XN$7zx!roHh8+C zw&chGX=n;z{o~W`eZQRj#jE#Io7`gM&60KQ9zB)G51a+w-F5va}Vz6ieyrHuR3MRR3`@(K>)>1A>h)Or2#%rH~WHbkRpUnTEbyO_aGmEyzD#(EneU?F!4ID}O&Vi{zg87drq zUaghFAm+QSonAZ(65)m*L`^4EWvhj!UM}Xm%=%7IAK|t~qgBVMmLI{&D%~4)d7D0Q z+6@qKvW)NHVR7>gyyc_?i3$Ws{t8mim;Ac^&Q!oV*tzWlZu8F;stDkGqYN06fu4*1 zqVvtani2kY&3pU-{|;Ur0AjR+0rrX(WgHjT(5wyL1!2s&B1db)>l8hE$Zx;$pS2xK!GWz+sg9omAh-0`4_-dR<{3k9lYU zzkXz1H+f08OSh0^Ot5m7DTzpG1B)>Nr?p=c=(hXE{*)3-+qui#h?cv_R);}2U4fPa z@RDuAO4YUCmJ)sqSfFA9Mxd@lhJ^gIIC|uvCC}&jv1qN3WQX+?z#|5%HT^m2)RaXx zD;cV7)G%Ne#Mkb`ME{{oIX>=uLqQ&b^SOeJaQORyaRfQe{d~q=5ef#N3^4GTbiUY| ze%SQJP0V$LFBX24SyJJH(K?e1spTJ>{~;E=)02ff(ru@0Kf0t2_x$228p!wJV@0H9 z$IK161*AMyih?5vU6e+Ft&_8EhifTT`e3C}2aviGR&jlJzrqf6ri8MKQ zELK%uR$NAJ0Mn23lR0ls?kl#x!AVqfz^e^hp`zvfsxHAfUcD>S8=9b>df1G=WxQ7` z8@^bwu^xX1c#ms-O0!&FBY^|z!2P4@pFXBfUfK$jF!GuK8hL#;)pobGrN?~14*y90 ziXu!*f~*9)!M3FTP=V}Uv$7yT701q#|C@3^zcUa$^(>QG$gBPsQKCH0n!%~F_*k!g zQDy|vZZY|`co`T^V$eeo5IVi;R|>ue1|*ezl!_vv0G086o#d!r1=4i_6wJ_HUju`A zkcegBtB@XO=Kd}Tbonv3=ulrJS_Kh+_N6xB?dI#e5(*M!#&m;cgWjJ1Pj(aZpB$L` zsVqHx4m74e@ZCnBH}GC(99^sK(zWta^R`R@iBkSY!WQWpL@B`lNkBX#i>+9kl<`@N4_P$8CIsg zBN)D1U7E_OwI*MtwmD}>UgG^c|Lu>w7cov{p<1=>SGMk{46d&pehi{Hc@dIaaivFS zLv|%lS6x^$_A)>Du#LVo5cY zpWO<(y}a@gyarg~yDGZYzsGkQ9)8QjSL^Kg8uhR)*D0hBRD$2w(4VRik$;n&+M?gy zyBXZha5CN;I1Fm+z_#Zp9|LI9>F>)mEvIx7GApPzD)MFDKMAO@uJhLOo?)p-cl^Q; z25Mt}NzhuN!*hF$qd4TL2+DhV4Vqr#=_JwI<3xQYov)getZn;5UEZaSSryBQa(I`aRu_*9Sn7=JPNq~a(Al!jgeCWVB+#=5UimzVXyJ5NV><3T&r^dKm2W^n6k|bM zkzv_z4A1DUuJh@{vq>}YpnzAtafhtFA4$W_jptCwEwA^i*e4(Z zD>f3ac>UjfX6Oi2Ta`tF{9qzJbC$Whu4=*)SAgOxzP2XAitcMfyDkK$g!C{ZR7hc; zSQ=*e4lR5@XFQr@zMR|x^Ad$(MeF_H{T_-%&5fDX~93*4NR&(KikP5A7y)>Vx8fv-xkx!^M8NIX%z0I zR^+)1uBA7lZRsifmV-EKYYmQ}yzx}Q1N*(+kbY7MnM&ac>GgG_G9_^_Li(%iRbEjG zcbQ;v(_3{Tb|bVU`nCy3?&0uRgD*ghp_gPi&mhrY%do#M#l?5)^wRde05BzEc7i4t z#$W5--XwGqKb*}0?g%k(NATP7WIr3XY`4I-B7G=4ku{;slyM$jZ8NHywkTwZM-o1# z*Kbz`{H?1rOkn5t9rCjP3Rsy&3Y!MDfbI}QH_d4%S&bygiRZcqhhyA zGp`@c*Rhf(yE99xXE>5LVVc*ENngAS?P-fO+6qRN%aoLMp5?<+gK@ZcX0280ef6Dh zH~|7=k36RLwX6Quapwd2VU3(s6I3dYJJdM&O$!SP;yz*>*iN|_WfkKWY_pjCG(`%L zxdRQJsGia4F&&Fn72>Czvq=2{@8W$Y`jS7z{ea}E`l?a-@^Y{+E1gERv?G4^E2&Rx zP(&1h9-F^fey-)EAufY^)pl;4fPi@zf0p7ovPMlQ9=p&^HZ4J1y2+tE3P{BdShJz2 z)%p{#ImT$ri)A{6?&y1#I6~w8{uRQA%gfUxLlc7XxQkF&yuS%0tvlYniB}figFC{ERJfA`kJ*)?1mQvFp$8m04%(nQp^SuNL1Kq@p}tNx>Swt(WPdf{3hT zY>M=NN0l}?Tz8DJ{Y9uO?d*vS=3GF;QonF>J!lXnqnrsgf3EYvEip_1dOpqg>Xt9F zt?Z+F@;7W6FnwvIG%fN9xn8*{SrK=be-3hJ@H-TCwjfgHK=k~f2?zr;f zuQb0(H9{T-9At)v*K8U{Gvf;^?Q1k0kIo-2#fiQSM!2v;1Pmd^;&n7l+rQuaZeZKy zm?@m}TMDmoeZw0{0CRn&;G>?JWf65Dp4q{Yq@u_&B$rCQ+25pzq`7}hYr&BNwz^_+ zgyxvz6Lc5zzKE?v?&hy| z$(j}E`N%Pf?LfL;&gALr`bbkB9-d)H};oO({IAIB!&0+%$GS0hl^M5c3;^Dy#n?G2u9RaK zh#p27TSziqO!fEv)%YAw56lnmC!8pK-x3U7I!{#MICD@tVPMm0dkY($%0h0vA-K&X zM_ZW13TYl-qCygP(GVeCIPFx&UZ{drzSK~t^#hm|@=T6HpQi1LW$(u)ZrTWjpM|OY zE0J7?3x-u7qEdk;8yEyyxs%(}!uEav(j#3t7+MVZx)%ra9Ny;PKB6iY+kv7~C0kXN ze#P0n7fG5Q=-X!&qVIL^xNKK6Yx-Ga=7^~s%jMaF(u9$tFC;S%x^YY?%a+bMxF1{P z7eeIqM^uH3wI8UaEfAhc%(HSY^6jM&rr#->Dh*QsVr(WX(9Ir0;`n~M;};ZLeRn#p zS-f1J(%4#Unl{J*8G}R9-M{UPSJi**LdAZ_vU3p8_M2UfNKOi(oCVrr3JD_^USmKi znKtUlv6G29pZnz6cl?HW3o{Kn-|4CFr1D(W9Wbi^zYn)aBOtDnksU59j;GD6nuXS& zy^@zcFiK8y)pLVM%GQvW!R2`eI4Kb^r9;w9Nxkr-bGaptCO5k`O(xYk?Wt;;3^=ns zL?ZkeS>s+^M^>T7_~x0E`n5slgy*DPbFPdkn=#pG_Gd0DDvBs`Q*x;4s$aT*N!Ei9 z*PZ3C%t<tQ#iXhPz^)76OT(W-j`eHu)2l#evSJT338Eh=-uq=sI6TI0?f zmS(1PjC1%kQf}p#bMI2b2{2|9!~>0pyZl-@9*M$e_mIa0Ypl__ve@Dp;vRX}MmN); z+CSf*$XCNSaq1MxcUGbzj1T)0 z*fn9Z4&0dC;r-iB zza0NcFS>f>F--| z6KL&%GJRIDly_6w0;)rU`gh10ziHC*U9TlynTHIch`5231(Pv<+#Pe}nAjUEiz8eG zY;MsvGnfsHAOP+Q;>r~h*WHC-2RgR)d43`HWd|vFHi|?)?t}=RMKxwqK!Ave3f}HR z5qClff*wUOn=?gn6BUpH$Mgx(3Q+!sBHDu%c_61Ezw#=}bFvUo(1ZmTsRF_WqX1}# zoY$q~CAuGX@^V$+Cg?*ZAz(J6Fk>Qu2Th3|8G#9MkAO$=H8}O(uv@9RV6Z+SzFYqB zYO1jaV;TF3F>Nc(bg*9fAmoz85a%IH^_n`AJfrR3Gg6QDyV?^aAKL0Li8!x|HU|CnP4p^!2l4P@LXj&meVkrRI4j^m$cjrFpq<4Q z0x0}|+r`#wKnzsHN?F)qEMy@Doa^5v3nFQ>4qyxd66>>!o$MYQp0uOpA2`}?1$)ci z+2gz`*PCCkC;Ypf2VN>Q%1uViX2pUIta^R-JEw%Ac*gXOabNBjo}Cz1#`FA^6@Jxr zj8x0BVXcFU7+IaRhIK>%DH00^E^Ni8a$U6PTypYTBfP?9X0f2Fi1-%%i1Te^eyil>QBz$alg(2b#D z06G9lI=s8Do-uxY1Rx}-B~0;edgK3wO6R{M?fEb5w5|{4-souffYEI>5sIR%VlQwR~i{kPMl?w}7`qSQ)7Uam&=q&9o78Fkw&~`4# zWl3LTo4){^h-c0hc1tDI-51rBlJIGE-QbQZC%D3NQ`zn1Wx(U(o7cG>`ezHa%c)bL z{HfOcQQ9+I=HuExE-jrkRWOm7Y9^q$A^)s*1sGSc&MBm&VM!wtNCz_tM4dOZ1&KTF z6(=o!kQ>hCGy0UM_w~UNjXaOR9ss8_MQH!nLW0~Mevp7FwG&fT3TN&AToJ{|Nr)fJ?|i^VtO&AV}ZH~)Ta6H~x_EWtSEUl7TEuK7tfzj4RX ze1eDbTdWkkNC@J~tmrwFF$SaQ)v<6cRuYlB{RJPjd11DSiWZkA&lJj(%gI!?Wnf#( zz^H|60|Ll4!|ccd{?BJgh1VYQcc3zhpDE7a$ArggO)Rv=m4vU#YiitX-W>j4#K zBQ+k1X8=ozc75}N8J+((2hXPnTmgZ2rYLn&=jZx zAlA-bnU3;NpFF+|>FORa`hw3%?#Rmn@+@g|crC|_rCZ&)L7-DSXHb${!al7)p&FTb9&!II=JZ|%`P3yHt)E;C{s?f#POS-z>GO5g!xxvK;2U2>!>U@Q@ z{)(xJbUYHclIS9H^5_P`*9hkkk^`KE7^OkB92*ID(ARNU7SkhNHvIl^DZyY8SDrs> z9bEG*AO6tc<8)HypPq9z-196{uFFaVZpe?BS+{uRei^%(8@y}8Uge^S`sP8U%h^?_ zitEWGF?7~6&bznd@xsit?~KtqP_x^Cd`Spk7GNMqNj>d(hA|V8OLCTV@!o6oJ?!i_ zR@m;=lDEy7?%@&6&#Q(R8#rW0SZ5Cx=iJ0gzgWLie(h+cN)(bZ)oX`wcbhzs=OQur z@yQaO$vISF<##P#zCmyv5O%Q=<6#1f~gxw=r3#y*VBA0vD*kv!IqGa>O zG5jQUt)skoM;he*4nVHSBXZ4#8toGPT^ul&9;YO$h6=Q|;wtGs?}&ql2fw2gcwH*- zxqfD(1P$o9l<)6YK@RwZe=JG2KAIn*18Q|Dmf7%HlMFR)#zjUb0$|TMvMsDC8p@K38R{>pLpBNCY`G(%Ey$2er;OJj{2c*HWvj#!c&Kqzk zxY;zh*y+&ozneh-BVMVISR&+=IgbLg(cKlqUR`+!x@7!l7k76@`R%B933K~^i}GEBI_^d z^j#bX&nCm6APxEB4V;a!9-+GsG8u|BIxfzRy^Ik8Ra!B|*}o40}kF%a>;ja0Ai z11jyX17n8b(y;on>FBs4E};f3R?>!<<5=b{ez<^~mjI*NJEv+KuftfG)XN37ape4x z(d(O@1jp%_`FiE5eokhUMA0}V)hKx1xH|4LsUhCQ0$!3BYI9=-im?|P^R_1a^oHN@ z@89R&Jxs;vCg;;^vHvjSKMt{I3Ba|Hf1sqck8n<%kE3Y(5GuEKZ&8QM*M~mI79ob> zx?leL`lNL2Feh$0X>Q6C`G`O{gDCF3CfC7%!ya~ifNatp`x#jp+oCdwJiN1TG4z~< z)48jt(!!Uvc4tNgWe=yI8Njt|0E1sCgUWg>W(Uqy8CRfg&SVSs@{eJ%c@hGCcU@EP zgeq=vgV%(A>d0?rrrV{-dY;_vRYsRlpZ?`6X2zO8u!rD!!FS1l^ho!yKYo+-&XUR* zbX!q}WKt85k+W_arL5KV`TI*6Siza_Pm|^gY%bc^NLO{*ecNx*{Pb1eCOr5L4!cn% zbBLZSO-*MJMjrEJHg`zVudd+5H;zXcXIu6>IRcu6@ismboO@1)Iy6x`HhDXY9(Ey* zZ-U-ZQ?h&9Zz(5XxH($1+ZCvDJKip#z~c(Q^*t`FUZeV}?28^dIy>|Vdb6-w1u6Yr za47f^T0D%)mLM~nO1fY|Hwd-FG-!2~w45@cx@Bb`LU`2w2sKkT$iDXxyRkMQO5ldh z|M>hjR6_Crp7sR^!?+;IJzlj~$G=%wZGv>Pp7T?qc$=Q%DEeBP=C;*@ zs^y!ZgikUQjCE5es^GT4VlYMY-qM9wxS{%wXV)>2FRzK-z`gNnOIh^PdUZr%1?BU)+z4E8b9%V zeIC8Z2<0?MM@fUyEtD=ZZ|f$SxU`YdDv|mgc_F+H&Bt|9WZPbRw~!eKQ$WrwT<=t@8l?O)_)yoMP=;y3A&JwWnnK%U7D6AN+F~k z##LdL-9ofJSb9b&xiHO)MIAKi1ezDRXVm!>w)lmjtyuR^_G`S1T1&NiX}(pHZj*E-0WT*|4 zx5lIlpZOnJ82dd;+IrxeD0NrNv0Or-D84O*P#a4nNe5ap^wC*N+8iFP22GInY!o*q zhosKKxVZd~`E}h&4al1E8zbW&9Q?t-R8NFS_q#r_ku5bBM7n%P)z-&H?)cY`8uGXQZYt9Ej0JfBn|$BA&b zw;x^FR46(JzFH}}XMx$;S%v$vL)U_OBDPrGyc#mI8QmJE>+@YfLKeN)!szTc`NmIP z@4ZSjnS;$xXEpQ?f{_ZFXgm`>)sHR(-ZN^SDApC!^5YDA)#r&72tfley1}SCwW+Rl0 z#`^Pi)^X&*dkVY`!@*(fyP&N^=J;?j60{R!(d1JzY%}addg3cKVJ=? zg{br^fRhQL*2@aO#T92vUkKE;wXVD{6a?&h%+y;i-QS*}wGmX4G|S^anN;$c0uoW2 zIBu&vO>?tV!2q@R0#09JA+CJpkt>d3j}0i9dH&y~qC|$yB(t4Ip5S#e{)S;XuHHsE zsOhYcH*p`G8*XH#?xy+EgZi2`k=rJmms-akj&#FQhf)qW*WVNhq9$3=ar_79B0dIW z+01GqFRH^yZskR&V~>53NdF6t{JR@r636cS~En^m1!mnRudn|Fn^VeWMLOh4R&`%ok!!H#IDe|xIak@jzQXSCl@3$ueQSR zLvqUM4t$(eWB_wmo5%gd5=T)$;_*%~xYRxA<%{&GoQF{x!ym^#Vp3)k$TtD+YtnZc z!sad^jH@Yt!jD~X5(t(93O_Qy&XhQWApO;FxeRbFGy?Q^pq7asF|dK@Fgs=rYGd@L z0M3QeqKdD*9?V!^TpGiOLP1pMX=_?+O(rp3oTMdY?MZeRt|F9(&-+l_@PmRl zU6o4L$}E) z^rHj|Tx=?~RGWyo`NUAjL>^A`19kQvPC6*ZZ8t{Pb+I&kQ!-1n%54rD9!ASNj{`T3 z1ELO|wrwj$iG1HvW#iMq+Q6h0C~DJHsH?|m4V*64u^(=2?ly66uwF?%x4?23u7Nok zE|Qht4yUsIZ%d$6^k72#)WiMZ`WOe~q)Jjj^KU7 zd)G!Lz3rJ{ZboYDidi37wRS(U{_?}FU$SRDdD^jx&SOop6>y@ro%bt7uRpll7TQ>z z?GA+pIX)073*nqc7*gF(saD>JcYRL(VRrHa;tNx_*3-id>l$(wg>j{+1I=ez=k}DC$1wi1(w$1_{pFYDFTaLLtjWO7 z)wL5YxL7@tsz~1_JE&5mTr+T@*=m|_4H3y^dtR?&8@)4_5g?mLm=GKA(>_wuAHB2M zCCjeMK!5X)tU#@P(7-3BUF!1GOH9fl`O~=>|5$-zu8vRO&c=Q4ii4ni4gaL01-cff zZsU#TIG~y{ode|!0_%rpx$i)YS${e>py^*fekz7{>h2&h_-o0DKFMe6<<#PU5;6~1 zyb`}v|KmsN^TqO~?zF1sZ>*8wmx>E<@t6o#sf&~(M)`vC=Tq|CDC(IspKv-|#}e}H zoGo+FjgTNc3fLSJni?$frdU!3(cB1U|e6#vCR4sSasen);nbPNm+Z~U!5=!W^)9tct~ zb9Fkn@UOpsZJLKB^%w|_OK!8wiaKmV1@or(z?%euQ|f%XuKhl94+I$qggD&})+7=3 zl?lhywHvV~dS_e%D2DlTIKLfY3hvfu<8!$c1%kz^?eQ8U-DGI%-DaQ*`$fRAg+guA zUxsN+RBU4suVC#9Jpah|In@5YEK~fpvJ)WgC zCFFn0G?jTb=8ow>VmdlYj!igL!x&L=(kbAv_pF_Q3wYTKC*+yJFs4;#7xJ<;{j}Zu zLkaWkiQM_SB1BBxhxjZy^WaJg2yWi-u#godTbZ#zq za%{L;;hC;}%akg?RJS5)4(cy+Cf zQX};Dl@LYT`EARkR1qKiq%?aUiGr^APJYTeG`E5*{I7ES4bmScWh8v-v^^x&wBeuu zE8yP`+x!b=Rgm;qQ~=zi`ZuWSgys^$8+5aP_M8ehM`4@{7HR}&bOKNk2mmE9e@ou~ znxKUt4}dG{A+X@DZpLgt?pAWJV!$_0e}U-?1g`jeB_jGa?FP7^8=xZ#EYWpzTyx&E z?M~|Zg#Q4HI87OER#LUE(UIkNF=1cNnkYIRa7SO$qK)_PCR!@9s!&2(^J>U=+p9Z- z-j=(p!YgGg<_@~}H~yjI29$B9G|?XHpOS3!zysvr{3 z=Kvro+NqcR>&n9B%HH~A!z|>{{6+LD5Orwpyyp4$5~xX|)49<;GY=E{-WH4jL5zt7 z-_U;jCDVQ-kIv_gLB6~0Beovjh&Z5E1hOA{;e%ce4t%*d@a2%YXUEECKc8bo+E*-+ zGw)o>U#0E!c5KP@)Zp%*=22&GC#cd9NOhos_-9vA5arkJ)r%e&@`C}`?dRs-C#wH{ zEm8EDkkHshz2n@-8c0h0pCqvc_u9j!A-s75`v0$zSXuvd5-S)x@Qt5dlUP4sWkdgW zNvsHJ|B=KxWVs-X)4S9D5&#j54R2H9!eoS|kRC8Geuy~NWaxM{zQ6nD{ARu(rT(Hue6I)cavfK zfot2BhX=v{05Bp-fP9XVE;YaeUKY|f-k;z533|W@X6_N-X+VRIQUal?c}Z_B0p!x( zm>NCCg2)y@fLQJ_XAM$eCU2Fju zB)0;3t`*&9X%&(O@I%3thRu`CJFYX56KE|%d)lntq1TO$0rD}LzUoZoZ%1(Z9c*~& zNaW4zfA!d7BC^7L_sxcJl@d4>bmsDAuuGG^x!W-|7EjUOd_g3+9&FtIbo46PlBG>N|5zybpz4JnJ%CyEiMvbJf^cV4hI> zaV4ZYEZaTFI@i*Zjh7W1sZk7y#q(r{IiIuw)fIo`$hZl|32pA^_ z__ZA7`*k~b#9C+h*PdyrYy+F3=l<03o%PKZ1)Xx0Oe;+aUXNC?q}uZz0uQ;Fjt|~P zH)6ZypBodsT63dI2)wuB#&}2^Y-o3FJ>$uJybe+7j4F6N-Il1(hW1y<~Q2seCoz`;bSKo!K^0Z+rQE%M_zYrn@Gu;9$>|`TX!<9x6??5gP ze1R89w7a+a*ZzcjCItr@bz9==r!i|P=`^UZ;ud_y*HGSO9jL#ifghHfPV<{S*fK14#m6KiXqr)#NEnxP!W znV~giDvn~3SA|_;dcwm`_)*l{<_N4XbGvkDL@_N-XknCd1w$euV0Yo=H3&UD{1B~Z zI=vj)(;9E3H&cBmszh6X=9Tp})77FJeS*@Ae|!*Se|KU?8U@yCx!rM19RS&&5`s+B z&rF_27JGwA+_Q)&JITGymbgTc8;JzR21YL<3te;IFBaf-+saS@I@frcg}k6_0avP& z=^ZRW-g>V2qm3~;^;WZyGViN#{S*1vZ_MBuaFSo^wQCDYKXy)G&`n1OAWc*pbdDLe zb+S$R(&iq}PFckIhN_uVh|(*_*d5Av2FF6E1mp<6E}FDj?|rrHPyOMcUBo-)@LEvO zoh!+1*)2$8D=|mz5MBE^a@C;Xo!zWSfmqeM9~K=(Z=F+_OQsoYWH3XipPK4iSj(o1 zPEC)|yEfvAUqr{_6#KGgD}WxI(RqMyOR~?nz{DYN{-uS&KWt|R9#yA|7bapoRN!#s za?p=2qB4V>LAGG}lzroATD$ssa8aO1Ygu_O;#~rd!c}wpxOy}FTIX@lXyonM;sl(# zGwp*7{|{U;3`kklik;z-=INj7OMd-3jZ^zYv=cF19RxL7mxZ==zeOS8dpti4Y=^`* z+7U+#9{qG+_@bkqeZDN7KDk0Tkrj8f67!`pn{t47cBrLN@K?@`#3%eYLrAvQ53f#It6$RJwp` zIFiD6sYm6jUU~-dLGIZWCm~w7ny{{Lk+c$xal@UF1Y&6&4KY{reQ1sGM1-e|@$cBY zRsFCTF2m0s3H_N7hCXoaIMugbi!Tl&8vL=Aj1JEJ9lY)4Wjo`HT@uPxGnxbj|D`$p2 z`0~c?My&A@!U9BLY2)7c83B+pbRl9(h!hBNg%yZC?9X2fP%v`KWk(7T0C@-(fHVF~ zs18u5Zk@vUzs(j<(GO+R>jd_--r=*aE{0{cz3(rDzsYldR!3^|fY`Zi+9zk}e*HDP zN(>vtujd5u`?;aS@LK}E-YmqSm`ql*JN#+d6VUyu zOOKB7NYT7?{lFlHr+Z+omuggFJ*qp;#SADIiPDS7Ce+)W7k9zuY{U{lO88@DyUt?` znnj)cL%HbCrKlkQr!^89DlPy(HGME95S$&1F%}0v&XR*6Rq;^!Xs$>GJ5S&eEC2zl zA=tN;7o$;aN!=Fn(nX-eBztZ)KI7%a6_@|0`BLRfHPXVZDks}6FXAtly1jTLzs||N zKj}$sb8iz{GW82u&FBiqbIIVxeIQwurRvAP|4G+6S1%zv{rWTpAM_k5`|>bDZZV`n zNZm~x*&a1?-Cz@?l!5-$eQ|&bw&`JW-h}NodbA16i0U+;GXg0@IP-_xEIlGPyGZxD zpE%E2`y7uMK?bKUQpqp-82Y!UnI13Jk)oYbN;5-@H-D zu(li6Avwlfx;f@|9`n8w$T|r8;>^)LC=g_fLYskkV+D^>@cC|ow zc_W&xr#VVqZ8|H8@S3vTBx^`@%{$6`tDG)eN-)O5SkrIKrVgVy^oUCEMBLcPmMUrRU~k8rSp z_Nz2Y+=te17j8`~_rsvNEyc&-MDCwKea<_%#Vv@RchYk^BbM%Cmdas+rFyFx<4K;@^%bS>C+#HiRbIf0=ln=jYs7VJj$9_ zK+Xk6iY5c`lE@VlMhZy>Iy0AnBM8_uM3$_%V<9wH6^bvfp=dY)KYt3y6=ehh+Gj#% zpj#b>Oo2j+0q^prvWcL3Wq=-!$H)l+Y7RD8z{05n;kN+v!75@AC_+MMkcT*t;7~#& zE=W7?6W_{hye6K}?5SrfU;s_+#8D!}D}>bb~)8bbVf#i=f~3(E0L< zZE)(nEj{Glg2?-GSj(|85!@0<;4;bS-e;-w=v#HOT}jGT@74(KJE= z%JMroh_QGEB@y74^Q(V>2N)oc1sVR%ttbR6`1h^ecng#*mH`q+>Xsk!<`WxtvHrtQ z4f46?*};it*W>c3jzO;baw*otjSPJie4z$ADBiIB3N*c)a~a<%AKWzes?V10vnM7? zBowqGPS@{20Ck{t2W4+2o^yw@J`{KeT2^x2+na*(Pm<-ZMz)NNay_x& z9L`0R){dx!oSq9!*U{vx^qxz&7`ekMWin}z8qi}14on;G@EtP;ggUTQAiP3^bT1?Y0 z2JpGcU*Ys!Stzx9DT7@FD7eZVu=wRw+baoZ6cgPdQ` zXB^p=w&l>?AUyEB*j+IVAKjX3_N5;=mEFs=X>om@b)?rzl3eaG4_nvnZ#m(fVW)$;U2*s`>c*WKUL! zT;VIH&Fq@}3bj;YDyh(fsra*H+}m&a*iGA3;%h5Xg?8Ufz#iiB8l)>cjHBfy1XfOq z$*-2;(LV{&{Ia3#|0PI2h8$#hj1=(hdAS-mis%lxZ@=<(+D%e%)rNZO%Xhb33y~h4xgq0v~`dcn)*-yUWsiiYEsH!H*7VfDsTCz(xQb_NO%j+BzY&GorEf@;NA zb0krDgAfz1ceq@3eO>8#1azXK5kyoU8jLw1dq)MHDG+QvK@T*zFz$s3pC(v*v8Ntz z$!(_PL?D0y=VA*mg1x}X@uC-(O_3Hm$!Sf}ZdMKQB>Abk7?LBY-fb!h5 z$K4)-)2>(r_q~XpyMPRR^8iCdvW`p}2u1}-;5SfA=l#)!s)<0Ic7VVIg)x3hHS#;* zZ-Te>{b@{#f+ryX#8aT0SHPgb#_}2=Jrj)!4s9i z5|amW&iIb(@Cv$n^Y;}2?jkDX(V#H}L52;aREg!0CdEL8bCB7J!9WcG zbO=ANAb|zL20(?STSS>q?>#6*7^8NC&}V*P;7(+r5Edf*BZx6$en|`kv>6GA@f0+U zvY#&_05$!NtRLQiMgVu%`ngm{3_&1qeM#jaIfPj;AaTO~C*~##Xs%eVj&BKweA-qX z??X%l`OJsKCfPfxQ3BTUr^KM%R$z~c@Ml(6>dN3<-!IulakGuta!mAtm;!G|q(N*K zWKt-$fP17I+i|cZ0Q!Cb6_WIGeh?Mn3fZ@M-!LMDzY`Y_+2H{@+25BJxbrHNM}bay z6JAD_SP^Mb6c9d&)dCFE0T6!lz|sg7>;bsDsuGbV)I$J7=J1M;`pi!N-0{v8!a$6^ z313hVLkYc4oVDvi;*4{DSpGd$*|v>t?2?^CNvrx8x0Q128`v?<^zrP)*LDqkYsm+` z$%M<7*$00Nku*&2C*P;kHRo(9JS7>Uf!&*hR=NXX(FAPg_S>uM+!tHx7PqTb{{H&d zy00MyYr$R)Tf1E4=~sCuec2C?DaB_@pQQ;INI|U~&^cS9+_hh$MnZ3^Xf8HyYxbQb zO<5hrmrlqZ_d-)#K@oAQm1$Ta^9UUm!VaB}BWuvx?*rS&@+F*GQBvzQ+FKCM*XAT*cR59Bupi_N85VdK5O!f6=F(`!Wgk_mqkBM*M9 zjuz;Zl?`|`|D-C;comR(6sdGNSF z%{+VpU(eX663w(SiYpXJJdpA(;(C|T}z+LL6O27qSR-!MPu{_?&N9OP4 zgdsJ=nw7bqXrLS-5uB_8Ju3@nc^1*ggg)hRvBd|R*JPWo)kqSMyd!gD_mo3hoT*GV z^l-G|LW5#=^~}G8{cKIh00(M4%v59tmp9;C`wl0Aqf#$hHs#rl*J6ftHihlr(-}9) zp2&EPNqKXM0X0cJ*m+utxcTqxpY)}WOIRi7s9=8YQ3k`Sk*ZmS26((NILWGFepwH| z=F_fdDqoi@+kdNb55{J>e`GTsNM(`U^pW z(lKX!o(ae!>Th$Mba&} zl6Ax^`m8ld8n@1FW49?!!sU@eefblB_Juy%74gKwEa0`$PJLFI7rOD-ZUDYK(;`XX zQBKxt4TEA@Br=xRi3MNZb72UV$F5yYDGrn zIqUb9-11O|Dz4U3f@T8Lhb1|cmG@uQfUx_`C#DW1E z7_U487R&^&p_5i$2k{}MfetSoOr7KJy9j7DlUu%OC_hI)Lriam782^Q0eWHaIqLW` zAs%3>J2nzg{qI1oS0UkOz9LVND+jRnwWPtS;&y%bo*h|hL{$JKd4LphEooAFXuD4T z@_cjhcpK)J;#UZ~Pz~kRGHy~3Ck76|@{5D%)qu}if&2N)r!H7YBeSI1 ztUJqqg8X4fN?uGoGTz(qxVt+Zq}bVA1*lMbRQ53Ch4b(z|B80|(9S-V;q$3^`b?vn zoL==}uOppOT+g0v)f*G^XVH%&isYev<-2N5sRbPi`9?2Pf zA)TYY_%zoQJXkVWbm@bGqp|9@NIYO=vr_wU>vtlj<2c0nh=#`EIW@ptN#9~=N>9Oyy|q)p4)rf=T3(0*n-+@KbLGzI@aqQ7lFO7!Ghv&nqzgH( z`F+K*Y>6nX!dK;C6L%C(Pp+g7q-MbCc?NQ@p^}ch!Rc)g!w9@qm=Iwa9`EYDg^k?z z$Xd8N)6R0q+|RgSu~Sq%;5AL+ zd1n0l-P=Cax1o4!`2`dhD!_*sReZ+Mq+BsN{+Vf$MV558`#4UytidjbPVGVvw;Skb z-SW%o=$rlpqh`C}M?9ZL-rl4kTZRh>{EUaqLi*fGR9%HlVq~TduMM~8%pv6=zDda6 zx9phNVF!qM1Y`%Mr zW)|B3525?akCasL5Eg$hW}6VSaqD6URjSoQE&$;J-(0HI$T+j__!|RfQSj*;RT24& zx&P?!OYqfrMzVp{DJzeYMF2U$-OKj%2u1+;^DlJElb<3+ZkOV-8L@X-YBoxO-M1RD zUiMaG8vTpn`VG(iA>H>4LL|L7T%#N+F}06)P2joD=&x`mLzn=I&ly$PC^77Zw0fnI zQE8f-obxL=Lp>?B6vGX=NN#YUP|oRi#HuXF7FrNsgh*m~8HelZq}J76!wvTB7u6nx z9tS3Zd7)VN$xRYenhMUc4X_UNi5p4%CHe1Tupbs1YQY+xaX)rc{g2+e*;n#{Rrt{nqcYsHF&IB(h z$*p(>7QAt|?Y5I$Ro(uPa-hzaN2D`i=OV#TqI~isG5-4ct9@%*1FXg*-1?HZe2m8A zVvJ63?S+S`Coyx9v|!cG;wT2T(iJj(#QqI}Z>mxh4xVPFsH-kR@KFb0?13F-!m5l9rA;N-~7} z{OhgNN236(-Ul_BI&~dq69L(?G79pX^viu0UMSxk7_q!NqK(5%3tCr${gkIcbi-v^ zsPa+)1kEcsJMq4R9a!;fw$yRz+!p$a(c=3(jT7?Br6$X@Fq6hkmI$QP9V%&=t@DBrP%rY5Ru&2yI5#^A8v(nFU9He;TB5NvEC?kystzsPwQudT#MMr zA!=<@;`=c2_9uGfV(xS~%f-*%#rfKaEbV!ttDFuzY7S$>JGlaODtwxF~mrBZ>5eE3aqkuRECIMA`-L(z{N=ncnI@NE?B;()?sF zKTJ+C#hX#MW|vDojhg@1@qv1j4Wf)Nk#_{=TDw=p+A3`Z&7q zN?;cqVH|)ksL0p=*!c28!Vq4>c6|<%e8UkW36MjAP-yr+P#6FJ3>L0ZBhaTnz_NiK z*&&kvM1nvty+PdnWR_%NJr&>x!ZJf)!qcCg%(vo6d4fa5eDu@SN<3Fo-&*JjgFge_ zS36wr2x)Qgmh-B{z3BGkN6WAhDA{63DUTh8pf>ES`np5PUKJSogGi4sB(AZH+=PYn z-F=ZmNxmqD@AgT|g`Wt9`j2J?Cmb3JpCQ)vhtri_IZlA>_FEX1FA;-#$MOC8k}A(l z13K39_i83bBb|~7syIrmk0+1ReE1Fgh7Mu)jJC2Msy?l!D(U?i4VS?k<2mPzZaOIa zx7EcA#irYFhs8!5JZ=l6@;1C21I6g(d@-(H(><$^qv%!A*%#n$vu}zXNPdgb9W}=f zCq~;R6*2L}_YZ#0tG1xz0r4b5;itm8#t}ZERe#j*I-Zv`$-B0A>FMb-z2gA%1COEd zy8(8dTUo8%d03Ys*9PVJ<-JVLs}A**$F0?6o2DEoA>)0t9I%zOIS-GGHdu;K zM_Y9g(pOlEHHfIEe`9>3!S7|O$QB#(5=v%cyZcltA|4UQ%qldq!5pSgI#=~QiE=a9 znN9YZpcs`xC=Hh4!d>=r$(?-01s-@sTOBHk^@?^yXmK=#Xh*v0sh6}D&1p-)hU(GgPS}-P~j8J*BI2UWS%j;PP;-9GEH!vc}7;;$w@R2Cuq)KwGR<fbSV#P94DL%11&&G>oRN;*1zAANM zTyY%3G8r-(-yrH(5N0WF1C)wm$uc>4U1fH*eUO2R+RQ5) zd6T~3*yT~dP82^FQ-*!1MNh?72|9^X_2*A+IkqM-^0=8Z?Y+nR+GMWY_`wXPd}UaUPW zyz;yDnx}$OBDBE)Qkh0IHW#}e$}rAmlPnB^L$+chF2NmQ>ZdC$IOr}E2n%O)c1`b*1*MU`P?2cPG+kNNQJ z_Kxf*mjoCi;|DfA^`c?MOZg!iw!P8v1~Hj1TAN^e7HfxfftII`eOl6&N2NX5C@Wn1 zAMifs$l`_7|1QuWi}c1sFSYWvE!X~v9|4{I?Vk5r^0)5wryaXe*IOFT%&7(Gm5BFz zp{OxW7-5~g4Q(N^u>l)wK+73_fTJ0xEvSI0Z+1P^YBE`{<>5M*O# zJUpc_@`&74cC9QE6Uwcx0--6}l2eBb zvGdpoT8Rc{@2+)EpDx7%0b@32(JLy}wkU1Yb0+GBQ%mHY{5TGt;Sebk^{1-?_#OYb zm-&-e2oFjW$v;951*ecMr@pxZe_RUqLr#=FXq!MZK7Oc4! zbDWsbWxD#0!}*OMV1to~uZ@r@vRi*pHXRj=0cw(YGNsuN=JBjX_aD{Z%MWaBEPT}kuL)|fp5E&^ z5W}h9%?MtKf_#$;1S}SbU-?$Na1;BjG8#`IepTIcoQCW1{i(tzpb9+?o(Ar7=ZD1rGTrASoHj|xmX*_dbWHn>9Xis2b=Bmm$QkZX8#%?O1Uh&Rg zLg7yAtwnZTLHx>kF$^!|Zmj#sB+OQ6U9@I5TrfV81~y1M z|7vSL@Mjs@QOO~CpJ@fQWm!txT@B9?qg7o*vbo!(so^4i#N{Whfor`*tP>TpKZA0L zAJj@8YCLWmG{`seS`yBb#0J*e*%MyN*QoF~TVn74gHr+gIp^_P@DWapcGz!xcu!~`8wS6>Ri&;M?)Xh@ z0D~0Yp(M`TysGRs`zNnkCt`Sd2YC9&W75@~`#VU>|MV_#=+V#5ly`K)m%~0UL~W9{ z_|+T2UL-CLEpY^N?8W^#?aHyY?mH_MHy$>Hrj0Fmwzk5}P_{ziVDo{<$|1zJdDxM4 zmwL-B>FJjt9yqms0v{5BImr2N9dX5V{xE}aSTb31o)If+vb?1;cF*g*RAljDjvY-J z&95&ZS=@F(vpah*zbQhydr;=XX@`Q1(<`H?|q*3~`fk65`^hntm+xnI9 z<&>AJOp7HGbLYg9eq?-bE&JnJkCPH6L_4In??`7S#*N|YW?d%;@ZR*i}%8Jfyb-1{#zMW+)s zeIC@Q9XC6O14_;h?>uZ)r-mQa*vNunoTup_Imh|QZG~Z%#${bkmz_g9G}YI$mF};$ zBk=(Rav?*wNzSu_NB{KaTg81y>RIB;%jltb(@BHOfa=Z=C1?lw!%iZggE|ZmCjdA5 zLJIJM_ojl+fVOuJjPy>NE%X5KRs6V7d>{7Qt~R*<_u3oKOqX0Yzi|QeH32AXH+-)< z;DoYhT|k>ZMe=Y1#r-cMzwx?wE51QcaEk92SiXm`}vK8A5*NB1*M%gG|xzWtI zB%LgV0d?fc~Oc2t%xCh)REaS&IwwI z2r*6ch1W>0xo$cIecPWO0s3nZ9H>458%RPDkspIo-Y421NIzU8-)8#_BN|3xFgaC` z4MuAOXnt*uFH8wZ$e@MP#J`i+pdhl!aX(>6j)s8D#3Q>(rGf(~5z@j*O@PDfhM~Fh z$AEA~)KD`0ADDsYr^XQYKYsz6YU07k4ZmR_`!+LyMVUMB11bGtt9ru$;#htIwH&}H zF1wvWY6c$g91?q7E7E>?+(mG{UP zcCn~%CXhZ?M1>8(^KdG3#6-FhS=G-2lR zK?r#O%gXlFBklC?c6Hg^;>KcZm*ZMGzNWIVRsJZsMDx*p)z~Aiw7jhhN@h!m&BL3x zEm`V`rh6C*QpH(F-#5MH+$!RAo$nnxjm|^w$*oZU>iPt4?eoBktZfzM#PFO5`u;~| z+^^R;{nz#SSEF1qDSP4Om@56o&k-h-1;#hX8q*gW{{&%x+%@3xvH+7X)c(;rg5-9g9_tybYu3F^eKY z(w|n%#zJ8h!9)#Jx6E~{Ik_>0G;H&ySTTknzB<{?g*(rx5^>(ut}>US%k;Jxjf#w6 zLMm}ZxR0o<><=`p=bzHiVz-TxH{kc=XRwzro=K%HBgvTOF{k8BtTZY!wZHOArAWIU zaxQ2U^cG>Mfh??R*v50iI95qKPAonDjK}aqnT%v9Y-!Vm_!+(ly25O;da3f+Ee3V%;?IBdpUVyh=Q|8&O#pue}XCVc%bm~OOvK@O4 zF?57+ge08Y`gt?Kz%P1g_2n2+Kxo=KF`J?N#NFTrK?_f=Gjo<1OT%#*+_OlXuzwUW zZTp=;awNxPgyPGIZBpBG+0oFfyjqB561Csr_Dp<mBIF z3p#nerEnp>*C1Fd5|@b}h!CQc&Ac^*O%x1ws!i-%95798*Kv;IDDF*=(hWg|TY8zh z+$V=62K`b>naf#FLT8&aGOoJkRJ9Qimt!UM%M1UiMlm)mWwlS(a87|78vImyBz z3r9C>=Dd3v?0o1)A1xVT&^0jpHB0o&zu$p#W}rXxnM=+T8_9LEDY}^?Xk5p}%i8L* zO%LjWqt_`66|5n=kIL&eDzfTD32d7naPQxh%;m_)U=_?j`DtU4S3e)<(u&IFDNi*7 z?#_N4sv8$|MUVJUgqtYG!qjj~=ZB7|Gz`b~P1z=;wA55ph%doQ8UFEL&;R-K_j~)$ zyQjq<_&K`w3K&})G*xphMLQHalvTa=OSf1QD)h!5obdgnRWmAw3lx{?(Am6-I$t&e z7a4U*LxjCQ-M{B|m(rQILUjtrz&&nN$MZU52pUt6?(vR)%JlJ(h$yll=foIUHZF)O zC{K@V2#?7gv^bu|`W8*4u&r{aPVbJtts?COmw>|@hs6V?PcG9<@a3DMqI-<~&J2pJ zp4S(~MlCKoL)6r0U1>*x$otBq_?ZYhNg-qcvp8(#_vEYh-)6Z795m@p>BuQ_$l1tc z=tG;-<&f`kptQESW?g5{tns|_(ioOR*bzvB>mNxNUXrFLh8|HHGVNtWT%vvwVH}2n zLwkMZPvOrX5;PavhXzxC$fBdP+J^uG18zXY%)tKlc`}~Sd`tif^JF3UIKbrZ-9P<; z-3H^+m*X2eDWnT#Dxc{Njl1_Q1$LNmY z+kACHP^y{?GLu*BqL;b`h}rfGb)*cOh*5Nmw~)^cS}1Az+T|V(!>>){0abq>4RScW z>{F>@3?`R2yyj>9|1pWLMMqEf4pgZK%l!OyVETs-C*AM*%7WbpvzYuUZQ)2;5Thb} z@bK~R@Jd=C7a+kbK7`06rik=VAx-*&6k}^N!iZRi10qaYGibm8BB0y&$7p=;ZLW31 z37_-te9gP)pF?&-F8lB8Jg1MrPzyyMAaB=yv3Q^Dzc%y0?La`l^8c85RvNya{*#$k z^!;CE-m|Qk=D_W1l&tQVtWTaL&U+ZtI3rr(!JMq-cX?fFSk=@E&_;t~ewfwH9yk@? z2qdZg@4ACd!PZDgkbjhCh51&_nL`9ZyuYcB^IrGyW_EZTi+8N}btq9^eubn%GM%2x z9L4-S<2H>scjD#j^+oo#F9-x72q-i^2pAGD#Rc{{G?|c(^luO4ASUBV!T;m^TT;JL z;DI{KG(M32udLETzzo^nWCkTbq?6+bPd@%d76gJf_ObnS&*$~51Ni%L>$3z*(AyiUBnJib1&|Nfghpaea^jn~`z*Q3Pv*BE4p)P61S ze{ue&baA~b_a{V3TXd+udGYn-@$);3;o-aiY5MRF$9fE)ETq)n|2!b124yi;@vja3 zM+|<&YGByqZ~E0A_!Uh^#XSD034ny0=}yuq680v})>~a1 zZN6O}?|-gx{Q0xVt;f4+|&95DleG-U)WMtMGS(`EBV zm9(+lEM@b@#pZZSX?6rv!GFG~WRJRn z3aTMB^@7#BKk`m|Y(8mKk1O_Dan;(2_kE44(s|Hv7g}<@e!=|jMOCO5q2ci`a+ieG z&A7TQ+?+|FHaZK~^y8Dq26p!NEX3@gq$EVExtG?;p2Vs=8NFoSm1$V7lJtZWC&YEP1D+XgU%%lx2iLMML{Zb52jv|z**)#n zWhoO<59hWC_pm<4n3;Yj4r+;^{;OvtL4rM}*h@8?;k?5Wl{#0`@|kw4sv*)CPg%-0 zL{-e-TTlFcIzaeT|I{-sQF6a*9y$)C^-$zNL%JCcT9Jl#!fv$B7?PAwk665QH+%Mi zpH+PsfFou7ZCRvRr?`s7ImoUzkV_MXC~cz~PgidEBSuHLn9!nYCw{}f`me)pYcoTiudRb`y^5$b6YVF1N#Anq!>4Fva z%it;=>hW<`Q6mS2vcErp6qw;;oP}YeciQu;w5nQD?TeJ{q&)VxI<32AhqBLMM_0m^ zc$>(>V&o9>sqMr04DC^iR*SyT8G0Xb;f#t|q0Qz@tw`aNi8iqKu7=>lw2+)9p6DLZFEak$siMVQY=oo$_ZHfj+gZ zT!p)n8Wh!s1KVYnS7cQ@oC9;BNK6yziod!TgF09;OWurs`i*1}8pO7 zA(^udRW8mq*NAxEdUa8e=i_?pim91BOZTYQhG2Bi`SZo1=`I}>B`5@Tq671igOWyl zBZ4+%>Z&{C&mpIo2S7v^bC;GX_wqxRUa{3l=zr-TzaqkDam7O{h@!JgzI7aqxt+zK z2<#ZaaV~hQ?JJ8HM=$-{1f=5`e=^CyJSJAL@xzq9p0Uo1n~d;Qm4=n{UocUd&KhoN zIdYo*trBA)gJG*G>+5zx8!3;C!3!J4Ijh7+P&^5+^G2A>72WoBUL{o7#yoDkThP>6 zS`hyNjZUQxgXNUFwUB3C;wcrSKc335RNxQsdi8(R)~*)W3Q17qE(y;e<14jo4eq~W zEHDyxEGjZNbB>@Fm)7Xa9(Y_A)TgBmyziSZOiCAr@ZY?$xnig;afZHE)U;f4mv4|X zpkG;BR6l=QL3L7=)Vq#OHp4QHj8hUhk`6;Oe&MN{d+Z`vbUM%eicVSNi4;di5}vjL zO&!qmcQu)lFa*_n&9~D~v{t;j%P3+)+y1L(`gQ^_1-K-km;OdL5HJTRJ({L7j$Z>a ze>Hgk{k{_3j#2%Ef`CdD6ZKtj;ndNB{~J32-1c2*fF~{Y`v+ddh31(>f;)bsocNPdNMj+zfYJ<62yn{-j$$_lsF-g_4; zde578SaNo&GaKch#?_Ty3bf6*RS~Bt8yUaMgE9ZBI(C9UQtX?xoSd)p6lb_jPHZ1f zEY7UihR4SrfDm|g&!Pn@_TDG^uTJ>$2&!oWXEX<|v}LcyaZ%|3u?H!*bAQRkPycL4PM}cS^ngw+<$)SWJm)bBd92;;!uI)6}8s zdOi)EAs#>Xq(g4uR9?SQc;B=%?Of3QQKN;g$=HVqjJ){T1yQmmJMFlPvwP&VI3v^D zu4UJnC;C_=t_`*Fycjp9ajtbYKWO<3!RA;+O1;Qv|1fo#ezo^pA{U)3a@hkd+4u&> zc}ccaZR3mNfM?%;jpPbN<7Ww;^iyrt#na4c*DJ+aHPmtsd&R@M+0%rpkh|X)%JGIb zV5^`1G9;q;ouw&@HOq@F@zxhY56c3%WE&En^#Nok4NoYC@oBgH5frHQqHmfv`!u#NObqW@U%u@rdE`>^20u3Mm4%@Mn@qSe zraeV`=N?^z`ZQd2wF}8lQ%JV+B?f}6>S7+U4XP9tHH$85(ZBHgZK#G2M{6r4z^S&5 ztHP>!1T*H%E}hz487J@Y6b^&vm&vc)FU~sj5Wuzbt;I$h0$-*0n6e0P(s=~-++~BH32*b~8oY3-oW@s= zvRZ$>FUB0(ix+;8Y;#u)lIc02??+WiL`RQ|bf~;bm zS<$;d{eM&SRe)DX1I!QnrOf}Q+)Thz{RbQVD^HcMB%gb+MZML>F#%%w**pzuLe|<` z^NORfq$U@tOZIGqi<97syoandL+=LYNo&R}XT8G)=igj0$U;O*HHNO1#2>`%+ z35LlWpk1fO!k(uFFZXWqLqU+;=#=P4{`HrL31>|w6YWvZv1BAa+t}7Tu7G)P7 z8Q4kNaEXLs@nyvW*D-fFUil|J_iiuqXVU`DW8AcGbED>eaCYd;X|hE{?_9iaeAfrq>FO6E0S|Xv>XEl}o5<%a|T&#Fjq0uUj?zh+X%? zJkr8WmkY}%BCImQnJ?s`tODbSZLg!v0>+|+t*atWzk1BEujIvSmMN-mon<|Ug4T!&DwA`C=V`I-DyJg z<=t#jF`ubI1_*96+yCJL84+I>0%3_(d+m2=dEY4(QUtpzJ~iOe3+ zh_;+oMcM-l&8<1aSh^IJo`%o9%zf>5FY15^f1RP^5p)AbzsBQO(DTn|fflr%o!PMb zd+kPV!C&F2Iyp~Qx9qg?&o;%DdutL^&DNeq7`q8wF)L`vCj zgM9rz>rNntGq%hKg`g*fih|B$Fa7_)-dD9{(T43RB2ofMH-dn4x3q+$ba!`mi2_R3 zLzi@ScXxMpw{*idsKC39^#j)0_%e zyb>K8@2KS-9)D%9&=JrjldiU5^-_kF$qaqD8-m?|hRgDVf`2R_=$07Ksb&LLOxg%? z(QYqJV+9wgB+EEBrYqNtk~UGC-SHrC=5p7D`Me|LfP#UuL4ghA;`j>fVqk^iIE^5d zAwPUU(ItR#vcBVYas;E z`J#25oj{ycEQ2!uaKNDq%b8RGjSYo^&VxY$T=m4Yi7;+n| z0pLk2U9AB6@#$XieiltDKG!7s_%qUAt}C&1 z#0|A-;&ID~IidKUE~l6euQ-j|#BOSzbvHunLbHK<#)0&Q(|D$ta*w?sQfkbr?Q!qP z0f!vW-L6x|&uNf3f^4BExdi) zI34q^a-TDQRNGnOoTh|~I}xjHuFrXIbdtA^>2C!s_G<2a`59ikCjLGqxbsMgdu-&* z7;J|=^y8gr<5mxeK0Mw~%{*;%$b_MsXTW}^qfqf;&81v`!*!>u#lK0@OTj^5-?owZ4Ubgq$j$1l>!K(5GZU8jsu&+lBl?K)?^C@+M?7~*x9lqYn%Z6$gGi6JLWIN} z%CIX`%`UK;jWeIBLP|~fP9hwVagG$-u5@94L!xTfUoHObLNx~|Pb@&nrhD{T?lPv5 zT{sa_z~1Bx9PTGWV)TXB-_9FPcyX=yQe-&#mSZzYiANMAeGlMl_tHGUm-@x)baES2XMh)|-TSn7b1js>? zC0(s&o=+f)xd_x;-iX{5GqB4SfInUc7v4+vPJ=GbZKjsOx4w|p~$?Hv`OC1*x0=x$G>c|fV3Vlb-B1#foKaG$(n{a(It|t%}D?547 z$j&G!D_u6Xv*-4u(;^BHwa-=RXVb~&2$lc{2|k%-@LCz%mAYJNi#HEDqT~7V$}@FK zuN<%=rxP1clnZhmFgA8jFdJ33&po@x<#gPr9Yp$do9l;ab83dM>QWVPUPv1q%PZ$r zukUYgIH?YQ@5<1~&CZqVU6no7+g`f3ky-berp^@4XB++gQ9_V2X9o+}&?9o*o3l}Z zEfxFW;0S2M?o{>XHR;tk(U!4egQ$=H0hrDpkBz#Z*6NO)fnz>Axxl;B27GUQ3G{tv z;Fdo7#4h4iYetJp4D~TC;jM#rxUA2(M?Q6}X7V`0N)(rrf$u;FJkB7JFYl9~umy{~AC4|RggrgGxLW&io4$tEmEHpv= zBB8=!dGS=HMG<^Wi)D$RefJnZfbZP`l}%`EOzV|^-uK;bP9Lk{jho##KRwf|ekXzT z<;|Y7h~Z=>OK8IYAhvXGezbQr95!amvtZ9~PRCNY$7(T;G*KRo>KDZ&D;lLQcA#;k zl7655+l^27Y|Eu9h<;Q{$Rojwn?=4bs@2)p1nMqH8M9` ze2r0rLTJ^BWk)fcv(EB;SNh~1j<@37@QFbuo=bjO zv7$~}dD`%H&6A?v&1v*d^@9nnbZg;Jho64@b(Ir2BV3s;%8Rf#R3YE)`tOF_3dPU| zq?HPYuc~CyRq`1P(_CdF+7y{K%8ChGF@Bl$C+zRxMA$`(kE6a)QlL~Wq)rfiSpP^) zAXp=Dj7zZHSxnvFF=7eST<{VviMzR3B~zxRT-~>cd?m4JHyJCNgH*32a?PmH(I__7 zf1eEa9c>PZi*;|*pZ{*{6G~oti8t*OV|Yw#2gXoSa+@PQ8;{LysfhWC=9}d~HjmJB zCDy+;)tv?Z9@IW+(okjKt4xd`59l7Pdg**gRVH5lDqCH?8^CGFf;!4(W;*y&j8$jX-3fg}khty!%rf zHLD5j$JekU@e1tAq~>M9*u~dvSCAH$%o<>3S(juEJR~D`bi(`78P2)#)D6m>^`9<6 ze=!!B|fKv zZ^(|mmZ{?I%B}FQ{6=9)TXmQlWrAyc(QewE>$u~f@9uQF?o^ILzc}bnQ$`jW0WTn3 ztJVBj;PLK*8kp%*CEU|3>omMIK8DUIn*((T@A+$+x3XhM5JDD$ zm34vv{{fp}RWWxP_8Zs0T6O0cEsjI3#RgH`=&}pbM}^FiO^{N%B<`JhF#|Cg{!H?) zbyW;O{6cbbsBNI3%I;?60AlnG?DAukaLA)R6D_%`9CfbM>Of-GOm9eH$V6-qN?KvP zYM_l6=*YuQ)7^Q=JXz3sf-9r2HvNtmA=5(1^qt=CFI~=jtIakIL()|*yrkdBWRB3i zG$r#`jpO}CjJfI3 zu_#|Mam#cuSFLK_%lL7XOioxC#g79)*_v=!u2z!%X^wl;sYu?35s5bDdgu*zd0-3B z=!`1g@BJ2@AYyA7N~z?XWbh+-+~@BH z&nMwkY+bxiS|Bym6XaeD&T(~>;HGD5`3Rf=r>71EUU$886t7y`MnbIqUgcqJfU0Fejr=WlvqD3+B5LAd&JUIx%bn<1M#(? z1*ltzy}|>Yw#*=KN%i?>M?JOqk!V1<+cGfpSRo=rV&1n4yS19YmmG#GHCWV>?s-4* za8nM`emd~AhZAksL5xgEt3h&voRla?b`ePA$9yT$wj#kpbv`w^?WpJQuzFe?*Sjjbyh6pvF?H}&3=t{K#Sg?51x>^;K+`V>l1mItK zLNQ{M_eG_&!>ODcBzmie@GXFN^2~flfz6HMoaa=waFrgCKDmlRfT|GoCX`x#~P|+p?DyTnm3QoUbmpEJfG#$EILXWcC1iQT>1`!AvLz= z`UFAkzGN>f#@M1jjx@I6^z6-ZLFOmSM{xvMi0mu=u5>sJ7K34Rt0Q}nlsFXD{DD`g zI*gj4j?^1sU`bEGc|tbEJ;{yrW6x6~FA@(_DVZT1uhIREM?{86+NX1P{T7?UxT&PN zX%)aeVAch>^UFD%NSn6>P!R;PXOS7O*;bm{FuRy3opH-#DW{SQF|#?o-v)0A z(l)noNS{oGs~!5b2x0N^@iHrrz|a{|!@Wl-s_i3v8gq|@805k~>yTiW<=V9gO4F|I zkqTR!JDz(lksj*5**#MJ1uGh=sx~JZqDU&7?N`b6bH;oZ3GVW=eZou72^FStU)bS_ z`tj|~PaKYomQ9D6=u?ki*zwOm$|n9|oQxxLvIhbX9hSB=-=Ns9nLL&Rk$h#VZ#v zh(gPhW`#ttN=g+E&!n7WyXE`~V#T6=96^{#)gjeJRJCg_)`(_6vvIMjOHiDIxPo1)=fnHl1LJ<{ zGC#?nb2~YS1qHfOpnX!HP*Z{-G7IY~rwzhCF7Q__Qz#LoSj#V@V?Wq35i6IMK(#Cu z!=2wP_bOGu(H?>gFihkP-dP+pD(Zh*eLSwc7@g;jffEn7VD$dC81>x8PqjB*5F1eI z%~ZmEe~N-5Z-B-;PMG>B46gtcI;|aLv--n}hevG##9XQMx3J$HEA&dB`0k18rhY=J zM6mCpS0(uOr^vAf#9XU&T3D~gpGn;p_BND_c#r%3-&6Ykbd@|G)GJW)ah&yT#mqwM zaqWbYzkx((EgOf;9@LC{#ySR!#g@rFZdM4S9rFBs9pd_JZ-C$stJCxWMOq7Pkf%?* zZkl70I0kW50)iQ+q2X6Ty(uBwOWOOo2LS80O5Lb~I1*qWihgtXW*vuZp(!pMz;f*3 zF55O3MR~iU%=hTOwm|%SVjA@S>1S#hIc=4ersQB4(*#YVEuddX_ExyfGwilzh~5ob z_@__cgbzhaIcF4ntSkoQEiPRmzO<^2%u{g9!?F2BaM%NnM*a`NQl-7 zWWvLmlJiFYSsyv}O>qvb*2gU%VJ9bno>@|ekTV) z$yRz$PxPGSGNSJ)dKND7osEy>Pa!*DCCPlB=3a9-e;9_!esyL!Rw|kr^vsu4Dp!@@iRuK&5?u4m`@UGX zjp)1m`qE|Dc2RNijn@P-q_(Vq(%cKI`b+j$bu@d`^HW=esY40)fobX(_hzL8oSUH_ zSNIMj+%A8iH6hw&=pox!M~{O>{?)_hpXr_V#na zf-bjFABBs8>$nlacykf7ih2!QGDNm7QWNKMGaRX=#KyAGK1EK#^sR-Wp>eNk|K%IX z2reSg%)U~R*%=UW0I4s(NxT+&S{DSRnw*Wpn=%-C2;Lqyn^)^m?Ps(V#@W>=TMY9f>JNC-;QY2Dg(MYa zgwR4YIEmD1gin_j1`AO^jRMqq@H=D7^V}%YoTBHuTE|aBv`?*pt!=XhrrGt9KZSph z-SKt55Szo9f+*<4c!n$xyTU8F_`B3$%%yrV$V;^lr=(;Tdza;63f3s50^u(pVa{@| zDl)MQy5zV!slVY(#C{>aF9AzA=@L=qgNjHT?HQb7} zzKG7JTOjgkNzRj64Yyi`GnM9^L?04fR81&OW@qZj*=F!p5!hu%@60o;WIGGRVdblv zHs_149CwxHJ-LMJQ@LCVpCVqv8K=UHYcDEjRPtctbsX34RIP|Vd_Rcv!u(&Ei3bl} z6i2w?iWqSUvz3Fj{}XE(Pe+>mJ@!1oD=0f*V8*Hh)omsZZ~t3p>^Bn9YYIHo<4wyp zBQ!L)en;Mp;@O3)%(?@G0;;?&eE~BlyZf3FRu20K5%hvbCnDwxGrhz&7hVGEX!%{m zPGwa_42!)?jeU#TOt;Snil;jaxPv>hTv!exi5-q>%O!|*zBtqje0XV_#XjZUenp%S z?`>x)UNgLcULF*(vvV>y5L)aNx&r+#;M74LClG>Eq}F_&jXl(3f219d2;Z(=4RTJ-TsC%IoaCZEH^2CdB_&!5tmep+EZIGj;?LCUWl*NP!bE8 zKB{;p4~L`7_(mU!A9mg0_PS2dz#^NbY#(Mh>Ri{N_b3BSmHNAG(8=q_ZN3cl_#VDfV*u`z10w4&hF^?Y#+_>j{4nwpZmi+WFDoIzx3AF zMT3WHJxA$Gc*8rD3x2U;YisjzDfR$^aTd_2j7D5G4;8>TsU{G`$3p|mOKfvTME@mz z?926ll7fh_gi)q|H~|eYgB1oIUP!J59>|`Ew2y3#DAJkA|>_eHjD2$#Xt zuPIC0c4ZR!(2PhV@HF=ZH2PEp(AwzIM7X2_ALENIyPmG%xFMmAY-r^-U)8PCnd-rzUUY`FILtqHwu$k5DGwa7z3R zrkq7V2UBa9YGp5*smiaN^zvt9d1(X71zRN^`XiS&F{V{ol~eQ#=BDB_c}xRbA(?*E z^Dx2EzrcWoyd`%#OxOO`wPpDPhG;)`%-jIRG&1k&x~=(UPtM(pZZ%U!d6XHwqN@7Pwf4APV}zbw{gFdDrn_^cdzv`R}ah-*u zht!M`LD#?K`rDENXXS;~f1fn*fg^Kk$loTQk+juTW)MKn*;IvbD{Rv6wq&|CJIe{)&BD&Fbxhw8 zjy1@$VRb>})D%kww=IS*l}PTpXPop^Mug*U+b^=-{@+i_+`iv0@i4H&AsT#_<2R6D zOwSsLHF%!yA;jaC^-G`{XliUPuDK>=hU=U~TwQsh7J*f-UT^Jf`KnAba~7&dMbuTw zpt#^lC5wHxMflqA9!h%@B=i+THt%?);xpf!?{lUSgWXH)RO)pt2}QQ$1OI{$(D`DW zy`JUx`942lY+sgddAEV0(`7=s9CN;1I_opkHge(Q>7)TO?H2mZ34j$87vsaJIh_s1 zwbN=EqL_x4Ir*-D4H^(O3aGs#uD{3eT~CDtQODgtgy$Gjqu=T;+FpB+wEJ`8ki3zy zVJUCP#U)aa(}UoF051>#L*1WAZDObwK-RaYza1SSRW6@CVF+Q@X>Xo*TmA}SN?^-o zgnuz6RXTXzK6~HkCavzI)J~xMIu6t~%lW++)x$ae+>GmrBXqZa5Fd8GIhT{?#{r1z z#>r`$LqG+-NX4c**WVP7pb4p{uxroUQ*Q^^^Coq&v^`$|3q}JP! z*M*i>n7;m~>uz-s3A|z42KwlZlhWmttZuW2(`;ASWG#!j_6x0|VN=CYg;lwuyrPEs z35rfH=YzA%?)jK`10{WRFAF2n1d zT)c;mKDZv94pgAV`Mq{f^XQbOjMocc*9cNwn;~8na|BujOD;fvqkNsEK0*~>BwU*Q zR{L9y#5O0IWLi&CNyW{nhDp{a?@Kk}o1jg>us3-M(v)HYNNVhEJ3etQ1TylSk?$6Q zxf)QHB<*CkU&$axmDQ_6sTHx-ks%hDrtauA_ek_mg$?R)n0;(!^B9a81PmXM^Z+(; zcztoZDD;K)Lu$MUhMWrxy#LFpmrRlh5Z>^)Fa#vUNMA?dT!Lc6^wYI6csZL!^c>Ob zBxa*dqAwBM1jPzUa!KL*ElZHBK3f>LtqBSco`AE*&6>Ja-1HufBOh#?A)@!j8Fx^4 zZrVnO0r0|xa=GThPT*SUz7OpWvTVo^(T;(aT1-(2wOc#-^%@`>+a{r|$;bn66b<}H zg>?flRXs&Wx4t$^PlX=VdnjjduygqQM>$L3nY5A}lbXCgr5z01oC&s!y{e+~Z?liU zR7H}+p9-u@>?P-t2~0?!d_oZs84`58bO5ZA(eYKqPW&M2bgb!=?-m$9?qsJ`SW9)X zv)fw+Ewig=bVht9@D(2sRIySPc#|izB+Q|C79oe?$Qr}$oqN*DAM~XRLm#ZtEOoXy=Z$b>3lc3#9sMZ*Cd}I=noDlO!kB><=>ldQrJ z%&?tC8zf!I0&;D;t~eDxLkKu;d-Fv;V`;1;I1)KD!0&%A@ZM%C;S8y~Ae5s}rhX5F_fD04 zH)O@}K4C*SpPq5v>7spcRn6cv^m`#RLU;JXFeh{Y9RfEsQ$*tA=ZJ)3);ut);m{$;&1^)59J=I})` zmwF!5pDy;OA0>UHI)(uLrUz-f?%Z9*7jhsq56LE6)E>V-HM(hmPJ}CL)$>)Oh-p&Q zH^Re#{*@d{J4@%G(~r0xPq5s8#W!5mgU0HiEyaWI+>M&h8ugQ--L$ev^yO z=faI5-*kTQN&R6-0HPy`VHG?lMfg7@tpO4B-pm<&Kl1c{idae?t}@3i-=YwU|7=W) z0=SIm+V3V0up$>8E>I6&{6>_0ET-KJhyX5JcV8Xz5lrlO1$e`Vii4c|=mbCg4`W2-S09Q#Y$DQR`eING z=nWmJ>h$eciSP$<>76Pjm(0P2 zh?Cyl#|ifcVi_)-U9QWkm787f^%`|VaAuvXt|Zxt+mCiF*I923WfPXw?Q*R489t<9 zz-aSJ%?Es2qZosGCOajx`XFEYQ;+ZuDZNTmu1M9{b4aiCEn_Dt;S0IPh|jUR$hz4? zvD^JmQLGCs2If>xZ}k}IzrYvM4aR0r`9VdW<}gzM3@Z2yEcIxDXB|;npM)~+BjJPe zM|<(=ldfoH=`w?y0G$0s{t;%Ps^8YvZ&Y9KBS=Iu-^UZH9lME=AnpqjVpV&C(U0NO zOW8EWOebm&I_ea}g(^r5ef_>I&OVzafI8>r9A%ny8g%`;6244s(Pe+L>{Swy7sj|{@>g0?tljfVd>WEI04yV zr8yx*tyr^x%rsT!Y-3q#WIZ0UwL^Yell4HDg=ttDK~%#5n42yYSmVrcTi@d9}DvPkS3J&t%Vo$dVO3Pr z$sqrT5$a^O$FbJg-y2R&(EeiHKG8@w(pS+p+sno77Vh+2gq=0R6%XymFp+%DP9+yO zR}}^|VW*Z5Nw?ftp%2kAr`Hu%GzGg;avG+JlasWnz9)i(TY#5gG*}#lbuybF%Z5&y zV?^v~wDIxPdXLbNL*nU|O>$t3r=_b%Fvo^Ld8_32S^-w zo?zB-v5c)Nn!Th}bY+a!nOwV}47Rih#JFRotuM4hWv_nm8$G=tOgd3dePh4LIWZ1` zhtSx;gSTC`Kc}Ufls;X-GyE~D?PD@=UT*#Vbc|eoBMnrss6O+CcI?7=%yT`c&K76$ zvfx&%;)-A8xil~ai@>-2h-yqu*lqbwn*yP8)BCyG8TnFjS@cDwRY{D?_0%*4jVI{1 zMSHhd1}hI~eOUsA-H-ptB_mz_a5rEBUa_Wh?r%0NW5KRpl zs27V#7V_M<56dhPz{O!X9~#5S{umkow-GVd9vd6)e_hBMgw%7z9t$x4VS)mIbaAv{ zv-ZS~w+RC@jB5PxQzlpo2C@uJZC~sYGh`2>i}vo&xrYV++VBw&arPyTN6|fI88j+@ z^s#psddfS1NK(Jc;h5FxiS$_pJW*Iw;*Q@RX`mxP;P`>6dVLR9$E98aoaFNAXS1g* zIKc7O2e*6BA7LNA2;d}ZK5o8#+|ok;9RH(Z9LwXPxE}x~84y8S`y@hhcn>5;fqXi> z$NWpJ3Y_G@VG7gJmj7L(uW3k2fXsArZTa+LRl$Wyd7u9hPZcoY5f{3xwVoUIu`N2(HXD6|;d^yv?Lre9FYUjU9X76!AZf%{f2Q=g z%s+Z$fV+Fds+_k==JA!lLv%NerbWBtZ$uCogJ3W;z0O}kO3`g(A8&m4+H6&yN8Kq6x)WtuIF#uFqfPK~pXCRF-X=Jf2e84ko)7CuV-t;`dQUH0Y z0w+SCvPV>uFr!dZkW#WsI8&=BRgED<^13RCAD*on1_*};EeC)DvQMn1={Rg4sMJ$7 zt78-*%{_Gy=zBprR@DbXpq2M6;>1w@^U;-hU_cglP)zlSxe-vzZqc51|3?_Y@>jV- z!u00x3IWtK&F7DfMyp?b2_(fJ;P+&+L8#CN;-W86pZ((_r+x}>_o;)IoH}>;J*?-~20lczgf!!QWMQV-dO-Ud z8rN}gbY+;+z6)xu;1`>z0m=H`STgk1h8Ehz48sxnN1fS=seGUObD7k<;B6@+;(>dk zaDetXuI$#Ss*ai0&yo?jA9cE0%BZ}=+~dkU7?>7h-D3JufrXaqVVVOulSY5rGQc;-cNMj$)acwKH5FNJ^szCZR9hvRE&k23m)yQR+TexToV zZlUemK~+S~PF+8!qc0^_>4|#p{xZ$~O-f?3sGHLK&ZO6}zgBETGt4JU1)cp&8DYFs zt_*E_fc_+nhV7*0Iv;d>F^fGx& z1^e*?A}lJ$e$*SdU5wZ{QH|%>OsjvrRqFU_$II7ju+f|I?%p<0&#B5|)spkZ<3;JH ze382d|2|9ZmG1!x_EK#n<~3lXMOK4yP!#Zf8}`G-mpmrGd@QNjP&zc)Je%62SrCxQ zIgY0v$r&ic91M}b8;@I#$yO`5_WMTz3~_Vs5a6YC44|@=_46Wj3Tz2bQ_s>ZH#{Y| zQ`$5&2;Gvgs6fwoVc?TX<1tm;{&Y)gDp2JR873bfUj3i^I8DDUsbN+9Gz!4wx{gYAxk=*#(3I z@E`<@lUyb?17D;%4w2IL(0z(4W!&7MgedX2@J!#|cE(%Ioi^lL0=Q)Nl8aqab^B1R zP~N|Ks0S8^;X{aqLODMzGv3XxR^Hn#{6Fph5kRt^VJ_M|spzQb?y??Gt>*5f3%?*E z43L|X%j%ePKJO;d&&mmVUAxo@AiBwmhk!m%_}2RJDrbysn(xN)z==imm(9Je>|$(O zm0{)34wJ|F&YG@l_eFZC#X{*@O@kX#hNh#xKIzvG3<|R4%31+Rp4Edr_91bSvSUoz zpAIapt}piXEJ{t~(j4v+hAGm}-Y_fMRN(tP8|{N$TrYwZj3YzaKUBEv5mSVp7vmR^ z7+92gQV&r-ROM77rcz<01lWJICJ^!`>2-!yKn3!ZH~#O)FJJI^Zo5AVIn*(?H|TmE zEtz&c03r%TvK8gG%*9budd0J~va5lI7^V%9;3c5QYij0Sph(QJNi`qEti`(SW+I;K z8!Ce}WHiiv!@{Obr1+b`&>+x6@)UD$PxCVzDIg7R9u$c)ob#w~*ewkXh$uRQMtz7S z)E*5h^sCOv<0QuD6GtKSq>UzL1C3%)D>g7#OqiIjf@hCu;rEC^R{MSkLH_PBfzUOQv~ITXbIeVM03Qtn8VHiCyS_;go?oPrO(*f1xV>?!pzipe>k z&z(mmWKH>@;KAuc7^jz0tqUmlR@SKGcl}CU4Y0SGxz!ZF_Vt$?%YyLTRx+#(>0MlL zlXJd)+*z`DH0$CQ0o5e0Lj}@aRU7(AMZMpZS?4df>s0?`%iP;b;UBjDFhGJ@3~c!V zJI+Fpe%__CnSg2jRdoz9%su)@AF|->p?mU5YlTIKMsv`xv4<2TyVL5Q%}0F)oals& zRg1}5m2Jdfx`UT9Gzog(rZG~cI<#{gym%z}x@I8uJlfz7PS=q722aevU_%RHkE{+> zyr_gxCN0;fiM7OFHrFi?F0QQvqfs&YfUbpv(EkREli$oU%J*M_v;8BM7Gkqh{*PgA z0TGy30nCYhOt5I2?w|LraOz9{tN5e#2U7F!2D0%}*1Z5`R`f*F7d+M0BKKVsz2nQ6 z$ArpN2c-R@RjQl^B<2~|@O{tbui8lTnD&FHfQ;^Z0b}&kGt$59h)MhSZ|o7;>OUr& zDG!$zRF5tNIF=dx>#9G*tn3d6rdYvg>=cX&x&FQ$*|(cQDYIt9!L1(Nyq9D&h#&&{ z5wUJtx(pQqyf-TOeI@;E94yvHk-?u#Ywd9IccItY0ho_Kt*MF9gjKWrTTaO# z{NK0zD?YVU^xFtA4=w{Gk`q9Ug}CVg#}-zvqG}|)4W#8X`$HhhjAa8huYkVv2|6X9E5$jv)O^`ic=SPJK)kjU?XR3NLJ%)7x=6VKpMYI; zR@)+9%eOxl#`^9u)UoPUuMjlXzX@&WOoVVoP?@)?&LMHWH~~mNo9YiEl{LD>?N}Y)6GMEt3*u zKX_t&p)#8k%)8L`gFCCy3)JZgvwTIezO}=zGHfm|O1cf*6zg)^<&nEe!P|dsr8)%E ziiA{`*)|}~%879v2Zj<2WxSTN=jqM_4BClGrD|D_gUu|ULBJV z&H`f_N-3%A<%<-cyZV^QZ4##XI?CRqE*b)#)uc=27GfUbI1i`CewXU4A!3~1_-(17 zR88!+ORj(klOYo@G)nYr^l&llZCvY*%gYxEZi;h*RGIbE#M`>HqbD~NR&H(>pE%lnqne>!`Stnkpd#El`vkQMc2>b zJQVV!59zb;fS}8WfVt$jH@E2gcf=UimW;#=WnG zqw12|9$yzyhBAPQ<@G;-@PRnXOvfV#*05AdRjYQxkW^1KXFyZ-94^|elnCh-j6l^X z$tMh`y{Pml3qJ+Nce5)-r99DWL%~-qer+wjZj<~&BeuNcG*=cPHIa`e!P^SAh!$uV zr*g4P8ouZ_e}TuoJ8H5a3@M6tP+-)atuSW11W8be|8P*) zAr2Q9_0#tarraNOGaXXay=I?9&y>Qls5sXp4M!QH3eXci3F1Ipi)Ut^%^lT>Mk%wn z)6!x4`{n~6RY!GNiEuF`a-KIHUG}VTcxk5GO{C5Y#s?FoxWmF?L#b+(0(inVUg_Uu zWLcx}<&;>LFuYu*L^N``tEqNaGwiV4WV&d{=>%ytM`q40j&67r-Xd%n_zt9%5hOz3 zWr}B4wu?%SvVilULeZz`Xk<5Rz2Ea}tHRj)J69&novV%^l_NZL=bHLh9z{k=FV@HM z)>$r$LbkT3OtVygs_g8tG`XjztCpO${^PeCkfA}bhE}@#ttsys=sWLoL?X1^Vl!w1 z6gm2SqtQQenc$dA`dVa>JuC%|ewzyPxpe2 zkP;)Pr1j0)r3(ii(XWSxJJhKY5pI%k@MZD#?iU4;a+H@OCpc>0RITisg`Q)={BTGL zXj>q{RpsIH2DITR@F{i|xR~V1SnZ^l4Am1m(3v!m$ZC^paZoy;NX1W0&Fyc0Jv-`_ zfBi;%R_P?fuk>=*jl!(%Uy1NK;=y%!*y(& z&n%YXN9bey9UaiH`gUU+bkXOcMk&gl01f8Y@3fMbKyy}^US{>y#fyIrj&tGTGM5@9*Ka`};++hfTVIw>ibZC!x zJQ5LXM5@m_Ig03M6CRMD!54=Zp0*$YxtGO)e)!2Wi+B%n;we`>0k2j(K*}Z#(2ahm z3c1w30p$Rqhw%8*7BL{xueS_}AU-zXB0)fZ{mq=JXd7s1TZcr?_U8sK_~7CI{`Q}> zcDh52_%Q7Y`EFdw7So>Qg%v|8Abr!?BukI$P*aeWZim$9&t9(G7f1e`*G_oR2IX%_9~=Vwc$hg=TEtQIvWZVFBs%6UrCJnd)^@jj}&Jegb+HannY!R zd>Ew}epbPW+_3{*;hccq7j?Hf#4i*bY~24evSCO%0ku*={22-!t)5;tr-VjbJX-uN znUd@tXH0Eb)e~pqfIlB=tK}?3L2+CSLazsZiz8WlAHx@)#b#A~y=xETM);vQUhqUO zHqP6Hlx!I*kyV=U$4Q!LXAaZA)LtQizoHvSR;3~Yjkm%CMx??tYsLn3qZF$h)@xs} z^(NU;l+eD}BZ~VOqUx@YD_^9#sG3Su7HdXUzu%|xT%CbMU4xTeli5EWU0ueHwz9qq z7Qe1OW|YOMnBjU~PMs#~m#DGs8@*u|&OkncsVdk>m4ds!!dFFQgH&wA*&mherONcD zulc3{SO6$Eic~}XwBGTh*V$%*F}dqFVeqt7SE$1L} zpyF1sIiK`?DlJ#49P%USB7U|n?Zt08O6QgYr$M>{oGeu`n81a|m^0aZoW0}Hxf)QXb&%H`x zUP}NvsR(|+OlqmuxnCn49Kt~B`NqoxmpRw}I~NW4-*Jn0$C%Sv?~zcALm0lbd@l1C zXgP#uBgN@^1FEawly zUxN`c2Ul6lt|!$_Q+=IEB)`geunmZAgc+g~`_GvHeU=C8yjP`JSiaq=#8UITKW0nY zF(>~|T@nkkcYy%*(AsvkMu|w6S?eYAJdA7}!mzskkl%!Xl=X*bze}w#XzFCvBhtpc zd)jq}Zm`dTg91yU0!PH0%W~3`zfp!4#TMXNWma4lB-luP98&eSH{n=V(*G^aYsREh zbJqQGlE@MzTdO3e4L$axm)MX7B)@cZRZB{F@bq=1J)76_9Xd&a&ehxlHvLO zd7QkNTcR1!x0y+y)0Vkb^SZoD6X<^OQ&<#VnbKy;m9UN8pDq6;jicbzZKRA6pce-)1_JLnjMX4OtK~ex5bNDR^yMAJnQ|lQ415EF-m?zSp$EfjIo5ma*2#(^{ zC=hBHU%@yXcixN8zBbJKHNW)Yf>)j>jWTTg=y~}=$2oBbD4lP~aWdm7O^M_fHd(14 z(sEZJ0svXmq&T>@U#Cp0>^X=tDI|CQJ3H%^I%+Kq%LGZ1V&sr)w6=@6H(Rhd=MT0j z1Mi-7l+#g0+wy*H3|3=PdXTuR>Na-E?Hm#NO~*BnJ%=rP4`e7#ZFah`Y7pdbtmjPM z5}V?g14U#`xus*{Y5hw_dw!Snnxl7fF&4H&rzE03ZCV;qkqcSAQAW=G!h~PGd0Sqv zDwf>g-`-$@R#QCW;=E#@LB>HKMu&~`2c8QO_yfiUPF{?F9JB*_EAa=cnyFEy{}dR) z)19$Db6KKv75Ar^@;bIw^QJlTW0ox`tjN5ciAv2{Py^9#WR|snMnr0g41zwusE9B0-n{C=!MS z=%}CaKRS^Aqbvv!AMoI3U=e@~8o(FOpDcMju)x{$RD^gxn5Ti+W`J+6hW_{gpSu@P z-+QHXl{+8uCU8!vfVy54!x7@ClAz-S5-nYxHvVJXurLJF4OFk$Upz6dQSX2P1YM5y z%_Bl!ZUB@U5nl1`PY6NJz3bYKEDG}RQYz?yOA+SnZ+P6dy6!#c&=w~0G}%QN1Gtpb zM7{r*66t__(=7`Tfjtrfl>Pwe@W0FSe=pNe*k9ZFOg%6wu6=3deqJar4@GO!2!qXF z-@ikM;n-l`hKQ4471FJxHncO)&h{8Da$(`+!rKa9%G?lI{<`ni@F7~ta{L9#*5d@~ zWJ)x$%8rAJn-5~1TM;Bnc==KOx+bdg1_Dt`T z2!hZeT@P2`X=t0PR4JUq14vOH_)+uyXjBG(0YhYObhH825-_p^92M3_7EUE?7P%r6 z@%#|}&c(s%x9=~psB-;kd#}Oi4ij0x@4r-CIRXNvXrt~=s;Nj&Dwk@j0F|OcV%@${ zHS!XB_)LXy4Y;z*4M4E!l*cR1Ql=S4+*%S!8UfVIWiS36ApMfHGu;%3&PLhW?FGPe z5QeJRjt0EKRWm1{Z3+F&5tfqaz|!!OIu$hUE( zj=n=P9KbC$>?GMY8&{-MqNh@X9?>OTnvxY-&@;#}s8CUdWIL_ptzaBPM8P&8HmZc{ zz{g;P-oUjEw>McefPXrRt0cVTn7BN4A{4@&8fw81J$D4?@0*+iHe?2iduA*(oXV@# z?C$)i$Z^go+g(} zlKu!vBW&8=ykXMTu@kFlmE8tCyDKmHn!f;5rX{##8bG|(3Y8kpW_KzLqF3o@h_rqi zy*IrXt)4P5b_!g4Rsk%T+(R`Ibk=^C-zJTX&+~6TxMCL^@VFib?`FR)gF5Zth?#e4 z&LnN%@0EF>s!6S=(i{ku-j6GrK3#cH&`yU3pr6k3Sy0JGWdogIc5zjO?gledM>q67nsWf*ij0`OG^x|^z)9%tIh>5AnciRl9M^eg2y zzX?^GKh)DI_0AtN-AoP=q!ZS2e3t{rnKP75gHikyxtxQSp~epH`zy|EboffD5{AUb z^eqmz_beRN_0(*s^6oNd@67z!$AwZHiz|RR;?JE{qY{I9L=+GZX%IvO0coTgq`SLOy1PSKTBN(XyFoxex*HB5ol1wmw~qMg z?|%3G1NV8Z&ry$fcCEAbT64}Z#~3A#j04qqLduOs7rbK%LZppf*q;#{q`APRX0o$b z@ApO%&l5t+Wg&jl{epSjkt|7&IStzO@5-&}`_-|d!>%0#+|3h({uo`L!YeMIn+m9l z6?Lw@L)j6K`I7xJi1oJQlo?daalyt zmod_^DtP{9$Dxe_{?;d4pty!>`6NRj;`v(1H~EfO%Ed0_`96dI2}R|d{FcGBDIe?E zFey_5SED^F#NO=}0eGhj8Sd=IOnhmkpw4GqRGk;Jfrz(-$TC~#=B^!8ZYd|~KoOA} zT|#q$)G8+L)cX9Lw{0n=()?=aWx?YI)})9WM@iNngC?8Wf` z0gsvd!qW&}Xg+3i$Z7d@^;>-{?}L2Vl_#td=)XKp_KA|2aA_`h$H|3}^d)Uc}!$NP};~6qXVRHY7stk~+0u(pjLJ z_V$H!JsU>!d5H&3pn0OIlO*X{^4>?G5l~i(Gli`mjoRLk#4)SaekEpEAFWRObs}qu z8eLJWS0Fog@J+oga^kn{!y3+yvJ^UV2O`hl>1*c=w3FGraeFS4Z%-*qN#3QZiY?dc zawfA9zI^@JC>P!NvhnDzEL;t8mx>dem-c7d1-(W%#q*X|_xWs4vXFxe&*l_P=?ZN3 zNWZtV+3St3dkn3k;39LHZ1JhQOZN{p_@ro8CY{^xb3sIH-r_XBR1J_i)vbtlqP*J? zXM#N{-Of!NJgr_bkv|227>>XThN~eO%C#VV~V{tLUM|pJVQ&Mco$I{ z3=$ThVD)iT8A@TXwDa@TsyIw; zm?scv&UMAEVbl0JsI`%hO4os{dr)_i#t)$?P~Gj7s33Frc?b*QVlT|QQfJ{&F1fr! ztT>=^Uc5@vpRe8=h{HnU?^V|v5`+fJ>(S5@M0?*=%e}klUxrrg}xJh+yY>?ONq`F!J9W zgEU%(9B^EGUua_|_%eCTIL#5bbjVF~3>&5iLw-;Fc&kN!l=g#cI!aPwLX27fcU9d` zPt@3k4fJ;8M_5&mCmk$kR<`y%TG7lczO4zata?PFP!Uzb)DbJ?9P`BAR#n3@gG{A# zaQzo4Qz4S3FXUA(gyVASGGn3&d!KW{^7hhyVoeE0GGj>hz9|=%_iGJ^0}qVqTnEAt zI~WyiShk5MNWfLcC=5E8C90tP&fw_zixCXq2qgJMe!J41){w*XjJaRw{B!}*PsXTT zrvaLtBsjd1OnTvp0AnuIVRPD$pI86>*v1ocm-U1hqB5&%|0iqh6Eg|X3uf!i`wqT! zK-8{|7q)&Z3Y$bSbD6=krd^JXD@hg)yXP{0mRz+{KMvD8Pwcq;^H(ETWsUrdDZ`C& zZKSoS3+Ev-W?!Q{B^PZ;^cgPsPqEu-g=sha0xn}UMP<2C<+S{<#Yy7v3K0*GIbs3_ z^R!RB)d*n=MlnGihV#v1MV7w6yAMCeKXO>+mWX2s&T_I?Nkfp6xvqQ zNuWDCO4;_SgiQm^N&Gtq8!y*uEY9BkFBxpelO6_5VH zp&kHcf0|0~;Ex*Y)OUv#9k+oxD4q7MTV6H=LgZr0XdqDgBzsSxgW%k|&7QjP#B5er zvz6j3n>Z^BwRP~MFkqsgd(Y6CP6z)J=4-hp3RnSNf=}JCtCFg}sRezbw=BTqqBuU(fOlow^p1=osA&+@il-S=i zjM#E_l|Y^YjwL{@P+JHu5X@b!DmYnc)V(8_glZPraCjS@LP;YtMH}KYYwT)Jm8{7` z9=DF!0e|4sFpH7dH}^0@PHN)pPZ?0;88|@)S zL);9c+KjpV4HV~~(HwbZnXiLV7e<{IBRJJajt;BJSIeenNnU^iGG0jQBUn+_vOwwS z(-_5wWm6&TNlk9lUFyMd8eS+#0r{x>=%zrVN**773@{t=76r6^NRz27I#!w)@Nmpp zf=;~07G6YQ!zUChj~o&$g;XNABv;b6YRj%orm9(~|_28Hu$JC#W!BM|93Odhx_(B4zIa;uGY*`WgPgM!C%iJyklA}Re7>W8stp4k? z&|kYM(u5K5raYS#dd?**Fz`;$69GXw0Dr=GG=j3z5Umg;H^v z5C#%LA+{~^W%2z-F4gVLiayvW&-zGir~}56CobPA3g(<}q2IYL;7Y+rlJm>Bv+XR; z(`#6_b=1cc&?OFD^nP`8&V8EHmc?&zSF+_-0VP|PX+`5;7e&7!7X`tX`C8-LpxAh{ zx;9%G?x37+P`3Nwdk@`hHV?e08vB9y&CdMZ;qxEq*0(q`+sb{LGXTSEAd-p8c+p9lver_0GKQm{x^GWt%YfuaNxife_8Ei2v!&6Mz{t9muL|4Z4I9Vo&SEBU zM~RKJKa~xx?ocGv{b{plqiX?BZx10Wq}P>(hg;X6)5Xie?WZTiqq?jaR3}%eoN|e}3lb$JM70l5=N~eD zMZS2TEsH;XEll@LI#sPivrw4%apEZRyw@AIn0)~~CH9Kz&Z;amPt|GVMB9aeVJ+f` zC(9l<-xX&J*Qz1WyO!!BW8wWnHV3w>C=;F^T+Vmjm28eQ(o>r2EyFLo@^vE`3#US4 zin%D*dN8qZrGpvXVa0MXjb|T8SUCK>PN%&bREF8Uv@R1&$Xz@!!+q-OutX%Wo*zy` zZ>i>8jd|9@QEztrXE29^jvJmdY3^Vh$bm zz?5VgK}(10K&RAQZ=CPS{5H zyEOGXG}{9~o^)eC*}tCa)d&zAa=M@-{tFK6prUZGJY~=d^<9t$K9oQouGL}iZ%>*a z$QxTjE&3O~L5Vi~nNwx|7&{U;AU3qSxDO`5KUG>@D6QvclgaE~ad}J-6qhw`z8MY7 zjNCs_Cw5H^xz><6I)%*N{uly%+}l&{&h?Y~RJ}s($W(YB1ZDUVDS2{0lmS!mwrPA4 zVMe@jXzBO4()}q5GerP;Y4T~~po4Xe0h4f~YTeOs^6^r~D8WE{{#`?!8MGAb|2+PG zNE}MQre0qUwZ^h}5O&1~24Ur{sjE3?0SU2J8PX5Ordf?FX|HZM0Mm5l$Ble3d>ff6 zL+$1IX2F=KdjF6{u_j9DXFp7HC!~fmcMIKaLrrtW#$J^+fd=B;v-C{>oFu09&-Bldv}1+$RLOCpH9Ypdr@h>3 zSI#!iUe@{+H)A1aoZK9lz8-*MM_7nyuCl+?`nh)y^E*nDg7TYQoh;!Ta(=gR)Mv3M z&xzUFBU?|#Z8Vf@g)nUo9n1>P%WI3TcpnykhV!pH>0j{81g=JZ2nTU-pUS&u|ME@f{z^DZBCI31f99dW)G`L3~`JX$Wy zWk`ooVH?Nwry1}GZaj=3VrYm(2ueV*1w&W*rU^Qn|FbiOz&Bfe+Ir{|;egy|0a$4N zo6&i7gaGu|;w0SFMGk*k5p1gSO4{Wov-I9aA32cVC~bTSr>m@ET}yjP75<-|0xvgMCytiMivG1ojY)tf=Kr12{|%#*oeHIzs#4W^qNb#Vb=oF(XD0%o z>+aDhMu$-denhm%<``s0!p#KR0d&sDkj~)0AK6%PMoDd~#e7~X?``ec0+7p!XR#Ye zA1;&dekR8q#lPnURTw`wn|$(YgdeL3mlO*e5&oZK(;2dC@0 zr(<(`NV0BuO+Qu#(W#*8s|L51hKX1p z5Gp{zTf!=&7n?Mig=1w1;gd(`C-8!DoCZTm0JK%3L zKF&iSCI0Q>ccbXw$$L_zkilZu-C&ESswdMQLKl4$6SNR&g?g`!Y=a?@Hv9Wg3rI!c z%mdt#9E#gA_UJK}GXcqurefPIT&dm!ql{(=!_Vcr>=2jcsYTxt*kufT!!;*OzjCH^ z(0$4_Iw!*%M7?dF>%4;P-g~jFXQXn7rk-hBtuxQ2R!Zb(19(p7s*kI>E1eZvwAa*Y zEzMDNvF&|Zxv4Kh)O{f~VvXw)A8qV9F^J-6y@_^5dn}TM2oOxQ!f?B{(OBmM$TfgADfrB z>f-o<>^bSrJ<^gEK9lE+uP>(Td@Hf@huNWBcFTh+P<1-$S{DL~7~sIwBsczkBciog z^gWt~%W>ymK!WC5m5StpMlO6A1;nqR-hLST94INh7+RC+rFkgZGWGzh{D;p=Eo&0waXuE8`Iv4I?t7pdRw!P|4ugd59CAWescO>@k0!cKw zzopdK5f=1JdK0MyjsP)k@|)9?Wd!0Oj;tZwV40SP0j5?1=higihXK|psM^s-1e7tTSDp=~ihIW0H z>w;o|f*^o>=3yK`TC8F=Z_o1zW0$~wZxp(0eh`0Qm@w+74)jNw;eCFjG@X=A0!>n= zt4Kac$dGk?c<#h6$paJ~DD?tZNiR+Kam+P8FjxCbVf^moB;O@^mMAJESX)`?a|a(b z?tgvxefz*5BAUv{bhloKXafHj6rbRK8I2T=*9;=@9OP#S0T)EIwW>Q1Go|hihB)eBm#&bFJ) zvC(!I&u?so99TVDJnL3|;f^yEa9^W7`Uwh1y|pc;`>wIAk*@a|Js)m}N7bO*TvJl7 zeVth2s^)_F)CHOd(k2RU2;&BkLf1TGShn#f(D)C58$a_1YVW0M$|ZiyjNdg8+XhOhkNZ;-ulC4i_%hU3&)5>%Gyv_V-kketL+1%KUerWiPYXrIJG6vsT5&(q zbasLsv1{G5mFu<&k93Ty<(*i{_8}xZEJJdWPvBa4!eipWNP#r0G72@pgW_^?hY2wq<(ps%B0IMr<1Gr8|>71 z{(Ke7_^oIIyy=vrw`0?l60HRc=})h8%Y93J(%s5IWKiOA5?7<|*B`hvvOk)TZV-&q zEDErkOIdB1Eb>}Wn4n*N>`wk#Ki=4=U@*kc1Gnd%JwCS3yy8%~g8^X-kSzrT!B3Qu zTS_uLyOsFX3NGR~F8~~S^~^kiS6PlU0dwq1YoWhUGQr7t?wY1bv6=nbhB9}kq4_pK z2D)w=|3-Te1==39%%hn}EOc7F>a7K}zrb}%b3CldA8C7=TvPSr zeA+Y8eWLutQtRFcp)Y4+b@J6M3rLDoYtY7s7KjwkCPPd`-Er%zFK@bMMm#$5yu#M+ z9piW78FKlUe&{VL%%mPqY;M3BUwt*>{C3Az7hJ#$3Alj#g*3%jkG!vTmwc2H0JkZj zdV^fBwzAN8JV0Gd+%|1WKIS|@U2D?Y*Bh_yaC+%j`|W_QI`iEaP2AH9n(^#wuKEKb zsYw&v0?XLRed(L19h$EGo7Wq*lYOh(Nv(@K3|9#ELlKaimA zH%!Ta{}-lgs5~vTquqICH#|Qf2{q_!ZE8$Dy#CDyK#D}p6qm$`zj{hH?I{nK-!Px;pFT{L{b z-0*mqnw*#YwBNaC)HmCs%k=BGU8&zJqM6L8TJ5M5vmjjodi%FV+uuz5|P5hmrz}p+fH4B zh%^ih<3HiRekDIzA>VCMf#te*OYH7h?m#ztj;LXkG&=BExWE*_DSWXIN`M3^1vZN~ zl1V@R)FQyKcA?cUS8jcw|8fT2r9(s+Y3B>>FaJaE!x7{tO|DO_{^clZP=B%()UrS6 z2#CE_lR=JhK={?;Z;oPh0dkbsgZor}(h-omI0Nsq{zmxn=YMk)4Q?n>dIf{@_ndek zhyZs?f$Hn4K;6gUZb1p`qTsA{s;4oMX29b@oxUClpfP=ng5W0CSRVH@D^W?a&xg(zpXtt5Wf0`Zq%Dn)YZ*4>Ra`g?&v(d9smZQJ| zChN_0M?LTe=YJA9;A02W8UPy|fQte*d(A<_NjL}W=GV2FNqCk$fhum#!YmuI%?Eyf zMm_CR=Pl!ujg(GdvEXoddbJrM&uy93nddP@G_5~^gHWrT2ZG&*L)SlMpBUm;Zu?#N z+yjs`BHFk79F4jo##74G)xGpQiv`t$CvO_S{USuVR8UAJe|y?w#DO!F8e(_fZNwpL z*9qFIa>NTTVEQ&DDBKC(J+Me19NgIdoXo%sy-w}Zo6~mteLB||s5>Z>!%>6{{Q};< z`otl*r6{)@lv`sCAHuvFY20xclc>CCKze&w1MXjuo)o+#I$#=mAp_aJ5OBCF8 zQe>D_RhDZ74dd(Y)(e5ndTOKc+@gyiG z$AG3oZ8XbVjy3o*V6&s;LK3&g^xfh1_~O_95d}RF6+_)~nS+hWzd0&U`{_=tMn(G@ z1C>$zV86>bivP6fbCFNM6Og^AQ<$6-m;Kn=t1#NdZzN(b#edg1W7ldVeM%Vkto5|2 z<)wK|it9W+Z%>%ya&(<2)pL{YXx@Euk3=%DTgyqW)#V0jM;8wJgiu+`nMGgU)4Wcgud3i&~M%T_(eE+>i%Wa)cDic@R-G&-a%!oJx5iDOC8<}4_YlkH3^HG@HopW zc6pSqXZcTE3f00?Xjx4o&PKlYQ8#DO6|fkv6&ZLmv~04Gr039Cw;e|bhf`Y8@DQCM z`8bhI=QpoUS!}O}u*nmLKc6!kZ8)xg>@~O?V#+SU+;n? zbbTY{;H6BzznFen4K*oxYS~?RrRA(@>iAyXcr2NI-u#l(<%}*~)HB~+Zm{*%h8k9Hl`1K% zcdGS(lyKp*fkHJ?wU*)o7>ghMsG3*hb0f7d+T=yZj=mJrn)TO`ORB~n&`BV0_H35b z^e<+%C4XAkN{Wse%zj4*seToeyq?^(BzRsvw_UDx!9gyxfRBIuaZ8?waho!TetHJI zTZp4l*UV;SHoFH&Xc4WxuZLzshs$Cc=|u9q)sfZjgvO0$CV4&GFyCEbkM?&n7eFAL zm%p8Spf6ipo8cm1oJlT&7Mq)t1X3V0eSt*jw;s?FY3q!d>FN2WSA}Mv->O{4YPbc&f z;!PQZy0Te*o!c{E+3U=ti48YBP515z(;H*T*iI% zgz<+X&~@?)6had7#4I$S3@K;HZr`k*8ohUliW5JZhKMdO%!l=TNNZp)@(l z<>`vsGbdD$=Yr&|=@@Zbh`)>cbo-FQaKHn#dhOF?)7fnLqn|?P-S2zdflbD0m3Of? zBJ&pV;l4D)!_6A%UGLYR5#T#Or?+A4DN<2Y?5JHFMnp-nH=7=s+^{q>Z9fi)ESxGG z3Ld1L&5gAn+%r@-4hq85er#_U^dNKeFgD>qicx5{%bYTj!q--NhUNf(?lWsm1UtUx3K;(bCv8OF{+ZRw#?3xv3 zTG0GjmM^_}hmm=~w-QD2!()hEW|j@| zg&0ZTxc|GWJ^2pEhRw5nqGqth>F_G-eo2FdnkPkeL7Z@D04!-l_rDQ6gzuEvB zLVboTO=#r7lV>M)C7Xvb9#hEDHJHVAsv@^@IvTtupOe_3pSnL!^UP22X#2vQr`4=B zV^IIcq<^bRBzA~%*C&k(o5pKBmXEKdw^9wTl=#$J?nSPb97G*AN<#)OfF)oz`jtW< z(I8p}1nYOXSx4^i-_{z?=^7XNQr>Iy<$lPmDO z#?zX9BnO>fbzDkRQa2mpPVL|21S!YM9oc+3eDpn9qLrBXRMgd>03#$R?(` z<~wER=5slCM@eBnc)7vec19iv151a>6_WLPUgR%<9kzhHRG=x{Kas3ee^ASwuY1J* zH{Rn7Ly(bhC}%@Tn7d;Obg+&_KCoG3t~5qsvN`Zv6MAq;{- zHXH1me?qN_@kL1V9;_a`*>Tp#{+MQ_%slHVG zJD0zY+;}hk|0pQXwX(UT7Qe5&IPY;$>9p#IZyfzmzM9Ew#+X}EdmKf=Rq3}BR=bDZ zV@LBd*3nWHq_cWl4%*IAP}EHrlF0fn389>Pd_OqUpWon3fvu!)93Aa!{ryQ@HVrKK z^?7ks**`Lx7%zXU;iR4&2j>txR11v$4RTg#G-7XeE}<8*S&TO`+O5)ShdC`?U$zou z++Q)1TRCt)j24S@-yDgG*dKpDL}B%Qmq5tiSE)EA{8Xw-hDIUDa^zXMqGlGN(^wo+ zhHd62;$)2i+h~&ZxWqsj>_k}^m_K`Y)2AC>eK9sCfU^(1 z)0&u^4tw@65*um~q;ym}mLB}$&VR7Zt7n7|SON%D?+Z)#;hGrs(?JOJ>bvKE^))QI zEr-#*UMquEwSYHvPuUlYs6#xI;t@`3?O)?u*lX?4<06AXHv1qk&ulufeS!$2PJUyZ z9m}-c^}vF(!-NYtGJJP_oWS@G#-5g9v-woz&VMjFiIDR-%~jJ)m5Q~xvnK`OO^Yjb zh@n^qrJvSM#%U^Lk%>RR<>1S@wC36wx~P)=IMix}99zrQkMpQ{H>!Imqq(qtdKn7( zS=3JXEZWbR1mEu5Y`F*&vKva;Cz_z%7!6(n%yrU&B+0u#h;`osd9M+9;}k-zXH|0T zz48ah;pP3nx;ES?rn5)*;6A4yk`pbF}joL>d^qAB#QjzzLU1qrD^LZ%h>=_a@WkWm9i^1Jx*K` zSS{E$w5X%>r6366r0nOgNtA{5ian(fCxh$r=}0mE<#^XnWKzjb%(Vn?49!8i{MQ%J zTl(**S3Zh8`L;A~P^LaVnZ_vS3#`UhnbXSP=x{qAgL$fWHjCv)!3gvBTqi>PbA@@> zigAsIm6K=Lr~2aNqMmE`+Cn{@fdI}u*Kb1hC3}xn*`ZSL&C zM|hzia2=NmD>!tG*4D#nJ%p+m7h&t*`yVj*iJO6xzJiM%Matdlt@@xvVI#JM?18nf zvzp9-GyAeqN)H>$AP#W{!AQN&VAVF)+-puZ3Ju?UP5wV#h95*fRQl%VatTN~#Xk%# z(=`LL&$P_wokS7<ch|$~3sY~24fl7t{J^UOyV_ETp7oo9`R6k{;4tqL|CbpIC(L?#~J$RDzz)b!Bc5ydk|96dr`E2U$0@c3# zFUq0RMV8ySv9}x6TLvRna~$Pc?wd@Y4kE_#yf#3q`#}sG=@M~Ygy9AKbqnryKE*x{ ziGwuNuEBX|fhGj7N$K&$km?;Aj&&-_t;;m4@bk~hu1kQ3yyJcj1yv3H`gKyF8ily)qmF^SDUk6((#f~PXxw#OyY(un7ebP^|B#HA4^}Cug zZP9EP!1meZ{`nDfpV=Oa32UWZ4;K-G#|X>QknPuNiB%b6PqNyFfwzsLcW;biD{XmSkm5k>@2PcaIRZvegeke(M!|CXqxZBs#d}-sPB{+`&JLv*%vkl>>fEV4YhQv=!xj&L z@ts3pKEkS`e2N2)2+CP~3UeOxJW3gnp zR4B`r`d6f#mpLlSym*3wNQl^Z(p89_j`E(S^~&APy;^4fLN1o#S3G`;CWQtD5GAHy z%p+BST(BYR#4sn@07TAXTt*9xkJ3XMYsH-fU5d~^c5$b(U>*U><>*(fGPP{6Q*h~YTgR*l{>kthtf9K?s@ZqvwcHfR&WWKQsd=IV6( z>WRF9$C`ur&0+Exe5V!bx01K|;;nCMfgFfu%y z(X&@Av#i(Gp-nsIFXvM%4Kyi7ql!?Oc(7VfNb??%`7fgRZQU59`w807dFY}ldIpBo zohqsfj(B!F8LO510XY_)VYIz*b5s@(kEHcz)6;~lg1Us$jlmt}ko#ReIy%TJD zjX>Ul+qDkfJEjh5;CZvp-cICIPPq4q*o}+GW0TpCwti9BXj$-4Wd19f-K?B^0yO!h zk+D`5wD=`Lr`s4-G%R`?A!Lra=}D<0W&>EHK$_o)3h&1z!>s0t_T@G|g%CHvjg z---{Blyp8o-AG7(*Bn$J=B8YmvG!zwI+$Ja>Z0&Ml5zK`sn~71R26$Pu|k=Z)q+Sr zF4V4Cc@hSzb{WGnh8ixYcn&kspS7Dnw=M&^tpI9XGN#DGZ+|8!Syr>2=;JhSY z!i`gjrQm-5fh-EGE{-d^ZsXOYDxteJw$nSJDaxV6%> zAjY~g`28MU*9t!iHvYHXuk()RjM1fMM>RGa!BTw&ZqWAcRsrChljX2Y(8B#W(6aI) zQO1b==?weXGvhp;Vze&3xbIizN=X}p2tkZb= z*`!bY_YCSIa~Vmen&mow|*gn2oP*VHqLYxeo1O)u>*>UrFkq~Y^N8h@&ve0Lj} z%YAq5k!!p=ENv$+dTCFFt|_S23s=ZTs#4p4Rei0^F*Pe(F_hYw*;^=PlncLDD|~7u zrQ2^=`4UMz)L<6l4QY<~!92CHEDvL)?vP4?_bttiXRC1Rei_>-)y*4>91dvMb|n70 z=QZAKkTLt_k~XeEl84wcudAZ#XS+L(0H0h+{}E2@77}{I2-I-WcfKS zc(Oz;f+0TH3l6kMB*GztWBLzY(yH=3Ri*FU|3!uPwUa#3#Dv;2`pYQnPG6MhLgPs4 z%QB08zu%cPoiFdc?V{5^eGcBGQN&g5GxsgHH~*4v-n3NS!EJJDXkqV9aQX!k%IHg% zr$hXkqOXR4;KcB8hsNLV6*M*hlkQDSiGNC;Y|#Gk_zpUpzne+C1PBx+`-8~8`{o@4 zU2?YTbp8JXNaTUir|}x*Md1pd;jL(OZ*PASJj4mGEU39Wu;y@we?z?*{xw8zXd1a} zKkul{?g%nce{zE3oPIcnn`{%2!|2K{>>F)O?Yhe9k-V3b-IY{ZcND{Q;D0pQdj(eWsMqr} zYMRfq#(!&5pL9kI_-jBQg{5!mv&NBrZLIr`Z21>EXpA+=16nA)AG82%DA17MWN7?LQ`$OwM3oj4?11NsPdcB> z13SUyF~|+GhXtstv#)gw$Uef)!Ntw_QwpMq;Uxs>XWfjqm$nILK?P3_Z$?y6Rii~v zGUOu)gc)Gg0Wh`vkP}K|^OZ=sJe~G$?6=6&k1%nlXdkM3F>Ba3^90{<3g>c4G;0XL zS<2SNt-l0EJOs{YAG&_bw` zS^(SMk=aLapXTY+kTmV-K)2CdDaQ+s2tZ@xf)d5D(Gg_P_oG$CL0ecbS%;59@qTyS z9O%mqvRN+hxZ|*i5ptY_zBgo=u3gq|o;xwAsz3V`oQ(Cdz`oUdZb0}7wnW(avO#IP zI7puLM-bJ{gix{Yp;&~Pv*L(i9IY##5g;|*uO!BHM*R5&Ju=X@26V=Yf79beMD$vX zgYo0cM4Sic)^4|_Wh~4YTaa7uI5(A0_Y{jR0AgJO!yJkEe^NH^J%A;BkW{(#X!|MD z&p<`Q3+QHYE7CrCeG9Mxbe2aJ+20Rq(!WGCeS570_?joZH$*{4`7}kGT$h5_s*^q@ z-+<7ozY&usgO8pZV}R@Kyf*Y? zgi37jv&aMBuI-6B>4t05^iM35c zSrLnspsZ0feTS=>{%S|%G`@m`#=Rd8mw@!D2~5`x&0jZ{FaFShm-+ch^~>huwjxz64<$(f zeWKjH!Vdk^JSQ5(5{`e1-sjn&T*u4Nd1eCI?WbJVZQ(2Yw94Ef< zmPe(wScygL$Q|V-hwf`xT1d~%o@qqq`PHQoO~t0(+>m~V;dHgFiyJtgxS91Ji`J)0 z_MNXCc1RHQoO@DT92;_?Gv~YW-#m(d2;y#vK6`AAo8>*$uw88>x!sN%;te6e{dCnE zi_G#?+A}m)MR&2)2UiTogfFhJ&<8rztH<#4zViyyW>}k^GZQZ~GPcy7+kD9rd-*_? zg_au9dZfujr8EKB0Hr@09bCBDWu0S3B(pR&cCRIGmx$Qg4adzEqh1a?-$H>My9uexTqv{ILA@L!ItoS0-~(a)b1 zM`>tY$AokrnUhT45b*~}s%oa0J`c`@%5vMj{@Gknbt7?*tX!;c@!r>v5jX#;DzUMO zfzbefAlJ!n-s*>sj$EU*%GD5=ijc54(liUprtmCEzueh4^zjz`qeA8X$1D!*RldkE zIp?zUw@t%UaABlvwv1Cw^3B>&@ww#Eqn6jfCZ97${xqxWU?cqY5*+)cnpDAqot=s( zMU(V^3?G2Iyc#*I@R#Vb$MfT+=7kbNjb?pTXIr zUZuFA!v2c{B#6C|Cgi1v`TmD^x2-hjU_TRwf%&gi&-(&2zUv$K+Wi+S09k+(07UG^ z!od7@bAA9W6GpxL2wVU5-46&GYxA`CVE$ITy!t`>5RW!`?{C}@=L)u}*M^1p*V7UY z&;$nJtUt9sXvT2{wz6%7gZX!Oda$q>2#LV|Jwu&+u+@eKBFw+T>j6`b{*X_g74E+f zXC7=dc#RHoH%QR4`UaZycvP-+#vgqvZF6_vAeF_DuVhi54b~?C)hmN9+E?cf;E=&s$((dF6R~&2xLy3f{yA zr2V^c7_WGe7sOF=GB;CcRJEf~3>=oE|NOLGSiOXs&a{0QhxbpztRHHeBGDMz^AANr z0+MM>Px_JnyQ=`H9T=zB%UD9IMV;Nd@_9Rn~e~P((!pDiz=A*hYg~`PU-xX~ zg!y1f1_`!cU@%ri1>Pz+Y3(Hsnc@rMcjq3o>iDF4eHhhni9lPGk(vJ>_kIz%9?MK% z5B)W@!l%kab2oB7Z=}6!9j~(VD84VXaj(3`v3g$W?Aqdw@XEoSR!5~kHsa$Kl4rCN zq8+e$ZXP{HH}>#InQ=Bq*@#beytz2z@j^xT0Q39x z^8UDB4A13b*fn&k(fs;EtEz<`zGq7pJrTc56>Vc>H2lBskw}|4D2j)rEaqb=+cjln z?%61;e_$@;_GqS;H&|4daq&7-iY2}88ebihaO))RB(CC#?E4Yi{jmH`UJK?D^2}fi zgsR)}SLOboA`539kBOdXMREhSHlGHSCci3(EJw5Y-Z*cWsWaJ|F%hMqTX-nhGudA@mLPM-bJ z^7O!^*`Se0TWm`xUC-5NdUMo!$!3NrRPDx%k}l7{l^HXx1a9~ED1&qj(+dFzej1V+@xP@ z|EtG3P|?beOOcFZ&;{b+=|gQFfO@d7XPH!`ENB=|Wc$-yr~&&;-w9UN;pEF&l9E+= zco-&+Tq4afc&!DKb-n>^pBiC7NY!Z_!LHDVNAYNiEW z_$~9_^0K-%lAlf%eJHJ5Bs~2(AvRy(-sCQAc6npQY)>;&_^G*?_aiDZ4*SlfvRt0f zfkWc>^u$6YJxiPLoMWf53zaOqt2#=d4{@#hQwnT~*o^6olEtE699pyqKfo~IO%s6) zWIx%xdCVp-7r4xsd&QC5fc98kowzvD%(Rknv9BlM_*2^MjlkAAH!`z2m-W$mhMfFM zS$P7NMvw8IqTM^xR9eqhpC{L!_>8~KqN}5Baj>2@o?vNYU+WJDwjV*NVIx}{k*b=x zdGqmMLA4OF%e$1UT5mcUX7QkofYty5QKEcLeaw~c7Tt2UiG#rPP~RtI7cpMVlWA^f z*KZ~4XxAx}y|uN^PzA5o;n^pRZyr*kU3y|a&o&ELQls=GUwNiC6FNLtd8J;Jr`DYO zq?zdmqL^4|5v6t=RUh*D@Ip`(JSdTZFJyCb2FJ%8ZbF$c(n%s6v#saU_O<*Ii+f!i ztS}O{zCwugb2zp?KNL$KvQ=i4cv!zBImG#=2s%7l^xyb$*aqxD9uaH^zhI>_pd*mAV!2fU9T`iCh~LgKb^_lY{+$1 z`Gvvn^cSPplsbezcoyR9ny9c{XiQ3-x6>cli0!euPqz;vQ6#+{^Z)Vomcex^UDu$Q zV~E*~nVFd(W@dKG%*=L-F*7qWGbVP-%*>3(%rNKP``m}-eXFMCo0=b|N=IsK?Uq`- zRxj<|UGeFZM7A~CMA*%;n)wVDzPMgCm$yDdgY=Vi39tTdxOqleaTt4N&+j?&KTtmh z0Q*NlU{3Ki#(7VH$D!Q3E;bf^Cj{$d5{YfyFHbaR?G(s*91By*6oTDvUUsuv9l73<5q`h5|3Cx|B_ZNrNCC=+ z+Gu8?+>xLB1ym7@Ijt^<9x@^)5p>H72uiRizo?mhQOfWGBx&4w)0~01Fj9TtXp{UB zN+#muqH>cEVxlz%K%Huy-SUpU?8>-SiHE8P^rC{lLg+1Ad_iMB!+$7Lxt5P>`8-kO zJr3Yjh|S|2y(%F_W{@J{0cCbJ$j%TIZ zV9o<)D9B?14-W6T6HvOF)1ov%*v9td59b95fBfY6czxMaiOu6f?s59bWba1ZuA)Ga z7O76P_ZuF7_5ov<-R9#6IP%RTzl=$?V#RODawZI4q_;&mhWr8B4}AJM5MUzxlu-nc zo&lGp$2FU{ev@J~)0>S^@9Ezk;cNFes(}-JMmCCk9+BUtGm*utD3%cxsAkS93^$R} z8sH@m!3gd7VP&5A=O5~(BhZLD!f82(@GPAp`{f@(r-(4ETn!j|mc7^5M zZ5={dm)r12X!0{wh~|w$0Jd*KlvL*|&$_~ZjqiWLs0>R0Ro$B$i(w<)pD4QZ9f-bN zgx|$Dg#H9>DGDHJa~rDs3E719LO?XuLl!Cku4nTHh8Lmw%hBO6QU3+jt%N}IX9&xk zmi-gQ17?8KAUPTf{V(X&K?XuTrs&iW`JY5W@EBsEOKx6WPrGF>QI1UwwCh{5+J-Fn z`|9~q)RQS)!t}${Y<4To=x2y7RH+T*tw$}XkLQOg9cnT_l>6x9I;VK=*HZwcwFiGE zh8`2Ml%m>3CW#JP!I7fph0BS;&d7)Rk<~QMIGam$EwAPLY_0 zepC*Dh1$V6Mko9%9ETcQmClY`6cDe`lGL1A(BieZ<}>kh1y>W##4&Bs2^mb>NkcU=gv0%+NIQwE4ZpCcejD&B-DR?2 zMSGeyZUwB{g&c)uqbD^irHR@lnGr=yylr-JN0yi2bZ7OPshal9N!Q@yL^!d>g^Q(P zE_qYt;#;4j4bBRiD;ULQn)=0%l`~S;`fgndIQsXWqR6@M<3}M1^&7hQ`cCBfCD+Ya z3o9WG^OyK_X%X+I8PmhJI4il43r0N6`dTI-25cI-!u9x`_f4akg6GYuEw!82)e+Z=8#S zTBWkV{`zbpI1Bk1nkq~lxGY$Ocv#l-Ni@Fn59as+Vw7T%AQhqCA>l>=*FsZSaP{_d zpq3YR3(5t6;bAeqSLK07v~arR%jHBvxODDsb7`n53ov8I7d@VZkO_UG`rUVjL61{# zzZ_jG66B3H?0p>fZ$I;w+y@npM9v*iBu8E44WE1mMgC>Dr3!h?SiqX&{fuqGv~31M z+yLOU4oUws=PsT62m^Uy!OQ)mZNy)Ub6X=B6Mt%ydif~x&aYYxf0CiwwHCXPtM|~t zvF#afaW-c=+BSktq}S=(5E;r5s3u?ucP0KYX8_AA9DfP7w2XuUpTFo=wJ_lv^KfEY zQ7)aW-L{UFMFB1%QSO%b(k$!yeagq{b0SM=9@UiI-LcZuNRd#R)0^DJZ^p2JlMecj z)fzyDPs``n?czCHf{8NGHe)o-RNz~4%bC5tS!YX<^WpCF3rCuYd1PMq@OKHri*W2+ zFIQli!t-<#9n}Xpd?LX{^|=aIc^r;qRPoY_->RBc(L#~@kj%i1uAl7dK442WXX3gp?Bm*1O!;Qqzq$Gd`UQ<#hNq&?CBNL(Q+RDP-}TsoK^+ zm?AtI#u6$$^OtsS`%WTPiv)=4#_x)=g(gmu(tZciB~{K>9xoY6btU^!&j1;#F`I~w z!5TC-(=g;=Z#NEuW%^?I1ji4l)ijLXO2$rujx}t7;9 zMu%Zq?_!hPw~0sr&R53vL370Juo8Z?RCaTuiF$SZ#SaI5AI)FtMT*C1?mnAJ2azX? zUPuK!lTJb9I^zkq(UPFDatB*CsCp)qd<`mNqAI4XG|LXMj+doUpGWr`@9=Aq`Nrkq zPMS+7FZrKcqVPz)9#=%8<*5z&^-wFsY53(3*ck=rC3 z29BMI=KkR#ER&HNHl|N*W(}^M$GlW+>7zO;8ZtN^OXlnS2LN>{SwBUN&|9C>j;C3( z^}bf2$ei5mO5=WKjlJt>(uFb%3~yVyu%9DnwsWoM7$eKy$8%nvABXX=doo`Mius1w z!1UAXo0!;<6iiA!VG={qGKph~W+S#1%K{sonkzkmnUmoU&efk#EygR()O2+ov#31D z9IYiDN<(=ETXSQ|rYAFz^5Pz&(KWqP`C^C6JBR|S_@^qdP3DAG`>-)G^L__tX$3Mi zI*y3y%{-JebeCT;bUlf(txei{-1M;(n^33U3>2?2JrJgKqHGeJanM%!w;CBHDHXJw zeHg@w?Nw91J2ZYc`)Mo2BffVv{hW1Zl$}U97#I;`2xLXEb5W6LVjbXg(cQjIVuCyx zu;~G!0c6AwG>iRhdkR-PVMywyHRNHHWP7JQuT#kq(GsY*=TU9-?_q_Ym#-oy2PiP= z1O|7AbOC+4pheWYE5)&Qla6K4+=~$6%GdYnyx|HR3zyU#_dK3M%$=(UlL?$u6o}84 z4YY1{{N~D);e9|tSxg1?LgszFSHyqzyIW+CIXL&t&1>GVj2rJq+?vqpM_yVf!kJcy`}-W|kReU5Ogl~RC6n6`*XPeF-8Lm=v;0R* z8xQzc42Yv>^jzd3%uQBq{poP426Z!!u=uX@v*+kcO=?S!%`F{>y-#W##{?3)vk6~J zkFLu$ejw=feQ}tm_M~GMm!)7{y#YR9cdRO z?5!hkk^(6H{V&>LD_n%x15o$<srG3m)axJU8v< zM$p=49dIU|Eg`IUr!oIrLQ*pnbu)ccbvN}%nUaoKHomfJT*oPy`3lb-^*5I;^{h1b zH{YE89)6#9$B_(DajE5Mzx)JojqK08mlxVi_>Bd$G;n-6*p4tZ6l9JFiSHH?Gy_%; z&pMjk8$5s)Xv5Z0ueSRerhAk$zOfk!T=O5UNs*gEs^!t9Utbl?6jq2qIi$5vQwJY{ou%~~w_gy9OIyNf(t^GRY~^;JI8%C7tN znjHBqpwQ5*_MdJ|_fk7Gvm{W_Iu9T?UxqcOb&!>CI}S90E#hX)_pr-HI+)LiMks_n zbVW}`R;InaYt2?w^J-+)4-~+1371(VOzX9}kobb_znn^YP4pcSP_T;Q^u!7!41s#b!$VDMc4ii6@G4qmw8@l?;vZJ1zOxM@QVHydm7} z_2E`uPB8w*0*t8b7Yv8To<1n=!HXUq6<4muL6fNcIEyTtu;qGZh4=ak<^|2FCsUFD zg|@Gj*qscr--aU4*e5$HjlK`1#footfWwQx{_Z{5xI7{WNAY$_@BGMr&0leNkEW+E z*zAk9mCV5o4T;`Wffm3AAC<1wLhSO`v-au_!wcntpXMgkj}y)-6Vk#?=7MaR92gj- zYF}l-?T>C?+|*8HF|cKE>2fO2OY`%Per#=GE^%Jd_Zm`r6-Icl)oYUcsJct;Ph7yY zF2FxR5kf5sfUa66WJp=jtqJ?7?vYhBx-+pbqR2AR(6L)@c|5|1nmQrMjaux z|MH7+J_)bJbk667b;)ze*wxCBGupNQf4p)1!20|vFa{Oi$PjOB3a`DCu5Ty1kesmQ zikQ(o@Ppm9;k9yavT(N&%Edvc!sE~r#^$0D6>Hw^W#mym_Du@j4zg zLPJw8`{?4MOR7KYTZ)&*m3%w%x~{5u#YA$=l)98tD9S~-Qj)^7X4g8O9fT|X^^X9Ax zCGC4dYtO3~v7p1N4*ZG*Td2Sg#G5g@YG*c z_*8X$0jJJ5r$S{eC->K%o!okzu(f>OW#&Ba?f9J}^+XsxLys(MUB{3uEPJpe>gecs zf0X+|8AUodDX5Sw`*MFnp$fQ13bC-%|wzxhlCue3et8Fi& zo{+K1G*cz;68HAYCDj>^QsCGfb|jBl8QRTYr1*R+_U-kx1iTDGsa-5VDb%^4p(#lM z`M!6Yw+QK2&k&rrW^crLUDr}PI+SYkvLPw2Z?~dodfx?SsUzviIns5jEa#EXqO`-? z@9;3B?tbEvfix);N{s#1M| zIs^Ba=W&NSnlLHM1VGO-XS?66S1Q_-kOpxLZ1Xpi<^W}aL&sWeRSImpSmX)47LnO3S14~Yc@bjd;n+yP<<)^miBmE>dCU#! zDK1rkf&s0IsSpeP&^b6kC)|_pt4M5TJBlfpLw5uMnPbOpMl^~i3KiKDzc*(CC!}4Z z?6Szk2}>atGnbSuT{5^w#ME7OSrIY!q&RE0p`ANtgG9cJTX_}wK~YE2a=Nmmo0AP> zzx(^}7bF&4YGM@Gx}jH6r|iRtjSKGC0Q2~oK!7|0zkRtcwe%sggBe-io9H>al8ypC zR>=*H18Z&~e!jYN8eFEAoYy7x$q`B!jOd=E)QV9HF2BtF7u(`~g2yX4?x$tZWT$-2 zjO;!`0?`2XXeo-3lJbaLx^jHesHrmT>2 zaQ2%So(|=4A~H-x;QDjVaO|=t(&c#0LoZLyX+2j-_Ir%b#Ih7}Ol<0h2K7DSp|viV zj9IA!3O{z-3QG33*+3EOcVwET(1&EqsVW_6CVEsTOMVtIW^4%XB2y~{uVH+R^Vc+o6|MDAyebsyk^$qR5PaKTU*G2-bTJPVBhdd<) za+3Rr3?abZ1n6cmB-(|)KReKM8%hHh2wD;#;?w5ZLqjwIZJ3L|iV%Lo2G+p@G?<4l zHwt7<2v-UV40IG|mKL6J4HVP{Xk$g87a2waX!e_?;5H(RInc&b$mbBjpUgnBqhN4u zf`Yg}8|;aU5dUvngFUgo+JUqY`GpMQ@2?2)d2TyYIwjH(IspI%r@{uidm zJ3A=%10DqAkKg~q6xse4rpN-cnDHl53;;Xj|1YKpFY+&@h%1Q^N|W}6M9V1i?Ppr1 z2?Q4etCXN5)+R(7-4YCIYy>#U#~ zZ#gL@99L@6>q;#oW!kP49qlKm#GDuEcN;HyZ#wJqMGIAUTpBNZm1O-vR zTF`$4G6Fy43xFmLyZifxLnsu7s}hmJ9q9HAi#W>y?a2o} zd<65J2gMI{WvqTc<7=aj-}nnW%FzN~h@jwfjv>#0N1uCl*Lgju^1+T8KG0MS#4t7N zaM*(WF%aE^)MSD@yJ1dhC3 z-dup|Ul9i$J;6>x*foKh9ObTbJ?nV)s?_270(y}Et@3Gj$A=BIw#)1FG^On1;MT;SuE_$#(T7F z%3L>f(l@bQ>5d4>*+UMyo<31gbljKk_CGdyFRr|yVO%-Bb*WlwYge!IjhPAHu zm3*DHeH+bS-=%X3;_UAeuecALwkEIxxh>`lkfFY5T*T-v;@O>&<91%+!AocOaJkvD zc{EOav6T#S1x&W7FiK_S*P7z>;AJaLk|A=dCJ73U@HYC6VP16D0lqU*k;89p!nema zl%_5ky9X9_hbs?xcwMVred3)~@d1OSVyOi~)A^DvP!O>hQ^V;X)_LcYh}yq1({h6} zb$98KN&JvYORR%Vfk7PonItxrd3XG9BEA#sHY@wtlfZ3=%ZV0J-q$H9r`*-*nS1Jq zfR8A-JI2|~?BJDnfC__Vl0+AM@(ai(G>TYBlaaJS();)2FHSc`_LQ|hXDx=kQey~O zIiR{c_xctB+M7E?wCN@->_qlB`!Euw@sAN-qJ*etQM!cklP}@**~oa7%w(= zJ=MOHH>=mb-`@>Dnc*FYSb@#|LJXMKb&KfzvLqhe(1SR~ohkz3T*e&Wo_M^*>W1N- znFUNL&@;nwXo7#Z;Ab>{x8G{ZcSWzipSOOpk>0VT!gFHq}FSsoKSJ#HnX2U3ql zD+1CL6opr7HJ%MphyZg4W=1nHX$Tq^^RFN#ma1~`(;*-ubH$0I`RKr&K$S~U3>WyC zXDG#osR6qUwS7`-8(_a-BPB_!g(8@ym6TxINaWAlL`C-F|3d?U#YxBfh=UJv%Zj>d zhYHbN_k}MA6I=pr${9q$#AV1s^~{r=6sT!YPtmb?RW~+porJmUpxIMJu0CNCDqxz~ zEV5PD9vOllCg}<$j$`5Kj*yVuTOCIvmSy@|!z%x06qv4UEgD z)0Xb&Q;X3$9f#LXIKAbPeqIt5R0Lz9zQMtEMY2|`Uq}v>g}>uS3bt|HTNoOL%gIUWIY#$j@ugb5rdIE;(m~l)7;}hm01z;sDH>+J7!f$x3fxCAPBv+g{ zKX6F*+TeB$B_1puE9dOQ{`du9sFQK7`NA`aF<6_~&CX-JmAWj9kYbkAwEV*dM~7L7 z{iCH}f`E9E7slu>2nV5H3OD5d8=wG2$%2Lg zg)9*OG9m-YO;3a@1!59H+zSFm1;i&R!9g+zVc6U;1yL+PLP%g)$fMREK}yg>>~I)x zm_lG3BkLuO)nic!Qryxs&0qX_BYD>t73Yy4;N*_rSiwyJ#*?dj#8#x%I6S)qS z2q6)$VnkD|0Y7CR6b@us8AAkxf$j_EI)DeH0V|YdZ-5XG1l$M`+=T*T0XB4&?OrS} zSl|Y1z`!R6Q)1-V==%xR?q*DToi*#O>b;=YoB^$dufv`n#r2Gg_P!)I>z;aVp6 zh~nda0`k{~kLw046Pm|7}%WR+XU?CcbV{`~Ft1)yPkVGvZ28=Q^1>tKgr`!7bg(NF5!}sbpj`~`Y(78avTSngT)wu!vd>x6DV22USkPD9 zSsurU5mkc!9A@E$uK`S8rUCn#(`*0-GfU{FH5ldW*>gfyIj|cmPa>jk0FtwYQ~CRH z;G0se7ScLK?$114EwEexd@ahguy>dRhfjzmUN!aNBj|P6K9-ObXs6@rK z5`H5FRZsJKI>1G3pfH0emHO%Pxe)*sQbsrU)25V4M|0NF^j=F$HSrs_CYn-Oen;ozm*~X;(IF%@-x;BZm_$| zWxaJt@;DxhQ@|AU7VI~CD;W_+Of8p7KVx_Q5x5Kjk&Njs{3v_f_W>RD&zRkRMlpLsAPZhA3S<8>V)-8d&p%;EtN&@? z@6)y@{81!)wgdE{>%O)svyYlBy7>&=llP)+u8#ZB3AqT-(#u& zI^qikL-@p%hxV^f=RZyepkwd{aUA`RIB(=XPWUMg0!k`Ck@&9(Wq<)52t;!y2-pyvAMg{vKc}Gy{<$d-!1;-AkWG`Tdw!#UG&J3BlR+3R14c4TRgOF;Jq07wse66(^ym7~`h87GYhu9>_moUEu- z1uNBM<8mPm8}m9Z*8SXvRVV5Zr>r4$R7ziP{XjQ*Un_K~3Z1-jyYe3Q#1Klll}76AT68Y_n{KkyzRys^xFaXECf zloh8&n#Xw-id&^SA1nulwKIxa;Pni?x0S_?nEnZNoX7t#F!etKr~p1JFiPYKNW_~-2x3<9%4Ak@|8 zP95vH=5?KXH;8W}?k%~59Goia6HiP(b)#q_qCQM~YA-$z)J!qq?{(_4t;0k%PS$6R z+60PYlW3Lpjcw39u8cBbeKA%yziE;pd;&%Ah`z>8yf-j9>^4PhQ+4t?a{eoilK)RN zR1IwqE*7p|jPiU}q$T(JIi@5&aBeXcdg?w$Xr@D|J}s>%)XMr+iXlHu7S)=tnNA%N z^ivv~ZaadFf1zf)@=pD0(gd)LS=$6OLB{$y`fPLT9lav)^huEITz(}$bi3zH{T=VL zvXGyZeI+w3*CzGiYC*iqZ2nAO@8Y=3!)m;qd+HR}9*}X?{vZ+PO8ffNXEqQneSBXf z?8rI4C-U`3kb^6$mZKz#wX#xhr1)}K+gqui<*~^|&965>SZsk^>hz)tM&jOy_?ruH z)~vKzK@#5b=mPn={!DJ0EmC-~5BXT{nuZ&R_Tv-S*TJd74G*L4L}55QzEVjtZL1KX z2=ZL0YUSk3BZ<3ocKXSv8Nr@>m^w`!s#eo6yWR#r@z~?3^S}l4ViEYyl0|Lti3%=G zp$7*Rlc^nT6>{x8`MLsi&em%dJ=GSpaeR|^zN#<&WHX(-ok2b}PV!i+6m1Y+_sUPB zzg@Jbo_C?qEL9k*Gzk!*s@e~bBwL{bb$k-ZIy+nM_c)%!Ok{W6bggu7JUeUky}}qx zqDprz{z10M_=K03fnb-8ctMNLA-82VQU9>GquST=0RCADg?oIeb&(#*jb>5MFM-T< z`>uP`0Pn=IjCwr>*Rw5vV*GQPFPsXwr#0S-LC51^EB}!g;;F6fECsCV-)sMT8wZPn zjNLd4EWl$AITo1Ur$0P1%;D+!CCLfPZbNV%e@UXPnJu5Q`_?RKVc`SS#~E_*Jm{D} z(%!5duI(&lTVLVSyQHc*$AohrvpDBN7Hn)6XmG0-yR)}cGqhb#ZL&ADZ8Q6f3RzTW zaIaa-6l1PTv+_MB*xQmtT_q7`Feayha~wkTAU$Z%tL)6Z7zA#Y zh+@p`?ANg)80gD=8^2QNiHd#Ot3ywKISG$zo~M_Ll2~0=eLSF{m~FtK0#9v=)h!9l zL#TE2QgvM8r_E8ba}r*uW@gGob`vg7QmFp428s3RcOy|%om_M6&VC)1h0}CY%L4tq zk)*3X9;n}rpysMXSoD_1?j_|w$Ad0XBRca(kWx^!dePAj6Mnjuuc+U8+weRX^4Hi| zo)bdR%5D2neWFjr0gi!s+M?16eVy9s9gJ5_e|LR`w8)wu*z02BvKqq)S&#jd$diC$ z?6$pcvppI2xJHb}tj|AKpVDZoxiR{lW>~KU1*ZIH#_FLk~;1iVwNtk(auv7sOa+ z*$ob^`->8s1MR^{OD1mAhH?ho{i88;2Gv6totD*fsAH8C3HF<1_2@e}2D!TK6{+qs`}K?V z`p5BsUSmJy(IFBc*SjLzoO;gUij<0mpc``4*`K11NDBrq8J_dc!_H5~2KTLEvaqnt zx`E&X!EPePZ0g%^X63NEA%w?)ttNNaYnVan@lC~n^fY{;1uk;DU<*OG` zH_2@eKjOxu<&DUlYbs>p3RUZl0&lrXhB!jmnvT19BGVRficF4#_*#e- zU&a#ORSsur^wc^XyfH^C`yU_PNp|JSkJ~StJ&cf26izlMiYrzQ@{K2_4eeW)kwQN- z#bu=E_3nym^KC~0H;m!|qrJyI+se$q^j7ntJ+67@9QSN9tG}wB+Mqehj=mq>{2C%- zs+fb)k;dHXCK=qZjoL#TjtRk!9=$XxMW5Es|jZm&^8I3_t7@fSznB?QzW=1Lpu=MV*uw+!pk{SN372qnmGW;WGKnJ?av_z}GfZbwD^}#*dRF zN+E|enAyT({_e-N$j6uV=cbZ$3raAk4!Vrtz06o*kI)WE@%dBc>+Jo5qWKc5x1E66^-muUN32vI9I3%6yn-1%1wJrWQhvcFqzL-t1A4@fLFI z_tAWj#{MREP7;?0P2P7d_RIPAepM8Gv=JE^@#63AEUP7s^hBQF{4W!}!@+nt zo47=ak-r|P9&+^K4!y|vf;(=lbM(j_$$~q;mCMOZP2)fY4Lp#y8}**JY^pv~Q>gRg z$0A!utb6duZ7A0%?r;%E1Tc8BL}H$CwcQH>3{H|c7R{dUIF46&dMgR@clOxFZaSpD z+x2ms9{JSQs$|RC!hP6?FF5T9d{T?|qp2LXcy|x-##GSqH4jc3aJ@lyG&rN-LUW!H zwIF(W_pf^&!1&T~-RYo45A3>^V=$Tdx=A@MxnZS=UweVcn)kq!Kg5z&zGXxVizhG! zY}i)Uo<>iv7u7d zgE1)&Gd$-t65TOhaHhlBX#k05g)3yy)AD4|O_=kIuj0;nPDYfs;)KsR6UUo?g|zeF zcf=D};?Kv59v6q$1qYhkTK#I>pYTwPHBy;c@L(iRn`YQL9XrT<%}61yncog8pa9#i zNbDjp8lAVNIk$Mu{&SLI@!%ZU924RF?ho&4dv-?@vJ11@axwZwDK<2Z793B{eKyB7 zR8-!2o{e=rQ+t}4c$(uZ3q;nFL=->*nVVOyFt)~mLg!T0}88ww*r7!NX&A>|B^ z1m}w9h&jq*f9^aQZf? z*$^Wf!F5pm2t_9$KoYJv^qCULL6Bi&B<2*5Q@*)@uqB&*FwaSkWUMn3oiq~s|ErVZDU<_>#noj zL>n@U));WMOxww8N=Joj4DYvOEJk=fv2i(BcRT!4PUFT7Ec)+p2&WS7=^4M$iSwSc z0vk~2OcCI$w#od=CM&0AX$e=pW zRGr9TG&C%mnWk*mq2|m21LIP?QTsa{_%IL8Fb(|hMRz?VBu0`Kv!^#${XCmWG_xl- z#aD1&`t-6+Tdy1Rn3qX)H@F#hfURAL!(rI5cYWc|_ESp|<=^=P1^t1yr;sA)s7snP zHO?h<30m|5H2+%n0+gw(rV(ptgZ90_n2XYf#SMCJht ztM5XvqTAE`6+;1UjpCEvlTm5Gj70rC!Z_V_x2bl#_71L&=-IntngP14D!Q^tLn>?t zhQ9q*M#HU5&imldQH1*t*#~zw2^0ZY49@q^Sqrw9i^Rhsrs2&5(@CV5SI_IsAGXz` z^EZe{lFgB^EBor&)D70l>x~y)vg z{C{SB9EBJCEa+*O;WG6#hAO+}cG)5b>{pKXce*h;TlbJ|@Z1ac6pFX8?_T!-da8?J z_!zUN`aG?4@s=JJBxCE+%&c-Bore@6;MKq5^ZDWiVjh}YaNd^YGG}p7+YinP+{~Z* zQo0*R$K~UL`1M%8Pjcvd`nhb}ul4IlSP3?9_LD=}56NwW=5PDdwVb4RbQgf=c@@d-)eI!;j zUjD~ZKmwdrUWvh(Po7?-?5(gO)elRVy#k}5RrkY0p*K(XVV`t8-FGG6B0la9-IV%r zvn1LR)aC86s2kqw)u9XT?9cRTKj|#pPAl^YB+Y91oayh2PxCDHj2v078hF0T;Ie5bE~R%8S&3$>e0`<20GKJ{UpXb=4!ebgj_$mt}xFuBf!fc`k&2&1gYhof9lD=Un> z8e5uuJA1*PY0V3+n_yCp$03*O$Oho+&l1v}pS<-e*{027b=>ITEh~jd^8i8Tp+nC@ z6*m!tWy$HTp`|=U{!nCtpw)PQT;2Cm3bakU(;iyOnVQa~TT?njg0ZlX-*Q}o^Atl< zHz35YZgAMUBOI7VXA$teS$K*DF>rP3MJzo^lP z#h|E+xTTEw?58zWwo2ew+)CU}ct*+QB*b+`@l;d#v{VYQm?NO`#S>5vaQp4XUvJq; z9-&O4E%(3QBtd59gwHr4Q8TQ!dX&9;dCOB9b8WLU@x7JMz%$3cZ3NaA;}C34tYz>H zReZo*cXlOqYfreY?eOrnF2K|$1&Y~J09a8InB7LpRabDEP`VzYH@V=P68oU4%IgVP zf-_bqBqoOVG}c#~s@T`=d|wf<8kD|QKI`9RU1doW0_Ss)s5UTE>UR#cNHP!mRAKYp zIEp6BSj3lSq-03L4OghOc|~?H_@3x%8>;zi*3iH3OF|5D-LkVnh{nWaPhY=WUHAwU z3tOED=)O5t9|nHc$%NcDd)C+Xj1xVzmGylZWc8V_1?W!VD;9Neb+URErksy-F$}$X z*~mB0W^@d-4Lq!WQHcARMAT9kX!&uWp=IiGv2dghT8i?Qd|GP)vA_t1EiZ=D2tCqX zoMX{>74eyS8xHsH*X!@$)gx@B2L!V%D<=8Nq_Zr`_n8%vF#O$ObqC_VOZ=q+&Ot6P z2D6>mXvV-cIuni zy>95>Bi|tdaQ@~(|KORl=s(faEO#X3Wxa;2>b4-zq4ke|`Ozu>22yc!6^Cb&xRAe;Lx&1p(bt>jATW|Bvc|K)AyJWop=9 z!~fdd+zynft9&81UjM5amuNth9Tl$s@4?DHYG>{8hsyp2_w(r=xo7@9zD4B^5>J5^ z{$F1TmQH}`d&@Jr|II%V!TcqH17&t)5KvNiO0<8iZu+NZweye*_=4>=U2HR%x-;o| z8D8kJhl!GlT297*>dG&Z1b2^W0Fca&0nA$S*3l-D-;y{yKq35XvOeHP)aGri_7Pu) zh!*bpV)=pXylVo@S$Qq^zaD|$7r073|3+QqjA5syo9crVGaAsg0XB4T`BDK!dERi5 z!G2{&S!^C{bV%I=cYevqHZHnAJc<~0#BtF>ovdB(^H2R0cTUq~^qx&HIcN<@WCCQ@ z6}JpQ@?rpF++y-y32R(Z@$qk~iIkshQ_1s*{_Sp`Qr6ysFyAPM(0d%9ovYzLU%*iq zeteY%K#&YocRTOSdM!9i=7eOr@IIt|S+SUQ^ZS;iYs1J+KIpraBp2O?6e;u7#@uqp zRlLW6*>e7?JPDWNj=JVdiyN&r8@3U^&h8IAG+N_=Pic0htYw1!G35dA$^&{EQ+&4} z`qYdMvTN5@der@W9|E({Nu+=%LR(1J z@Hc2e>>r%pBBLEv8^gaBP^>^lHDh1AfFJ(W6={)DoNBuYDIkztiR_~8e^jHy-ntrbk3YN2QVe!fqt6l0fW@1*t zTZI$QT^~~xE==*nsyWkp*xxud+g1vwCtu`=COVZ)aYG*vhV)~-3K}b+0LXk#afv@sF z{@p7F3S_ zF)6u2_#ZL|d8+fE;i_|17g?r(Gs!c4OZcpzLe*?+>?Euo{De)mz8Ttfrc=c?aQuz2 zelB^q!-?)D`YfJTP$Wy8wz)P$#zL)&c&eZ-ty(6YI>mPUigc1ut@%rhqkM%xu%%Gm z3~^LhkmpK!J23nTA2# z>q$yFJ!8nl+bt0@KgrZ`*%gJ(Vh!;2?u9`$)jzJo7&^^tV80EEz^S$vj9s9R zJ1?@aL63Oa5ShtU&lCWu!*T%5_+3YW^+Si*`GDO1wmPfv5ks!)nAZbFIsMtA;?&!j8xD*^0~{y@YLns3OZ?b~;v)hZvNw*h5oAVO z7DlG{OR6;CqAtrF%Nw|kv-BJxNLE^um#Zo+29CR#i z>ua*3#ptp|!TeE6tCfR9sJN;Q%3(=M)ZPbm2JTHuLjxQtM41;(hUEH9NZn+wuXW2h z9{DWd4bBGbdK#%rZW9@R*1~qkBy|{Rux%*T`l9Y(m{&>2Vvy&qqrVZW52odCLEpV2 ztnk-aTYon_gDWof^hjy( z)4?P^Yjw-0E78US+YW!g$a3A`w2k{sX%xYxsC6H;U~ zr$n_f#MnzwgDXjz|9AquGt(-cCkHIjp{bZg6y*o>NT*Gt`R1{wMk zgS&^WUtJb*N8e1ob=UwkzdQ@c?TephbwAQHNuM1x@I~1(5?f>yUwRe}AMvzkhe=+1 z@s_z#{*d?fePOS}!fyd15&?M!i}O%kk$PgpGPxzYa2y*s4bdBBsX89MTDj}dm4`zD zSd|;W-k{j#U{EZ_DVPz*X6_if>+%Q*o~3=pQ|y>#KMoGXpm|QBFUHAcvjMiPi&{#r zZNt;_U%z4wM`q4nO4UXKO$(^_IQYWe zeo@zAsXi4u?MtsKSIIG*5OA18+;h}|&#+eDL{ds)o$n)XK_qn0sp?iG-@ z#&Q(o#jE5yz+GrTdnN6;H_U=&s~Y`-sXn6ZT+qIqgg#|*U`eT7Dx;}bUh-PC{})0) z1gT#6ldq(D7+E?|eQk)23ikNyN!8`dJ_g33i?;3$?0G;ogKWeBlLF?ykr!`x>uQjA zNjfF91ZR9@aF@_!wuiyew&}uYZgfP9omsCkb8ua zWi~@2-_t&;tsP|KW58kBcSbm*Vm=NW9{gYIeN|XhUD&NsiUiukj~Bi7uNUrJ?G|}t8?++?PrU7tu@zt=X~GsjxnZcTC9g z;B4Pe@Lj%^Q_TcZ3ESIA-kp%@DpIcNBqMjMv|wx}v{ko)J6KqvE0g`iJ86qXVrkN7 z)dn@15PyzEtPyLcLn5($t~^d2v#rA1!{gR}y_yFPo1v1aKBi!d+YN~Z74##F)jraa zapt>9yh}!3*KIc1QyMgIJ|wMyy;=|QW)t0`;^wmnD_R}}>0~c)4xzwHhP7QTenw}d zq%UVV795@~bFii}eX1;59%LeYfx%6uHOAaeJV2;-gH81AnWL@xl?v?)?~Oo7a^B13DcX7JT8qoj;&DGC^O8NG1l{s zOWCakl&OwF)gqBgbhm(^si?OPPyH>LMU}d&NT?@ELPRG(c&T*k~o&^u&;{`w1BM~K=*i}>b+CUNqnMmOzqh#u!#L-rOVcu za7cGVM`8gjTABJvjc6J9WTe!b4}Go!mn-pra-QJGBU{gIkf;o;@ew^*K^`*H?AIFxh^DlNRs^QtQu(@7zAJr}5HDa?Vaxa|4**IY<%8<> zB2vj922q#eBPzvPjal$FI`iP6!xui#~SVoV+QtkUN6FdlKHZUQQ7rSr?K4{ zu&uR3A|B3%$(%jgZlF{>?+ zQrkYJgOD%Xi}O^7eavih z$|qtsQLXfJ zg&Zqya)Wgn{k5F<7ZAi)HBtJNU{+`Y-soV^Zm~*=HrrN>Lrca^8WwN9W!g(GZ`pD? zm^a>xfTk{>q)fz7bue_Cl!9}?@nBf@L7i)_0Zo(&7(U5?tRq&4!g0>7ROx*j$u>cu zm&bPURFlM^uyc9v4V$pkK9}()h*R0>WTG1#rh$enq0B!%oF94ZVA7tuN6S~{3*lq( zokvb>iBpM$)G!b-c&pX+ya^}i<{p+uO~rVUluOZ5EZ@t3jH%;yJO9ipQ@C8qneT{z zy?{iFv}!-*LmD9OGwWK+k@cO8zZ8fl#$hy3yGK^)E-**&l>u)ARj(A&m#MGDUNk2XGtAQx?&;T62=x*ew;}$?fC_Krl0B z5NDOh7hR(*>kQ=)&{_Q)G}UNXBmz|)oOKe4#SE+ypaPChKUssn;fM#G2~W(L$%`a( z729bo&-3~a9BFbWbOekseLF+ZOXv6CDV>Qbn?tBD)#0$pBU9*{Xes4qliLg43y0I~ zOUMJ~e*XEX`w=?_9utQC9ETO^pAG!y6{%3CeF!7Ag#P+_fElRF<0%;{U<6LE(*N&2 z@jeJN{V$CW=EFVju+!)5f5sR8T*^zfYk2CoF1J9oUkQ9q6 zZBCE6{wQo&~vSpq|TJmv$Tud%!=`3Nwa1)-5D?K|kFZExK z-bw-hWOYXz)cIvqL!5WLyrz6M@>m>}vab$PMPdqQC@PToClc^!OgwVwL0kpwBj(|K z1Tye{&4wR$vicdlo$XQ0`a%WxM8bVFJh-F(Fh0TlwtGE)K!1}5Q9_$epS76`;a?NX zlNBvs>4A;TV8&DmXMOxy3;bQ?7op+I?IkhYl=I!BEqCzC$<<2iaYO@H z+3JCjq;o#g9y7)ge-e#CFG{q_&5j78&#UvpN3E}Lr~E}S7)p+aE>#k+$ExIe(nukR zlya53`-2glOYO@ZlWYl6HM6Kv(5P}~u)-i`0K6Xr zjd=Y@fJq;Ih0-5D9r+CI`PFbZ+;UDFrHJ6NVd9>DgW1{8lJnv%eM&e56 zwWqX|Hd&)JN|{Eg7qC9aQRricZz8^=gtIsw@gO|hCnKAuULlSk$R1PYX{4*yw0yHX zA@-lh!i(lrhl?1Lw!{w9GO*RVbHGZVgZCQe3I!28NoEOgL)-R|h_W{XNG@trM0$?! zqE|fZ8q!{cH#yQ=3{nevho)2^pDI^zr7`_pSPT`ne0O*exbAE*gT`@cJN6uY#b(Kj z1|(vrMk>)qX70)mu0z6IE+H^|=;b;=>w=>4dX`zn@W?cqh-0u3e8E==PDs8*WIG+y zNSwRGCE<%ACnlC`39VGQMe_ce5#74+JfQypJyFwKRrM4WoKfl#oKiFqQD*Y~SRoN3 zHTgUU&No<1*AOl6D^A=a%9gf~{c9U)^r!H`>+a;%FJ+0@J{R10o5$RqToBp4iJKx3 z85$slCB?z;T3h%1YY_~v^sIe~FDUI1E+sors}zKT`w;0^`c3p4 z7ei~HoDyaesQW(M*M09~Q@|8*-{^>j)}nDiMsqj&6=u8YNTxMH{C;F|5Rzoa_vp&G z9|>#~m6n6vs@#}yf4>`6-SFS zT*6bZKJ_Ch^m)%^%tuR`>rElMgIrwYB3z0RpNiEB55=K!3TJ}m`GchDbt`TqRD@!% z(UnvCakozw5||NU|AyU@1@O6{djk0+FH*Ad>KosL_M;Js(US3ud7NZGIESjvhvyG@ zNEHIoU89Q0e3Q{t7u&O&;O{CDu>7ec8Jp%TULKH_y0cLx;syOcnxYuesO#*qsqvfW^TzDY z!L#SuDt>M0IIouJ(&`dov6D%uZ&7e5a)(q>N<2e<+|u>sQK21p&mS6C^o$eBn4DG{f_$=eblkamc}NF4HtnD+>OaKB3zgIvIl#PmY`qk{CcCgG z!-c--SXSDt#HcJXM$<}qX;Pl)sRTp0t)mor*Bf2i@M?(U!Y7WFvz^Wi)JFvSvxM0i z$Y1r6tzAgJb^IOps4y!IFgE80p)&M*r&dn9ry@kv2AtHN@hh}C?IJAK3kR7;B{ymf zWAD&gwj%c;@kKxb+H$GvdbcHr zvZ^b2Ii+;KaC4bTwDybkmr>&b98})s`%P<)Rz@L>X>2+$c6dcq5UwWku7>Lv{q;n8 z`|1>2LY_#pwNCcc?P{-dO)_aCi30Xe;t%8`;xz#F?ykWisG00k&uA{bgvScFIQ=Ww zTD9=;a?7GdD(HPJDD;I9%6B1W<*(Z-C~UY&e2u|@gcNdHbi<5Sb-~5HoaJ*xP0Q*G z2{`LFhcUSorT(WD!O><_hm;kQFHH6~1F-%cv-j{;a>}c8ABl3S-WXkd5@yl91I47e zWWx0-pQxAIZh3G;q@%T;`EuTLu^C`FmtM?5x($YhdM{IJ4;fSN|N5;5o@dX2bP#WcmE=F)OOgRHBV-4xq^JK%;DC?X zT!2QZ#GgIv{$##?4YD>e(5RjFN%bT7d!>J_{0vB`cRz>e{Zae;{EyQ<_vx%o?&sdW z7U%~sll(v{*g0=C;XmIqe+H6p$!X*F^#8fl|9yl%BlW*;;a?%~zZ2wjB zE(k**d&o$%U%smjV?2xkGrp+jw1a+MOcN$ZKiM++vquaAf7K0d^gWfp+%SW$GW^`zrgZD!B*gTQtAOHG}m4WNp<)Xv09uuM3ui|!9ffe_7uYA_QZ zo%>kOcyooGDLlSKjZJuvgfVI-O}8DZx=L&y6Q&%4u_N*7X#t{zkh=TPTk|w!Uh&6K z^uZj9h4F7rat2Ku78k<2{yiVR5kL2TNaVOUsFw63)Yu`-8ie6aZ-!%hL%@ML%w_t1 zn~?@CK=EvGrT*MA@=^3WPo3c&VSQXwyE$Qaqif)(AHw=}h)d<_UIeX=UAT$V7S7t$ zU8=2rTY6lb_O7MLUW;_tcBNgDBPg%fbbM|@R1w3}NZfMTSSLdbo6GX#^c8?5+=$CV z$6;b2v*(7Sc55Cs9-_Y*RO9Gx*2<;}k^EwFV#}Hn=3LLxWQd73-N6;Tf}W&~@rCDrf@UNfR}jAg%*k2-J9kPq~dFk=5?hL2U6sF#}Y*stU+Yh6?77c z{GZ@dptlo!dch6!ls!EYjw>R`qGb(n$)U#1@g4gE0vD}Yx{c|Xr;}FE`@II$`JOpw znGAG=*P{w2TqSCML}G3lL$#oKq-aW+*?GrkN<;8ZSz8$D+iHXG-mrO^8`2Kt)4o^y zfC?qi$j9HofTZZ1g+-fK^XT)Igmtyut;W(~R`pfPZuf7G*|vh7@&2;}J$x)c^}O_9 z)?8KbtuXOR!(`Uj>4Ao5Q&aI8hTf&uo)His-H@(Pt|F~YI&8xT2DCn4{-aNOfNhK3l^Ok<5K z^c?XSNY{%uvFH=7JWX>%*+CphLw~;|ksAVJ8u-%tFmVOBhJm^;jUE?HDfGY{7PO(A|PSFThEf4$VzTE_CU3 z#{${B!pPQ55JDrmQm_5hcx0kSbHDrzW-R*P)YvDRpSl zrJmo(`BO3)I{Mv8cxZVuGLUZ-Mu`l<-~8FoftbZt#h!a zj+gWWv<@iQbjU)I6U&>n20=MAO`TsN7fmXtYh<&VmQ%IN>ur(-OVf7DcQ!Yaf@K{? zA-1z{Qg}3`kl}ld&is_K6~|Q#?SjWzV3_W|7jHnGV*xFq35NuL1GQoLUSBFy)D-8` zY5XWR=;uhm72YM)dX3=urpSyU{P|CxS7Wz3VGFbtu_hVg&_rMW0quf0s{dV%fO(Mi zwsy=EZ#igCDa|6nDBF2cDR@*L1d$id(U*qIc1cOP$$m#)^N=(#=O->sj^0Z2iF~*Q9NnzU$}1;f5X24E|hPlWnY?>||4Q zxhccffwov8LW%h$IfEkQ-X&EHA`coK>ek4^Yb0Z&pcq;2Y((v`nsV=2QG7F;qhIIx zoD-$mJ%pYOGZ}|3wj?)NgvYo*7@75&W5j&dZMAJ*B;ML@Y!tOGC~A9jA+U~E93whv zYev$BN96ik$^qX+jqgM|U5w_481iN56#;}M76wEYCcFC%@t-oObrN;D?;%l*au|7W zK4|WMC375=LLiw%>-~1BHqn_;Ol&t6W#@oT$+{O?+*kFLXhy%w%w6%N&h2WurlZM~ z@|v@T_kfN>bWTXpuvsVW@Mlun!3}} zpYk5>a{b%F;u~dIEOgJ>_@Qi$Or}v^hN*>3WrL6^!}E~)s^4(wTG^vMX>CPxfNN3x zwLT8}I`&k%+dABmJAtKBH_f}8uI2V4>Q zwjhbHZ6FkUN@(W@r@QD{0^H=`!G;VcxK*=~}{E2H)f!fJpn zux-6Bnsle6u5#=Z0A|s#u!i1#JT{|RRg*ABH+jbH)*VvYxX6R}@)cXmzY@!jttL=v zY#&it$Vf%469Vs$Va?iN=i655X&5Rv;>A%bY9)7v3M`^)xF^%{PqS=L#bP&uVAntq zJWl-=7S}4^z|JgsRQCFdJd>6St)5`wws`^CTMZ_7JsdEi8SxNq$!-$N@+Izb+4o9XkH;X-#$eO7te*Xf6WSzsBbuq)K ze#Z!TW1>yiE_$v@)Z%B_l9U<;%3y@7G^o1r6$*vJJP7{QlvdczY(dyTJohHGobsgm z9QFK|s#YuP``y|=BnsonrNFy5LYJA1edoK68K!n=jWQeit89x$Lejz!#x;w&z+LWC z*T1aTStKg-C%$iUxGzD&bd2fo|YYM zcU;hRSbX4hJ3ICWc{`Z^dQtKf=nhRE0_KP}MHsCa5%VP+RaVTNHXDIfqkV$u#rdo`z+GaSDw@Y$cSV6MikVb;EWm{j93f&-DP|Lv!V=qZ#`ef%Jk3L`Q!2<=)5mew~{md z+eo$si1_q04XC95@zcS-25_QG%b@@26*{s3IH-0{G3CDoIa`4LPDnGkiO=8Nt3E80yep=loV|{8lXRssn&lNWVp==zsdj0nNaL|L-0^4gaH^RM?Ix z5CovUne{86>-ma43Tsnnw$H{kjnwzI`Q!F8rp;nroOjU$O$h8ae>^_fny43g6-KK=iHGFJGKZzuoD?@Y1I< z8X>+{yREWPvskDfa>+~>+Y4$uLj8l_c}^pAI6W}lwH%S8Ys2YWH%(XWK6JVx ztI&PczxtS*7Kgg;Ilb4w>#JaL&c0H0qWY@hI=18@FWByPC%g6Je9b$q{9)RJOx%F1 zpd>&?pdr@3xgm14O3K_?^>pEtvQZ|+D$fD7@Sj$;JJ4Gv6~saN18WNWDB%T7&w7PmyU%>nOSt@a*f5Hz~$m zGyT-_sc!jzT+|JsZ7-y+pbZ$n{z5aq*TUZOcW~&Nh4GCxNqX5x5Yj%(*Rn1ezDyV? z98$%!zLGY5!DW%-KG$I`Ilz9mdMs~Pev%GHQifrJ>`0XKi&HTj1a*YVTi?7!Cv0|Z zVJRm`*DLo{c26XHl5tyNjL%r!@YH@SSA8cH)7BAMP5FmK%nQ*rRC<~n$<6llGqw^f z{+GD!Raa79xpan8)?}aTQ*+OlhfyW^3-YVF>jqFQs9VjR;-Z#ssx)<3oTv|*uh}U3 z*Q*wYU2I(?(&nh4m%8f6Tbs#+Bq*fIL zb-_l9C2}tpHxZ;TMXE|3H7R6090f~GH7fB;-4vBUx^TTxaBG}y#?8l4@h$4g<94&4 zWStP}R5@e)FEH6k2+pRqw~3c4cjr*|n92qeYIHrWXl&STMVM1xKj?-at+>=2H(1vq zJIt1vVu?=&r&P8SxV64?O{66kqSXcsf9SEPEPJzA1(*1-u5_EF^vxq5@z0ePYr0B) zQxD1hSspWJ0q`JeDZ1vZaHj-CBE*{&``ijU5JtWemg$GpQn%~9)zU_XXL)sGcI4*x znvaUDfZ~|3KElvXub6YLBjFa?49(R|q11xCp8UlZG}*(My^$qJ&_XnS58n)I1g6f#tb@Z= z4N{Q1N(wTEbivQX3EZhkNTnVfk; zm5*8_g1CprS+$)6I*L;3u?g#uNsZ45yPR4I^Ou@y!?SGyruHlLUtN~Gi5Hcd+SMNIqpj(WYCo{s4A}7Bne&vkcB4eB%XUH(Dr_P`n2P8IM8bp z(8Qi&X_wX)c)*JgAPadMaoV69D*7+4Etiv|j&y0RWr6j)aZ&xHpTfEcu%6n}x9FZi z9Vn3Bja(Qb&)dl82r5tj`d!tuiL0X_<0r(MA_5w{(f^Ww@hU@EWAGmHK#ajN(bu9R zk|jHUQ;o3PUP7s60STLY&S`EOH&yabvrUmByEjU+VDyo?IY^o)l6MMK3+C%dkEkGe zUoLnoNn)a?KZkUrHnEXP9`NxtlTn@!P2ali7T}p ze8yBTXF*cDwxUoy&?Ie9mfK3yH@Hv_oOj8>G(4_rM`Ea;Rll=TTry`a>1`)f0oiCY zZ5(`)FPxPK-=AjYk=v!{x@cEgsyXmxqav4GBQ_rBR<7$;t(}&dH;=4BV$^0`-KVXB zIr1j#&UDEiS|jB@G7q+|utgukym;TOA`L@tDa(RXiy^umZd!rtX5ORdO#71G^zI4x z&0;p*fEh-kk#pfkAE%agRq8{=jn;=bVq)iX%G}Q`uIaV5aPTKoEK_NSri8Tm$@wi# zCR~K7>vz*(caQQH{(v&#`UcMN0J1Z}^#GgaK6-6sz7I(EBrF4!jv=6a ztu*e>B1G8u@alW!(?3a3KshfCTtqYJp|v^jdQ`#FMI-C$VW;K*ai<;T-En<(b;Xk* z)nEq__?b(-TCSSAwz+JgHo8+y7mW8@hlcbh@l{!GIOMA|+=~(OjN^5B$;w5vf;rBG)nvj{ zD{nJl_>KpoHvH6&rvM=Z5tisL+Z<*ZLFc_kmDZVnC6nUD?P+!7ZBuz2od<^+3138g z?w7=lZ}++oG=DCD8xviZkCUqCy9as{5-DJQr<$91m zm6hSMMkH&pxIe4pVpbFILi`x&0-sLE_6sAIUGgn2nhQfP z!3z-%%op}yl}#f&Lu)lcNnrcMRP}tSg|7j!B2;a)8_~O_;m-1ZICv5-80 zHZ$bhs3#)pRaMz@iEEa{YZZNw8w*};xsPbbjyo!+1nN-t6pU{7QEIe4fIBaW0P%DE zfcMT#NZI9nf7PDgpo6LAKF8+TQ`?pcLM_*W+YA4-CoyaLeIgq{#E%8$DuQDAyeWy4 zr6TlgSUw&4!E^GAAn<%*`yl9>Yl;y63V+ko%jQq|jF0sr_zk`!mquKL-iRS(!yZJE zQ4@WJ(*uW6zrRbrO<~p!Ayaq@O|W6w{Am8cdSCJ`_@qMs$MAy`aRr~t!ShfxPPHJP zut!lw7pN>cP;MO#)Z_{?MW?U4R?#bKHNGNS-3w3@;!zHe)JGB$5(V)lapN96+@;ub zhkQgC1jQ6x?u4yG@i)KWRfj-hF8N=5GZDgQu2|Pos&bHZ4`3V9z>DrC!#{&78zhO|Z1~YuH=VbQ2Zbt$3J> z)Tx;RmNrvL+uX+57Mfqj*iLn?L(PwZJ+o4m2{@JXYxs}vCjZyMJ^I)wdJB8vxD?a)n@*+Wb4l%}<#$uI z%1qp6J|5{oay7nHj(Ke!1kUsk@yUe45$$M5r7f2%BovOj^QVxkDgOiI;VP6Btid8q z4=Ea*oRFQQ_Bz^w()asVSXx|BYt0gv$(lHZn;u?d|8%@3g|&C#B4`{h;e{r1!wh zW~M%nM84hQ$smGHwlygyYd~u0ISH-b>7Wy^>>N#T+g!@o0lYb#z2FiLYy!;aA;du!GwM( zFo^CT6QtI(+Bf9fdt74YwA=bP`P>h@+Ux!D&RFuPN&O~~;KaJGvHDcND8hYB+PK97 ziB1;kkGZ%cRXGALG(b(-o|3|P@ZAY54!m$Tg}SgxbXj^0?|w^vQAXNd+@?_;dC@af z6&lq6NQq?(%PT~Yzq3bFRr?;^H5#cN7r%+JSw2%D5>{^KPGeh)RfPzSH@DEHy5WmO z$1yuTU8)y;EgBWpZ*a)fOXz5>NugmCg!m`jH+ypbT=X2}NKrKOTRcz2x*7mzF4`HMEhm;kGapDdG)0 z4m!C9t~{;x9=?jqYRSNXV;4}*+ZUgdlD;(@uD;JqmC9SzdKDP0!8iex1`95!_*xXjCS^eg1TJr^=wBzEB-D&Ch^OBp+!az z1ha_>=<;`F{qP2?GwBA&y|2&Wc26Xn?XSe=Ccgz~1hxXwkvGFXq$BJ0zoa89!fgyZ zH?WB(SBciAUsFyZZLdZcWbXQj-*)|@XTftew2>&yA5-;40^6a5J}*h|j;iomXkBa3 zMR#|1HH{G;T}?}_EiR@g+SZaCtGq)zFAlFVq7Ze*;?o2r6YU<_9R@~E>BbEz#ax>w zWg30*__!Ycn`>V7#iwzbXs;rq6A5_J$6;pdsw{ajOPX%J%d^RpQFx!4#?IP%%Qy@8>?7n7rGL%e;oQ;S}v;x#hkj$lq z?c$xzU;!bLhN$A2wi{aeYb$WaACV{maA({?3|W3qa5g4E*#Vgq+vbNu{CSqc96&<=7s%_!Q1_FO$A9S zUg%8*X>(dOlWSrz1v?0FsZSuS0xqsg2tzvMoI{%Ye|pc%fblC5zNiDJ=(<@;L$U9e z({u;0%_xTheIoc)42}IMp4k)`5Sf(j8^;;smYpa879PD(oz2P66j#T3^pq(D_%}VK zrxU?hX+N2E19`uhcHe`Wf0O6%2@}Or#2sd+3l)tm$45C!9?n&J$t`)CMNV(W*<1{4Ykt5pv-u!W@)4*5e<=I(b@}1m=C7 zhKJ&W+517r8&zC|b)pYnA%pq@(M@W6gI{J5#jZYoyjJfBh1II2eNW9R|8(?&n&+?- zcf^=1?RZ`&a#D~Ldt2iSzq$n$m0+0p&Mk)$;_;9kZDE}0t3DIt@rd5-1@qwZpNr{p zqk9;vh=29MuJ$zf2LX@DkV0qUUd-Z9A0@ATogObPSY8kBgwSXb{?V{}g2hxU>27HrqJr6!arpPC=GKIiF&BWcUi zGetX7#T}g``=|hN3#m+2R~v&i`i;M|V%<{=A6kYs47$1+^c?8UR}+9!Q8T{+Tuta8 z=F|~xj+QQdi>-y<#wOt`WGd({e_MyYOwHu@>3$*v;ehpTE~z!|(7(0oJ=?zB>tf=! z)QIgm#wZnCj@Ct^x+0H!HLvwJJp@S)XX^EbDCB4&;+u4X3=xcO(onhIKs!D&@OJf9 z`*J5^(8JIS9%J$uM&5SDtUFp^aVY42;+4(XVOVG|!ri<}p;gsE=N4Z2U_kQ2-MgkE zqUTkyQaxfEreh4dj!l-Ewm!wI&55GD#@tq8)^XdMp!&Csnn0UabOqUEc}oS`yrW*S zRONR}y`nE$JVdY0!=C#mPNaVi8?|kZbqSAQDnN8FYQ?8ud5vy@;i1ld!CqoS3j5*F zfei}y8FY9j>X`D3$GS>L%qbGsY2yWz6xrkVA&#HUuFe}gm3l&&2d9`@&If*=gkcBk zQtHl?ds#x3@BvqX(y*@TSz=jVwh6|c{F>Z9XJc4uiv0Af5gtVUQx(3pGJc+5x>{+p z2f1Qelu^LT$uCu`r*SW>!c8=%B;k)0HnDAB2!=Qn?#|c60(TwMQU~vpjeq&7e8`^j zx0d33vm+IY%2-4^T($GmbuiM1E=~2|j({+=uwitgdfOz6-nU@x4f8trZc2Ih)-1(r zEe5L>7DCq>((B@I zuiQu}dP>ZTQ5cX@jc#)By0?R)~wj&CA_)ae~B3^b!q-|?{Ly?S)FYutK}P3 ztpoUjYd^^_iqmEVtr}iia||XlU{CXlUno`XlHTe*u*lHX7>?>Eu7H`*-Ba&ot0+c(DDFL2LkXss7;&#AQ(&9!vME;5f{E~$B~O`-QKq!0Guw6?jT zs!K^tGWeim2};HSjToG%y)Hqa!aD?avE4SGFvu|?Q{R%s$8l{{$5t6e$+MekNOX2~ ztl*aiqtYEiPmq{+)yy`_@Sgv)_6?mj6{D5VF1?b77a3qvloRLol`#DarheN}8n~3$ z_XPS-)3&IQa!8jm95NmmrMH5rlM8nz%8w=!EwiF^&e%gQ*T@X?~;~r6O;ppvBJ5Xu(BIk688p^bB)b$Ul`;3dn2-D0Zd#22!ZSEbr z;T)5B=Q7sWBSq%$NEZiJUIpjZAErYSdinrs@MI(FOu**6Q1(_&zs}r{=YzMt)XrV& zUg3TTpT-F|s%Ink7YFP}$}T0n0<&QUDL%iOzca$Y`+&QB&!sp9w@TFs8C4z!nW5zF zYj}o@MzL!d4l%BN!#8--pS~>>il&4B!Dnx!SH;Ljt1C<7SszCK5Mp)q%zJP+sA9SR zwEl!>Z3BXS^rS3K2T`<*h|2wDUM#aC%^Oz5fO1=QC-^w)ow;?`ojSvLfVKPdXx$Eq zYTBlk?(co7BNB+M?xn*!y(!=UgS*eg64RgbP+LvS9r}H&+j`oug7I1 z46t}C&oOxn)Z7n|#}tYSWREu&U#9tgI40yb;pd9yRFog<`hos4EY=- zD(nnnhFEEa32jiut+MUwG!Z@_w}kqxLmxmW3EWeM;t{Py%=0XSjF&n!sKujMbCX^&cRj$Iwv3FQ%4DhbiE#J}OgpG{N9 zlE(`n)3P}JJjqaXytn_FAf8P$B1YwUBVYZPWz{nG!^;oB_uMfU>|flmlSvXwuBnKx z1JBeMV9(m;ePRWuFr5-zGpPYD6Oru9YQ!t{E~jqgsa?|EZBnt_XGa(^8h(nk4UNl~ zjvnZU#Y)qF%gUU`T=;nW6RM=eFWHV;DeXd!+HHx0P37I>lDyyAH4C4_A+JMt6Kg_W z>~m;nwO(L7zQFin>Ds!13S?4FHx?jjEh}MLyzSB1jiO9_68#cR9_q4uj`B1@h;~^Q z>$iyXu}MSQ5&DK~vG8%w@De&%zzryC*GAEvpv1d<^W$fA+jCddvShuVu%g30 zZhv*x^7;VGjYlG}Gif_+{KKDv1TX8cmc&%ImkTTkP1P*;FXkczk2PVBK0{Pn=MS6i zv<=YGIzP-lId0a9We2JvJBsb8`KILSDLRoXiUG0~*WI*y{qDKs+(I zWiGQ(F%-eDZw@gUV~iKs7+E_@H@@!GIyd0LzGgz~@Bdx|qN5Yqc>{PbyYJ%0pAt_d zZ;1k`9-NS5zWRasQU$DbQY{0+^($K&cm@OcDV#w!YY#!wso~3{*S#~=P4%A#Xtzh) zEx62T=K$ImGHdrN(j#eNg;T#gldmVmUPf!tLtkHtyzhUrIz|~jc$800Vqk;9)zTWSxcSawK6Ku-O!>+tnqwE*LBD)x9AwtaIIxYxy#{t2|e??lN^)=Kk6F(@n29b z6%ZUc*5-?CE2AFoBEAFxgqTO~@kTUMT!NFYNqZZ)V`b6q7@6Fw+;Ase42D{!iI)529QA*2aVeB@!v+eZ(O%41(9sX#fh4uvv?v(^uv}1IH&QhJQE9KjN zoCltx0(U8+GygpnXj(udIFd<9OQ=Max~d(Lv&y0xISyP~2PD!qzg94R@yQ8_tj2(#6P6J;rQF*%~=)}ktHX}-zPea+d{gyvA?!xx-_$vee6>g+Zc z6xS;`j}9YzQZSQfD9P2C3qub(0D~NI;(2Nw5>5K!#E8N30=+FMB9+e{@UZ@|P;8aG zuVPjU%629$5*vf2c48T;KL>*>5Yy!P;y}^m-!P0R`$104Ss;uR4J%I5d;ekm%QuNV zln+0cL$UXM59V>}E&QH@U|st887q#{RA+C6-K;qy^GngmboXc~Bs;fSqNV|sS_}|) zou1!&zCe(qrcw0(@N2%a{aQ8uF5{!rWU4)c+^*rCg!Z1r_J~=f+wdzHv#K`NC3oUVu0}DZQ;g7GR*@vp*IMd?d2sL{skAC2 zXp4&P#L8zQE}V)QpT+`7Xe&JCBahZFSGcDJr2Em)ELQYmJcn4S>);s9XRDNc7rcIw zez?EtyB}c|w`IP$M}?_eF@H79ylTh2Lic%u-O41OF>~G=+hl~=$^PNtEWKs{{^1q_ zGq|kSV}5xJso|Rgccs=;RVB8Uk;A>u%kBJR{|(Bi!!f#RMwr?)cX9RryZ7Kx1wCPQ@R2)5Ft+}lsnT78<#T#9v6C%T zM$0@)m#O@ET(o^`vu4Ga5iSC)2$5Ox9uC=9sl`nl^(*#em5{^0+yhFUg!i|vTApB- zp`ebZy)KPTWXTWem-kj2nl-c`=CLU@N5MVxT$`i)Z6Z3I1e9B^Tv~2Q5m(C-5@w$? z8XJzU(iw+~08X<)i(b<*ujeQiZfHU()b#dSe6f=4=za0cnD zWQCr^xNP|h(oo4W#R)k_&{|#;m;@nco*r}8w5%2N3MwZ0eZU0JRMqQi?xiSs=WTiis+guo~&+bN@ zYfx{$J<=72Jiy)7nD6;!a&LG5R1Kt@>Kg7~P?acL;$YJnw^ zY0M)>an9vVW>G^v(F()w1O4J~PB1EGEn6INDrM7+)8~k6^XuYguZF~JXzU&fI4 zG1lP_gTeYDdiv#lRD#R`*kh@7TzO~LS>}4sOV+@2sA~54x)UxUFq8k7n|M-F{;*Zz zG_nLx$!6sACWjT?;J}$N_M*6(mO0SXr<%Ylc!Q2Juu`E@ivd@Cl{q(vdRR9;f7N#t zn#OoH^yDGB#P@vK=>|x3k*!$4YwP1tUONQdWt2ZGyw=H|V=YiOJnK z)QCuM0+^V4$Bi>q%|Zbd=4xL(PEs@fhrPFqimDB`ux+G86a)#8l5UU|DQOky7#isY zham(6M7kTK1q7s;ucx-i@Cs8k2HOI=>XAaE)jxLkBa?WZEii z#4q#{T2y|1p!lC!E{5y!`ZM=uwn)e7(pQu3f(rvQ4rh?>klNrGwZ@czf?y>Kb?#cm z_nEbwQo2qb-ZW^VyGNYc`eLyF??J=JbP|kkhD%E|$7m z4F7EMe|$l9mCPkXYsp!VB|lK4EoaQj2ub4Tvd-q8|@1kAXf15?G zZY?bV*CJM1WTY3k|Cf;1q6viKzWcrr{r3oec{`sI0HHg2@_?bgAN|L~cFzL1Wfv1k zUHpBY`{Qm~kN`d>$&p6!e+iE-z60$vZJLh`{}}|o<%-XQz~|TvhCj#syD6{M;Cvh2n?OJ|2u$NPyX);{1MInZwURJga0p2VnmD}?#gfGCj5JnPKqe$ zM)u3N$A6#2pV#J2_OJsWhTLjbxBW7Rwm4hF;%Sdmefka%0@Xby?OI;LDC1VWk%-=B zS7m1!tp$sI8uMjx#+YFy-#zg-uHLLyfw&lN6%0(w5Y%dMAMiOPd$2B$KAqrT^_-Hr zL2!8nIHWH{LYldfD)T@rg+M=XcGBaG&FM&L9hQeBg(InJrXmfTMlKxIQ(@@d?lu9; z-&tT-`?heu=wN6z0Yg>8GEm8@oui@)6kbLyDuz=f9SzV z%=3Pa<_(GrRrpVcm}M+>V_z=v@}fMqP>h@R2C!HWd~Lm8J=zwpEg`}<7)M5qp3ue= zoU!vMs&lNW3#Jx8CHY$KIy{IiayKA{uAnlyH6c9~1@ob!Ofz@7Z~)J=vhH)uC@P~{ z@sfMQ%A>C1tJ|V>wHdR|*S=V1<&P|vt=5YE=-ms`D#)%vp%Aam8asv!xBaUIre4yQ z*ooqgWf5NeU>(Hh*4Ke^t4H*diSZbJn?=03mrjk{JEKTzbo6J7{Y^?b*kv{y1kDvesPRMhtlB4BcAun;^L$r=M&$&_bv!plgVpo?#12To z{uu2XwYtn~8Wq_;p}$#h8@4fehYUznk8j@C-33>%)_=sGchU#BzIK%O5x|~tzE=Pl z)rw{0;zf%0-l?wX4^ju(*n*-r=?Yy;B3eFNQ9fO;K4wtFlZ6W8>MlTCrX8E=YC|# zm-?oUawW)6`Ye?g+Cc|dGbDWv!|o1>IL5YlT8yt=Tf@>?^83ZQA|7)X8(YZ@Jo_ADH{Zjgv zTxIK+XVBrnrGNvi(ehSMb#0outjjb6(6uX!3jPIUcB!%g-RGJ6Hi=3ZFO1X6Hy&Ka z2!6iRgR?f2Kuv>rUHUlmw4V&!dPJmFeiR~t!xJzHrG8a>bX~6F`z>_qv(F~)h0Zr` zYu~wXD*f}wM}~GkJHX&l__@oQ!cReZeejXO$+J=yNTPXFuj_BM-;kx$@WLFsf&4r- z*|~W^N8A8Kcg<1{}_T%o3DAok$%iozEELEc6Aa~4m1Yk6rRmLaX6>ESKc zS}sH|0A$*$C1mPwDsepI(Tb)oAgx5TiTb`>yc--_RrYE0e{q(Qa1*#8$irW{NBU5 zKQoM*u;Gz9lDH^7e)%*FYOU#5NiPnv7pk!;S5gB#M3akoioHLGdCim$CfbJrBs9k% z$JeGT6yRu};@+lt#5EQ3*f4TshSXL%Y!-C6;(PaPyB%@$;178$J_~yHZ~Z}bsX`5e zyKb9oGOEN!Y(0*4_ZQ3X%g=-nZWKqF;kMgsM-ns(M(H`ooij(=a#oX(K647b8)_}b z5-Tp+YXfc8rL#8k#+-e2P|*1|exro1y@&j$hs(!dK2f(kguSmt950bv-ma&Vmlo{E z+d?l|PQO%T8EjWaDqG%)S0w&U?PI-6vgW`L^z7L8rC;$yC)rPC)onZw`sbwRtHoKB zKf3}v8t&4bw`)w>G2Ug-pXPX{=#Ww8E!>by?0s(<$WchL;nag!&T+o;(Pc;*AbFPj z@;DcKyV?nWs1$iXU&_5j-m?DF0PiYY(8VANv!_>>J_l2`d0$suue9nyc(DY&{$M7nagoPU*tCXqv4#-c;uvgL@ zvRXt)(!sOeHF;}|@SN6=l)I~JiyuQAXYG};m_XP19EjWT)bbq^Jd zExnyFtxc!&*Ql8QBKzcX2faN6*us>gpfhqb5MH2z(0m)}fALjHRQJR5*}$bxQl*O; zl8uUzI;A#Rmqs9Z;YIl<(KNv_toF2~`OA@5AIox`&3jLk0kG(t5%@@Ct2-BlS?V_( zl!70L;_uR%V(Ph$KONIsFCArMRWakD{1}obi=Q9F(VfwjLoGy1orB%3zahBhYgqw;EDv>?2c&xEkz*_X! ze|E(+3X-}qBO8dCB|sdTdJk4#U&AZM@d+TgX(~WcWTb*b=m?A>Id&tukhi4NcR2WIK zB6#H5FHMM?Tut7S<@hzml>zAP1REV(dPd?l!3*p3-pM2dPac5xMs<1Ya%_==h9Ek-|QISOpP0R5} zuRZK9xp<;NQb&w4C5Fo{R$uhSX-avi;HJ^f?i1mmEc?N;q59J|P!HR9ZXl1UmQY#x zUb>73NKw~}jb!goC;2yDeor*I>Uz8aw^sV>>AhA{z~vqY>Bwtv9O;JhEa%7OIo!JP z{G-JZK%QXh!mx|h$Z#9afpu*ko#aJ%=lU3mV|alVUlziz!V!M=RhoQ)bP=Kb^(0CY z-!)^mCASM8;i+U{4{X^ZD{6=8>*wmV=$+bm^hK>cIU)CrH0t9Zn}d&&7p)WGgEmx= zk_)6r^L6~w7JWx6qdebAQ{+sYI-`CZY`fAwhZw)5^tgI&xwMFEBe{1+H&sn*EvIFx zkO}R7p;VpKv*M2n@C^c{{Wist#n;7HWtQ45@1-D$xFCZ1Wlu6A5xSry<^eMAu@0yJDG)*5|44)1oh2@u*4xG4_S z<->!{`XQKAH{9uhLKRY6@*OgR;lt_fofJrnKJLeA7^!#ubzjzg(WQ(&1xtMr2i)50H= z0e<^gW{9&@FSORYu;#Ay`7+bzYxetx8r_hK_&B_iI=(fbK-(<{52d$7ndwU%^-KlVJl|pbfmnLbVCVfkjult- zwM47EjvZ@ylBln(>&LGorpG=3JLQlExFwmkArGV`)+}Nj0oCjLXlZhKSi)Ia>}_`4 z;dCO+&?cg`S!_{G{to~`Cp)2TrCe=|jbg~=@?IMOHA8}`2a32rQc$DDsybTqt8_g& ze)gK;7x_a~E1;L9CHbZI6R@d_gE%W{LmH~J$i2KYxj}{k6N9Hkzq#g!(a9{2ZedB} zE_@{!x2$VtpRjTMh9F5X2w13_bm@JF9S8R56}-E4Mbm}+nqzdPacA|E?hWHOE6}0p zqKG;j_~iXt>026-vP(b5bH){l>V}6H`=;A;n`)WH;e6_DRzP(=u|2*C&t>+Vb!;F2KB7Bw5y81qx__CZ8DQ~mM% z1tH|}2C!=E@)YYO)`(Od6Rz$S$Z7FcB*}QFf>IwH&C=y6_XUsL>_M)7h$#}nvpgdY z(7Q$ z;}9VFY2s%WL)YGBwvYQK4a}k%o-Iy&f6n56jZ;z388?SV*oqE6UCAE*VtazEV>k-= zxtZeb0_j{ukhT-oLTrk{KKC=Q%k}D1>crL>KL<_cu{uA#z;hq$Vj8v|--ph3@1hhy z0M-{b|3$MUDydb1f~TcDq@Qi;yz+o}DHB{MczmVud)hxS9RhO=0WNBLv+=c`NL9C&<_n9#AOKCWa(a!;ZzQy#0U$mNHlCBhHkiD z0$m#8-Nu%iD)NWX^bNX;kyCvT@IQZQcivWUvYJq~56NV#Jq?zc(eY=BA#{v=9tQ6_ z{G@weD(C9iE8v={Z@+|sL;97Qub3sXIHNy2OJxDGJU+(7V-<5BE9>eI#3wl{7Yw>t z+3xOidwBcj+g;;NQqc<|sQCk8E&Xjk$A#7kP^sMKuG!$8MTNC6(nhltIRa5A1)B6; z!M&HRb2McK$U&s+jfS@x7eY<-$7)64N|@UZ-g-Wv7x%obHHj?^lj-)f#5`|-*__)o zwwrj~LJx79$d7lP3Kt*Pg4Z>o_BLR z)uc3qhRHQ;m8KZdlwWZhZrO;+NlMPUU<9!Ha5ozloe5k(aF zKH9JmN=-1*iyI3j)bF#cm7D}d=;&HsH;rtEo3V|_1Cy99Dd|+Jo3Ybu(S69^ds05T z%G;t)`$!PS8Uuld{w_x*KL6AO7Av@8URh?`xFaY3(zGQ)NevFwY8JFN@i|JmEYMr~2=De>oPD-K--x-GT^m4kJiHo9(Ptu9U3 ziiX=FFLv+=3_>SJNS|b1E)C|W?^doQ3Ae}QGoKOIf}VSDbcsCJ-*g9w*UhTAUiv1o zxxCpv#(XvOEsXhf3b%5 z5daHULpkE^mnOInrrrnZQqIlzXeDOQa4|fcI1xffytPT%^Z`~O0sF0-`JR&UV;b`2 z-DLvdVX0IRfW&B~m}kpdxx`D-Nbq30b7x8}$tCREl%`a@ncwlCvxfS7+Z>n0*8T83 zF2p8I2Z$DN+(~q&d54$yh}U7Hv2km;`svf4pTW26(#-oEm)soe#A@_<_qNNYYebN_lF0?&){<$`AoIH%A)*E$qg_H$;RY{&!gk14Hf^F_xM5 zsH(7ZDcUJK!kCP19c*et?G5(i`y*B%oi2Wc5A6#z0+K`%nxbb=2RM8P4 z`n{G%cK0TqJ`&@u|&F*0W8y52H~_A`$tJo1277ee1ZkQd&PS z0VJbdj%cCs@^TTUb@Efa2MZkGQ)>;C&YFli(hMgw&4&_baU5B$Sm^`xt3ah0`cJ zGDHfKL}@)0SRqklF>sbwnKZ|FwORH-D%^u7F)WIuNI0Y341Hj(#3h47keShkHo^Vu z2>rcFWmqVNYYo8F=mq}8XD8WswNO<%#44RyHL5!F^IWEK;N*P4V^At2m7EF_#jtX6 zadR&+Xe7p?=OV?q{zPVb$}^?D?~KtIh-1}kWt(-^VaAU`!nANGGgwT>!y{DQL2BA} z0#FGR@!c99j4VA3pKO{Tf>gFw-f=(FKW;v2v#tZAQQw6d|@a zfI)(q(BLL%;fZYRaYIRSZfWg}aU}gDbvC5z!W%$;*VW3PMCL`7mpf5!1z)qLK5VP0 zXpJ=9fYY98X^iR{P=2gxzvy(SribpN@KmGnyR119TN&LVSk==hM*|5fMX_qu6jgWitWgRVKu9`-soNK?;5(DdD}1`pZfoSWOOD)C~}W4w(}fWPW| zRCuet*hfN4{3Zg!cXt0f18rAKhiAw%Hk&^Ags()zVa{wOwyJ25BT6LRKqlvQZ_VX{ z+&h&ZSvnq$_%@1yf|R8rqR*v)T8U;-^D=u4L^ceHt;ky zdr6v?MbCaX@bJDE4G{vY3fkXrhmTQLYJXwK(~$3waM7{#MSmZsp=^3-r)tKOi1EI2 zQ%k;Qh-O-8tkvA?vpU4jgwp|3%909WHYz69z>pEXvPUGD5k*&dmnJtJ5I)C_uDGkxc)55kWnN84MJHQ$AIRWLoVei#)#;f-i;&H>2CZz5`4f;dDbyq*#~a0&c!K10$Ayd#vF=Kher5?eY=9o zAGCN_KxfA5@hhN){2ghN+Z#KN!PxMAR`%P8eGJbZVchyYv|B74{P5 z*;=S~3IMeHVIJqI4@VFDzw7yU-0jn`u^AxQ915+YB#?+pBB-}18EV$K-hMfB*ifOE zL7AAKb#7$eGa-%aSIUlUSgdReRpR)StCZlr%2n1uNt2ZC9Bu%;fbj?Gd$AQPM;Oq@ z{-8_$v9oS-%Ea?+)$QbwhFR&*O>ryH?}G~1J|*(Ig17x3k?kvfy%gf>a+}A{DbVwS zpjyw>`eM5X!>9Zu*E^nF3?jgIa09>>pMIgygJhP-oi$1AKgAetkN6XkwEi*+fA)~( zmp9~854Wr8LDg*ZS)S_N^4vA|E+VdMxXOr}?ivAFj&nNuXhrdWiiT>7%WDvbV8wSO)Yq37n>f8*46AI5(uPrtB3dzWbIZqv~`J8Q=z2!;avyQ(Ika zDg7AmnG4~xW0m32`kn=!ch?%B`7P>YgR zqxV1@r+cSgw!gAf-;S^4N_Ht2YA^^?NUSY9_aKb_whX=PbSo7IIamq|zoK~W24w!Y z+*_f-?=rBz1#=_)54JvwISn?EW2_+`^+}DA)~A1Uu#2@sZ%*@68)euCKBo*Tis)lt zra1lO{qVutGF+KGb0i=D3#xt&Jq;V%>9nE=%n~l{8^Y)xTu+7#Ou1#z*<$GBG&CDymLJ&8$}yK(9OqXw>>3RH@-~0RCxOt z(HuEekF@ABPxTjK?h=hSt;b0QA=w;oF~&p< zzcHC(F3-dyR?Y}Hi+4z(e(}AJ{c*Jd-jNNLx4`^PT(qkPaPs{sQ7)7-s*(|JSHanWrtM#^YhxI^l z{RvbnnL4Lx^ZvqVL;iFZ4gG0X)sj%|p*!D$6gJ=3TIebsmB-`4Jvpu*f3gN*3YN;w zi`Fw>LYnd*{d`3xXlvQ5>e$8Y)*IcU+cw7vgedJl@Ud=ViBO%>@zV#rXwzvg-2F73 zIjAK3v%ok$W1s11!dE0`;_6s)>tJ0NioFzTJoW}|Xqy4f+b|VR)LVD2PvnyKX(IWC z53d|u+O&%cSk~ONjXhmGw7v)xO-qh9n%iPaS*Zn5tfBz!LzkRZB3Zz-B3FngM?iNWS(WUKrmSQ@f!^9jGU&^WiY=k^ zHJ^V4H<2x|!yxlR_h?K3RGIZwwdzLfILpSPL=pO-sSih3R7l}aAy=BT20k$l~srwZ3m79wJg_%*l zkY4`_W@tyl1CQPHhgrrCi1>8t>}#H#6MGf*)w9JU*RFex1rC~3qRkuGT(#d3(z%L~ z5J4^#E?2`{ko%kdzXP->p^km+$l%1-bttjxB`%68>D{pG&`SR?M@a!uwo!kmW3%4L z0CiW_{t(Xw4-kR%TVcr#dgfmFU5x8J0K1TJ7YYn#b2&X1&AJWaFXI(|eejAA0bbmx zzSgvPF(S%~nkk6?(x9(`d3+`prTW@40FEujAcEpfWofR5`6MrIC5uKiX!W{78vI;7 zNUX)uA&2I$q&CoB_Dp%8rLV4HyKrmcig3_rto6Z2LzNXvsK7ZMS!foJ%nYsn;&7GB z`~kkbIe9ZnXNVw3)CR5$r(sz^@m$jJKj!{zD{CTZylVs`L$Ch|QyQ?cUmCxrn2Dn# z!1(Km`dE1_`^R4POR@juV$#yOvdeFKCJFyfU)6OuU_k{dr#<(ZF$o9vEb?tf)@Wl(7e}Bh6f7ZSFe2%nx|MT;&-+l72h3AiN z=HLHQ2Y9OX3|>r|F{z?GmzfN;60th$}V%;_FBbz^Wnwqtnw;~_ld*V6TTnnpWEvGJ;N>4fJfpv zQZEU~2!b&yYyz$Krlc8)JDpA)5)D&J~PUHQ(pADh$^C6B&KW zpVC@4V5s5SE95%0j8!;jR&BTFiVVn8+=!r*+)aA@@SltEIU4v%byzx_g)wZeX&@bk zin@b20vcD6hC?Ski6NDpPEdh(RCoYt$R@T)4SPprEf{42F8Zqy*!V!0bvT=`+am&h?_Z zAD$fzvX0I1`_3+=J&aZ~PJp~~N}r-oi+N7+cidEX1BX@6-}PJ?Xb&#?=n$imoA6AN z^WCG@DW)7HH=I{f1(}1Y_S(xQ0=g3EO~^0pz>HiID5aZ(>No)we=VF|3IJ!%UfF4E z(QMOu$fQ4sc_y`sPBxt4LX_>3eCi_LZs(5aNXdb{%RG}KoXofxPls-NydZTRm;sy`URG(2o|3g5PxW9)^dn(x<=uAfw)c}; z^R9~Rk4=^~3s$qS=YjohCaN_ppxNHXzVH_yATJ~$BI$?of&SdI0%&TQFte*F0urd? zoak;kFZUs%f53q~*NABeYRCUwT!%%a0bXP_h#IMg!PB(^U50$k`8uHG#`Ma);x;2; zfmF`jj)g_(o+EUjfcsolhZxHifuCKEe-&d)MU+i(EwbL&;1lOkG1-nEBd|iTmm34?3J)Ku zzRTjgN)i{{b3Vj+bK{?Ay$~KSokGRI`((`kf5EkKhGjBmv-%V>_H~P8)w_DG9h~JJ zV)&CcNl$7|2XP4#9T7la5QqVSoy1JL*qT72OaFr3i3+yh^lc3Q{N0a+^i87MB3CXO z6bv*a#IIk#YEv5R4Sp0{h)_@Oo9uTjJTcOFjLBS@$EL#*+5PO;T9-MRz1!$`s(C1I zsYA0IsGT3s@=IF#mvj%CW93S9Us6Xp`c?X>Y3&n|i~(Dz4Ur0rHFF9-(^){d?f%^B zv$5KB4mMw7$|lZLEn@S}Bi2$XBDy~~s#ARMo0-laog`S>8}-scH$~PgCJcNvO3T(Q z_u$m=a6M7h9Q?*019Ua{+@!Sgv2FOoHz|8M`!-siLj~tTPCUfZ&{qlefN@KOaIBz= znshCGl1DUDCvK5O0(L~PBpi0w1ajlci6Rb=Eo9S2VaZ5 zat^qqk$r(0MRLAx(>RP1V1R36TqMbLaX*x){K??a$!*nHp0gyM3{qca$bM_qot}nHlt~} ze3U7$H8~NU2(+jvR~aC$`coXwtMGHbDh1$a7d!Ab!jf(M6DMTA7I z`ESTzfc*W4Jx|A)6ru04eD3SP{cZ3u^+#f6?Sd(sIDa<<{fZB!_kwTP=ZO5SeuEPM z8*of?A|bPG6zI~+f4lZ+vYl#|vDZOe4{0-H&u>=yHzVBCtCToav_~A*9WmmT$OBbzC&b48Y^XXhZGHZ?5AGWt^t2yxKER>ya-nRx zE{Nvp{NK-7?syzkqVDUq{s(6`}0S3Sfr|Y_z%2 zd$IE}n15r{-47PMl5<Ipfap%I(I z)OBPDw~faG)-|~uy6)Tyv+_@N>MY9gM~URP`NmAU+iV{qg1Mk^#{S41M|x@J-)7#7xy*qk1N(i zTIWAM;G;EHww0Q0A5Hm;hp_h~8Sns_ZT>#JS<(TcEit#!0IqtS93L~~b>&XhekfX6 zQ6Ve;kZy&7#Vo{duM#oq`~{r(^LkL1C(SDWy{+{w%*> zmfDs?GvOeGKR18A`vUFoR^l8HY5DU3CXBn89VpVrcWroPTz+bR+6T(^AIBEeki42# z@MtdR4@56l?Um|s>c^RElk8@`PS*fe)$tU=?@O#fWD`bwvLQ4P?~Lectmzx$XG98VF(meH(2?YH?u5H4 zznM8P5m}^ANzN*A({@TcUB!w|Oi&M7(V%<=iwSoRGQ6HsVa^ho`@-IY7n4CsVfk6B zQi=)oD)Y3)acT@dwlxQ1n0*d)RxreK2u-+vG&;>YQkUTiSYDoKiYOp)rsN}Pq6 zn#lx$o-Jpog70{P1X$Dm3hj^s08lSBlin4+5^y?jm}b=+O@#YnNkzgO>t9tm)y zRorej(x-{BV4k?RPt1SJ&m0g8Js?8k|r?$0R{C($d;ra_mHN zg(mV@foS(W?VZ5(o)5X+IJqQ=9^<2;+qU+Re1D}$XCIJ9I5;1$)g11AUGHhKGU9#% zf3e??@XkpmhE`bw8kZ8cG+8m1;{H|bLL5UzE^<~qd`m`-`Y-zOVR9wCFfD9n;J0W= ztKmKBG*w)=N3!SbAA>dWaVahG=(eP@qA2^SreGoDKFn|GC2WW-LTA&w=c5(t@Pi3J z&qde(dhQI2V&D+SH>o;jCbM<~%{zm%at1;bdcZX)WG=lTuKte1`-3jtv5R!buW9AT z`#OW)hqoL*i~?cJCdO(qx^nM^d$fLApzi`)8&6PYJX}Z@lSvk-5+7#4eY-Ne_J3dJ z-dtsN9=3hRHA>u67j_33K=*7}VXUQ<@;uxOxgIMQZH+QPQ*ymYbVaf*S~V7UuO{9x z0VVkTVJ?g&??4~U^iCp0hk%gdDmDdxR%#wx8OL%FW)s#P&E$|jlX95;RaqDG+W8c^ zwJ#r`z-Dbl=QSF2M6Z*=C(e5Gsh~Fdqs3I=3U=qDUv}KV;J&E)1m7@q6eF9OY#i94 zvSeJD(^ReSdzI{nAn8v{UZ~3up&%v@HFI0GsFz^8c~nY zsX0t3@A=Tg7`~8xewp{R=yTo7o3|(D1|ejisrx0^GR{vqzd86sSDeL)^QCIuu+g2p@oK6!i z0rpKE7!S7?auum>B5u+fZ!(Yxq?KZ0s|07wS1@|-0mJk-d|<%K0zuB@R)Ik$@Sy?e zyV8`n-;-nhAFx6(z!fK9no!WR$xgRXSBXe|Y0Ca(5Nn<7!u%_5pcd~cG>c-L{UEjQ zs?q-reWeT*lNQA9bRD%Uf%`qAZtjh{gL;NgmDU0{22KZKer7g`ld|jQHa#fqr>J`v z$oT5(;jFpLYwk3NjuqAib7DGIdVM-N<3AA5C_0R~hvH!cWZV(NqiiX+8LG8Z3kKoe zf(HPA6D!tV@IdS`6~SNOM_}PFzRA=aat>js;`iQ!jvaA#Rl!ZwE4keHFy8I$EYtWq z#FSZ%T3DVY1szyTr=%auTotyxVNt@}6^PIDSqJGH8EV+y*Eo!28zHtOj(7rALdB!= zR}k^~nNqlw7Y%#qv0plVRMdKQbQo?I14xcNZZM(Qz~D3fJt94&e;*$#yhIZ(zs$xi z6!emT6brqv*wA^S&RC&k8%jq$T$5gw1jT9$+otQjNM z0aRDPU?WMMwVaxU2U`SIkj`8Q#c-5G8)$Dei^nd9+dKuV2YB1yY-XzBF4Bp?B zLr)wNNDca}<8j~l=l1$berjyH>bkHyyTkIgvFeY`^dk*Wj;z0JzcBn?aY9RNU|D}$ zY17a7&vpI%D;~=Ng4q9k#Xslw|4!7OVCVmhsQ*9B3%}IHDmo@pVpImjikioatj0)L zGQFS4Xu<8owMH%}m9>41LC$D9>kRJ1+QEQ!1*~Nf5h0RS{?tfN|A4%74 zywZLQ;6MHD#ntCimej_B&-(k@yKY++G8mfXr+@7tO(v?Pm#zVjoH}>=(ia0X|E@(q zn<8N7c|q^*{^eI*j~j04=zK3*k#hNKKafzwNsGdj|0Hq>v<7lEmbBSL2Mt5-o=yK~ z_IvmW&cfDtk3E1yQj(2^ZAdmpa`wW@X_P!G@+9L>w(=(@VZnO(Fryz#6@CTY#3?|% z$$$9ppE5_UXMoNgbi-g;W&Tgf# z*DW8LnLg%+(g@6({^=AY#Ojq-)D4wOdR67ryeDSj75KsbX^_+d-YlQ0KV|2V@xx7Z zU69$v01|bI^bhE;nj&S@X?Y#{xPoZRs=cyzLVO4RxhY*uutr1R(GaB`$2TU1Mw~X; zbPS*Rx?y_ zEpOkcP+UWQalW_}pm~!oXXdN*Gp4Y?Pqe>9)CphPzTu*Cpu?>&YkgIh_X3kYup%ui zx+l)5;7WPbc>6cSmL$0*c>DO1m_tOqt<5gX+Trsuit^o6>)T`PDN@DvzB+1aMY&#B zUtWKwz!&1dm=fe~O+K!_>`neYn@YQ%RgKwqpybslk(jA`3lWFO1?vIwd!{ZLQ_l(t zW3AQ~QfXyEX%-N-a};LZP(e~2bVV~v9!65JD*npxePR)>Ee9AL%XP?C0-cv%%Z_=( zkHyKO%Tl#pWt}`OxJ#URe*-{x zPfShY|3W)UEvb{0m#?TCcP<=_I5L}UOKd%(+t_(qZ}%XWtA;Sg0fCyj;H{@#%7+&8 zSq7{apWDg5>m8+lcc6#$aBgP^AO_Dfx=C<043j;#z+#WDbdGVKb?LuSf&+(%$SMlp zApPjM0gxH3>ASa7T)AiMtX&H{KiDT`B@B44csmzd`XOfiBaP39owY@ssw8+C3t}95 z)X!8}>HTk<1spzp*=!c%8di(RKJji)vr++17>bNd9b5|Kv@!`w*8y z^nH7(iIs8Boa0!^j0akKP4}&%(c@>d{E%i7e(=#yl7r=^D|X=_h^b6fA_rY_+bkK|i#V<3AB0 zrGTlSx=u=V(!tk+pctuxTe;+PX<=9wm%F<b!mdteQlp9jfQ8C|!UG2MV z1$D#xd58rxJVe+f6~LjD*EgZ5Y_gb^QZ`yc{)L z^4nBalv(91+?p&36!a$dW+i|xM%1xamKLoCC0c2cgSh$tK1Yafe@xk z&N+jU1kX{;vPgxI$p2AF*A2n5)EoK}Y0z46Mim34)=NO7LHlHh0+NdO_%O=3P8q7j zY$VO;JLRy!R;Sa#9+RTgF#d5CQ!rRKS^4Vaw*HQW>wUqBm?!tFh;#02Zc}XV%Pq^B zKqt~7OlcgbZGR_B!Yg_nJIdXm8e%F(<{Pb9!hR7tGU$PL%Ur?1{7x;9>Wpu5DA?<^ z+7!i#;QW_(dUr`x&=7tR{e;!rvz9yDjiBHD=cdW#WTa_9P}R9Xt&o#%+TsWvltPpk zQHd_e;pK~Vl<}GWrY$5x>GXNHH16 z)qcHwq+)~MCN7Es&*exUt|h{O*nGbNQYi20dGVbiQJ)Sz6nfiTGEx;T-XyoJ_`olI zwKJfh%Y^bc%PEPcZ6DgZd)ktymDPu;$pjom2hMOJnfjElZ%u_ClA$nsoZ^YSzUMJr zS@xHEy=UIiRv%oBAF&5*4do+#R%hC}%t>^%bTi-2M77?@r|@Ii(aQHaM-Ie-)HyU* zT>8DCkpmO;9*IvpL6|6|t|BWh4iMNum?TMi`U(}ISE-R7P}j(g?7&|0+EqVwS&P@b zWInfhCt~_o)st5CF>6!~7hdxEA;1*nJkSK!@b(ocpOD#JbRilhv=Mwp31N&d%=b}S zW6ee%3mqxR;}4LdIS#9>2amOwV_x=Z$Qwl$os5Tn_2FD&>)e0U;j$t!b}=m(ae9-V z#0!6XQ1`hkYa}X^#VZzI+eD*Xa7$UJZRiR$Fn}%CZZn3iL)r}5>P4V@|Gt1jo=WMo&%SHl%pHlP>LD2bzF(J+!s8 z;Jr8*S|({RHIP&T*ig>~ceEB zros(}Ud16FfL+0oi`LobiOrFGHfDX;|DB z1Fj_QfJM1&&4lE%Sd&u_>jl=UbF2F#5%&4=P9ASx%vK2SAAfckdi|$6{F+x4a9&8p zW*+y#z{<+o!ZPiHbzlbk@`2Uf$b*P(6pkSwUH@zS1$>8~Ax@L~$S$A`Ebix{pj21s zi9u+q$hpUsuK$vXS0H=y^Ze*9SaH#&CN(o}Qr@kHIC`yWDn36)+h4$jntA0ue}8FV z)^%s%n5pl_(V}I@29pOt@<#qQ9P(^BU)0m_b~7)-zt3|!&#x|#;#PqZvwr$Y_>ghE zi*WH18;r;XtrXZJscnJeQV;xc1LqxuD@(S~f=t58w*?W=ngg?MX=tc$n{OE_X$Y-G za5LtYf9!dL(AlY0{{Sbs$3Yh`;p6984g>t(XEZG^ec`Me+0}#&w~?NYL7ag>`poJ& zTLionG+YKeuRFwQ=c(?F#Jv+ zn0L7G>y_k9FW5R=9+e3x(kn( zOuWbDRs%+a;J0~M+Y+*sj{a*XvH9b3HK9Uy9-`YaBGYuZrGROvbYRQ|u`C1{Gzr>K zp+!8=KO}|;rYIso(uXZM11hw72J~f? zfuy%@8*>N$cysP72UKm^!}$F~?)HY7a~(uz+|2ci?D5e0X-f<{fX+O^PRKLoJNNGX zNCZ9DJc`C!t+8087nF5KmAnQkGJK8od%E5`2Hq(a8v>h!erg=y1~a6j{g~h{`6&D3 zWS^aBm&y9<5OQ&`?NhD&J}UeY)Y9#LQ#>^s!&zpKw@|xH?jem0P=M`kb+L#?fBX#k zPgS2m_{UFVFQP8(1H$b7IAxJuG>I0!K^hSUH1k&RwV`3{j#@d{m)C=rwecK|cR5F_ zq#lJ;OGL5JV;D{+7Nsii` zeQ6NxQ1CoBRWx3mgXqir)borE0nLxrZ60y zOJ`KVAcd$H&I?dnbb} z#AzN;TI4q~V;OI659eGq#_ecoS)?Q}l+`*fqUr21{nuHN?ejC1eI}lI++#~6y%Qw3 zzdl3a=+?kMw9yI8fpT;eJUcSYgI`}YQ?pb`_Jj?On0Byn_r&DABjft!dYO~4ct|cS zLH7J&&{}Xb>G*8rIMMBTE9qR|URvz+p%Re|iG7%ka=ggOqnD}rhG{Zn-XCh+7_q<2 zxY>ewETu(yc`aDAX0Tgvo3|^(Nir&j#Cl@$YmXpjOFjAYg0nkPZ3}fR#K!>{PnH&C zI)%Cl7UrkE^K%jRB(>}^8P5un+U9@0=wl4^PFkR>b^Bl%J>n_gw(5#&FO}YS+CBw( z2#Y!Ylw9ve{3X$(>rvgD`}2Kr^ZaB%pD3iD0m5Fg@Oc;aSMQF@2rf}UMB?`jYyJqf zkX)Q+IWnx^oMK1w0WFf@?%wyDAPbS`Sausys%WUuvyfk>_}Yzp<+E^6f_ZiEKDR&~x4=jmDk9KP6_=W(;sIH46gL9#^N$Wv(i9OvL zxS8zgPeSMfSkz|i*M_&pNhoW1aOBpVAqtO{@jRx}{62EC!AwmzO28bip4W z!-v}Ft)|rMj+%;-7~r{BJPd4VL?@IAxp^Em^H2UC_TDNk%IoTB&AEG z1f;vWOLFKCK^o~82Bf>YQM$WJ8itY_V2J+>>Z5+o-m~}McQ&6rGkfoQ$BJuRYu&5j zPKPq#?1g7}xdq}K@cwjNvz0F!QL1Lf9yI||3h>PXz9kfsTf^8wyL{W+gwMvGhABD> z>W*L=P_#ccF=QPC>XnP-;4{R~cM8<)uq`?ym6Z{I8@$G;%xQBh&8?0DiG->rw&Y^s zrQX3Lz_AKn*e`4BxttS-K!R!P5<6!fCHkWv_3yXo2K72B5wL$A;i9Jq%3kV$rCqUT zvEtg_a{4*w5_@Ls_s{&dX+S+GHPHw>w4dEKr_G$|f>3S)An>i*_v9ZH-N}v*dW5Dt zdZ%yD>o@|Dvrx))4_1lBTLA4$I{+@m&)czozsSelX~qQ0>k|zLQO>*R*hEMnJF4iS zQ+H{4_FQlPYB~N(-(TB&pQNY@;XaAd>AfMhdmpgSq*e^DHi999$$VD0<^qudz`!@7 zqbZl(x%b)3!4wzg&hQ3 zXq}MYyes@yzqjwb!6flS?hVfUxh%iN^eVb;t)(_<`m+$gr&q?nq9s@759SK@A`P=; zq~V?^E}yjZe3BbtBYGKH*fBRq{nrG?8UXZuDoIb+@1Kd#1pv({jIs~@nRL-Huy5m+ z1T1g<>H+PQwhZuy*gj!m|IV+R0r1|B*OZU$vtTTen`|i#4=xgJkY-A@g?J-wcBE;s zx*>*{t-Xh5kxOu$^-?`5O~Tl)U_MrSdDs)aAY1@#YCz`X?Uz$=!a`x+>ce%jnX=eE zQh*=Kyy#LOQe9$48$d%c_DK72OuIw z^$o%pvU>kL`r!rMmFVK8L0HiF*E!7wGNt(`b|?nF9WrRF{#K`BXgH2)dM zbqx=HJ&)Gq62ZHd!IyxQcv2(Js>lwtN-Z)MTCK}b#L}4Uk%(hsQ@2U=DKz#IX?OrW zxSP$SS>FMN@~_EsQv%Cjen?xXllyv}5iK*8?HVl`V)9Sprw$hbMfD`Xr zXcBhFPRbUQSbMf-F}=OH7KlM^lC{w2&Qbn!y$tV|9hqav{%mzKg=Ts?lnb0|yO{nO z@KqJ(r$~vq>BsOHRPt>CcXW4zk&yX!6U=l5N0ne*U!#-#%7%pXOiY)%R?>|AIx=~< zz{zK2i3;TW+(Npo537aAyuz?pUeLRWlgZ9La%oXc+1zz@G{BT4d8uY zDJ{L1ucbKQJ|5=wV$@MqN^9ot3sDP(1+4})=4r&E)nDvNw8zQ5tGEmvN+?s#$3W_8 zwV~}EZuM~g0Z*PpT!peMW5>@7F2w-_nA%$tT%m9N9C>ZY+jrhthQ!@L@X(6JSU9k- z*l*JpwQ=WqQWVHqJ>zH!+Oqo^`%!Q&^ug}XVpaZT2zmM@^U?*_k#vQ75&tQey)VJ- zA?cWZmb?vOo^zK0|1Nt&iI!lf8jZW?VaG+_pR?X1@Px$E)o&uVGFya{2opk#hYC~@ z9_EAcXGGc*-!8ADQ#dVfD^feRlIoQNX%ZwA>JGmPkWs5mCI#(|W$UUqZ{}$ysYy1- z8`%nDCGaMKJEoSP_1Wv3|80E}4KRedPeg^fMo6G+Oy;UoLENOG(ROX=c##OtT@&aQ zu_i|pG<6c|Xi=woFT*=()pMq(8$qDI>Uv*3oeubk|B#Pcqcal2?>c29)s<5=%sFjTrUFT%~4zlH9B`PGC2EJa)wKln1)> z)wgf-uf9nbDPG;`>@E7@nY)?O;X`II9bRCGz)X26y62fTI_2guM;R$Xk$y;AmnR+) zp5!90DLGCT%J1x6LC>~!!YyROHh$MfmwWRA*_S^H3w)yU1%!z1^MZ1&twwwz5Dl#h z=JC#%Qb<{K+R0)Ho&8=aIR&p;EU73&L@Uo^qnta^@%_+B75n>EdHWgW9UV1dip;sN zGrlU$FLYE~yOXM>`!IstxPDgV^mFra4yZuFeVZ0@Ei;xT$G;?xau^^0X>C-atK}f= zu${N_>yj=Jd*_#kU>4@o{rrpU;au;p#|+laz+m^T7AxT3CVqt9VDNB`t!`M z)~{vnbpBV`)Y7hgg&3ZgM1oxv^O3g9T^eq;K^v~!2S*F3w=i5J%nCJLMs80fe9yLa zdt;+$nV!7eVk@KhN&-5MhfiB7r#B-ZC`@65m0;X3mNQWIA-E;fi2lQ(L)phGJVgU2sd+Yh??Q=6eO;I z{%8j6;QqNB*NgW>%=4Bk7Pim7+Vlq&px)-Ijs9=K|F^HjB}?z=dq zR@FDqA+7WB(stp_fSOwkQ0Lr97`r|N{%-9rnfyxI;-?T|R3sT+-D3XNMAjYz!~!;`Z1a-&DV<{ai1#1K3VixV2N>PVgumRG--2lYP+hp12ffDs3Xjh~j{+Gk zMUM#YDj{Q4PfDeyS-hL9vAWtDYuH1|8mO!&%XjHQ*{&~DVCS5($eC&c<<1zlh0NIK zjn`MpKCeClKh{sP;I)~&yfwQh`?nNRmb;^`qY<)ErWUfSWIqG5;$jwr4-a0)znV3kEnyrM68-tvj!_CO*6r8P(V^A(6hDFeEwz$w1{(m?my- z?3k9uWV3h|plAwE9r+T&yuIWVdh4GSAd=uPo{i`&s z?bOdQ_ze&e(YxjR1&p&L+-u5B1f?o)a+Bf2Ow94q^7xZpyS-i7M#A{yFQW7uM%(r7 zrm#F0Q(`u}?Z2J2CNZ?{xE-H(9xW+#IS|w{8KuUZnHky3c=0D*;dY3+i1aRy8G_Jo zaHHbWr@^I0ATjfgQh5_fSMoZ|>Zdm3*&W8T;!YiCFaJ{a0Algh(}*O-sHEX!Shup4 z-T~au>%3sM(vTp1Ts?6!9xwT55gI?k+ND-s$wO9=hr+`hWyRZi3NaJe~glCQb# zO@#76tw!QgyWxYvS7%B~I2D)Y#O^Z#n*jq5z>1?jm22<$RC+iz8N=?qg8tEyy`l(H*UM59l3tRE@U^3IE77QZP19Opkvf9sm3WNf+u=` zK3VjyTdNp;OHDb(f{k>ji(WP8EG2IlXJuVj!cO+AAROA(ou0TZBQ!3n>5$nk8lsfw z5LvdjQQIY{^@K^M={7-eO=)yRslg;TL!9y#?9;R^Q{ZDuqR?|&=&!xFk9iv~vh-7M z|MvR;U%%!SEnpT}Q~c)=Tpxcl-#g@k51K`dI{w-Tz<+;!Z9`^Rqx|oWf%h13Y#;;V z>c8abeIdY5d%{}q`p8jJql{k|f3 z0$6p@BUOn14krM#GA7vh{trk(3drC9yz&3=n41xFo&&AE5q+QkS|H%iO9MuvfXveM z3p@WzngsdUFnm9R%lz+C11N<4b5r&IQ3T0AD~=?Wz`sW88+5>46bd$rR%+rLDD&8C zi_AxQcemivR7B?_ZM06dxDV@rH4h=R5kE-4u*x3qHrUGnb)O?DGT~1(JDr4&JBRH6_mPtZvqe zs0MJU1gNwSP#(YBnv2!_;j6hLgfmL}005nJsYx2`-yiRVR5s?ACN~vEFGCE#W8y<+ zhx?FDTWhYf9+ch5wx?D;LxU=XjSJz6*C0a0+;n0gOU=3hW3ruf`UB+ilpGW3p|t3P z+OuMqCbV87v0~_~dJK+va5$Hcc3(6iA=QP_FdvnzY7gOHnzbta`3-_qWC(2F_|^zt zQ&U3Hboz4R2n}n{h0fb^EA_Iqq_2wjgy81^bLHHIjoSKxTVsK4FG(k$=UqbNSP6~p z(+(HvGU1eI58qT9|EPRwtuhy?***CsoHTN*%247_(6NVZOd5)ThgLih?1$w7s|4QS z_mm0+cG#i&h$^I2>%)_82B+J2i(A&X*T<)c`2pH1ddzb%O9#8RbohM79jRi({8ymU zg)e?@qmpdLU!dXFP?A$WGd*%Owsl>dTgaHwp^$p%rbh1tU)t|FS0dxtEna~lZvO)R zZ{2|cPd5tAKc&5#J&o%RPhHYNBBv&Mrnp^1Mij+>3pWp;=%3lBDtuo5)n`Ol!@K*fVHj z=J(IdcJA%?J_J3E$}9WEB-K+;Z}YY>+~HX#hK@P!8JznT%?yR z-w$l43^-@#znxfnsV77&*yG3M+csc^6_de;drYmg8uz8h1*N#oUigx^RCaZ!1%_5k z65M9btZHI<-zvQjcb^H~t_EL?|K#5<@^tI7m4)v872jiSuTcrG-%gy=)0*Ae&t?W# z#GAkNjej7Ndw7pM-@jPqL;6KkziY2U5;r1U`O4`IC)Nf3`#OtgZb1`=ym1}{n?&$1 z2(7QS?G0?!rbvShPE)v{_2j^yIex01VJ;_w#z*O;^9&DT_g3ii6iU}L=MQmv%e3$F zBVwuyD;3Bm@y>{^ms?d5<_nk;YASU;!!TNJu8bnMDTcD){)XPBDL&N&%9~fNSyRa$ zHEbIKf+|WPNpfWQQv9cw52J@US%~TJDhXy3M_CoXj@rz%8D_%u=%NO}y+D!tI)1dI zwE(cII2P_*B78OD`?#YJ(?nGQ7UJW3DYikAm3PT@#|iQn`yE$Vo~I6q$XnGy&Kyy8;J-j>k z7GYv^%$Fr}tyUXOx?dJXu{WLXdUT#h%%s()uKqwj2oheh&+JpQI_UD3D)6C{m`lEB zgqye}X_?2#I(?1B=AVrS>&B{9fRuiWqA}7ckf~mIm?IU07t*k+WT5N67n9ECUH;2{ z#rE$RsD$+GA-^WS|AMWTg@SJuld1nQ+*2ojmNom6yF-IAPwAQyH6_LFB~8Jp%l_S( z;lhvMS}%#u#zqRfzO2!9a8vr3*ux}fa`@O}v75q^8+i;!E7><)h0L=Xlyd{Y&bxs& zwlh>eEv~r`+75)^dV}m8D^7k3URk>mvp2Qd$_LrAx2*({2K$_?s*Lz`wKlqw5>cx@ z$!VFH^@ztd%vthP6=rl_NfF8ML-x!}Z?9<2kJzXddOE?fo%TFxyP}Y;*pT-XQ*drX z02ITKe33S#Iqy|Lfr^?${lx(T{CEr!oB3_=6!|jKbAW8IcuTi_FMJd#`P>Gc+P50e z^EOO+?uYICE0X*kaQ$jLpPphsRsu_6BsoOv!5+0K%|h@AD(he>ms#y;6#*~h@;aD1 zs_glg_?oz&C(}qlA!-n9S|WSE=Gn)z>K1m5$E1RyZA z=E$Jv!S1g4N995H!xV-FCeVArO+rtpkL(a%^*z^JZSRF|yjI1X$n{csU=V5{!z7GQKdGy9 zt77+BNlt{lzYoq(>ROc7SU~ttc(0#hpD)Aw>I#KdcxmHqTiuCFuJ!g2xdkTt-b1 zm2evOJP*r^Zd2Dbz@{~G2z~nVRP%ZYNGa+0XgXg(u=JSeOPNlm!g~5{`%6pZ`jJ?T zOXY<4;tlKFMFoBN#pn;12o2qR$B(WippmjP^99GtnBi;UnI5@xDmLYH?1YtXLDQx$ z=&38dyV}}os^$$f-?uP_Hb7IXoZzcarqKWetMrQJQgQ9Ws1PSwsdI#{Lv~IyZ{-R; zj~@n6nC$QfPo?oxf)92g!Kq7YN2IkI^cUPKlMfR82aK0=6?U7BD~I)=9;53Lj+pi7 zi-Or%17k<{{gN_&ywS|?#pk7k5oz2K#I8B=(XxC;mB#;PzO;l7Ny$#>3V63NTO)~CnVup$ zqk&->+nOuMinC$Sgu6hr?#CA`m<+xf z|GXyJb~&&9O0!uN($lAwE>EdCu?2_HzusqkCQQHkj@2YM<9^>%_7imf+| z&bQ1S?Av^9M*mSQ3D3HsTE&^2lm<=Em|{YZc~Sa ztT=*Mf26smHqh*?I=UCg+TcBrAj=bG}-Xsosx zFW46F7pac>@9w0xm)-7Ek4l&97x0uVI>1VMEj`SoFn;HN)p9pxoP>6qG$5e{a;i*X&YZ$vedMlCbQYdLliF;e+xWdwQRl4@oBitqK7pnBAo^EogeiXElT*|3w?cX_L%co51jg2-e; zu@-E#O60U*Qh+S*T0ZNE3U*WuEw4`9*g-NaCcv*H+)h%uu?OKT@L`KPws{^#bzXONRQUlm2OwOsaz(}x*W z!`=`NRqwp+(rHD>cqq)cIL4C8%U1nE9RV)~(H6@$^q;Z4^k>7l{FbPWL2MI!2pW=U z($3QyPYY?OyTsIY8%*84Rix?VkwIk6@-m2OIr52lpptv7F=pvQ$uhr$ zvWEPE%lU%W{da#tbwmK$V_6_oa|6W*qiu$d%7*{#&a&5{UIIodR(-B(9XJ5x170AT zs{8x>QV-%y_>Yt_ZVkR*GCqX_BkL8n;z99ySjCC$bWuiSX+OiT@pDcq@|CNMsp4XZ z{r*k$sjuxd?2|u^m|F+0ywNTp5D{_7J^5N;1t+#luDP6Kz$sN(VO==<5T4z`yO%9sAzx2!!PpqFMs1BKUq1D<#M7|CXMB)g;$Y!-puPf{`%QzgUQ zG;uR4C~jONEeZm7NB-{*9!nA5!ZmLni7bs1dYCTZ!$3&G?Ie@NkJU(1SP7x&mVCSs zD*Uw}o5}(kYQFE%Shh8S0Fqst+r&2OcAz+|tPyO~82usr^cu|4-UiTtf_hH3B6Mo0 zuvW)0x3;!cu|VO2wdC>1D{xXpS(QUNExNqys)t|HoRvjP#63#Ee2`KtU)P0K)vh-< zaj6;tGk?K)>Jk#D&X?SnlJuG1TFk;%)w-#E%Jzvodv5PY=fGrvd zg`f(J7EAFl9nq-_mHI3$RD^SZ`V|kRR`%A_qc?l*xF@Hn{yZ+azZGm)%s?*2c6TD8#Z}h;byKs ze2d4{q8}NvNy4ICv;6&@q2itQKSrtW_!@}`r*1*qZ2%J=hjJ0X6fDXi>1Tla!_-T9 zK)*NF$h}j=f8mRgXKez2brkh4Q#9866!Gy5dH zF^yW_fN~7!IWxpPjF36_YQ8tAQRixk!?@Fv3)*E&00@UGJdH)qNXpYFooq{%qAgn1 z?z^lQ?@wx#Cfwz7Pv5E)xsX%>S=Ax$J@42%R$6HxvQ2ux2Upo1I?KcCr2l@!Ch$F~e^kiFfg?a_7UiLw5?$zOEgLCw_2ioOWw^ z@@=a&G(5=wNCI;7BW_xgG{u z?axh07&<(=wv$&M8LE0i7_6((pEXL)`SUKV9L&XdP*N#I$t~ThJGXkEW)c5(by<&( z_4wpN+iHnC#j_uWg&8W~`fbicqhk}=p!<5b;yLI-NnEHk{Sk!fo$p0i@or(5y zuK84SU9DCJwJec~pi`CExz=*O{R0my=rf|kIYWKkrPG&WV3xe zvefX_2%g@q&JEQ4pHxf$)#pLI&-+&4t9q{J3yTKl0`u|Jdj{o9|8YN4+qI!Ga>5Zd z>)35wYqBY`#DQeG;mcHo^z2Ck2nm!J=8(bu3rGT=k!`qaGBdXGQh8v*VCqQ&M^%Yp z!U7+!^4@^bZ;FSzD8ou5PxLA#gRYS$+GB%iqi4)w=3gzMGD$`dIwHS~vD56Agoj6gNUsl#Q)etNLC#pB@83i@P^^?2nG2dxX0CPBxIm-m4gkCg4 zb!^NeFOev(YLm?k&f*Gsl(tR8+<~%#`Gc2(>nPzNT-)kFHcL{sD$(hN*>d2FH$f^WW zH8G3#lHt6~mkHS#wc>}kEN3R4&%!^ECU_t%6R`r^>km9lwJFbwIP!fCl8^^Wwx=%SF7 z{Z~two9KdeFhF6gZlj7_xCsW*6*ryq<|-DO=~*QLtA;m9NkQEi7qiF|R;;G9;`*i^ z`$Q--rTj>A{{1dL4xIFR)c}Rz7v~$f@g76_kr_uXo1V~h&&u*%{2(gVh98!0m0HKt zVGp*_&O02;cUZ)W(X#a88te*oqS?cuPBOU#My*eiXD8~eSe#@;L=A2%();fo75PNf z-oA;hc%dPz_9c-MNx$P9`61cqyD{wl#$0dJ0JCE1TzB|K-jRtc>cy6;wQLsZCA}(f z_WfUK?7157D$en_9%j;;`F(oMXliz4CGn#2%onk3mRqFUAAg8_dvL|Th@8Ij0pCut zL