simcats 1.2.0__tar.gz → 2.0.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (63) hide show
  1. {simcats-1.2.0 → simcats-2.0.0}/PKG-INFO +60 -30
  2. {simcats-1.2.0 → simcats-2.0.0}/README.md +55 -26
  3. {simcats-1.2.0 → simcats-2.0.0}/pyproject.toml +7 -3
  4. {simcats-1.2.0 → simcats-2.0.0}/simcats/__init__.py +4 -3
  5. simcats-2.0.0/simcats/_default_configs.py +206 -0
  6. simcats-2.0.0/simcats/_simulation.py +842 -0
  7. simcats-2.0.0/simcats/config_samplers/_GaAs_v1_random_variations_v3_config_sampler.py +1059 -0
  8. simcats-2.0.0/simcats/config_samplers/__init__.py +9 -0
  9. {simcats-1.2.0 → simcats-2.0.0}/simcats/distortions/_distortion_interfaces.py +1 -1
  10. {simcats-1.2.0 → simcats-2.0.0}/simcats/distortions/_dot_jumps.py +8 -6
  11. {simcats-1.2.0 → simcats-2.0.0}/simcats/distortions/_random_telegraph_noise.py +4 -4
  12. {simcats-1.2.0 → simcats-2.0.0}/simcats/distortions/_transition_blurring.py +5 -5
  13. {simcats-1.2.0 → simcats-2.0.0}/simcats/distortions/_white_noise.py +2 -2
  14. {simcats-1.2.0 → simcats-2.0.0}/simcats/ideal_csd/geometric/_generate_lead_transition_mask.py +3 -3
  15. {simcats-1.2.0 → simcats-2.0.0}/simcats/ideal_csd/geometric/_get_electron_occupation.py +5 -5
  16. {simcats-1.2.0 → simcats-2.0.0}/simcats/ideal_csd/geometric/_ideal_csd_geometric.py +5 -5
  17. {simcats-1.2.0 → simcats-2.0.0}/simcats/ideal_csd/geometric/_ideal_csd_geometric_class.py +9 -9
  18. {simcats-1.2.0 → simcats-2.0.0}/simcats/ideal_csd/geometric/_tct_bezier.py +5 -5
  19. simcats-2.0.0/simcats/sensor/__init__.py +15 -0
  20. simcats-1.2.0/simcats/sensor/_generic_sensor.py → simcats-2.0.0/simcats/sensor/_sensor_generic.py +1 -1
  21. simcats-2.0.0/simcats/sensor/_sensor_interface.py +261 -0
  22. simcats-2.0.0/simcats/sensor/_sensor_rise_glf.py +229 -0
  23. simcats-2.0.0/simcats/sensor/_sensor_scan_sensor_generic.py +929 -0
  24. simcats-2.0.0/simcats/sensor/barrier_function/__init__.py +9 -0
  25. simcats-2.0.0/simcats/sensor/barrier_function/_barrier_function_glf.py +280 -0
  26. simcats-2.0.0/simcats/sensor/barrier_function/_barrier_function_interface.py +43 -0
  27. simcats-2.0.0/simcats/sensor/barrier_function/_barrier_function_multi_glf.py +157 -0
  28. simcats-2.0.0/simcats/sensor/deformation/__init__.py +9 -0
  29. simcats-2.0.0/simcats/sensor/deformation/_sensor_peak_deformation_circle.py +109 -0
  30. simcats-2.0.0/simcats/sensor/deformation/_sensor_peak_deformation_interface.py +65 -0
  31. simcats-2.0.0/simcats/sensor/deformation/_sensor_peak_deformation_linear.py +77 -0
  32. {simcats-1.2.0 → simcats-2.0.0}/simcats/support_functions/__init__.py +9 -1
  33. simcats-2.0.0/simcats/support_functions/_generalized_logistic_function.py +146 -0
  34. simcats-2.0.0/simcats/support_functions/_linear_algebra.py +171 -0
  35. {simcats-1.2.0 → simcats-2.0.0}/simcats/support_functions/_parameter_sampling.py +21 -23
  36. simcats-2.0.0/simcats/support_functions/_pixel_volt_transformation.py +24 -0
  37. simcats-2.0.0/simcats/support_functions/_reset_offset_mu_sens.py +43 -0
  38. {simcats-1.2.0 → simcats-2.0.0}/simcats.egg-info/PKG-INFO +60 -30
  39. {simcats-1.2.0 → simcats-2.0.0}/simcats.egg-info/SOURCES.txt +19 -3
  40. simcats-1.2.0/simcats/_default_configs.py +0 -90
  41. simcats-1.2.0/simcats/_simulation.py +0 -460
  42. simcats-1.2.0/simcats/sensor/__init__.py +0 -11
  43. simcats-1.2.0/simcats/sensor/_sensor_interface.py +0 -108
  44. {simcats-1.2.0 → simcats-2.0.0}/LICENSE +0 -0
  45. {simcats-1.2.0 → simcats-2.0.0}/setup.cfg +0 -0
  46. {simcats-1.2.0 → simcats-2.0.0}/setup.py +0 -0
  47. {simcats-1.2.0 → simcats-2.0.0}/simcats/distortions/__init__.py +0 -0
  48. {simcats-1.2.0 → simcats-2.0.0}/simcats/distortions/_pink_noise.py +0 -0
  49. {simcats-1.2.0 → simcats-2.0.0}/simcats/ideal_csd/__init__.py +0 -0
  50. {simcats-1.2.0 → simcats-2.0.0}/simcats/ideal_csd/_ideal_csd_interface.py +0 -0
  51. {simcats-1.2.0 → simcats-2.0.0}/simcats/ideal_csd/geometric/__init__.py +0 -0
  52. {simcats-1.2.0 → simcats-2.0.0}/simcats/ideal_csd/geometric/_calculate_all_bezier_anchors.py +0 -0
  53. {simcats-1.2.0 → simcats-2.0.0}/simcats/ideal_csd/geometric/_initialize_tct_functions.py +0 -0
  54. /simcats-1.2.0/simcats/sensor/_gaussian_sensor_peak.py → /simcats-2.0.0/simcats/sensor/_sensor_peak_gaussian.py +0 -0
  55. /simcats-1.2.0/simcats/sensor/_lorentzian_sensor_peak.py → /simcats-2.0.0/simcats/sensor/_sensor_peak_lorentzian.py +0 -0
  56. {simcats-1.2.0 → simcats-2.0.0}/simcats/support_functions/_cumulative_distribution_functions.py +0 -0
  57. {simcats-1.2.0 → simcats-2.0.0}/simcats/support_functions/_fermi_filter1d.py +0 -0
  58. {simcats-1.2.0 → simcats-2.0.0}/simcats/support_functions/_plotting.py +0 -0
  59. {simcats-1.2.0 → simcats-2.0.0}/simcats/support_functions/_rotate_points.py +0 -0
  60. {simcats-1.2.0 → simcats-2.0.0}/simcats/support_functions/_signed_dist_points_line.py +0 -0
  61. {simcats-1.2.0 → simcats-2.0.0}/simcats.egg-info/dependency_links.txt +0 -0
  62. {simcats-1.2.0 → simcats-2.0.0}/simcats.egg-info/requires.txt +0 -0
  63. {simcats-1.2.0 → simcats-2.0.0}/simcats.egg-info/top_level.txt +0 -0
@@ -1,9 +1,9 @@
1
- Metadata-Version: 2.1
1
+ Metadata-Version: 2.4
2
2
  Name: simcats
3
- Version: 1.2.0
3
+ Version: 2.0.0
4
4
  Summary: SimCATS is a python framework for simulating charge stability diagrams (CSDs) typically measured during the tuning process of qubits.
5
- Author-email: Fabian Hader <f.hader@fz-juelich.de>, Sarah Fleitmann <s.fleitmann@fz-juelich.de>, Fabian Fuchs <f.fuchs@fz-juelich.de>
6
- License: CC BY-NC-SA 4.0
5
+ Author-email: Fabian Hader <f.hader@fz-juelich.de>, Sarah Fleitmann <s.fleitmann@fz-juelich.de>, Benjamin Papajewski <b.papajewski@fz-juelich.de>, Fabian Fuchs <f.fuchs@fz-juelich.de>, Karin Havemann <k.havemann@fz-juelich.de>, Jan Vogelbruch <j.vogelbruch@fz-juelich.de>
6
+ License-Expression: CC-BY-NC-SA-4.0
7
7
  Project-URL: homepage, https://github.com/f-hader/SimCATS
8
8
  Project-URL: documentation, https://simcats.readthedocs.io
9
9
  Project-URL: source, https://github.com/f-hader/SimCATS
@@ -30,6 +30,7 @@ Requires-Dist: numpy
30
30
  Requires-Dist: opencv-python
31
31
  Requires-Dist: scipy
32
32
  Requires-Dist: sympy
33
+ Dynamic: license-file
33
34
 
34
35
  <h1 align="center">
35
36
  <img src="https://raw.githubusercontent.com/f-hader/SimCATS/main/SimCATS_symbol.svg" alt="SimCATS logo">
@@ -47,14 +48,19 @@ Requires-Dist: sympy
47
48
  <img src="https://img.shields.io/readthedocs/simcats" alt="Read the Docs"/>
48
49
  </a>
49
50
  <a href="https://doi.org/10.1109/TQE.2024.3445967">
50
- <img src="https://img.shields.io/badge/DOI-10.1109/TQE.2024.3445967-007ec6.svg" alt="DOI Publication"/>
51
+ <img src="https://img.shields.io/badge/DOI (Paper)-10.1109/TQE.2024.3445967-007ec6.svg" alt="DOI Paper"/>
52
+ </a>
53
+ <a href="https://doi.org/10.5281/zenodo.13805205">
54
+ <img src="https://img.shields.io/badge/DOI (Code)-10.5281/zenodo.13805205-007ec6.svg" alt="DOI Code"/>
51
55
  </a>
52
56
  </div>
53
57
 
54
58
  # SimCATS
55
59
 
56
60
  Simulation of CSDs for Automated Tuning Solutions (`SimCATS`) is a Python framework for simulating charge stability
57
- diagrams (CSDs) typically measured during the tuning process of qubits.
61
+ diagrams (CSDs) typically measured during the tuning process of qubits. <br>
62
+ Starting with version 2.0, the framework additionally allows simulating sensor scans. This enables to simulate the
63
+ (re)configuration of the sensor dot before measuring a CSD.
58
64
 
59
65
  ## Installation
60
66
 
@@ -76,9 +82,10 @@ For the installation in development/editable mode, use the option `-e`.
76
82
  After installing the package, a good starting point is a look into the Jupyter Notebook
77
83
  `example_SimCATS_simulation_class.ipynb`, which provides an overview of the usage of the simulation class offered by
78
84
  the framework.
79
- For more detailed examples and explanations of the geometric ideal CSD simulation using Total Charge Transitions (TCTs), look at the Jupyter Notebook `example_SimCATS_IdealCSDGeometric.ipynb`. This notebook also includes a hint
80
- regarding the generation of required labels for training algorithms that might need line labels defined as start and
81
- end points or require semantic information about particular transitions.
85
+ For more detailed examples and explanations of the geometric ideal CSD simulation using Total Charge Transitions (TCTs),
86
+ look at the Jupyter Notebook `example_SimCATS_IdealCSDGeometric.ipynb`. This notebook also includes a hint regarding the
87
+ generation of required labels for training algorithms that might need line labels defined as start and end points or
88
+ require semantic information about particular transitions.
82
89
 
83
90
  ## Tests
84
91
 
@@ -98,7 +105,8 @@ pytest --cov=simcats -n auto --dist loadfile .\tests\
98
105
 
99
106
  The argument
100
107
  - `--cov=simcats` enables a coverage summary of the `SimCATS` package,
101
- - `-n auto` enables the test to run with multiple threads (auto will choose as many threads as possible, but can be replaced with a specific number of threads to use), and
108
+ - `-n auto` enables the test to run with multiple threads (auto will choose as many threads as possible, but can be
109
+ replaced with a specific number of threads to use), and
102
110
  - `--dist loadfile` specifies that each file should be executed only by one thread.
103
111
 
104
112
  <!-- start sec:documentation -->
@@ -125,8 +133,8 @@ To view the generated HTML documentation, open the file `docs\build\html\index.h
125
133
  The primary user interface for `SimCATS` is the class `Simulation`, which combines all the necessary functionalities to
126
134
  measure (simulate) a CSD and adjust the parameters for the simulated measurement. The class `Simulation` and default
127
135
  configurations for the simulation (`default_configs`) can be imported directly from `simcats`. Aside from that,
128
- `SimCATS` contains the subpackages `ideal_csd`, `sensor`, `distortions`, and `support_functions`, described in
129
- the following sections.
136
+ `SimCATS` contains the subpackages `ideal_csd`, `sensor`, `distortions`, and `support_functions`, described in the
137
+ following sections.
130
138
 
131
139
  ### Module `simulation`
132
140
 
@@ -135,21 +143,24 @@ An instance of the simulation class requires
135
143
  - an implementation of the `IdealCSDInterface` for the simulation of ideal CSD data,
136
144
  - an implementation of the `SensorInterface` for the simulation of the sensor (dot) reaction based on the ideal CSD
137
145
  data, and
138
- - (optionally) implementations of the desired types of distortions, which can be implementations from `OccupationDistortionInterface`, `SensorPotentialDistortionInterface`, or `SensorResponseDistortionInterface`.
146
+ - (optionally) implementations of the desired types of distortions, which can be implementations from
147
+ `OccupationDistortionInterface`, `SensorPotentialDistortionInterface`, or `SensorResponseDistortionInterface`.
139
148
 
140
149
  With an initialized instance of the `Simulation` class, it is possible to run simulations using the `measure` function
141
150
  (see `example_SimCATS_simulation_class.ipynb`).
142
151
 
143
152
  ### Subpackage `ideal_csd`
144
153
 
145
- This subpackage contains the `IdealCSDInterface` used by the `Simulation` class and an implementation of
146
- the `IdealCSDInterface` (`IdealCSDGeometric`) based on our geometric simulation approach.
154
+ This subpackage contains the `IdealCSDInterface` used by the `Simulation` class and an implementation of the
155
+ `IdealCSDInterface` (`IdealCSDGeometric`) based on our geometric simulation approach. Please have a look at the notebook
156
+ `example_SimCATS_IdealCSDGeometric.ipynb` and the `SimCATS` paper for detailed explanations regarding the geometric
157
+ approach.
147
158
  Additionally, it contains in the subpackage `geometric` the functions used by `IdealCSDGeometric`, including the
148
159
  implementation of the total charge transition (TCT) definition and functions for calculating the occupations using TCTs.
149
160
 
150
161
  ### Subpackage `distortions`
151
162
 
152
- The distortions subpackage contains the `DistortionInterface` from which the `OccupationDistortionInterface`, the
163
+ The `distortions` subpackage contains the `DistortionInterface` from which the `OccupationDistortionInterface`, the
153
164
  `SensorPotentialDistortionInterface`, and the `SensorResponseDistortionInterface` are derived. Distortion functions used
154
165
  in the `Simulation` class have to implement these specific interfaces. Implemented distortions included in the
155
166
  subpackage are:
@@ -160,22 +171,41 @@ subpackage are:
160
171
  - dot jumps, simulated using the algorithm described in ["Toward Robust Autotuning of Noisy Quantum Dot Devices" by Ziegler et al.](https://doi.org/10.1103/PhysRevApplied.17.024069) (In the `Simulation` class, this is applied to a whole block of rows or columns, but there is also a function for applying it linewise.), and
161
172
  - lead transition blurring, simulated using Gaussian or Fermi-Dirac blurring.
162
173
 
163
- The implementations also offer the option to set ratios (parameter `ratio`) for the occurrence of the distortion (e.g. dot jumps may only happen sometimes and not in every measurement). Moreover, it is also possible to sample the
164
- noise parameters from a given sampling range using an object of type `ParameterSamplingInterface`.
165
- Classes for randomly sampling from a normal distribution or a uniform distribution within a given range are available in
166
- the subpackage `support_functions`.
167
- In this case, the strength is randomly chosen from the given range for every measurement.
168
- Additionally, it is possible to specify that this range should be a smaller subrange of the provided range.
169
- This allows restricting distortion fluctuations during a simulation while enabling a large variety of different strengths
170
- for the initialization of the objects. <br>
171
- RTN, dot jumps, and lead transition blurring are applied in the pixel domain. However, the jump length or the blurring strength should be consistent in the voltage domain even if the resolution changes. Therefore, the parameters
172
- are given in the voltage domain and adjusted according to the resolution in terms of pixel per voltage. <br>
173
- For a simulated measurement with a continuous voltage sweep involving an averaging for each pixel, the noise strength of the
174
- white and pink noise should be adjusted if the resolution (volt per pixel) changes, due to smoothing out the noise. This smoothing depends on the type of averaging used and is not incorporated in the default implementation.
174
+ The implementations also offer the option to set ratios (parameter `ratio`) for the occurrence of the distortion (e.g.
175
+ dot jumps may only happen sometimes and not in every measurement). Moreover, it is also possible to sample the noise
176
+ parameters from a given sampling range using an object of type `ParameterSamplingInterface`. Classes for randomly
177
+ sampling from a normal distribution or a uniform distribution within a given range are available in the subpackage
178
+ `support_functions`. In this case, the strength is randomly chosen from the given range for every measurement.
179
+ Additionally, it is possible to specify that this range should be a smaller subrange of the provided range. This allows
180
+ restricting distortion fluctuations during a simulation while enabling a large variety of different strengths for the
181
+ initialization of the objects. <br>
182
+ RTN, dot jumps, and lead transition blurring are applied in the pixel domain. However, the jump length or the blurring
183
+ strength should be consistent in the voltage domain even if the resolution changes. Therefore, the parameters are given
184
+ in the voltage domain and adjusted according to the resolution in terms of pixel per voltage. <br>
185
+ For a simulated measurement with a continuous voltage sweep involving an averaging for each pixel, the noise strength of
186
+ the white and pink noise should be adjusted if the resolution (volt per pixel) changes, due to smoothing out the noise.
187
+ This smoothing depends on the type of averaging used and is not incorporated in the default implementation.
175
188
 
176
189
  ### Subpackage `sensor`
177
190
 
178
- This subpackage contains the `SensorInterface` that defines how a sensor simulation must be implemented to be used by the `Simulation` class. The `SensorPeakInterface` provides the desired representation for the definition of the Coulomb peaks the sensor uses. `SensorGeneric` implements the `SensorInterface` and offers functions for simulating the sensor response and potential. It offers the possibility to simulate with a single peak or multiple sensor peaks. Current implementations of the `SensorPeakInterface` are `SensorPeakGaussian` and `SensorPeakLorentzian`.
191
+ This subpackage contains the `SensorInterface` that defines how a sensor simulation must be implemented to be used by
192
+ the `Simulation` class. The `SensorPeakInterface` provides the desired representation for the definition of the Coulomb
193
+ peaks the sensor uses. `SensorGeneric` implements the `SensorInterface` and offers functions for simulating the sensor
194
+ response and potential. It offers the possibility to simulate with a single peak or multiple sensor peaks. Current
195
+ implementations of the `SensorPeakInterface` are `SensorPeakGaussian` and `SensorPeakLorentzian`. <br>
196
+ Starting with version 2.0, an extension of the `SensorInterface` called `SensorScanSensorInterface` is available.
197
+ Implementations of this interface allow simulating sensor scans in addition to CSDs. This enables to simulate the
198
+ (re)configuration of the sensor dot before measuring a CSD. `SensorScanSensorGeneric` implements the
199
+ `SensorScanSensorInterface`, modeling the sensor dot as three resistors in series (barrier, dot, barrier). The function
200
+ describing the dot is similar to the function in the `SensorGeneric`, but has an additional final rise of the signal
201
+ after the last Coulomb peak (an implementation of the `SensorRiseInterface`). A new interface called
202
+ `BarrierFunctionInterface` defines how the barrier functions must be implemented. These functions, which basically model
203
+ the shape of a pinch-off measurement, are currently implemented using generalized logistic functions
204
+ (`BarrierFunctionGLF`, `BarrierFunctionMultiGLF`). The potentials for both barriers and the dot itself are calculated
205
+ from the applied voltages and provided lever-arms. Then, the barrier and dot functions are applied to calculate the
206
+ individual conductances. Finally, these conductances are combined to retrieve the sensor signal (proportional to the
207
+ total conductance across the sensor dot).
208
+
179
209
 
180
210
  ### Subpackage `support_functions`
181
211
 
@@ -215,4 +245,4 @@ This work is licensed under a
215
245
 
216
246
  Contributions must follow the Contributor License Agreement. For more information, see the CONTRIBUTING.md file at the top of the GitHub repository.
217
247
 
218
- Copyright © 2024 Forschungszentrum Jülich GmbH - Central Institute of Engineering, Electronics and Analytics (ZEA) - Electronic Systems (ZEA-2)
248
+ Copyright © 2026 Peter Grünberg Institute - Integrated Computing Architectures (ICA / PGI-4), Forschungszentrum Jülich GmbH
@@ -14,14 +14,19 @@
14
14
  <img src="https://img.shields.io/readthedocs/simcats" alt="Read the Docs"/>
15
15
  </a>
16
16
  <a href="https://doi.org/10.1109/TQE.2024.3445967">
17
- <img src="https://img.shields.io/badge/DOI-10.1109/TQE.2024.3445967-007ec6.svg" alt="DOI Publication"/>
17
+ <img src="https://img.shields.io/badge/DOI (Paper)-10.1109/TQE.2024.3445967-007ec6.svg" alt="DOI Paper"/>
18
+ </a>
19
+ <a href="https://doi.org/10.5281/zenodo.13805205">
20
+ <img src="https://img.shields.io/badge/DOI (Code)-10.5281/zenodo.13805205-007ec6.svg" alt="DOI Code"/>
18
21
  </a>
19
22
  </div>
20
23
 
21
24
  # SimCATS
22
25
 
23
26
  Simulation of CSDs for Automated Tuning Solutions (`SimCATS`) is a Python framework for simulating charge stability
24
- diagrams (CSDs) typically measured during the tuning process of qubits.
27
+ diagrams (CSDs) typically measured during the tuning process of qubits. <br>
28
+ Starting with version 2.0, the framework additionally allows simulating sensor scans. This enables to simulate the
29
+ (re)configuration of the sensor dot before measuring a CSD.
25
30
 
26
31
  ## Installation
27
32
 
@@ -43,9 +48,10 @@ For the installation in development/editable mode, use the option `-e`.
43
48
  After installing the package, a good starting point is a look into the Jupyter Notebook
44
49
  `example_SimCATS_simulation_class.ipynb`, which provides an overview of the usage of the simulation class offered by
45
50
  the framework.
46
- For more detailed examples and explanations of the geometric ideal CSD simulation using Total Charge Transitions (TCTs), look at the Jupyter Notebook `example_SimCATS_IdealCSDGeometric.ipynb`. This notebook also includes a hint
47
- regarding the generation of required labels for training algorithms that might need line labels defined as start and
48
- end points or require semantic information about particular transitions.
51
+ For more detailed examples and explanations of the geometric ideal CSD simulation using Total Charge Transitions (TCTs),
52
+ look at the Jupyter Notebook `example_SimCATS_IdealCSDGeometric.ipynb`. This notebook also includes a hint regarding the
53
+ generation of required labels for training algorithms that might need line labels defined as start and end points or
54
+ require semantic information about particular transitions.
49
55
 
50
56
  ## Tests
51
57
 
@@ -65,7 +71,8 @@ pytest --cov=simcats -n auto --dist loadfile .\tests\
65
71
 
66
72
  The argument
67
73
  - `--cov=simcats` enables a coverage summary of the `SimCATS` package,
68
- - `-n auto` enables the test to run with multiple threads (auto will choose as many threads as possible, but can be replaced with a specific number of threads to use), and
74
+ - `-n auto` enables the test to run with multiple threads (auto will choose as many threads as possible, but can be
75
+ replaced with a specific number of threads to use), and
69
76
  - `--dist loadfile` specifies that each file should be executed only by one thread.
70
77
 
71
78
  <!-- start sec:documentation -->
@@ -92,8 +99,8 @@ To view the generated HTML documentation, open the file `docs\build\html\index.h
92
99
  The primary user interface for `SimCATS` is the class `Simulation`, which combines all the necessary functionalities to
93
100
  measure (simulate) a CSD and adjust the parameters for the simulated measurement. The class `Simulation` and default
94
101
  configurations for the simulation (`default_configs`) can be imported directly from `simcats`. Aside from that,
95
- `SimCATS` contains the subpackages `ideal_csd`, `sensor`, `distortions`, and `support_functions`, described in
96
- the following sections.
102
+ `SimCATS` contains the subpackages `ideal_csd`, `sensor`, `distortions`, and `support_functions`, described in the
103
+ following sections.
97
104
 
98
105
  ### Module `simulation`
99
106
 
@@ -102,21 +109,24 @@ An instance of the simulation class requires
102
109
  - an implementation of the `IdealCSDInterface` for the simulation of ideal CSD data,
103
110
  - an implementation of the `SensorInterface` for the simulation of the sensor (dot) reaction based on the ideal CSD
104
111
  data, and
105
- - (optionally) implementations of the desired types of distortions, which can be implementations from `OccupationDistortionInterface`, `SensorPotentialDistortionInterface`, or `SensorResponseDistortionInterface`.
112
+ - (optionally) implementations of the desired types of distortions, which can be implementations from
113
+ `OccupationDistortionInterface`, `SensorPotentialDistortionInterface`, or `SensorResponseDistortionInterface`.
106
114
 
107
115
  With an initialized instance of the `Simulation` class, it is possible to run simulations using the `measure` function
108
116
  (see `example_SimCATS_simulation_class.ipynb`).
109
117
 
110
118
  ### Subpackage `ideal_csd`
111
119
 
112
- This subpackage contains the `IdealCSDInterface` used by the `Simulation` class and an implementation of
113
- the `IdealCSDInterface` (`IdealCSDGeometric`) based on our geometric simulation approach.
120
+ This subpackage contains the `IdealCSDInterface` used by the `Simulation` class and an implementation of the
121
+ `IdealCSDInterface` (`IdealCSDGeometric`) based on our geometric simulation approach. Please have a look at the notebook
122
+ `example_SimCATS_IdealCSDGeometric.ipynb` and the `SimCATS` paper for detailed explanations regarding the geometric
123
+ approach.
114
124
  Additionally, it contains in the subpackage `geometric` the functions used by `IdealCSDGeometric`, including the
115
125
  implementation of the total charge transition (TCT) definition and functions for calculating the occupations using TCTs.
116
126
 
117
127
  ### Subpackage `distortions`
118
128
 
119
- The distortions subpackage contains the `DistortionInterface` from which the `OccupationDistortionInterface`, the
129
+ The `distortions` subpackage contains the `DistortionInterface` from which the `OccupationDistortionInterface`, the
120
130
  `SensorPotentialDistortionInterface`, and the `SensorResponseDistortionInterface` are derived. Distortion functions used
121
131
  in the `Simulation` class have to implement these specific interfaces. Implemented distortions included in the
122
132
  subpackage are:
@@ -127,22 +137,41 @@ subpackage are:
127
137
  - dot jumps, simulated using the algorithm described in ["Toward Robust Autotuning of Noisy Quantum Dot Devices" by Ziegler et al.](https://doi.org/10.1103/PhysRevApplied.17.024069) (In the `Simulation` class, this is applied to a whole block of rows or columns, but there is also a function for applying it linewise.), and
128
138
  - lead transition blurring, simulated using Gaussian or Fermi-Dirac blurring.
129
139
 
130
- The implementations also offer the option to set ratios (parameter `ratio`) for the occurrence of the distortion (e.g. dot jumps may only happen sometimes and not in every measurement). Moreover, it is also possible to sample the
131
- noise parameters from a given sampling range using an object of type `ParameterSamplingInterface`.
132
- Classes for randomly sampling from a normal distribution or a uniform distribution within a given range are available in
133
- the subpackage `support_functions`.
134
- In this case, the strength is randomly chosen from the given range for every measurement.
135
- Additionally, it is possible to specify that this range should be a smaller subrange of the provided range.
136
- This allows restricting distortion fluctuations during a simulation while enabling a large variety of different strengths
137
- for the initialization of the objects. <br>
138
- RTN, dot jumps, and lead transition blurring are applied in the pixel domain. However, the jump length or the blurring strength should be consistent in the voltage domain even if the resolution changes. Therefore, the parameters
139
- are given in the voltage domain and adjusted according to the resolution in terms of pixel per voltage. <br>
140
- For a simulated measurement with a continuous voltage sweep involving an averaging for each pixel, the noise strength of the
141
- white and pink noise should be adjusted if the resolution (volt per pixel) changes, due to smoothing out the noise. This smoothing depends on the type of averaging used and is not incorporated in the default implementation.
140
+ The implementations also offer the option to set ratios (parameter `ratio`) for the occurrence of the distortion (e.g.
141
+ dot jumps may only happen sometimes and not in every measurement). Moreover, it is also possible to sample the noise
142
+ parameters from a given sampling range using an object of type `ParameterSamplingInterface`. Classes for randomly
143
+ sampling from a normal distribution or a uniform distribution within a given range are available in the subpackage
144
+ `support_functions`. In this case, the strength is randomly chosen from the given range for every measurement.
145
+ Additionally, it is possible to specify that this range should be a smaller subrange of the provided range. This allows
146
+ restricting distortion fluctuations during a simulation while enabling a large variety of different strengths for the
147
+ initialization of the objects. <br>
148
+ RTN, dot jumps, and lead transition blurring are applied in the pixel domain. However, the jump length or the blurring
149
+ strength should be consistent in the voltage domain even if the resolution changes. Therefore, the parameters are given
150
+ in the voltage domain and adjusted according to the resolution in terms of pixel per voltage. <br>
151
+ For a simulated measurement with a continuous voltage sweep involving an averaging for each pixel, the noise strength of
152
+ the white and pink noise should be adjusted if the resolution (volt per pixel) changes, due to smoothing out the noise.
153
+ This smoothing depends on the type of averaging used and is not incorporated in the default implementation.
142
154
 
143
155
  ### Subpackage `sensor`
144
156
 
145
- This subpackage contains the `SensorInterface` that defines how a sensor simulation must be implemented to be used by the `Simulation` class. The `SensorPeakInterface` provides the desired representation for the definition of the Coulomb peaks the sensor uses. `SensorGeneric` implements the `SensorInterface` and offers functions for simulating the sensor response and potential. It offers the possibility to simulate with a single peak or multiple sensor peaks. Current implementations of the `SensorPeakInterface` are `SensorPeakGaussian` and `SensorPeakLorentzian`.
157
+ This subpackage contains the `SensorInterface` that defines how a sensor simulation must be implemented to be used by
158
+ the `Simulation` class. The `SensorPeakInterface` provides the desired representation for the definition of the Coulomb
159
+ peaks the sensor uses. `SensorGeneric` implements the `SensorInterface` and offers functions for simulating the sensor
160
+ response and potential. It offers the possibility to simulate with a single peak or multiple sensor peaks. Current
161
+ implementations of the `SensorPeakInterface` are `SensorPeakGaussian` and `SensorPeakLorentzian`. <br>
162
+ Starting with version 2.0, an extension of the `SensorInterface` called `SensorScanSensorInterface` is available.
163
+ Implementations of this interface allow simulating sensor scans in addition to CSDs. This enables to simulate the
164
+ (re)configuration of the sensor dot before measuring a CSD. `SensorScanSensorGeneric` implements the
165
+ `SensorScanSensorInterface`, modeling the sensor dot as three resistors in series (barrier, dot, barrier). The function
166
+ describing the dot is similar to the function in the `SensorGeneric`, but has an additional final rise of the signal
167
+ after the last Coulomb peak (an implementation of the `SensorRiseInterface`). A new interface called
168
+ `BarrierFunctionInterface` defines how the barrier functions must be implemented. These functions, which basically model
169
+ the shape of a pinch-off measurement, are currently implemented using generalized logistic functions
170
+ (`BarrierFunctionGLF`, `BarrierFunctionMultiGLF`). The potentials for both barriers and the dot itself are calculated
171
+ from the applied voltages and provided lever-arms. Then, the barrier and dot functions are applied to calculate the
172
+ individual conductances. Finally, these conductances are combined to retrieve the sensor signal (proportional to the
173
+ total conductance across the sensor dot).
174
+
146
175
 
147
176
  ### Subpackage `support_functions`
148
177
 
@@ -182,4 +211,4 @@ This work is licensed under a
182
211
 
183
212
  Contributions must follow the Contributor License Agreement. For more information, see the CONTRIBUTING.md file at the top of the GitHub repository.
184
213
 
185
- Copyright © 2024 Forschungszentrum Jülich GmbH - Central Institute of Engineering, Electronics and Analytics (ZEA) - Electronic Systems (ZEA-2)
214
+ Copyright © 2026 Peter Grünberg Institute - Integrated Computing Architectures (ICA / PGI-4), Forschungszentrum Jülich GmbH
@@ -1,15 +1,19 @@
1
1
  [build-system]
2
- requires = ["setuptools>=61.0"]
2
+ requires = ["setuptools>=77.0"]
3
3
  build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "simcats"
7
- version = "1.2.0" # also update in docs (conf.py) and simcats (__init__.py)
8
- license = { text="CC BY-NC-SA 4.0" }
7
+ version = "2.0.0" # also update in docs (conf.py) and simcats (__init__.py)
8
+ license = "CC-BY-NC-SA-4.0"
9
+ license-files = ["LICENSE"]
9
10
  authors = [
10
11
  { name="Fabian Hader", email="f.hader@fz-juelich.de" },
11
12
  { name="Sarah Fleitmann", email="s.fleitmann@fz-juelich.de" },
13
+ { name="Benjamin Papajewski", email="b.papajewski@fz-juelich.de"},
12
14
  { name="Fabian Fuchs", email="f.fuchs@fz-juelich.de" },
15
+ { name="Karin Havemann", email="k.havemann@fz-juelich.de" },
16
+ { name="Jan Vogelbruch", email="j.vogelbruch@fz-juelich.de" },
13
17
  ]
14
18
  description = """\
15
19
  SimCATS is a python framework for simulating charge stability diagrams (CSDs) typically measured during the tuning process of qubits.\
@@ -2,8 +2,9 @@
2
2
  process of qubits.
3
3
  """
4
4
 
5
- from ._simulation import Simulation
6
- from ._default_configs import default_configs
5
+ from simcats._simulation import Simulation
6
+ from simcats._default_configs import default_configs
7
7
 
8
8
  __all__ = ["Simulation", "default_configs"]
9
- __version__ = "1.2.0"
9
+
10
+ __version__ = "2.0.0"
@@ -0,0 +1,206 @@
1
+ """
2
+ This module contains the default configurations, that can be used to initialize an object of the simulation class to
3
+ perform charge stability diagram (CSD) simulations.
4
+
5
+ Contributors should add their parameter sets to the default_configs dictionary so that they are available in a central
6
+ location.
7
+
8
+ @author: f.hader, b.papajewski
9
+ """
10
+
11
+ import numpy as np
12
+
13
+ from simcats.distortions import OccupationTransitionBlurringGaussian, OccupationDotJumps, SensorPotentialPinkNoise, \
14
+ SensorPotentialRTN, SensorResponseRTN, SensorResponseWhiteNoise
15
+ from simcats.ideal_csd import IdealCSDGeometric
16
+ from simcats.sensor import SensorPeakLorentzian, SensorGeneric, SensorScanSensorGeneric, SensorRiseGLF
17
+ from simcats.sensor.barrier_function import BarrierFunctionGLF
18
+
19
+ from simcats.support_functions import NormalSamplingRange, UniformSamplingRange
20
+
21
+ __all__ = []
22
+
23
+
24
+ default_configs = {"GaAs_v1": {"volt_limits_g1": np.array([-0.2, -0.087]),
25
+ "volt_limits_g2": np.array([-0.2, -0.047]),
26
+ "ideal_csd_config": IdealCSDGeometric(tct_params=[np.array(
27
+ [0.01075474, 0.01549732, 0.42465033, -0.38038481, -0.02750187, -0.17179705,
28
+ -0.02674207, -0.17171497]), np.array(
29
+ [0.01075474, 0.01549732, 0.40341781, -0.36136557, -0.04171389, -0.16351316,
30
+ -0.04012621, -0.16343108]), np.array(
31
+ [0.01075474, 0.01549732, 0.38324692, -0.34329729, -0.05592591, -0.15564346,
32
+ -0.05351035, -0.15556138]), np.array(
33
+ [0.01075474, 0.01549732, 0.36408457, -0.32613243, -0.07013794, -0.14816725,
34
+ -0.06689448, -0.14808517]), np.array(
35
+ [0.01075474, 0.01549732, 0.34588034, -0.30982581, -0.08434996, -0.14106485,
36
+ -0.08027862, -0.14098277]), np.array(
37
+ [0.01075474, 0.01549732, 0.32858633, -0.29433452, -0.09856198, -0.13431757,
38
+ -0.09366276, -0.13423549]), np.array(
39
+ [0.01075474, 0.01549732, 0.31215701, -0.27961779, -0.112774, -0.12790766, -0.1070469,
40
+ -0.12782558]), np.array(
41
+ [0.01075474, 0.01549732, 0.20758441, -0.18594583, -0.12698603, -0.12181824,
42
+ -0.12125892, -0.12173616]), np.array(
43
+ [0.01075474, 0.01549732, 0.13804363, -0.12365398, -0.14119805, -0.11603329,
44
+ -0.13547094, -0.11595121]), np.array(
45
+ [0.01075474, 0.01549732, 0.09179902, -0.0822299, -0.15541007, -0.11053759,
46
+ -0.14968296, -0.1104555]), np.array(
47
+ [0.01075474, 0.01549732, 0.06104635, -0.05468288, -0.16962209, -0.10531667,
48
+ -0.16389499, -0.10523459]), np.array(
49
+ [0.01075474, 0.01549732, 0.04059582, -0.03636412, -0.18383412, -0.1003568,
50
+ -0.17810701, -0.10027472]), np.array(
51
+ [0.01075474, 0.01549732, 0.02699622, -0.02418214, -0.19804614, -0.09564492,
52
+ -0.19231903, -0.09556284]), np.array(
53
+ [0.01075474, 0.01549732, 0.01795249, -0.01608112, -0.21225816, -0.09116864,
54
+ -0.20653105, -0.09108656])],
55
+ rotation=-np.pi / 4,
56
+ lut_entries=1000,
57
+ cdf_type="sigmoid",
58
+ cdf_gamma_factor=None),
59
+ "sensor": SensorGeneric(sensor_peak_function=[
60
+ SensorPeakLorentzian(mu0=-0.12096, gamma=0.00095, height=0.026245, offset=-0.253275),
61
+ SensorPeakLorentzian(mu0=-0.11596, gamma=0.001, height=0.027245, offset=-0.253275),
62
+ SensorPeakLorentzian(mu0=-0.11096, gamma=0.00105, height=0.028245, offset=-0.253275),
63
+ SensorPeakLorentzian(mu0=-0.10596, gamma=0.0011, height=0.029245, offset=-0.253275),
64
+ SensorPeakLorentzian(mu0=-0.10096, gamma=0.00115, height=0.030245, offset=-0.253275)
65
+ ],
66
+ alpha_dot=np.array([-0.00044775, -0.0002922]),
67
+ alpha_gate=np.array([0.08949, 0.116395]),
68
+ offset_mu_sens=-0.0818745),
69
+ "occupation_distortions": [OccupationTransitionBlurringGaussian(0.75 * 0.03 / 100),
70
+ # in g2 (y in 2D) direction
71
+ OccupationDotJumps(ratio=0.01, scale=100 * 0.03 / 100,
72
+ lam=6 * 0.03 / 100, axis=0),
73
+ # in g1 (x in 2D) direction
74
+ OccupationDotJumps(ratio=0.01 / 6, scale=100 * 0.03 / 100,
75
+ lam=6 * 0.03 / 100, axis=1)],
76
+ "sensor_potential_distortions": [
77
+ SensorPotentialPinkNoise(
78
+ sigma=UniformSamplingRange((1.8250268077765864e-12, 9.125134038882932e-05)),
79
+ fmin=0),
80
+ SensorPotentialRTN(scale=74.56704 * 0.03 / 100, std=3.491734e-05,
81
+ height=2.53855325e-05, ratio=1 / 6)],
82
+ "sensor_response_distortions": [
83
+ SensorResponseRTN(scale=10000 * 0.03 / 100, std=0.047453767599999995,
84
+ height=0.0152373696, ratio=0.03),
85
+ SensorResponseWhiteNoise(
86
+ sigma=NormalSamplingRange((1e-10, 0.003), sampling_range=0.001,
87
+ std=0.0003))]
88
+ },
89
+ "GaAs_v2_extended_sensor": {
90
+ "volt_limits_g1": np.array([-0.2, -0.087]),
91
+ "volt_limits_g2": np.array([-0.2, -0.047]),
92
+ "volt_limits_sensor_g1": np.array([-1, 0.4]),
93
+ "volt_limits_sensor_g2": np.array([-1, 0.4]),
94
+ "ideal_csd_config": IdealCSDGeometric(tct_params=[np.array(
95
+ [0.01075474, 0.01549732, 0.42465033, -0.38038481, -0.02750187, -0.17179705,
96
+ -0.02674207, -0.17171497]), np.array(
97
+ [0.01075474, 0.01549732, 0.40341781, -0.36136557, -0.04171389, -0.16351316,
98
+ -0.04012621, -0.16343108]), np.array(
99
+ [0.01075474, 0.01549732, 0.38324692, -0.34329729, -0.05592591, -0.15564346,
100
+ -0.05351035, -0.15556138]), np.array(
101
+ [0.01075474, 0.01549732, 0.36408457, -0.32613243, -0.07013794, -0.14816725,
102
+ -0.06689448, -0.14808517]), np.array(
103
+ [0.01075474, 0.01549732, 0.34588034, -0.30982581, -0.08434996, -0.14106485,
104
+ -0.08027862, -0.14098277]), np.array(
105
+ [0.01075474, 0.01549732, 0.32858633, -0.29433452, -0.09856198, -0.13431757,
106
+ -0.09366276, -0.13423549]), np.array(
107
+ [0.01075474, 0.01549732, 0.31215701, -0.27961779, -0.112774, -0.12790766, -0.1070469,
108
+ -0.12782558]), np.array(
109
+ [0.01075474, 0.01549732, 0.20758441, -0.18594583, -0.12698603, -0.12181824,
110
+ -0.12125892, -0.12173616]), np.array(
111
+ [0.01075474, 0.01549732, 0.13804363, -0.12365398, -0.14119805, -0.11603329,
112
+ -0.13547094, -0.11595121]), np.array(
113
+ [0.01075474, 0.01549732, 0.09179902, -0.0822299, -0.15541007, -0.11053759,
114
+ -0.14968296, -0.1104555]), np.array(
115
+ [0.01075474, 0.01549732, 0.06104635, -0.05468288, -0.16962209, -0.10531667,
116
+ -0.16389499, -0.10523459]), np.array(
117
+ [0.01075474, 0.01549732, 0.04059582, -0.03636412, -0.18383412, -0.1003568,
118
+ -0.17810701, -0.10027472]), np.array(
119
+ [0.01075474, 0.01549732, 0.02699622, -0.02418214, -0.19804614, -0.09564492,
120
+ -0.19231903, -0.09556284]), np.array(
121
+ [0.01075474, 0.01549732, 0.01795249, -0.01608112, -0.21225816, -0.09116864,
122
+ -0.20653105, -0.09108656])],
123
+ rotation=-np.pi / 4,
124
+ lut_entries=1000,
125
+ cdf_type="sigmoid",
126
+ cdf_gamma_factor=None),
127
+ "sensor": SensorScanSensorGeneric(
128
+ barrier_functions=(
129
+ BarrierFunctionGLF(pinch_off_percentage=0.001,
130
+ fully_conductive_percentage=0.999,
131
+ asymptote_left=0,
132
+ asymptote_right=0.3,
133
+ growth_rate=80,
134
+ asymmetry=8.948499659663527e-05,
135
+ shape_factor=25.64528635013381,
136
+ denominator_offset=1,
137
+ offset=-0.78),#-0.83),
138
+ BarrierFunctionGLF(pinch_off_percentage=0.001,
139
+ fully_conductive_percentage=0.999,
140
+ asymptote_left=0,
141
+ asymptote_right=0.3,
142
+ growth_rate=72,
143
+ asymmetry=7.784390241302876e-05,
144
+ shape_factor=97.5062459999433,
145
+ denominator_offset=1,
146
+ offset=-0.88)#-0.93)
147
+ ),
148
+ sensor_peak_function=[
149
+ SensorPeakLorentzian(mu0=-0.151, gamma=0.0002, height=0.09, offset=0),
150
+ SensorPeakLorentzian(mu0=-0.148, gamma=0.000225, height=0.09, offset=0),
151
+ SensorPeakLorentzian(mu0=-0.145, gamma=0.00025, height=0.09, offset=0),
152
+ SensorPeakLorentzian(mu0=-0.142, gamma=0.000275, height=0.09, offset=0),
153
+ SensorPeakLorentzian(mu0=-0.139, gamma=0.0003, height=0.09, offset=0),
154
+ SensorPeakLorentzian(mu0=-0.136, gamma=0.000325, height=0.09, offset=0),
155
+ SensorPeakLorentzian(mu0=-0.133, gamma=0.00035, height=0.09, offset=0),
156
+ SensorPeakLorentzian(mu0=-0.130, gamma=0.000375, height=0.09, offset=0),
157
+ SensorPeakLorentzian(mu0=-0.127, gamma=0.0004, height=0.09, offset=0),
158
+ SensorPeakLorentzian(mu0=-0.124, gamma=0.000425, height=0.09, offset=0),
159
+ SensorPeakLorentzian(mu0=-0.121, gamma=0.00045, height=0.09, offset=0),
160
+ SensorPeakLorentzian(mu0=-0.118, gamma=0.000475, height=0.09, offset=0),
161
+ SensorPeakLorentzian(mu0=-0.115, gamma=0.0005, height=0.09, offset=0),
162
+ SensorPeakLorentzian(mu0=-0.112, gamma=0.00055, height=0.09, offset=0),
163
+ SensorPeakLorentzian(mu0=-0.109, gamma=0.0006, height=0.09, offset=0),
164
+ SensorPeakLorentzian(mu0=-0.106, gamma=0.00065, height=0.09, offset=0),
165
+ SensorPeakLorentzian(mu0=-0.103, gamma=0.0007, height=0.09, offset=0),
166
+ SensorPeakLorentzian(mu0=-0.100, gamma=0.00075, height=0.09, offset=0),
167
+ SensorPeakLorentzian(mu0=-0.097, gamma=0.0008, height=0.09, offset=0),
168
+ ],
169
+ final_rise=SensorRiseGLF(fully_conductive_percentage=0.999,
170
+ mu0=0,
171
+ asymptote_left=0,
172
+ asymptote_right=0.1,
173
+ growth_rate=2500,
174
+ asymmetry=0.035,
175
+ shape_factor=2),
176
+ alpha_sensor_gate=np.array([[0.096754, 0.1], [0.99, 0.15], [0.15, 0.99]]),
177
+ alpha_dot=np.array([-0.00044775, -0.0002922]),
178
+ alpha_gate=np.array([0.08949, 0.116395]),
179
+ offset_mu_sens=np.array([0, 0, 0]),
180
+ sensor_peak_deformations={}
181
+ ),
182
+ "occupation_distortions": [OccupationTransitionBlurringGaussian(0.75 * 0.03 / 100),
183
+ # in g2 (y in 2D) direction
184
+ OccupationDotJumps(ratio=0.01, scale=100 * 0.03 / 100,
185
+ lam=6 * 0.03 / 100, axis=0),
186
+ # in g1 (x in 2D) direction
187
+ OccupationDotJumps(ratio=0.01 / 6, scale=100 * 0.03 / 100,
188
+ lam=6 * 0.03 / 100, axis=1)],
189
+ "sensor_potential_distortions": [
190
+ SensorPotentialPinkNoise(
191
+ sigma=UniformSamplingRange((1.8250268077765864e-12, 9.125134038882932e-05)),
192
+ fmin=0),
193
+ SensorPotentialRTN(scale=74.56704 * 0.03 / 100, std=3.491734e-05,
194
+ height=2.53855325e-05, ratio=1 / 6)],
195
+ "sensor_response_distortions": [
196
+ SensorResponseWhiteNoise(
197
+ sigma=NormalSamplingRange((1e-10, 0.003), sampling_range=0.001,
198
+ std=0.0003))]
199
+ }
200
+ }
201
+ """Dict: Default configurations for the Simulation class.
202
+ Includes the default configurations "GaAs_v1" and "GaAs_v2_extended_sensor", which can be used to instantiate an object
203
+ of the Simulation class (have a look at the jupyter notebook `example_SimCATS_Simulation_class.ipynb` for an example).\n
204
+ **Information for contributors / developers**: The dictionary itself is stored in the file _default_configs.py to ensure
205
+ a clean separation between the Simulation class and the configurations.
206
+ """