From d8ab37ef50ac6d875a1367ff0af90342a4d3ac10 Mon Sep 17 00:00:00 2001
From: Valentin Bruch <valentin.bruch@rwth-aachen.de>
Date: Thu, 29 Dec 2022 00:58:55 +0100
Subject: [PATCH] more plots, small changes in some plots

---
 final_plots.py |   3 +-
 gen_data.py    |   2 +-
 plot.py        | 216 +++++++++++++++++++++++++++++++++++++++++--------
 plot_pulses.py |  40 +++++++--
 4 files changed, 216 insertions(+), 45 deletions(-)

diff --git a/final_plots.py b/final_plots.py
index b48fab8..0150b1d 100644
--- a/final_plots.py
+++ b/final_plots.py
@@ -455,11 +455,12 @@ def export_omega5_interp(
         korder = 2,
         vdc_max_J = 82.686,
         vac_max_J = 82.686,
+        voltage_branches = 4,
         ):
     """
     Export interpolated data for fixed frequency omega.
     """
-    parameters = dict(d=1e9, solver_tol_rel=1e-8, solver_tol_abs=1e-10, voltage_branches=4, xL=0.5)
+    parameters = dict(d=1e9, solver_tol_rel=1e-8, solver_tol_abs=1e-10, voltage_branches=voltage_branches, xL=0.5)
     def special_selection(data, order, method, padding, **kwargs):
         if method == "J":
             return (data["vdc"] < vdc_max_J + 1e-3) & (data["vac"] < vac_max_J + 1e-3)
diff --git a/gen_data.py b/gen_data.py
index 09478ed..1ef10e0 100644
--- a/gen_data.py
+++ b/gen_data.py
@@ -196,7 +196,7 @@ python -m frtrg_kondo.gen_data \\
     parallel_group.add_argument("--steps", metavar="int", type=int, nargs='+',
             help = "Number of steps, provided for each independent parameter swipe dimension")
     parallel_group.add_argument("--scale", type=str, nargs='+', default="linear",
-            choices = ("linear", "log"),
+            choices = ("linear", "lin", "log"),
             help = "Scale used for swipes (must get same number of options as --steps)")
     parallel_group.add_argument("--threads", type=int, metavar="int", default=4,
             help = "Number parallel processes (set to 0 to use all CPUs)")
diff --git a/plot.py b/plot.py
index f6e3ffd..614054d 100644
--- a/plot.py
+++ b/plot.py
@@ -7,7 +7,7 @@ Kondo FRTRG, generate plots based on save data
 """
 
 import matplotlib.pyplot as plt
-import matplotlib.colors as mplcolors
+from matplotlib.colors import LogNorm, FuncNorm
 import argparse
 import pandas as pd
 import numpy as np
@@ -529,10 +529,30 @@ def plot_comparison(dm, omega, d=1e9, **parameters):
     Only data points which exist for both methods with equal Vdc, Vac, D and
     frequency are considered.
     """
-    for name in ("omega", "method"):
+    #for name in ("omega", "method"):
+    #    parameters.pop(name, None)
+    #results_J = dm.list(omega=omega, method='J', d=d, **parameters).sort_values(["vdc","vac"])
+    #results_mu = dm.list(omega=omega, method='mu', d=d, **parameters).sort_values(["vdc","vac"])
+    ## For comparison with resonant dc voltage:
+    for name in ("omega", "method", "voltage_branches"):
         parameters.pop(name, None)
-    results_J = dm.list(omega=omega, method='J', d=d, **parameters).sort_values(["vdc","vac"])
-    results_mu = dm.list(omega=omega, method='mu', d=d, **parameters).sort_values(["vdc","vac"])
+    parameters["include_Ga"] = False
+    parameters["integral_method"] = -15
+    parameters["truncation_order"] = 3
+    parameters["solver_tol_rel"] = 1e-8
+    parameters["solver_tol_abs"] = 1e-10
+    results_J = dm.list(omega=omega, method='mu', d=d, voltage_branches=4, **parameters).sort_values(["vdc","vac"])
+    results_mu = dm.list(omega=omega, method='J', d=d, voltage_branches=0, **parameters).sort_values(["vdc","vac"])
+    ## For comparison of different numbers of voltage branches:
+    #for name in ("omega", "method", "voltage_branches"):
+    #    parameters.pop(name, None)
+    #parameters["include_Ga"] = True
+    #parameters["integral_method"] = -15
+    #parameters["truncation_order"] = 3
+    #parameters["solver_tol_rel"] = 1e-8
+    #parameters["solver_tol_abs"] = 1e-10
+    #results_J = dm.list(omega=omega, method='mu', d=d, voltage_branches=4, **parameters).sort_values(["vdc","vac"])
+    #results_mu = dm.list(omega=omega, method='mu', d=d, voltage_branches=7, **parameters).sort_values(["vdc","vac"])
     results_J.vac = results_J.vac.round(6)
     results_J.vdc = results_J.vdc.round(6)
     results_mu.vac = results_mu.vac.round(6)
@@ -586,10 +606,21 @@ def plot_comparison_relative(dm, omega, d=1e9, **parameters):
     Only data points which exist for both methods with equal Vdc, Vac, D and
     frequency are considered.
     """
-    for name in ("omega", "method"):
+    #for name in ("omega", "method"):
+    #    parameters.pop(name, None)
+    #results_J = dm.list(omega=omega, method='J', d=d, **parameters).sort_values(["vdc","vac"])
+    #results_mu = dm.list(omega=omega, method='mu', d=d, **parameters).sort_values(["vdc","vac"])
+    ## For comparison with resonant dc voltage:
+    for name in ("omega", "method", "voltage_branches"):
         parameters.pop(name, None)
-    results_J = dm.list(omega=omega, method='J', d=d, **parameters).sort_values(["vdc","vac"])
-    results_mu = dm.list(omega=omega, method='mu', d=d, **parameters).sort_values(["vdc","vac"])
+    parameters["include_Ga"] = False
+    parameters["integral_method"] = -15
+    parameters["truncation_order"] = 3
+    parameters["solver_tol_rel"] = 1e-8
+    parameters["solver_tol_abs"] = 1e-10
+    results_J = dm.list(omega=omega, method='mu', d=d, voltage_branches=4, **parameters).sort_values(["vdc","vac"])
+    results_mu = dm.list(omega=omega, method='J', d=d, voltage_branches=0, **parameters).sort_values(["vdc","vac"])
+
     results_J.vac = results_J.vac.round(6)
     results_J.vdc = results_J.vdc.round(6)
     results_mu.vac = results_mu.vac.round(6)
@@ -644,55 +675,55 @@ def plot_floquet_matrices(kondo : KondoImport, norm_min=1e-6):
     idx = kondo.voltage_branches if gamma.ndim == 3 else ...
     try:
         axes[0].set_title("Γ")
-        img = axes[0].imshow(np.abs(gamma[idx]), norm=mplcolors.LogNorm(norm_min))
+        img = axes[0].imshow(np.abs(gamma[idx]), norm=LogNorm(norm_min))
         fig.colorbar(img, ax=axes[0])
     except AttributeError:
         pass
     try:
         axes[1].set_title("Z")
-        img = axes[1].imshow(np.abs(kondo.z[idx]), norm=mplcolors.LogNorm(norm_min))
+        img = axes[1].imshow(np.abs(kondo.z[idx]), norm=LogNorm(norm_min))
         fig.colorbar(img, ax=axes[1])
     except AttributeError:
         pass
     try:
         axes[2].set_title("ΓL")
-        img = axes[2].imshow(np.abs(kondo.gammaL), norm=mplcolors.LogNorm(norm_min))
+        img = axes[2].imshow(np.abs(kondo.gammaL), norm=LogNorm(norm_min))
         fig.colorbar(img, ax=axes[2])
     except AttributeError:
         pass
     try:
         axes[3].set_title("δΓL")
-        img = axes[3].imshow(np.abs(kondo.deltaGammaL), norm=mplcolors.LogNorm(norm_min))
+        img = axes[3].imshow(np.abs(kondo.deltaGammaL), norm=LogNorm(norm_min))
         fig.colorbar(img, ax=axes[3])
     except AttributeError:
         pass
     try:
         axes[4].set_title("δΓ")
-        img = axes[4].imshow(np.abs(kondo.deltaGamma[1 if gamma.ndim == 3 else ...]), norm=mplcolors.LogNorm(norm_min))
+        img = axes[4].imshow(np.abs(kondo.deltaGamma[1 if gamma.ndim == 3 else ...]), norm=LogNorm(norm_min))
         fig.colorbar(img, ax=axes[4])
     except AttributeError:
         pass
     try:
         axes[5].set_title("yL")
-        img = axes[5].imshow(np.abs(kondo.yL), norm=mplcolors.LogNorm(norm_min))
+        img = axes[5].imshow(np.abs(kondo.yL), norm=LogNorm(norm_min))
         fig.colorbar(img, ax=axes[5])
     except AttributeError:
         pass
     try:
         axes[6].set_title("G2")
-        img = axes[6].imshow(np.abs(kondo.g2[:,:,idx].transpose(0,2,1,3).reshape((4*kondo.nmax+2, 4*kondo.nmax+2))), norm=mplcolors.LogNorm(norm_min))
+        img = axes[6].imshow(np.abs(kondo.g2[:,:,idx].transpose(0,2,1,3).reshape((4*kondo.nmax+2, 4*kondo.nmax+2))), norm=LogNorm(norm_min))
         fig.colorbar(img, ax=axes[6])
     except AttributeError:
         pass
     try:
         axes[7].set_title("G3")
-        img = axes[7].imshow(np.abs(kondo.g3[:,:,idx].transpose(0,2,1,3).reshape((4*kondo.nmax+2, 4*kondo.nmax+2))), norm=mplcolors.LogNorm(norm_min))
+        img = axes[7].imshow(np.abs(kondo.g3[:,:,idx].transpose(0,2,1,3).reshape((4*kondo.nmax+2, 4*kondo.nmax+2))), norm=LogNorm(norm_min))
         fig.colorbar(img, ax=axes[7])
     except AttributeError:
         pass
     try:
         axes[8].set_title("I")
-        img = axes[8].imshow(np.abs(kondo.current.transpose(0,2,1,3).reshape((4*kondo.nmax+2, 4*kondo.nmax+2))), norm=mplcolors.LogNorm(norm_min))
+        img = axes[8].imshow(np.abs(kondo.current.transpose(0,2,1,3).reshape((4*kondo.nmax+2, 4*kondo.nmax+2))), norm=LogNorm(norm_min))
         fig.colorbar(img, ax=axes[8])
     except AttributeError:
         pass
@@ -809,14 +840,14 @@ def fixed_omega_dconvergence(dm, omega=16.5372, solver_tol_rel=1e-10, solver_tol
             vac_grid,
             idc_enhanced_grid,
             c=d_grid,
-            norm=mplcolors.LogNorm(),
+            norm=LogNorm(),
             cmap=plt.cm.viridis_r,
             marker="x")
     plot = ax_iac.scatter(
             vdc_grid,
             2*iac_enhanced_grid,
             c=d_grid,
-            norm=mplcolors.LogNorm(),
+            norm=LogNorm(),
             cmap=plt.cm.viridis_r,
             marker="x")
     cb = fig.colorbar(plot, ax=[ax_idc, ax_iac])
@@ -872,7 +903,7 @@ def check_convergence(dm, **parameters):
     x_mu = x[mu]
     x_mod = x[mod]
     drtol = table.d*table.solver_tol_rel
-    norm = mplcolors.LogNorm(max(drtol.min(), 0.05), min(drtol.max(), 500))
+    norm = LogNorm(max(drtol.min(), 0.05), min(drtol.max(), 500))
     c_j = drtol[j]
     c_mu = drtol[mu]
     c_mod = drtol[mod]
@@ -948,7 +979,7 @@ def check_convergence_nmax(dm, **parameters):
     mod = (table.solver_flags & DataManager.SOLVER_FLAGS["simplified_initial_conditions"]) != 0
     j = (~mod) & (table.method == "J")
     mu = (~mod) & (table.method == "mu")
-    norm = mplcolors.LogNorm(table.voltage_branches.min(), table.voltage_branches.max())
+    norm = LogNorm(table.voltage_branches.min(), table.voltage_branches.max())
     nmax_j = table.nmax[j]
     nmax_mu = table.nmax[mu]
     nmax_mod = table.nmax[mod]
@@ -1039,7 +1070,7 @@ def check_convergence_fit(dm, **parameters):
     x_mu = x[mu]
     x_mod = x[mod]
     drtol = table.d*table.solver_tol_rel
-    norm = mplcolors.LogNorm(max(drtol.min(), 0.05), min(drtol.max(), 500))
+    norm = LogNorm(max(drtol.min(), 0.05), min(drtol.max(), 500))
     c_j = drtol[j]
     c_mu = drtol[mu]
     c_mod = drtol[mod]
@@ -1559,6 +1590,7 @@ def compare_RGeq_interp(
         ref_method = "mu",
         observable = "gdc",
         suffix = "",
+        ref_filename = None,
         **trashparams):
     data = np.load(filename)
     prefactor = 1
@@ -1590,7 +1622,11 @@ def compare_RGeq_interp(
     ax1.set_xlim(vdc[0], vdc[-1])
     ax1.set_ylim(vac[0], vac[-1])
 
-    ref_data = data[f"{observable}_{ref_method}_o3p{suffix}"]
+    if ref_filename is not None:
+        refdata = np.load(ref_filename)
+        ref_data = refdata[f"{observable}_{ref_method}_o3p{suffix}"]
+    else:
+        ref_data = data[f"{observable}_{ref_method}_o3p{suffix}"]
 
     for ax in axes.flat:
         ax.contour(vdc, vac, ref_data, levels, **ref_contour_kwargs)
@@ -1646,13 +1682,33 @@ def compare_RGeq_interp(
     #    ax.contour(vdc, vac, ref_data, missing_levels, **contour_kwargs)
 
 
+class GNorm(plt.Normalize):
+    def __init__(self, vmin=0.1, vmax=1, clip=False):
+        assert vmin > 0
+        assert vmax > vmin
+        self._vmin = vmin
+        self._vmax = vmax
+        self._clip = clip
+
+    def __call__(self, value, clip=None):
+        return (1 - self._vmin/value) / (1 - self._vmin/self._vmax)
+
+def GNorm(vmin, vmax):
+    assert vmax > vmin > 0
+    scale = 1 - vmin/vmax
+    return FuncNorm(((lambda x: (1 - vmin/x)/scale), (lambda x: vmin/(1 - scale*x))), vmin, vmax)
+
+
 def RGeq_comparison_order2(
         dm = None,
         filename = "figdata/omega5_interp.npz",
-        method = "J",
-        compare = "o3a_p",
-        reference = "o3a",
+        method = "mu",
+        compare = "o3a",
+        #compare = "o3a",
+        reference = "o3p",
         reference_method = "mu",
+        #ref_filename = "figdata/omega5_interp_vb7.npz",
+        ref_filename = "figdata/omega5_interp.npz",
         observable = "gdc",
         prefactor = np.pi,
         **trashparams):
@@ -1665,14 +1721,18 @@ def RGeq_comparison_order2(
     fig, (ax1, ax2) = plt.subplots(nrows=2, ncols=1, sharex=True, sharey=True)
     data = np.load(filename)
     cmp = prefactor*data[f"{observable}_{method}_{compare}"]
-    ref = prefactor*data[f"{observable}_{reference_method}_{reference}"]
+    if ref_filename is None:
+        ref = prefactor*data[f"{observable}_{reference_method}_{reference}"]
+    else:
+        ref_data = np.load(ref_filename)
+        ref = prefactor*ref_data[f"{observable}_{reference_method}_{reference}"]
     #gdc_o3 = np.pi*data["gdc_mu_o3"]
-    #norm = mplcolors.LogNorm(0.08, 0.4)
-    norm = plt.Normalize(0.08, 0.4)
+    #norm = LogNorm(0.08, 0.4)
+    norm = GNorm(0.08, 1)
     cmap = plt.cm.viridis
     omega = 16.5372
-    vdc = data["vdc"] / omega
-    vac = data["vac"] / omega
+    vdc = data["vdc"][0] / omega
+    vac = data["vac"][:,0] / omega
     extent1 = (1.5*vdc[0] - 0.5*vdc[1], 1.5*vdc[-1] - 0.5*vdc[-2], 1.5*vac[0] - 0.5*vac[1], 1.5*vac[-1] - 0.5*vac[-2])
     extent2 = (1.5*vdc[0] - 0.5*vdc[1], -1.5*vdc[-1] + 0.5*vdc[-2], 1.5*vac[0] - 0.5*vac[1], 1.5*vac[-1] - 0.5*vac[-2])
     img1 = ax1.imshow(ref, cmap=cmap, norm=norm, extent=extent1, origin="lower")
@@ -1703,16 +1763,34 @@ def RGeq_comparison_contours(
         reference = "o3p",
         observable = "gdc",
         prefactor = np.pi,
+        comp1_filename = None,
+        comp2_filename = None,
         **trashparams):
+    """
+    Example usage:
+    >>> RGeq_comparison_contours(comp1_filename="figdata/omega5_interp_vb7.npz", compare1="o3a", compare2="o3a", reference="o3a")
+    """
     contour_kwargs = dict(colors="#000000", linewidths=0.8, zorder=2)
     ref_contour_kwargs = dict(colors="#ff0000", linewidths=0.8, zorder=1)
     data = np.load(filename)
-    cmp1 = prefactor*data[f"{observable}_{method}_{compare1}"]
-    cmp2 = prefactor*data[f"{observable}_{method}_{compare2}"]
+    if comp1_filename is not None:
+        comp1_data = np.load(comp1_filename)
+        assert np.allclose(data["vdc"], comp1_data["vdc"])
+        assert np.allclose(data["vac"], comp1_data["vac"])
+        cmp1 = prefactor*comp1_data[f"{observable}_{method}_{compare1}"]
+    else:
+        cmp1 = prefactor*data[f"{observable}_{method}_{compare1}"]
+    if comp2_filename is not None:
+        comp2_data = np.load(comp2_filename)
+        assert np.allclose(data["vdc"], comp2_data["vdc"])
+        assert np.allclose(data["vac"], comp2_data["vac"])
+        cmp2 = prefactor*comp2_data[f"{observable}_{method}_{compare2}"]
+    else:
+        cmp2 = prefactor*data[f"{observable}_{method}_{compare2}"]
     ref = prefactor*data[f"{observable}_{method}_{reference}"]
     omega = 16.5372
-    vdc = data["vdc"] / omega
-    vac = data["vac"] / omega
+    vdc = data["vdc"][0] / omega
+    vac = data["vac"][:,0] / omega
     levels = 1/np.linspace(1, 12, 12)[::-1]
     #levels = 0.05 + np.linspace(0.03**0.1, 0.9**.1, 20)**10
     #levels = np.logspace(-2,0,50)
@@ -1994,7 +2072,7 @@ def matrix_truncation(
         kondos[idx] = kondo
 
     fig, axes = plt.subplots(nrows=2, ncols=4, sharex=True, sharey=True)
-    norm = mplcolors.LogNorm(1e-9, 1)
+    norm = LogNorm(1e-9, 1)
     cmap = plt.cm.viridis
     #z_ref = (z_matrices[("mu", True, False)] + z_matrices[("J", True, True)])/2
     z_ref_j = z_matrices[("J", True, True)]
@@ -2263,5 +2341,73 @@ def overview_3d_contours(dm, show_contours=False, show_surfaces=True, save_image
     plt.show()
 
 
+def RGeq_comparison_new(
+        dm = None,
+        filename = "figdata/omega5_interp.npz",
+        method = "mu",
+        compare = "o2",
+        reference = "o3a",
+        reference_method = "mu",
+        #ref_filename = "figdata/omega5_interp_vb7.npz",
+        ref_filename = "figdata/omega5_interp.npz",
+        observable = "gdc",
+        prefactor = np.pi,
+        **trashparams):
+    """
+    Compare two different results for the differential conductance
+    (or another observable) side-by-side and by plotting their absolute
+    and relative difference.
+    Used to generate some draft figures for the thesis.
+    """
+    fig, ((ax_dc, ax_trash), (ax_img, ax_ac)) = plt.subplots(nrows=2, ncols=2, sharex="col", sharey="row")
+    data = np.load(filename)
+    cmp = prefactor*data[f"{observable}_{method}_{compare}"]
+    if ref_filename is None:
+        ref = prefactor*data[f"{observable}_{reference_method}_{reference}"]
+    else:
+        ref_data = np.load(ref_filename)
+        ref = prefactor*ref_data[f"{observable}_{reference_method}_{reference}"]
+    #gdc_o3 = np.pi*data["gdc_mu_o3"]
+    #norm = LogNorm(0.08, 0.4)
+
+    omega = 16.5372
+    vdc = data["vdc"][0] / omega
+    vac = data["vac"][:,0] / omega
+
+    skip = 40
+    plot_number_dc = data["vdc"].shape[0] // skip + 1
+    plot_number_ac = data["vac"].shape[1] // skip + 1
+    vac_max = vac[-1]
+    vdc_max = vdc[-1]
+    for i in range(plot_number_dc):
+        color = plt.cm.viridis(data["vac"][i*skip,0]/(omega*vac_max))
+        ax_dc.plot(data["vdc"][i*skip]/omega, cmp[i*skip], color=color)
+        ax_dc.plot(data["vdc"][i*skip]/omega, ref[i*skip], color=color, linestyle=":")
+    for i in range(plot_number_ac):
+        color = plt.cm.viridis(data["vdc"][0,i*skip]/(omega*vdc_max))
+        ax_ac.plot(cmp[:,i*skip], data["vac"][:,i*skip]/omega, color=color)
+        ax_ac.plot(ref[:,i*skip], data["vac"][:,i*skip]/omega, color=color, linestyle=":")
+
+    #ax_dc.plot(data["vdc"][::skip].T/omega, cmp[::skip].T, color="blue")
+    #ax_dc.plot(data["vdc"][::skip].T/omega, ref[::skip].T, ":", color="red")
+    #ax_ac.plot(cmp[:,::skip], data["vac"][:,::skip]/omega, color="blue")
+    #ax_ac.plot(ref[:,::skip], data["vac"][:,::skip]/omega, color="red")
+
+    extent = (1.5*vdc[0] - 0.5*vdc[1], 1.5*vdc[-1] - 0.5*vdc[-2], 1.5*vac[0] - 0.5*vac[1], 1.5*vac[-1] - 0.5*vac[-2])
+    ccmap = plt.cm.seismic
+    absdiff = cmp - ref
+    absdiff_max = np.abs(absdiff).max()
+    reldiff = absdiff/ref
+    reldiff_max = np.abs(reldiff).max()
+    img = ax_img.imshow(reldiff, cmap=ccmap, norm=plt.Normalize(-reldiff_max, reldiff_max), extent=extent, origin="lower")
+    #img4 = ax2.imshow(absdiff, cmap=ccmap, norm=plt.Normalize(-absdiff_max, absdiff_max), extent=extent2, origin="lower")
+    fig.colorbar(img, ax=ax_trash, location="right")
+    ax_img.set_xlabel(r"$V_\mathrm{avg}~(\Omega)$")
+    ax_img.set_ylabel(r"$V_\mathrm{osc}~(\Omega)$")
+    ax_ac.set_xlabel(r"$G~(2e^2/h)$")
+    ax_dc.set_ylabel(r"$G~(2e^2/h)$")
+    plt.show()
+
+
 if __name__ == '__main__':
     main()
diff --git a/plot_pulses.py b/plot_pulses.py
index f0869c3..43f3c4c 100644
--- a/plot_pulses.py
+++ b/plot_pulses.py
@@ -108,18 +108,28 @@ def integrate_ft(t0, t1, fourier_coef):
     return ((fourier_coef * (np.exp(1j*t1*phase_arr) - np.exp(1j*t0*phase_arr))).imag / phase_arr).sum() * 2
 
 
-def plot_transported_charge(dm, **parameters):
-    table = load_all_pulses(dm)
+def plot_transported_charge(dm, omega=None, **parameters):
+    if omega<=0:
+        omega = None
+    table = load_all_pulses(dm, omega=omega)
     table = table[table.pulse_type == "gauss"]
-    fig, ax = plt.subplots()
-    ax.scatter(table.pulse_duration, table.dc_current/table.omega*2*np.pi, c=table.pulse_phase, s=100/table.omega**2, marker="o")
+    fig, (ax1, ax2) = plt.subplots(nrows=2, ncols=1)
+    ax1.set_xlabel("pulse duration t (1/Tk)")
+    ax2.set_xlabel("pulse phase  φ/2π")
+    ax1.set_ylabel("charge per pulse Q (e)")
+    ax2.set_ylabel("charge per pulse Q (e)")
+
+    phase_norm = plt.Normalize(0, 1.25)
+    duration_norm = LogNorm(0.01, 0.2)
+    ax1.scatter(table.pulse_duration, table.dc_current/table.omega*2*np.pi, c=table.pulse_phase, s=100/table.omega**2, marker="o", norm=phase_norm)
+    ax2.scatter(table.pulse_phase, table.dc_current/table.omega*2*np.pi, c=table.pulse_duration, s=100/table.omega**2, marker="o", norm=duration_norm)
 
     sym_pulse_omega = []
     sym_pulse_duration = []
     sym_pulse_phase = []
     sym_pulse_charge = []
     _h5files = set()
-    for (row, kondo) in load_all_pulses_full(dm, pulse_type="gauss_symmetric"):
+    for (row, kondo) in load_all_pulses_full(dm, pulse_type="gauss_symmetric", omega=omega):
         ref_time = min(3*row.pulse_duration*row.omega/(2*np.pi), 0.15)
         nmax = kondo.nmax
         sym_pulse_charge.append(integrate_ft(-ref_time, 0.5-ref_time, kondo.gammaL[nmax-1::-1,nmax])/row.omega*2*np.pi)
@@ -130,7 +140,21 @@ def plot_transported_charge(dm, **parameters):
     for file in _h5files:
         file.close()
 
-    ax.scatter(sym_pulse_duration, sym_pulse_charge, c=sym_pulse_phase, marker="^", s=80/np.array(sym_pulse_omega)**2)
+    sym_pulse_duration = np.array(sym_pulse_duration)
+    sorting = np.argsort(sym_pulse_duration)
+    sym_pulse_duration = sym_pulse_duration[sorting]
+    sym_pulse_omega = np.array(sym_pulse_omega)[sorting]
+    sym_pulse_phase = np.array(sym_pulse_phase)[sorting]
+    sym_pulse_charge = np.array(sym_pulse_charge)[sorting]
+
+    ax1.scatter(sym_pulse_duration, sym_pulse_charge, c=sym_pulse_phase, marker="^", s=80/np.array(sym_pulse_omega)**2, norm=phase_norm)
+    for phase in (0.25, 0.5, 0.75, 1):
+        selection = np.abs(sym_pulse_phase - phase) < 1e-3
+        ax1.plot(sym_pulse_duration[selection], sym_pulse_charge[selection], color="black")
+    ax2.scatter(sym_pulse_phase, sym_pulse_charge, c=sym_pulse_duration, marker="^", s=80/np.array(sym_pulse_omega)**2, norm=duration_norm)
+    selection = np.abs(sym_pulse_duration - 0.04) < 1e-4
+    sorting = np.argsort(sym_pulse_phase[selection])
+    ax2.plot(sym_pulse_phase[selection][sorting], sym_pulse_charge[selection][sorting], color="black")
     plt.show()
 
 
@@ -213,8 +237,8 @@ def parameter_overview(dm, **trash):
     gauss_height = table.pulse_height[sel]
     gauss_phase = table.pulse_phase[sel]
     gauss_good = table.solver_flags[sel] & (DataManager.SOLVER_FLAGS["include_Ga"] | DataManager.SOLVER_FLAGS["second_order_rg_equations"]) == DataManager.SOLVER_FLAGS["include_Ga"]
-    ax_gauss.plot(gauss_duration[~gauss_good], gauss_phase[~gauss_good], "x")
-    ax_gauss.plot(gauss_duration[gauss_good], gauss_phase[gauss_good], "o")
+    ax_gauss.plot(gauss_duration[gauss_good], gauss_phase[gauss_good], "x")
+    ax_gauss.plot(gauss_duration[~gauss_good], gauss_phase[~gauss_good], "+")
     plt.show()
 
 
-- 
GitLab