[1]:
%matplotlib inline
from qcodes.dataset.experiment_container import new_experiment
from qcodes.dataset.experiment_container import load_by_id
from qcodes.dataset.plotting import plot_by_id

import nanotune as nt
from nanotune.model.capacitancemodel import CapacitanceModel

Capacitance model for a single dot

Initiate or set database where data should be saved. When initializing a database a new qcodes experiment needs to be created as well.

[2]:
exp_name = 'capacitance_extraction'
sample_name = 'capa_model'
db_name = 'capa_model_test.db'
nt.new_database(db_name, '.')
new_experiment(exp_name, sample_name)
Upgrading database; v0 -> v1: : 0it [00:00, ?it/s]
Upgrading database; v1 -> v2: 100%|█████████████████████████████████████████████████████| 1/1 [00:00<00:00, 498.49it/s]
Upgrading database; v2 -> v3: : 0it [00:00, ?it/s]
Upgrading database; v3 -> v4: : 0it [00:00, ?it/s]
Upgrading database; v4 -> v5: 100%|█████████████████████████████████████████████████████| 1/1 [00:00<00:00, 332.35it/s]
Upgrading database; v5 -> v6: : 0it [00:00, ?it/s]
Upgrading database; v6 -> v7: 100%|█████████████████████████████████████████████████████| 1/1 [00:00<00:00, 166.01it/s]
Upgrading database; v7 -> v8: 100%|█████████████████████████████████████████████████████| 1/1 [00:00<00:00, 499.56it/s]
Upgrading database; v8 -> v9: 100%|█████████████████████████████████████████████████████| 1/1 [00:00<00:00, 500.27it/s]
[2]:
capacitance_extraction#capa_model#1@C:\Workshop\nanotune\docs\examples\capa_model_test.db
-----------------------------------------------------------------------------------------

Initialize an instance of CapacitanceModel with three gates and one dot

[3]:
voltage_nodes = {
    0: 'left_barrier',
    1: 'plunger',
    2: 'right_barrier',
}
charge_nodes = {
    0: 'A',
}

qdot = CapacitanceModel(
    'qdot',
    charge_nodes=charge_nodes,
    voltage_nodes=voltage_nodes,
    db_name=db_name,
    db_folder='.'
)

Set voltages, define capacitance matrix and calculate the corresponding ground state dot occupation. Negative electron occupations are not allowed, they are replaces with zero.

[4]:
qdot.V_v([
    -1.55, # left_barrier
    1,     # plunger
    -3.5,  # right_barrier
])

# capacitances between gates and dots
qdot.C_cv(
# left_b  plunger right_b
    [[-0.1, -1.3, -2]],
)
print(qdot.determine_N())
[0.0]

Determine the voltage range required to sweep in order to measure specific charge states (dot occupancies)

[5]:
N_limits = [(0, 2)]
sweep_ranges = qdot.determine_sweep_voltages([1], N_limits=N_limits)
print(sweep_ranges)
[(5.5038085937500085, 7.042281652688992)]
[6]:
dataid = qdot.sweep_voltage(
    1,
    sweep_ranges,
    n_steps=200,
    normalize=False,
)
plot_by_id(dataid)
Starting experimental run with id: 1.
[6]:
([<AxesSubplot:title={'center':'Run #1, Experiment capacitance_extraction (capa_model)'}, xlabel='voltage node plunger (V[1]) (V)', ylabel='Gate R (V)'>],
 [None])
../_images/examples_capacitance_model_example_single_dot_10_2.png

Let’s change the voltage configuration to see what happens to the Coulomb peaks

[7]:
qdot.V_v([
    -3,  # left_barrier
    1,  # plunger
    -3.5,  # right_barrier
])
dataid = qdot.sweep_voltage(
    1,
    sweep_ranges,
    n_steps=200,
    normalize=False,
)
plot_by_id(dataid)

Starting experimental run with id: 2.
[7]:
([<AxesSubplot:title={'center':'Run #2, Experiment capacitance_extraction (capa_model)'}, xlabel='voltage node plunger (V[1]) (V)', ylabel='Gate R (V)'>],
 [None])
../_images/examples_capacitance_model_example_single_dot_12_2.png