From 5f60c9a916e202758cfe1032368a9198fae7ab59 Mon Sep 17 00:00:00 2001 From: Jens Hedegaard Nielsen Date: Tue, 20 Mar 2018 14:26:38 +0100 Subject: [PATCH] [WIP] Dataset documentation (#992) * fix: Pass str not ParamSpec * fix: Use the the argument string to connect * feat: Add add_parameter_ to compose better Note to self and future reader: an underscore appended to a function name denotes a function whose side-effects needs to be committed! * oopified all the things, tad tired * fix: man I must have been tired * fix: Use list instead of unpacking * add Todo, finish implementation * add todo about metadata * fix: Return 0 instead of none if the dataset is empty * feat: Add subscriber * add example * docs: add example using zmq * fix: Typo in sql * remove junk * docs: polish API, add docstrings * polish up * docs: add examples * remove old tests * add requirements * remove leftovers * remvoe spec * move examples out * clean notebooks * fix: Move experiment id concerns to the PUBLIC api. That is: a dataset needs an exp_id. If it's not passed to the new_dataset then we use the last exp_id. * fix: Create better dirs for merge with qcodes. * fix: integrate with qcodes * fix: make sqlite operations public * fix:many details * feat: Add exp container * fix: Configure container in config * docs: update examples * fix: Remove leftover todo * style: PEP8'ing for great justice * Shuffle around notebooks * [WIP] pave the way for auto-plotting; "inject dependencies" * [WIP] Introduce half-finished plot function * Feature/dataset (#806) * Add notebook with some benchmarking experiments * Fix add_results and insert_many * Update benchmarking * MILESTONE: first working version of plot_by_id for 1D and 2D * sort axes for 1D plotting * add examples of working quick plotting * feat: add measurements.py file, add Runner * add Measurement object * fix: don't use the type keyword * Add interface for using QCoDeS parameters * [MILESTONE] first notebook with the context manager * add debug logging, some of which should be removed again * Remove some debugging, make _rows_from_datapoints 130 times faster * add adaptive sweep to context manager notebook * typos and log * typo * refactor code and reuse add layouts * Make dataset pass with mypy * remove absolute import from __init__ as it seems to break autodoc * no longer build for python 3.5 * Add some debugging to exp container * Add tests for dataset very basic but working setup and teardown * Validate table name to prevent sql injection * Actually check * improve tests * fix testing if unicode * better test * More tests * remove db * add_result takes a dict from str to single values not list * Improve tests * Correct function sig * remove db which should never have been comitted * remove prints * imporve tests * more tests * remove print statment * Remove unused import * Make sure to close all connections in teardown This fixes issues with test failure due to failure with removing the tmpdir on windows * Correct dac validators (#906) use the correct validator range (cf. d5a driver) and adjust naming * add publisher from logging branch * Update notebook * typoes * Add simple example of json exporter for the webui: * add notebook with example of exporting with notebook * add optional kwargs at creation time to subscriber * style: change camelCase to snake_case * [WIP] tests for the measurement context manager * add unregister_parameter + test * add some testing for paramspec * change paramspecs paramtypes in test from "number" to "real" * remove old param_spec function * 100% coverage of param_spec * add register_custom_parameter + test * fix: make refactor work * add a number_of_results property to DataSet * remove debug print statement * lowercase paramtype * test datasaver and support/implement array unravelling * validate paramspec names * remove debugging print statement * update test with valid ParamSpec names * add tests for exit/enter-actions and change OrderedDict to list * fully cover add enter/exit actions * cover write_period property in test * avoid infinite recursion in write_period * fully cover unregister_parameter in test * add a station to the datasaver scalar test * mypy * codacy: removed unused imports * make database errors hard errors in the ctx mgr * clean up non-working SQL error test * add test for add_parameter_values * add test for modify_result and insert an exception * sort imports and test CompletedError in modify_results * add exception checks to test_add_data_1d * add SQLiteSettings object to hold settings read at import time * add little test for sqlitesettings * correct docstring and add dependency checks * make insert_many_values consider input length + test * add SQLiteSettings to __init__.py * copy DEFAULT_LIMITS to avoid modifying it * playing with Travis * revert "playing with Travis" * update test_adding_too_many_results * add VERSION to qc.SQLiteSettings * try to use VERSION to make Travis happy * add a failing test to read Travis' sqlite version * cheat with version to check if MAX_COMPOUND_SELECT is to blame * fix typo * add test + remedy for writing a divisor of MAX_VARIABLE_NUMBER * increase a deadline to avoid flakiness on Travis * increase another deadline to avoid flakiness on Travis * replace "id" by "run_id" and "exp_id" * remove unused imports and variables * turn deadlines off for two otherwise flaky tests * remove more unused stuff and a redundant test * remove old double definition * add a few tests for sqlite_base * modify a test to do a double-catch * add functions to get and set user version to be used for db upgrade * add simple test to do a silly upgrade of the database * update error catching in test_atomic_raises * remove unused variable * Add a docstring to Subscriber * squash! Add a docstring to Subscriber * squash! squash! Add a docstring to Subscriber * Add a pedagogical notebook on the Subscriber * Change Subscriber log debug and offset min_count * Update example notebook to use redefined min_count * Add a simple test for dataset subscription * Change snapshot to match exiting structure more closely * Build dataset notebooks too * correct makefile * add dataset notebooks to index * Merge types 'real' and 'integer' into 'numeric' * Update notebooks to latest API changes The changes being: 'real' and 'integer' -> 'numeric' and no id attribute of anything anymore. * Add titles to notebooks * Remove types from context manager API * Add support for ArrayParameters in the DataSaver * [WIP] Add tests for ArrayParameter support * make examples executable * WIP dataset importer for old data * Add dataset as fixtures for tests * use the simple importer * update notebook * add tests of loading old dataset * add property for dataset to datasaveR * Add support for storing metadata to importor * update notebook * Add smoketest of json in dataset * Update add_results to make test_datasaver_array_parameters pass * Disable deadline for test_datasaver_array_parameters * PEP8 one line * Expand docstring for Measurement * Add format_string as attribute to Experiment * Make Measurement name settable and use that for result_table * refactor loading * add more examples to dataset context manager * Speed up plotting functions for later use in data exporting * more efficient sorting on 2d array * update notebook * refactor code to make numpy array export reuseable * Add data exporter to numpy array * update notebook with use of exporter * Add example notebook with real instruments * Tidy up Context Manager notebook * Tidy up Load old data notebook Sphinx is unhappy about png images. When using %matplotlib notebook, that problem is circumvented. * Move Real Instruments example notebook * Change Makefile to execute DataSet example notebooks * Fix typo * docs: Include the Real_instruments subfolder * Fix typo in index.rst * Update Makefile to create needed directories * add notebook with dond * Remove example-loading notebook * Remove subscriber-example notebook * Add jupyter_client to docs_requirements * add plantuml diagram * Make Makefile generate scripts instead of executing * Revert "Make Makefile generate scripts instead of executing" This reverts commit 46ede2b0d15b8f4a8bab402bd815f4a42da3b672. * Add jupyter to docs_requirements * [temp] Print available jupyter kernels on travis * Stop printing jupyter-kernelspec list on travis * Add scipy to docs_requirements * Give Travis 20 times longer to execute each notebook * Increase hypothesis deadline for combined loop test * add notebook with dond * add plantuml diagram * Move dataset spec to documentation * add diagram to docs * willams document as converted by pandoc * refactor to improve rst * add more diagrams * Move figures to subfolder * add new section to fill out * fix rst syntax in spec * typos * update dataset diagram * fix typos in docs * start writing text * Add subscriptions to Measurement object (+test¬ebook) * Update logging for subscribers in data_set * Replace spaces with underscores in notebook name * Tweak some test parameters in Measurement test * Fix mypy issues in measurements.py * Tweak test parameters again * Add some more explanation about the dataset * Fixing a few typos in dataset_design.rst --- docs/conf.py | 2 + docs/dataset/dataset_design.rst | 75 +++ docs/dataset/figures/bad_trees.pdf | Bin 0 -> 12595 bytes docs/dataset/figures/bad_trees.svg | 173 +++++++ docs/dataset/figures/bad_trees_remedied.pdf | Bin 0 -> 15179 bytes docs/dataset/figures/bad_trees_remedied.svg | 262 +++++++++++ docs/dataset/figures/datasetdiagram.puml | 39 ++ docs/dataset/figures/datasetdiagram.svg | 52 ++ docs/dataset/figures/dependencies_01.pdf | Bin 0 -> 15846 bytes docs/dataset/figures/dependencies_01.svg | 238 ++++++++++ docs/dataset/figures/dependencies_02.pdf | Bin 0 -> 15845 bytes docs/dataset/figures/dependencies_02.svg | 233 +++++++++ docs/dataset/figures/example1_conductance.pdf | Bin 0 -> 14083 bytes docs/dataset/figures/example1_conductance.svg | 209 +++++++++ .../figures/example2_compensation_A.pdf | Bin 0 -> 14859 bytes .../figures/example2_compensation_A.svg | 209 +++++++++ .../figures/example2_compensation_B.pdf | Bin 0 -> 15147 bytes .../figures/example2_compensation_B.svg | 218 +++++++++ docs/dataset/figures/good_trees_complex.pdf | Bin 0 -> 9966 bytes docs/dataset/figures/good_trees_complex.svg | 276 +++++++++++ docs/dataset/figures/sqlite_layout.pdf | Bin 0 -> 60058 bytes docs/dataset/figures/sqlite_layout.xlsx | Bin 0 -> 11243 bytes docs/dataset/index.rst | 11 + docs/dataset/interdependentparams.rst | 444 ++++++++++++++++++ specs/DataSet.rst => docs/dataset/spec.rst | 157 ++++--- docs/index.rst | 1 + qcodes/dataset/experiment_container.py | 4 +- qcodes/dataset/sqlite_base.py | 1 - 28 files changed, 2523 insertions(+), 81 deletions(-) create mode 100644 docs/dataset/dataset_design.rst create mode 100644 docs/dataset/figures/bad_trees.pdf create mode 100644 docs/dataset/figures/bad_trees.svg create mode 100644 docs/dataset/figures/bad_trees_remedied.pdf create mode 100644 docs/dataset/figures/bad_trees_remedied.svg create mode 100644 docs/dataset/figures/datasetdiagram.puml create mode 100644 docs/dataset/figures/datasetdiagram.svg create mode 100644 docs/dataset/figures/dependencies_01.pdf create mode 100644 docs/dataset/figures/dependencies_01.svg create mode 100644 docs/dataset/figures/dependencies_02.pdf create mode 100644 docs/dataset/figures/dependencies_02.svg create mode 100644 docs/dataset/figures/example1_conductance.pdf create mode 100644 docs/dataset/figures/example1_conductance.svg create mode 100644 docs/dataset/figures/example2_compensation_A.pdf create mode 100644 docs/dataset/figures/example2_compensation_A.svg create mode 100644 docs/dataset/figures/example2_compensation_B.pdf create mode 100644 docs/dataset/figures/example2_compensation_B.svg create mode 100644 docs/dataset/figures/good_trees_complex.pdf create mode 100644 docs/dataset/figures/good_trees_complex.svg create mode 100644 docs/dataset/figures/sqlite_layout.pdf create mode 100644 docs/dataset/figures/sqlite_layout.xlsx create mode 100644 docs/dataset/index.rst create mode 100644 docs/dataset/interdependentparams.rst rename specs/DataSet.rst => docs/dataset/spec.rst (88%) diff --git a/docs/conf.py b/docs/conf.py index 3f65b21b9a3..6141df3dfe6 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -392,3 +392,5 @@ # we are using non local images for badges. These will change so we dont # want to store them locally. suppress_warnings = ['image.nonlocal_uri'] + +numfig=True diff --git a/docs/dataset/dataset_design.rst b/docs/dataset/dataset_design.rst new file mode 100644 index 00000000000..809de9b65a8 --- /dev/null +++ b/docs/dataset/dataset_design.rst @@ -0,0 +1,75 @@ +.. highlight:: python + +============== +Dataset Design +============== + +.. _sec:design_introduction: + +Introduction +============ + +.. _datasetdiagram: +.. figure:: figures/datasetdiagram.svg + :align: center + :width: 100% + + Basic workflow + +This document aims to explain the design and working of the QCoDeS DataSet. +In :numref:`datasetdiagram` we sketch the basic design of the dataset. +The dataset implementation is organised in 3 layers shown vertically in +:numref:`datasetdiagram` Each of the layers implements functionality for +reading and writing to the dataset. The layers are organised hierarchically +with the top most one implementing a high level interface and the lowest +layer implementing the communication with the database. This is done in order +to facilitate two competing requirements. On one hand the dataset should +be easy to use enabling simple and easy to use functionality for performing +standard measurements with a minimum of typing. On the other hand the dataset +should enable users to perform any measurement that they may find useful. +It should not force the user into a specific measurement pattern that may be +suboptimal for more advanced use cases. Specifically it should possible to +formulate any experiment as python code using standard language constructs +(for and while loops among others) with a minimal effort. + +The legacy QCoDeS dataset ``qcodes.data`` and loop ``qcodes.Loop`` is +primarily oriented towards ease of use for the standard use case but makes +it challenging to formulate more complicated experiments without significant +work reformatting the experiments in a counterintuitive way. + + +The QCoDeS dataset currently implements two +interfaces directly targeting end users. It is not expected that the user +of QCoDeS will need to interface directly with the lowest layer communicating +with the database. + +The ``dataset`` layer defined in the :ref:`dataset-spec` provides the most +flexible user facing layer. Insert reference to notebook. but requires users +to manually register `ParamSpecs`. The dataset implements two functions for +inserting one or more rows of data into the dataset and immediately writes it +to disk. It is, however, the users responsibility to ensure good performance +by writing to disk at suitable intervals. + +The measurement context manager layer provides additional support for flushing +data to disk at selected intervals for better performance without manual +intervention. It also provides easy registration of ParamSpecs on +the basis of QCoDeS parameters or custom parameters. + +But importantly it does not: + +* Automatically infer the relationship between dependent and independent + parameters. The user must supply this metadata for correct plotting. +* Automatically register parameters. +* Enforce any structure on the measured data. (1D, on a grid ect.) + This may make plotting more difficult as any structure will have to + + +It is envisioned that a future layer is added on top of the existing layers +to automatically register parameters and save data at the cost of being +able to write the measurement routine as pure python functions. + +We note that the dataset currently exclusively supports storing data in an +SQLite database. This is not an intrinsic limitation of the dataset and +measurement layer. It is possible that at a future state support for writing +to a different backend will be added. + diff --git a/docs/dataset/figures/bad_trees.pdf b/docs/dataset/figures/bad_trees.pdf new file mode 100644 index 0000000000000000000000000000000000000000..b92a54cdb5f26d5ffb77613832a9c0ce8a731f56 GIT binary patch literal 12595 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 H6z2Z{;%pH_ literal 0 HcmV?d00001 diff --git a/docs/dataset/figures/bad_trees.svg b/docs/dataset/figures/bad_trees.svg new file mode 100644 index 00000000000..274efc947ce --- /dev/null +++ b/docs/dataset/figures/bad_trees.svg @@ -0,0 +1,173 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/dataset/figures/bad_trees_remedied.pdf b/docs/dataset/figures/bad_trees_remedied.pdf new file mode 100644 index 0000000000000000000000000000000000000000..522216425b727da74dbbbbcab0460b4683845323 GIT binary patch literal 15179 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 jif)v!F#(USzaAGjI)NOVe%)2DJuYShDk>2 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/dataset/figures/datasetdiagram.puml b/docs/dataset/figures/datasetdiagram.puml new file mode 100644 index 00000000000..84530cb9a43 --- /dev/null +++ b/docs/dataset/figures/datasetdiagram.puml @@ -0,0 +1,39 @@ +@startuml + +package "measurements.py" { + [DataSaver] + [Runner] + [Measurement] +} +package "data_set.py" { + [DataSet] +} +package "sqlite_base.py" { + [sqlite functions] +} + +package "experiment_container.py" { + [Experiment] +} + +package "param_spec.py" { + [ParamSpec] +} + +database "SQLite" { + [experiment.db] +} + +[Measurement] -> [Runner] : Calling 'run' creates: +[Measurement] --> [ParamSpec] : Registers instances of: +[Runner] --> [DataSet] : '~__enter~__' creates:\n'~__exit~__' flushes: +[Runner] -> [DataSaver] : '~__enter__' returns: +[Runner] --> [Experiment] : Creats DataSet with ref to: +[DataSaver] --> [DataSet] : Stores data via: +[DataSet] -> [ParamSpec] : Holds instances of: +[DataSet] --> [sqlite functions] : Inserts data into DB +[Experiment] --> [sqlite functions] : Creates experiments in DB +[sqlite functions] --> [experiment.db] : SQL calls + + +@enduml diff --git a/docs/dataset/figures/datasetdiagram.svg b/docs/dataset/figures/datasetdiagram.svg new file mode 100644 index 00000000000..cf20179c321 --- /dev/null +++ b/docs/dataset/figures/datasetdiagram.svg @@ -0,0 +1,52 @@ +measurements.pydata_set.pysqlite_base.pyexperiment_container.pyparam_spec.pySQLiteDataSaverRunnerMeasurementDataSetsqlite functionsExperimentParamSpecexperiment.dbCalling 'run' creates:Registers instances of:'__enter__' creates:'__exit__' flushes:'__enter__' returns:Creats DataSet with ref to:Stores data via:Holds instances of:Inserts data into DBCreates experiments in DBSQL calls \ No newline at end of file diff --git a/docs/dataset/figures/dependencies_01.pdf b/docs/dataset/figures/dependencies_01.pdf new file mode 100644 index 0000000000000000000000000000000000000000..6feed632783425131a76792022b730d07df66fc6 GIT binary patch literal 15846 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 n{{IW9OWB#d&hy(E__L~ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/dataset/figures/dependencies_02.pdf b/docs/dataset/figures/dependencies_02.pdf new file mode 100644 index 0000000000000000000000000000000000000000..a597dc46d6c1379e9900191cef608da6f2bd1e22 GIT binary patch literal 15845 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/dataset/figures/example1_conductance.pdf b/docs/dataset/figures/example1_conductance.pdf new file mode 100644 index 0000000000000000000000000000000000000000..0a27b1123b489e2f64934906119adea2132138f1 GIT binary patch literal 14083 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 bf1=6>WatR`<6R&tCy)c4f + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/dataset/figures/example2_compensation_A.pdf b/docs/dataset/figures/example2_compensation_A.pdf new file mode 100644 index 0000000000000000000000000000000000000000..9800b9c10f040956aef8a79a768cd0df03379fd3 GIT binary patch literal 14859 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/dataset/figures/example2_compensation_B.pdf b/docs/dataset/figures/example2_compensation_B.pdf new file mode 100644 index 0000000000000000000000000000000000000000..e43b5fc10c6f6a127d715272e25805a178efa509 GIT binary patch literal 15147 zcmbum1yo$k(y*K0?jB@thd~CH;4Z=4-Q5WqTnBeTaCe8`?k>SCI01r&@I&77zTY|D zxp%F9-Mg8+hpMjX?yBm&*P8vTrc@LaXJlalAy77)Rz4!I0e}E|BP#?xJ^-_%PJ4s|>8Q%dnKb*0Y2hK2Qq!8i}TgWtB3iOWfnT+#w*q&I-BN}r29>(t@pWzSefBOVuKL6g)pL8i<4AGqYN_hB-bLRQ% zuIjlEXY1D%&B50kKR$B(hmhxfRwl+h;z7?Rrzl6-YxStT8DajfnT3+~7*2c=?Q>Ey z?NP~-*~~TAxK-x#DcPa4F?BbiNaNZW#qM8Q$?6gLMYShAhe6BZVm#lCJR5&oJ%N+m z*E+Mm`VtPiA5_hWn$(_m3KlEy7tCqwK|Cmm6Yt6XoRJu=%iQqe{`g}@+k@OVYvbAD z*P7td)9qK@kM~asV-X62n9d2n!>SqP4wR!WBiKP?uC2kI9JRVO<`dWTMl;xJGA0c1 zv1~IA!{8Mq%8v8-UD?Lb;dHah1jUm9vhImXjVD#_d`A06M7E9CO=C6rXs;|Y0rS>+ z@Ph@a`0qglHm4Jl#Gb-*MkNxt=~>Fyj|1XC3hC3Lta@@OGe=vviC&g1 z-p<%RZ`9T2yh>WMoR=y?ZJGpSJ0Gr2Ax^VEUr+gMegku3@%hyrB5h_yr8sGT-d?~* zcRM$&>Xseiloe&hgx_KK&oyf~zsAsula?Ry;jm~Re(X*~P3p)9Zk$Xyel)EWE|`j+ zXj)*7CJZ*CCucC3iISmuY|q(vf*g2Mf|W|!AB*O>TXd-mmSOsqfVGsMRMa5s`^7-D z#XhgZMJ{g&N9t;I(2VbmhZv%>25#qBd);(T9-205#d4s8n%3wt_W6O|$3T{mF+XNj; z%U*Go8%S1rk7~`$@p8o`*>>T8tT`+eMdqNPIp<__8I+H2_`i>o%E!Es3;(n?{l� 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 MPEb;cDTpKdA1eV;AOHXW literal 0 HcmV?d00001 diff --git a/docs/dataset/figures/example2_compensation_B.svg b/docs/dataset/figures/example2_compensation_B.svg new file mode 100644 index 00000000000..4765c53d721 --- /dev/null +++ b/docs/dataset/figures/example2_compensation_B.svg @@ -0,0 +1,218 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/dataset/figures/good_trees_complex.pdf b/docs/dataset/figures/good_trees_complex.pdf new file mode 100644 index 0000000000000000000000000000000000000000..36b19fffd7b4e9d21c9af1e3a2d3f94ea3b21322 GIT binary patch literal 9966 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 K43f%HSpN^+F`cmh literal 0 HcmV?d00001 diff --git a/docs/dataset/figures/good_trees_complex.svg b/docs/dataset/figures/good_trees_complex.svg new file mode 100644 index 00000000000..b54a9440507 --- /dev/null +++ b/docs/dataset/figures/good_trees_complex.svg @@ -0,0 +1,276 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/dataset/figures/sqlite_layout.pdf b/docs/dataset/figures/sqlite_layout.pdf new file mode 100644 index 0000000000000000000000000000000000000000..311a54ba524d96cf5fd32040cc3961a2a0584135 GIT binary patch literal 60058 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

pyQ&dP`Ky9g3+p^z{o@vF~oTw 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

>Ad9nnvY@T4w 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 literal 0 HcmV?d00001 diff --git a/docs/dataset/index.rst b/docs/dataset/index.rst new file mode 100644 index 00000000000..d25892f4e26 --- /dev/null +++ b/docs/dataset/index.rst @@ -0,0 +1,11 @@ +.. _dataset: + +DataSet +======= + +.. toctree:: + :maxdepth: 2 + + spec + dataset_design + interdependentparams diff --git a/docs/dataset/interdependentparams.rst b/docs/dataset/interdependentparams.rst new file mode 100644 index 00000000000..43c43f45659 --- /dev/null +++ b/docs/dataset/interdependentparams.rst @@ -0,0 +1,444 @@ +.. highlight:: python + +========================= +Interdependent Parameters +========================= + +.. _sec:introduction: + +Introduction +============ + +At the heart of a measurement lies the concept of dependent and +independent variables. A physics experiment consists in its core of +varying something and observing how something else changes depending on +that first varied thing. For the QCoDeS dataset to be a faithful +representation of actual physics experiments, the dataset must preserve +this notion of dependencies. In this small note, we present some +thoughts on this subject and present the current state of the dataset. + +.. _sec:sett-gener-stage: + +Setting the general stage +========================= + +In the general case, an experiment looks as follows. We seek to study +how :math:`B` depends on :math:`A`. Unfortunately, we can neither set +:math:`A` nor measure :math:`B`. What we *can* do, however, is to vary +:math:`n` parameters :math:`x_1,x_2,\ldots,x_n` (:math:`\boldsymbol{x}` +for brevity) and make the assumption that :math:`A=A(\boldsymbol{x})`. +Similarly, we have access to measure :math:`m` other parameters, +:math:`y_1,y_2,\ldots,y_m` (:math:`\boldsymbol{y}` for brevity) and +assume that :math:`B=B(\boldsymbol{y})`. It generally holds that each +:math:`y_i` depends on :math:`\boldsymbol{x}`, although many such +dependencies may be trivial [1]_. Given :math:`\boldsymbol{x}` and +:math:`\boldsymbol{y}` (i.e. a laboratory) it is by no means an easy +exercise to find a relation :math:`A(B)` for which the above assumptions +hold. That search is indeed the whole exercise of experimental physics, +but as far as QCoDeS and the dataset is concerned, we must take for +granted that :math:`A` and :math:`B` exist and satisfy the assumptions. + +.. _sec:good-scient-pract: + +Good scientific practice and measurement intentions +=================================================== + +In this section, we assume :math:`A` and :math:`B` to be scalars. We +treat the general case in the next section. + +In a measurement of :math:`B` versus :math:`A`, it seems tempting to +simply only write down the values of :math:`A` and :math:`B`, declare +that :math:`A` is abscissa for :math:`B`, and make a nice plot. +Responsible scientific conduct principles however urge us to write down +*everything we did*, which in terms of data saving amounts to also +storing :math:`\boldsymbol{x}` and :math:`\boldsymbol{y}`. At the same +time, we would like the dataset to reflect the *intention* of +measurement, meaning what the measurement is supposed to be about, +namely that it measures :math:`B` versus :math:`A`. Currently, this is +handled by the dataset by declaring that :math:`B` *depends on* +:math:`A` whereas :math:`A` is *inferred from* :math:`\boldsymbol{x}` +and :math:`B` is *inferred from* :math:`\boldsymbol{y}`. In code, we set +up the measurement like + +:: + + meas = Measurement() + meas.register_parameter(x1) + meas.register_parameter(x2) + meas.register_parameter(x3) # and so on + meas.register_parameter(y1) + meas.register_parameter(y2) + meas.register_parameter(y3) # etc + meas.register_parameter(A, inferred_from(x1, x2, x3)) + meas.register_parameter(B, depends_on=(A,), + inferred_from=(y1, y2, y3)) + +This is shown graphically in :numref:`fig_gen`. + +.. _fig_gen: +.. figure:: figures/dependencies_01.svg + :alt: A drawing of the general setting + :align: center + :width: 60.0% + + A drawing of the general setting + +The default plotter included in the dataset will understand the +dependencies and plot :math:`B` versus :math:`A`. + +.. _sec:higher-dimension: + +Higher dimension +================ + +In the previous section, :math:`A` was to assumed to be a scalar. In the +general case, the true independent variables :math:`\boldsymbol{x}` can +be grouped together in :math:`k` different variables, +:math:`A_1,\ldots,A_k` that represent the intention of the measurement. +An example would be a heatmap plotting a demodulated signal as a +function of two gate voltage axes. To describe a measurement of +:math:`B` as :math:`A_1` and :math:`A_2` are varied, we set up the +measurement like + +:: + + meas = Measurement() + meas.register_parameter(x1) + meas.register_parameter(x2) # and so on + meas.register_parameter(y1) + meas.register_parameter(y2) # etc + meas.register_parameter(A1, inferred_from(x1, x2)) + meas.register_parameter(A2, inferred_from(x1, x2)) + meas.register_parameter(B, depends_on=(A1, A2), + inferred_from=(y1, y2)) + +Graphically: + +.. _fig_dep_02: +.. figure:: figures/dependencies_02.svg + :alt: A heatmap + :align: center + :width: 60.0% + + A heatmap + +It may of course very well be that e.g. :math:`A_1=x_1` in which case +there is no point of having inferred parameter for :math:`A_1`. + +.. _sec:that-really-necess: + +Is that really necessary? +========================= + +It should be clear that the ``inferred_from`` notion is a kind of +metadata. It describes a relation between the raw values that the +experimentalist can control and the desired outcome of an experiment. It +is **not** required by the dataset to have any inferred variables, but +we stress that it is unscientific to throw away raw measurement data. +Whatever raw values are recorded should thus be saved along with the +“interesting” parameter values, and the ``inferred_from`` tagging is +simply a way of declaring what is derived from where. + +In a perfect world, an auxiliary laboratory notebook contains all the +information needed to *exactly* reproduce the experiment, and the +dataset needs only store the numerical values of parameters and nothing +else. In a sort of pragmatic recognition of how actual laboratories +usually work, we have decided to put some metadata directly into the +dataset. Specifically, we want the dataset to be able to hold +information about + +- What the experimenter wishes to study as a function of what + (expressed via ``depends_on``). + +- What corresponds to a raw machine setting/reading (expressed via + ``inferred_from``). + +As complexity of the experiments grow, the second notion can be +difficult to uphold. It is offered as a help to ensure good scientific +practice. + +It is important to note that the dataset can freely be used without +*any* declarations of dependencies of either sort. + +.. _sec:plotting: + +Plotting +======== + +Besides being optional metadata describing the correct interpretation of +measurement data, the direct dependencies (expressed via ``depends_on``) +are used to generate the *default plot*. We estimate that for the vast +majority of measurements to be stored in the dataset, the +experimentalist will want to be able to plot the data as they are coming +in and also have the ability to quickly bring up a plot of a particular +measurement without specifying more than the id of said measurement. +This necessitates the declaration, in the dataset itself, of what should +be plotted against what. The direct dependencies can thus be understood +in the following way: :math:`A` depends on :math:`B` and :math:`C` means +that the default plot is of :math:`A` with :math:`B` on one axis and +:math:`C` on the other. + +Although visual plotting is not tractable for an arbitrary amount of +axes, we promote the principle of having a default plot to be a logical +principle about which dependencies we allow: only those resulting in a +meaningful (perhaps :math:`N`-dimensional) default plot are allowed. + +.. _sec:all-possible-trees: + +All possible trees +================== + +Now that we have established a language for describing connections +between parameters, and also described our aim in terms of plotting and +metadat, let us review what the dataset does and does not allow. + +It follows from the consideration of section :ref:`sec:plotting` that +the dataset allows for a *single* layer of direct dependencies. The +trees shown in :numref:`bad_trees` are therefore +all invalid and can **not** be stored in the dataset. + +.. _bad_trees: +.. figure:: figures/bad_trees.svg + :alt: Not acceptable direct dependencies + :align: center + :width: 75.0% + + Not acceptable direct dependencies + +A few words explaining why are in place. + +#. Circular dependence. There is no way of telling what is varied and + what is measured. + +#. Independent parameters not independent. Although :math:`A` clearly + sits on top of the tree, the two independent variables are not + independent. It is not clear whether :math:`C` is being varied or + measured. It is ambiguous whether this describes one plot of + :math:`A` with :math:`B` and :math:`C` as axes or two plots, one of + :math:`A` versus :math:`B` and another of :math:`C` versus :math:`B` + or even both situations at once. + +#. Similarly to situation 2, :math:`C` is ill-defined. + +#. :math:`B` is ill-defined, and it is not clear what :math:`A` should + be plotted against. + +It is perhaps instructive to see how the above trees could be remedied. +In :numref:`bad_trees_remedied` we show +all possible valid reconfigurations that neither invert any arrows nor +leave any parameters completely decoupled [2]_. The fact that each tree +of :numref:`bad_trees` has several valid +reconfigurations exactly illustrates the ambiguity of those trees [3]_. + +In column **c** of +:numref:`bad_trees_remedied` we see two +somewhat new graphs. In **2c**, we allow two variables to depend on a +third one. There is no ambiguity here, two plots will result from this +measurement: :math:`A` versus :math:`B` and :math:`C` versus :math:`B`. +Similarly, in **3c** we’ll get :math:`A` versus :math:`B` and :math:`C` +versus :math:`D`. The total number of trees and plots per dataset is +treated in the next section. + +.. _bad_trees_remedied: +.. figure:: figures/bad_trees_remedied.svg + :alt: Acceptable recastings of the dependencies of :numref:`bad_trees`. The pathological tree 1 is omitted. + :align: center + :width: 85.0% + + Acceptable recastings of the dependencies of + :numref:`bad_trees`. The pathological tree 1 is + omitted. + +.. _sec:number-trees-per: + +Number of trees per dataset +=========================== + +The dataset can hold an arbitrary number of “top-level” parameters, +meaning parameters with arrows only going out of them, parameters on +which nothing depends. At each step of the experiment, all parameters +that such a top-level parameter points to must be assigned values, if +the top-level parameter gets assigned a value. Otherwise, they may be +omitted. What this means in practice is illustrated in +:numref:`good_trees_complex`. + +.. _good_trees_complex: +.. figure:: figures/good_trees_complex.svg + :alt: A more complex sweep example. The blue rectangles represent the results table in the database. + :align: center + :width: 85.0% + + A more complex sweep example. The blue rectangles represent the + results table in the database. + +We may say that this dataset de facto contains two trees, one +:math:`A-B-D` tree and one :math:`C-B` tree [4]_ . One dataset can hold +as many such trees as desired. In code, +:numref:`good_trees_complex` might take the following form: + +:: + + meas = Measurement() + meas.register_parameter(D) + meas.register_parameter(B) + meas.register_parameter(A, depends_on=(B, D)) + meas.register_parameter(C, depends_on=(B,)) + + with meas.run() as datasaver: + for b_val in b_vals: + for d_val in d_vals: + B.set(b_val) + D.set(d_val) + a_val = A.get() + datasaver.add_result((A, a_val), + (B, b_val), + (D, d_val)) + c_val = C.get() + datasaver.add_result((C, c_val), + (B, b_val)) + +.. _sec:few-examples: + +A few examples +============== + +Finally, to offer some intuition for the dataset’s dependency structure, +we cast a few real-life examples of measurements into tree diagrams. + +.. _sec:cond-meas: + +Conductance measurement +----------------------- + +In a conductance measurement measuring conductance as a function of gate +voltage, a gate voltage, :math:`V_\text{gate}`, is swept while a lock-in +amplifier drives the DUT at a certain frequency with a drive amplitude +:math:`V_\text{drive}`. The drive induces a current which oscillates at +the drive frequency. An I-V converter converts that oscillating current +back into an oscillating voltage (which a certain gain factor, +:math:`G_{IV}`, with units :math:`A/V`), and that voltage is fed back +into the lock-in. Assuming no phase shift, the lock-in amplifier’s +:math:`X` reading is then related to the conductance, :math:`g`, +according to + +.. math:: g = \frac{X}{V_\text{drive}G_{IV}}. + +The corresponding parameter tree is shown in +:numref:`example1_conductance`, where :math:`A` is :math:`g`, +:math:`B` is :math:`V_\text{gate}`, and :math:`C` is :math:`X`. One +could of course argue that :math:`V_\text{drive}` and :math:`G_{IV}` +should also be parameters that :math:`g` is inferred from. We suggest +the following rule: anything that is known beforehand to remain constant +throughout the *entire* run can be omitted from the dataset and written +down elsewhere [5]_. The converse also holds: anything that *does* +change during a run really *should* be saved along. + +.. _example1_conductance: +.. figure:: figures/example1_conductance.svg + :alt: Conductance measurement. + :align: center + :width: 40.0% + + Conductance measurement. + +.. _sec:comp-sweep: + +Compensatory sweeping +--------------------- + +An interesting example that potentially does *not* fit so nicely into +our scheme is offered by compensatory sweeping. A voltage, :math:`V_1` +is swept and a quantity :math:`S` is measured. Since sweeping +:math:`V_1` has some undesired effect on the physical system, a +compensatory change of another voltage, :math:`V_2` is performed at the +same time. :math:`V_2` changes with :math:`V_1` according to + +.. math:: V_2 = \alpha V_1 + \beta. + +Since both :math:`\alpha` and :math:`\beta` might change during the run +via some feedback mechanism, we have four parameters apart from :math:`S` +to sort out. + +There are two ways to go about this. + +.. _sec:decoupling: + +Decoupling +~~~~~~~~~~ + +If the experimentalist really insists that the interesting plot for this +measurement is that of :math:`S` versus :math:`V_1` and the compensation +is just some unfortunate but necessary circumstance, then the unusual +tree of :numref:`example2_compensation_A` is the correct +representation. + +.. _example2_compensation_A: +.. figure:: figures/example2_compensation_A.svg + :alt: Sweeping a voltage with compensation in the background. :math:`A` is :math:`V_1`, :math:`B` is :math:`S`, :math:`D` is :math:`V_2`, :math:`C` is :math:`\alpha`, and :math:`E` is :math:`\beta`. + :align: center + :width: 30.0% + + Sweeping a voltage with compensation in the background. :math:`A` is + :math:`V_1`, :math:`B` is :math:`S`, :math:`D` is :math:`V_2`, + :math:`C` is :math:`\alpha`, and :math:`E` is :math:`\beta`. + +The tree of :numref:`example2_compensation_A` does fit into the +scheme of :numref:`fig_gen`, the scheme we promised to +represent the most general setting. There are now two possibilities. +Either *we* were initially wrong and no dependencies save for those +specifying the default plot can be defined for this measurement. Else +*the experimentalist* is wrong, and has an untrue representation of the +experiment in mind. We explore that idea in below in :ref:`sec:restructuring`. + +.. _sec:restructuring: + +Restructuring +~~~~~~~~~~~~~ + +If the space spanned by :math:`V_1` and :math:`V_2` has a meaningful +physical interpretation [6]_, it might make more sense to define a new +parameter, :math:`V_3` that represents the path swept along in that +space. After all, this is what is :math:`physically` happening, +:math:`S` is measured as a function of :math:`V_3`. Then the tree of +:numref:`example2_compensation_B` emerges. + +.. _example2_compensation_B: +.. figure:: figures/example2_compensation_B.svg + :alt: Sweeping along a path in voltage space. :math:`A` is :math:`V_1`, :math:`B` is :math:`S`, :math:`D` is :math:`V_2`, :math:`C` is :math:`\alpha`, :math:`E` is :math:`\beta`, and :math:`F` is :math:`V_3`. + :align: center + :width: 30.0% + + Sweeping along a path in voltage space. :math:`A` is :math:`V_1`, + :math:`B` is :math:`S`, :math:`D` is :math:`V_2`, :math:`C` is + :math:`\alpha`, :math:`E` is :math:`\beta`, and :math:`F` is + :math:`V_3`. + +.. [1] + That is to say, for many :math:`(i, j)`, it holds that + :math:`\frac{\partial y_i}{\partial x_j}=0`. + +.. [2] + We repeat that the dataset can hold an arbitrary amount of decoupled + parameters. For illustrative and combinatorical reasons (there’d + simply be too many trees!), we omit decoupled parameters here. + +.. [3] + Note that the ambiguity could be resolved by enforcing particular + rules of interpretation. Here we have made the *design choice* of + disallowing ambiguity in the first instance. + +.. [4] + We note for completeness that the values for, say, + :math:`b_1, b_2, \ldots` need not be different at each step. Perhaps + :math:`B` represents a voltage that is kept constant as :math:`D` is + varied. + +.. [5] + E.g. the station snapshot (in which case it is actually still in the + dataset but not in the results table) or even a laboratory logbook + describing the equipment. + +.. [6] + Say, for instance, :math:`V_1` and :math:`V_2` are drain and gate + voltages and the experimentalist wants to sweep along a certain path + inside a skewed Coulomb diamond. diff --git a/specs/DataSet.rst b/docs/dataset/spec.rst similarity index 88% rename from specs/DataSet.rst rename to docs/dataset/spec.rst index 2227ac91014..a9654c0d7c0 100644 --- a/specs/DataSet.rst +++ b/docs/dataset/spec.rst @@ -1,3 +1,5 @@ +.. _dataset-spec: + ===================== DataSet Specification ===================== @@ -27,13 +29,13 @@ Metadata Parameter A logically-single value input to or produced by a measurement. A parameter need not be a scalar, but can be an array or a tuple or an array of tuples, etc. - A DataSet parameter corresponds conceptually to a QCoDeS parameter, but does not have to be defined by or associated with a QCoDeS Parameter . + A DataSet parameter corresponds conceptually to a QCoDeS parameter, but does not have to be defined by or associated with a QCoDeS Parameter . Roughly, a parameter represents a column in a table of experimental data. - + Result A result is the collection of parameter values associated to a single measurement in an experiment. Roughly, a result corresponds to a row in a table of experimental data. - + DataSet A DataSet is a QCoDeS object that stores the results of an experiment. Roughly, a DataSet corresponds to a table of experimental data, along with metadata that describes the data. @@ -58,7 +60,7 @@ Basics Creation ------------ -#. It should be possible to create a DataSet without knowing the final item count of the various values it stores. +#. It should be possible to create a DataSet without knowing the final item count of the various values it stores. In particular, the number of loop iterations for a sweep should not be required to create the DataSet. #. The list of parameters in each result to be stored in a DataSet may be specified at creation time. This includes the name, role (set-point or output), and type of each parameter. @@ -66,13 +68,13 @@ Creation #. It should be possible to add a new parameter to an in-progress DataSet. #. It should be possible to define a result parameter that is independent of any QCoDeSParameter or Instrument. #. A QCoDeS Parameter should provide sufficient information to define a result parameter. -#. A DataSet should allow storage of relatively arbitrary metadata describing the run that +#. A DataSet should allow storage of relatively arbitrary metadata describing the run that generated the results and the parameters included in the results. - Essentially, DataSet metadata should be a string-keyed dictionary at the top, + Essentially, DataSet metadata should be a string-keyed dictionary at the top, and should allow storage of any JSON-encodable data. #. The DataSet identifier should be automatically stored in the DataSet's metadata under the "id" tag. - + Writing ---------- @@ -115,23 +117,23 @@ ParamSpec A ParamSpec object specifies a single parameter in a DataSet. -ParamSpec(name, type, metadata=) - Creates a parameter specification with the given name and type. +``ParamSpec(name, type, metadata=)`` + Creates a parameter specification with the given name and type. The type should be a NumPy dtype object. - + If metadata is provided, it is included in the overall metadata of the DataSet. The metadata can be any JSON-able object. - -ParamSpec.name + +``ParamSpec.name`` The name of this parameter. - -ParamSpec.type + +``ParamSpec.type`` The dtype of this parameter. - -ParamSpec.metadata + +``ParamSpec.metadata`` The metadata of this parameter. This should be an empty dictionary as a default. - + Either the QCoDeS Parameter class should inherit from ParamSpec, or the Parameter class should provide a simple way to get a ParamSpec for the Parameter. @@ -141,71 +143,71 @@ DataSet Construction ------------ -DataSet(name) +``DataSet(name)`` Creates a DataSet with no parameters. The name should be a short string that will be part of the DataSet's identifier. -DataSet(name, specs) +``DataSet(name, specs)`` Creates a DataSet for the provided list of parameter specifications. The name should be a short string that will be part of the DataSet's identifier. Each item in the list should be a ParamSpec object. - -DataSet(name, specs, values) + +``DataSet(name, specs, values)`` Creates a DataSet for the provided list of parameter specifications and values. The name should be a short string that will be part of the DataSet's identifier. Each item in the specs list should be a ParamSpec object. - Each item in the values list should be a NumPy array or a Python list of values for the corresponding ParamSpec. - There should be exactly one item in the values list for every item in the specs list. - All of the arrays/lists in the values list should have the same length. - The values list may intermix NumPy arrays and Python lists. + Each item in the values list should be a NumPy array or a Python list of values for the corresponding ParamSpec. + There should be exactly one item in the values list for every item in the specs list. + All of the arrays/lists in the values list should have the same length. + The values list may intermix NumPy arrays and Python lists. -DataSet.add_parameter(spec) +``DataSet.add_parameter(spec)`` Adds a parameter to the DataSet. The spec should be a ParamSpec object. If the DataSet is not empty, then existing results will have the type-appropriate null value for the new parameter. - + It is an error to add parameters to a completed DataSet. -DataSet.add_parameters(specs) +``DataSet.add_parameters(specs)`` Adds a list of parameters to the DataSet. Each item in the list should be a ParamSpec object. If the DataSet is not empty, then existing results will have the type-appropriate null value for the new parameters. - + It is an error to add parameters to a completed DataSet. -DataSet.add_metadata(tag=, metadata=) +``DataSet.add_metadata(tag=, metadata=)`` Adds metadata to the DataSet. The metadata is stored under the provided tag. - If there is already metadata under the provided tag, the new metadata replaces the old metadata. + If there is already metadata under the provided tag, the new metadata replaces the old metadata. The metadata can be any JSON-able object. Writing ------- -DataSet.add_result(**kwargs) +``DataSet.add_result(**kwargs)`` Adds a result to the DataSet. Keyword parameters should have the name of a parameter as the keyword and the value to associate as the value. If there is only one positional parameter and it is a dictionary, then it is interpreted as a map from parameter name to parameter value. Returns the zero-based index in the DataSet that the result was stored at; that is, it returns the length of the DataSet before the addition. - + It is an error to provide a value for a key or keyword that is not the name of a parameter in this DataSet. - + It is an error to add a result to a completed DataSet. -DataSet.add_results(args) +``DataSet.add_results(args)`` Adds a sequence of results to the DataSet. The single argument should be a sequence of dictionaries, where each dictionary provides the values for all of the parameters in that result. See the add_result method for a description of such a dictionary. The order of dictionaries in the sequence will be the same as the order in which they are added to the DataSet. - + Returns the zero-based index in the DataSet that the first result was stored at; that is, it returns the length of the DataSet before the addition. - + It is an error to provide a value for a key or keyword that is not the name of a parameter in this DataSet. - + It is an error to add results to a completed DataSet. -DataSet.modify_result(index, **kwargs) +``DataSet.modify_result(index, **kwargs)`` Modifies a result in the DataSet. The index should be the zero-based index of the result to be modified. Keyword parameters should have the name of a parameter as the keyword and the updated value to associate as the value. @@ -215,96 +217,96 @@ DataSet.modify_result(index, **kwargs) To remove a parameter from a result, map it to None. It is an error to modify a result at an index less than zero or beyond the end of the DataSet. - + It is an error to provide a value for a key or keyword that is not the name of a parameter in this DataSet. - + It is an error to modify a result in a completed DataSet. -DataSet.modify_results(start_index, updates) +``DataSet.modify_results(start_index, updates)`` Modifies a sequence of results in the DataSet. The start_index should be the zero-based index of the first result of the sequence to be modified. - The updates argument should be a sequence of dictionaries, where each dictionary provides modified values for parameters + The updates argument should be a sequence of dictionaries, where each dictionary provides modified values for parameters as a map from parameter name to parameter value. See the modify_result method for a description of such a dictionary. The order of dictionaries in the sequence will be the same as the order in which they are applied to the DataSet. - + Any parameters that were specified in a original result that do not appear in the corresponding modification are left unchanged. To remove a parameter from a result, map it to None. It is an error to modify a result at an index less than zero or beyond the end of the DataSet. - + It is an error to provide a value for a key or keyword that is not the name of a parameter in this DataSet. - + It is an error to modify results in a completed DataSet. -DataSet.add_parameter_values(spec, values) - Adds a parameter to the DataSet and associates result values with the new parameter. - The values must be a NumPy array or a Python list, with each element holding a single result value that matches the parameter's data type. - If the DataSet is not empty, then the count of provided values must equal the current count of results in the DataSet, or an error will result. - +``DataSet.add_parameter_values(spec, values)`` + Adds a parameter to the DataSet and associates result values with the new parameter. + The values must be a NumPy array or a Python list, with each element holding a single result value that matches the parameter's data type. + If the DataSet is not empty, then the count of provided values must equal the current count of results in the DataSet, or an error will result. + It is an error to add parameters to a completed DataSet. - -DataSet.mark_complete() + +``DataSet.mark_complete()`` Marks the DataSet as completed. Access ------ -DataSet.id +``DataSet.id`` Returns the unique identifying string for this DataSet. This string will include the date and time that the DataSet was created and the name supplied to the constructor, as well as additional content to ensure uniqueness. -DataSet.length - This attribute holds the current number of results in the DataSet. +``DataSet.length`` + This attribute holds the current number of results in the DataSet. -DataSet.is_empty +``DataSet.is_empty`` This attribute will be true if the DataSet is empty (has no results), or false if at least one result has been added to the DataSet. It is equivalent to testing if the length is zero. -DataSet.is_marked_complete +``DataSet.is_marked_complete`` This attribute will be true if the DataSet has been marked as complete or false if it is in progress. -DataSet.get_data(*params, start=, end=) +``DataSet.get_data(*params, start=, end=)`` Returns the values stored in the DataSet for the specified parameters. The values are returned as a list of parallel NumPy arrays, one array per parameter. The data type of each array is based on the data type provided when the DataSet was created. - + The parameter list may contain a mix of string parameter names, QCoDeS Parameter objects, and ParamSpec objects. - - If provided, the start and end parameters select a range of results by result count (index). + + If provided, the start and end parameters select a range of results by result count (index). Start defaults to 0, and end defaults to the current length. - + If the range is empty -- that is, if the end is less than or equal to the start, or if start is after the current end of the DataSet – then a list of empty arrays is returned. -DataSet.get_parameters() +``DataSet.get_parameters()`` Returns a list of ParamSpec objects that describe the parameters stored in this DataSet. -DataSet.get_metadata(tag=) +``DataSet.get_metadata(tag=)`` Returns metadata for this DataSet. - + If a tag string is provided, only metadata stored under that tag is returned. Otherwise, all metadata is returned. - + Subscribing ---------------- -DataSet.subscribe(callback, min_wait=, min_count=, state=) +``DataSet.subscribe(callback, min_wait=, min_count=, state=)`` Subscribes the provided callback function to result additions to the DataSet. As results are added to the DataSet, the subscriber is notified by having the callback invoked. - + - min_wait is the minimum amount of time between notifications for this subscription, in milliseconds. The default is 100. - min_count is the minimum number of results for which a notification should be sent. The default is 1. - + When the callback is invoked, it is passed the DataSet itself, the current length of the DataSet, and the state object provided when subscribing. If no state object was provided, then the callback gets passed None as the fourth parameter. - + The callback is invoked when the DataSet is completed, regardless of the values of min_wait and min_count. - + This method returns an opaque subscription identifier. -DataSet.unsubscribe(subid) +``DataSet.unsubscribe(subid)`` Removes the indicated subscription. The subid must be the same object that was returned from a DataSet.subscribe call. @@ -318,7 +320,7 @@ The existing QCoDeS storage subsystem should be modified so that some object has - A write_dataset method that takes a DataSet object and writes it to the appropriate storage location in an appropriate format. - A read_dataset method that reads from the appropriate location, either with a specified format or inferring the format, and returns a DataSet object. - + Metadata ======== @@ -329,17 +331,17 @@ parameters This tag contains a dictionary from the string name of each parameter to information about that parameter. Thus, if DataSet ds has a parameter named "foo", there will be a key "foo" in the dictionary returned from ds.get_metadata("parameters"). The value associated with this key will be a string-keyed dictionary. - + parameters/__param__/spec This path contains a string-keyed dictionary with (at least) the following two keys: The "type" key is associated with the NumPy dtype for the values of this parameter. The "metadata" key is associated with the metadata that was passed to the ParamSpec constructor that defines this parameter, or an empty dictionary if no metadata was set. - + Utilities ========= There are many utility routines that may be defined outside of the DataSet class that may be useful. -We collect several of them here, with the note that these functions will not be part of the DataSet class +We collect several of them here, with the note that these functions will not be part of the DataSet class and will not be required by the DataSet class. dataframe_from_dataset(dataset) @@ -352,4 +354,3 @@ Open Issues This is convenient for adding data analysis results after the experiement has added, but could potentially lead mixing data from different experimental runs accidentally. It is already possible to modify metadata after the DataSet has beenmarked as completed, but sometimes that may not be sufficient. - diff --git a/docs/index.rst b/docs/index.rst index b02b2a4d667..656b9b0091b 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -61,6 +61,7 @@ Documentation help user/index community/index + dataset/index api/index api/generated/qcodes.instrument_drivers roadmap diff --git a/qcodes/dataset/experiment_container.py b/qcodes/dataset/experiment_container.py index db0a0cc9a21..50caec3d549 100644 --- a/qcodes/dataset/experiment_container.py +++ b/qcodes/dataset/experiment_container.py @@ -126,7 +126,7 @@ def __repr__(self) -> str: return "\n".join(out) -# pulbic api +# public api def experiments()->List[Experiment]: """ @@ -204,7 +204,7 @@ def load_experiment_by_name(name: str, the requested experiment Raises: - ValueErorr if the name is not unique and sample name is None. + ValueError if the name is not unique and sample name is None. """ e = Experiment(DB) if sample: diff --git a/qcodes/dataset/sqlite_base.py b/qcodes/dataset/sqlite_base.py index fd218c9ae96..a9481b442ba 100644 --- a/qcodes/dataset/sqlite_base.py +++ b/qcodes/dataset/sqlite_base.py @@ -1010,7 +1010,6 @@ def get_paramspec(conn: sqlite3.Connection, c = conn.execute(sql) resp = many(c, 'layout_id', 'run_id', 'parameter', 'label', 'unit', 'inferred_from') - (layout_id, _, _, label, unit, inferred_from_string) = resp if inferred_from_string: