Exemplo n.º 1
0
def fit_single_esc_varying_width(show_figs=True) -> List[go.Figure]:
    """Fits transition with varying width based on temperature at a single ESC"""
    global dats_by_coupling_gate
    dats = dats_by_coupling_gate[-260]
    dats = U.order_list(dats, [dat.Logs.temps.mc for dat in dats])
    figs = []
    for dat, w in progressbar(zip(dats, [20, 30, 50, 100, 200])):
        save_name = 'varying_width'
        do_transition_only_calc(dat.datnum, save_name=save_name, theta=None, gamma=0, width=w,
                                t_func_name='i_sense')
        plotter = OneD(dat=dat)
        fig = plotter.figure(title=f'Dat{dat.datnum}: I_sense at {dat.Logs.temps.mc * 1000:.0f}mK',
                             ylabel='Current /nA')
        fig.add_trace(plotter.trace(data=dat.Transition.avg_data, x=dat.Transition.avg_x, mode='lines', name='Data'))
        fig.add_trace(plotter.trace(data=dat.Transition.get_fit(name=save_name).eval_fit(x=dat.Transition.avg_x),
                                    x=dat.Transition.avg_x, mode='lines', name='Fit'))
        [plotter.add_line(fig, value=xx, mode='vertical', color='black', linetype='dash') for xx in [w, -w]]
        if show_figs:
            fig.show()
        figs.append(fig)
        w_theta = dat.Transition.get_fit(name="simple").best_values.theta
        n_theta = dat.Transition.get_fit(name=save_name).best_values.theta
        print(f'Temp {dat.Logs.temps.mc * 1000:.0f}mK:\n'
              f'Wide Theta: {w_theta:.2f}mV\n'
              f'Narrow Theta: {n_theta:.2f}mV\n'
              f'Change: {(n_theta - w_theta) / w_theta * 100:.2f}%\n'
              )

    return figs
Exemplo n.º 2
0
            fig_minus = plotter.figure(
                title=
                f'Dat{dat.datnum}: Transition Data minus Fit (width={fit_width})'
                + title_row_2,
                ylabel=f'{C.DELTA}{y_label}')
            fig_minus.add_trace(
                single_transition_trace(dat,
                                        label=None,
                                        subtract_fit=True,
                                        fit_name=fit_name,
                                        transition_only=transition_only,
                                        se_output_name=save_name,
                                        csq_mapped=csq_map))

            for fig in [fig_minus, fig_fit]:
                plotter.add_line(fig, value=fit_width, mode='vertical')
                plotter.add_line(fig, value=-fit_width, mode='vertical')

            if fit_func == 'i_sense_digamma_amplin':
                add_print = f'\tGamma: {fit.best_values.g:.1f}mV\n' + \
                            f'\tAmpLin: {fit.best_values.get("amplin", 0):.3g}{y_units}/mV\n'
            elif fit_func == 'i_sense_digamma':
                add_print = f'\tGamma: {fit.best_values.g:.1f}mV\n'
            else:
                add_print = ''

            print(f'Dat{dat.datnum}:\n'
                  f'\tWidth: {C.PM}{fit_width}mV\n'
                  f'\tAmp: {fit.best_values.amp:.3f}{y_units}\n'
                  f'\tTheta: {fit.best_values.theta:.2f}mV\n'
                  f'\tLin: {fit.best_values.lin:.3g}{y_units}/mV\n'
Exemplo n.º 3
0
    def one_d(self, invert_fit_on_data=False) -> go.Figure:
        """

        Args:
            invert_fit_on_data (): False to modify NRG to fit data, True to modify Data to fit NRG

        Returns:

        """
        plotter = OneD(dat=None)
        title_prepend = f'NRG fit to Data' if not invert_fit_on_data else 'Data fit to NRG'
        title_append = f' -- Dat{self.datnum}' if self.datnum else ''
        xlabel = 'Sweepgate /mV' if not invert_fit_on_data else 'Ens*1000'
        ylabel = 'Current /nA' if not invert_fit_on_data else '1-Occupation'
        fig = plotter.figure(xlabel=xlabel, ylabel=ylabel, title=f'{title_prepend}: G={self.g:.2f}mV, '
                                                                 f'{THETA}={self.theta:.2f}mV, '
                                                                 f'{THETA}/G={self.theta / self.g:.2f}'
                                                                 f'{title_append}')
        min_, max_ = 0, 1
        if self.datnum:
            x_for_nrg = None
            for i, which in enumerate(self.which):
                x, data = _get_x_and_data(self.datnum, self.experiment_name, which)
                x_for_nrg = x
                if invert_fit_on_data is True:
                    x, data = invert_nrg_fit_params(x, data, gamma=self.g, theta=self.theta, mid=self.mid, amp=self.amp,
                                                    lin=self.lin, const=self.const, occ_lin=self.occ_lin,
                                                    data_type=which)
                if i == 0 and data is not None:
                    min_, max_ = np.nanmin(data), np.nanmax(data)
                    fig.add_trace(plotter.trace(x=x, data=data, name=f'Data - {which}', mode='lines'))
                else:
                    if data is not None:
                        scaled = scale_data(data, min_, max_)
                        fig.add_trace(
                            plotter.trace(x=x, data=scaled.scaled_data, name=f'Scaled Data - {which}', mode='lines'))
                        if min_ - (max_ - min_) / 10 < scaled.new_zero < max_ + (max_ - min_) / 10:
                            plotter.add_line(fig, scaled.new_zero, mode='horizontal', color='black',
                                             linetype='dot', linewidth=1)
        else:
            x_for_nrg = np.linspace(-100, 100, 1001)

        for i, which in enumerate(self.which):
            if which == 'i_sense_cold':
                which = 'i_sense'
            elif which == 'i_sense_hot':
                if 'i_sense_cold' in self.which:
                    continue
                which = 'i_sense'
            nrg_func = NRG_func_generator(which=which)
            if invert_fit_on_data:
                # nrg_func(x, mid, gamma, theta, amp, lin, const, occ_lin)
                nrg_data = nrg_func(x_for_nrg, self.mid, self.g, self.theta, 1, 0, 0, 0)
                if which == 'i_sense':
                    nrg_data += 0.5  # 0.5 because that still gets subtracted otherwise
                # x = (x_for_nrg - self.mid - self.g*(-1.76567) - self.theta*(-1)) / self.g
                x = (x_for_nrg - self.mid) / self.g
            else:
                x = x_for_nrg
                nrg_data = nrg_func(x, self.mid, self.g, self.theta, self.amp, self.lin, self.const, self.occ_lin)
            cmin, cmax = np.nanmin(nrg_data), np.nanmax(nrg_data)
            if i == 0 and min_ == 0 and max_ == 1:
                fig.add_trace(plotter.trace(x=x, data=nrg_data, name=f'NRG {which}', mode='lines'))
                min_, max_ = cmin, cmax
            else:
                scaled = scale_data(nrg_data, min_, max_)
                fig.add_trace(plotter.trace(x=x, data=scaled.scaled_data, name=f'Scaled NRG {which}', mode='lines'))
                if min_ - (max_ - min_) / 10 < scaled.new_zero < max_ + (max_ - min_) / 10:
                    plotter.add_line(fig, scaled.new_zero, mode='horizontal', color='black',
                                     linetype='dot', linewidth=1)
        return fig