Exemple #1
0
def fit_stage2_decay(det=None):
    f, d1, d2 = read_second_stage()
    f_min_idx = 0
    f_max_idx = np.argmax(f> 1E6)
    freqs = f.values[f_min_idx:f_max_idx]
    spice_volts = d1[f_min_idx:f_max_idx]

    mod1 = DigitalFilter(1)
    # mod2 = DigitalFilter(2)
    mod1.num = [1,-1]
    # mod2.num = [1]

    if det is not None:
        det.AddDigitalFilter(mod1)

    def get_filter(mag):
        mag = 1 - 10**mag
        ws = freqs *(np.pi /  0.5E9)

        mod1.set_poles(mag)
        h1 = get_freqz(mod1, w = ws )

        return np.abs(h1)

    res = optimize.minimize(lsq, [-3], method="L-BFGS-B", args=(get_filter, spice_volts), bounds=[(-8,-1)])

    v = get_filter(*res["x"])

    f,ax = plt.subplots(2,1, sharex=True)
    ax[0].semilogx(freqs, db(spice_volts), label="EAGLE")
    ax[0].semilogx(freqs, db( v ), label="4th order best fit")
    ax[1].plot(freqs, db(spice_volts)-db( v ))

    plt.legend()
Exemple #2
0
def skew():

    lowpass = DigitalFilter(2)
    lowpass.num = [1, 2, 1]
    lowpass.set_poles(0.975, 0.007)

    hipass = DigitalFilter(2)
    hipass.num = [1, -2, 1]
    hipass.set_poles(1. - 10.**-7, np.pi**-13.3)

    det.AddDigitalFilter(lowpass)
    det.AddDigitalFilter(hipass)

    wf_proc = np.copy(
        det.MakeSimWaveform(25, 0, 25, 1, 125, 0.95, 1000, smoothing=25))
    wf_compare = np.copy(wf_proc)

    f, ax = plt.subplots(2, 1, figsize=(15, 8), sharex=True)
    ax[0].plot(wf_compare, color="r")

    overshoot = GretinaOvershootFilter(1)
    overshoot.num, overshoot.den = rc_decay(1.7, 1E9)
    det.AddDigitalFilter(overshoot)

    for frac in np.linspace(0.01, 0.05, 5):
        overshoot.overshoot_frac = frac
        wf_proc = np.copy(
            det.MakeSimWaveform(25, 0, 25, 1, 125, 0.95, 1000, smoothing=25))

        ax[0].plot(wf_proc)
        ax[1].plot(wf_proc - wf_compare)

    plt.show()
Exemple #3
0
def fit_second_stage_lowpass(det=None):
    f, d1, d2 = read_second_stage()

    f_min_idx = np.argmax(f > 10**6)
    f_max_idx = np.argmax(f > 5E8)
    freqs = f.values[f_min_idx:f_max_idx]
    spice_volts = d1[f_min_idx:f_max_idx]

    mod1 = DigitalFilter(2)
    mod2 = DigitalFilter(1)
    # mod1.num = [1,1,0]
    # mod2.num = [1]

    if det is not None:
        det.AddDigitalFilter(mod1)
        # det.AddDigitalFilter(mod2)

    def get_filter(
        mag,
        phi,
        zmag,
        zphi,
    ):
        ws = freqs * (np.pi / 0.5E9)

        mag = 1 - 10**mag
        zmag = 1 - 10**zmag
        mod1.set_zeros(zmag, zphi)
        # mod1.num=[1,0.]
        mod1.set_poles(mag, phi)

        # mod2.set_zeros(zmag2)
        # mag2 = 1-10**mag2
        # zmag2 = 1-10**zmag2
        # mod2.set_poles(mag2)

        h1 = get_freqz(mod1, w=ws)
        # h2 = get_freqz(mod2, w = ws )
        h2 = 1

        return np.abs(h1 * h2)

    res = optimize.minimize(lsq, [-2, 0.1, -2, 0.1],
                            method="L-BFGS-B",
                            args=(get_filter, spice_volts),
                            bounds=[(-8, 0), (0, np.pi), (-8, 0), (0, np.pi)])

    v = get_filter(*res["x"])
    print(res["x"])
    print(mod1.num)

    f, ax = plt.subplots(2, 1, sharex=True)
    ax[0].semilogx(freqs, db(spice_volts), label="EAGLE")
    ax[0].semilogx(freqs, db(v), label="3rd order filter")
    ax[1].plot(freqs, db(spice_volts) - db(v))

    ax[0].legend()
Exemple #4
0
def main():

    df = pd.read_csv("front_end_1k_to_1g.txt", sep="\s+")

    f = df.frequency
    f_min_idx = np.argmax(df.frequency > 10**6)
    # f_max_idx = -1
    f_max_idx = np.argmax(df.frequency > 5E8)

    freqs = df.frequency.values[f_min_idx:f_max_idx]
    volts = df.vm[f_min_idx:f_max_idx]/df.vm.max()

    mod1 = DigitalFilter(2)
    mod2 = DigitalFilter(2)
    mod1.num = [1,1]
    mod2.num = [1]

    def get_filter(mag, phi):
        ws = freqs *(np.pi /  0.5E9)

        mod1.set_poles(mag, phi)
        mod2.set_poles(mag, phi)

        h1 = get_freqz(mod1, w = ws )
        h2 = get_freqz(mod2, w = ws)

        return np.abs(h1)*np.abs(h2)

    def min_func(x):
        v = get_filter(*x)

        return np.sum((volts-v)**2)

    res = optimize.minimize(min_func, [0.9, 0.1*np.pi], method="L-BFGS-B", bounds=[(0,1), (0,np.pi)])

    v = get_filter(*res["x"])
    print(res["x"])

    # plt.figure()
    f,ax = plt.subplots(2,1, sharex=True)
    ax[0].semilogx(freqs, db(volts), label="EAGLE")
    ax[0].semilogx(freqs, db( v ), label="4th order best fit")
    ax[1].plot(freqs, db(volts)-db( v ))

    plt.legend()
    plt.show()
Exemple #5
0
def fit_digitizer(det=None):
    f, d1, d2 = read_digitzer()
    f_min_idx = np.argmax(f > 10**6)
    f_max_idx = np.argmax(f> 5E8)
    freqs = f.values[f_min_idx:f_max_idx]
    spice_volts = d1[f_min_idx:f_max_idx]

    mod1 = DigitalFilter(2)
    mod2 = DigitalFilter(2)
    mod1.num = [1,1]
    mod2.num = [1]

    if det is not None:
        det.AddDigitalFilter(mod1)
        det.AddDigitalFilter(mod2)

    def get_filter(mag, phi):
        ws = freqs *(np.pi /  0.5E9)

        mod1.set_poles(mag, phi)
        mod2.set_poles(mag, phi)

        h1 = get_freqz(mod1, w = ws )
        h2 = get_freqz(mod2, w = ws)

        return np.abs(h1)*np.abs(h2)

    res = optimize.minimize(lsq, [0.9, 0.1*np.pi], method="L-BFGS-B", args=(get_filter, spice_volts), bounds=[(0,1), (0,np.pi)])

    v = get_filter(*res["x"])
    print(res["x"])

    f,ax = plt.subplots(2,1, sharex=True)
    ax[0].semilogx(freqs, db(spice_volts), label="EAGLE")
    ax[0].semilogx(freqs, db( v ), label="4th order best fit")
    ax[1].plot(freqs, db(spice_volts)-db( v ))

    plt.legend()
Exemple #6
0
def fit_stage2_decay(det=None):
    f, d1, d2 = read_second_stage()
    f_min_idx = 0
    f_max_idx = np.argmax(f > 1E6)
    freqs = f.values[f_min_idx:f_max_idx]
    spice_volts = d1[f_min_idx:f_max_idx]

    mod1 = DigitalFilter(1)
    # mod2 = DigitalFilter(2)
    mod1.num = [1, -1]
    # mod2.num = [1]

    if det is not None:
        det.AddDigitalFilter(mod1)

    def get_filter(mag):
        mag = 1 - 10**mag
        ws = freqs * (np.pi / 0.5E9)

        mod1.set_poles(mag)
        h1 = get_freqz(mod1, w=ws)

        return np.abs(h1)

    res = optimize.minimize(lsq, [-3],
                            method="L-BFGS-B",
                            args=(get_filter, spice_volts),
                            bounds=[(-8, -1)])

    v = get_filter(*res["x"])

    f, ax = plt.subplots(2, 1, sharex=True)
    ax[0].semilogx(freqs, db(spice_volts), label="EAGLE")
    ax[0].semilogx(freqs, db(v), label="4th order best fit")
    ax[1].plot(freqs, db(spice_volts) - db(v))

    plt.legend()
Exemple #7
0
def plot_pulser():
    from waffle.models import PulserGenerator
    from siggen.electronics import DigitalFilter

    pg = PulserGenerator(1000)

    lowpass = DigitalFilter(2)
    lowpass.num = [1, 2, 1]
    lowpass.set_poles(0.975, 0.007)

    hipass = DigitalFilter(1)
    hipass.num, hipass.den = rc_decay(82, 1E9)

    pg.digital_filters.append(lowpass)
    pg.digital_filters.append(hipass)

    pg.energy = 1000
    p = pg.make_pulser(50, 500, 250)

    plt.figure()
    plt.plot(p)
    plt.show()
Exemple #8
0
def main():

    df = pd.read_csv("front_end_1k_to_1g.txt", sep="\s+")

    f = df.frequency
    f_min_idx = np.argmax(df.frequency > 10**6)
    # f_max_idx = -1
    f_max_idx = np.argmax(df.frequency > 5E8)

    freqs = df.frequency.values[f_min_idx:f_max_idx]
    volts = df.vm[f_min_idx:f_max_idx] / df.vm.max()

    mod1 = DigitalFilter(2)
    mod2 = DigitalFilter(2)
    mod1.num = [1, 1]
    mod2.num = [1]

    def get_filter(mag, phi):
        ws = freqs * (np.pi / 0.5E9)

        mod1.set_poles(mag, phi)
        mod2.set_poles(mag, phi)

        h1 = get_freqz(mod1, w=ws)
        h2 = get_freqz(mod2, w=ws)

        return np.abs(h1) * np.abs(h2)

    def min_func(x):
        v = get_filter(*x)

        return np.sum((volts - v)**2)

    res = optimize.minimize(min_func, [0.9, 0.1 * np.pi],
                            method="L-BFGS-B",
                            bounds=[(0, 1), (0, np.pi)])

    v = get_filter(*res["x"])
    print(res["x"])

    # plt.figure()
    f, ax = plt.subplots(2, 1, sharex=True)
    ax[0].semilogx(freqs, db(volts), label="EAGLE")
    ax[0].semilogx(freqs, db(v), label="4th order best fit")
    ax[1].plot(freqs, db(volts) - db(v))

    plt.legend()
    plt.show()
Exemple #9
0
def fit_digitizer(det=None):
    f, d1, d2 = read_digitzer()
    f_min_idx = np.argmax(f > 10**6)
    f_max_idx = np.argmax(f > 5E8)
    freqs = f.values[f_min_idx:f_max_idx]
    spice_volts = d1[f_min_idx:f_max_idx]

    mod1 = DigitalFilter(2)
    mod2 = DigitalFilter(2)
    mod1.num = [1, 1]
    mod2.num = [1]

    if det is not None:
        det.AddDigitalFilter(mod1)
        det.AddDigitalFilter(mod2)

    def get_filter(mag, phi):
        ws = freqs * (np.pi / 0.5E9)

        mod1.set_poles(mag, phi)
        mod2.set_poles(mag, phi)

        h1 = get_freqz(mod1, w=ws)
        h2 = get_freqz(mod2, w=ws)

        return np.abs(h1) * np.abs(h2)

    res = optimize.minimize(lsq, [0.9, 0.1 * np.pi],
                            method="L-BFGS-B",
                            args=(get_filter, spice_volts),
                            bounds=[(0, 1), (0, np.pi)])

    v = get_filter(*res["x"])
    print(res["x"])

    f, ax = plt.subplots(2, 1, sharex=True)
    ax[0].semilogx(freqs, db(spice_volts), label="EAGLE")
    ax[0].semilogx(freqs, db(v), label="4th order best fit")
    ax[1].plot(freqs, db(spice_volts) - db(v))

    plt.legend()
Exemple #10
0
def overshoot(det):
    '''
    How do I get me a decaying overshoot?
    '''

    lowpass = DigitalFilter(2)
    lowpass.num = [1, 2, 1]
    lowpass.set_poles(0.975, 0.007)

    hipass = DigitalFilter(1)
    hipass.num, hipass.den = rc_decay(82, 1E9)

    det.AddDigitalFilter(lowpass)
    # det.AddDigitalFilter(hipass)

    wf_proc = np.copy(
        det.MakeSimWaveform(25, 0, 25, 1, 125, 0.95, wf_length, smoothing=20))
    wf_compare = np.copy(wf_proc)

    f, ax = plt.subplots(2, 2, figsize=(15, 8))
    # plt.figure()
    ax[0, 0].plot(wf_compare, color="r")
    cmap = cm.get_cmap('viridis')

    new_filt = DigitalFilter(1)
    det.AddDigitalFilter(new_filt)

    p_mags = 1 - np.logspace(-4, -2, 100, base=10)
    z_mags = 1 - np.logspace(-4, -2, 20, base=10)

    for zero_mag in [5E-4]:  #z_mags:
        for pole_mag in np.logspace(-7, -5, 100, base=10):  #p_mags:
            zero_mag = 1 - zero_mag
            pole_mag = zero_mag - pole_mag

            if zero_mag == pole_mag: continue

            color = "b"
            # color = cmap( (mag2 - mags[0])/(mags[-1] - mags[0]) )
            new_filt.set_zeros(zero_mag, 0)
            new_filt.set_poles(pole_mag, 0)

            # print (new_filt.num, np.sum(new_filt.num))
            # print (new_filt.den, np.sum(new_filt.den))
            # exit()

            wf_proc = np.copy(
                det.MakeSimWaveform(25,
                                    0,
                                    25,
                                    1,
                                    125,
                                    0.95,
                                    1000,
                                    smoothing=20))

            try:
                if wf_proc[155] < 1.00001: continue
                if np.amax(wf_proc) > 1.1: continue
                print(zero_mag, pole_mag)
                p = ax[0, 0].plot(wf_proc)
                color = p[0].get_color()
                ax[1, 0].plot(wf_proc - wf_compare, color=color)
            except (TypeError, IndexError) as e:
                continue

            w, h2 = get_freq_resp(new_filt,
                                  w=np.logspace(-15, 0, 500, base=np.pi))
            ax[0, 1].loglog(w, h2, color=color)

            p[0] = ax[1, 1].scatter(zero_mag, 0, color=color)
            ax[1, 1].scatter(pole_mag, 0, color=color, marker="x")
            an = np.linspace(0, np.pi, 200)
            ax[1, 1].plot(np.cos(an), np.sin(an), c="k")
            ax[1, 1].plot(np.cos(an), -np.sin(an), c="k")
            ax[1, 1].axis("equal")

    plt.show()
Exemple #11
0
def two_rc(det):
    '''
    WHATS IT LOOK LIKE WITH A 72 US AND 2 MS DECAY?
    '''

    lowpass = DigitalFilter(2)
    lowpass.num = [1, 2, 1]
    lowpass.set_poles(0.975, 0.007)

    hipass = DigitalFilter(1)
    hipass.num, hipass.den = rc_decay(82, 1E9)

    det.AddDigitalFilter(lowpass)
    det.AddDigitalFilter(hipass)

    wf_proc = np.copy(
        det.MakeSimWaveform(25, 0, 25, 1, 125, 0.95, wf_length, smoothing=20))
    wf_compare = np.copy(wf_proc)

    f, ax = plt.subplots(2, 1, figsize=(15, 8))
    ax[0].plot(wf_compare, color="r")

    # hipass2 = DigitalFilter(1)
    # hipass2.num, hipass2.den = rc_decay(2000, 1E9)
    # hipass.num, hipass.den = rc_decay(74.75, 1E9)
    # det.AddDigitalFilter(hipass2)

    mag = 1. - 10.**-5.22
    phi = np.pi**-13.3
    det.RemoveDigitalFilter(hipass)
    hipass = DigitalFilter(2)
    hipass.num = [1, -2, 1]
    hipass.set_poles(mag, phi)
    det.AddDigitalFilter(hipass)

    wf_proc = np.copy(
        det.MakeSimWaveform(25, 0, 25, 1, 125, 0.95, wf_length, smoothing=20))

    ax[0].plot(wf_proc, color="g")
    ax[1].plot(wf_compare - wf_proc, color="g")

    plt.show()
    exit()
Exemple #12
0
def poles(det):

    lowpass = DigitalFilter(2)
    lowpass.num = [1, 2, 1]
    lowpass.set_poles(0.975, 0.007)

    mag = 1. - 10.**-7
    phi = np.pi**-13.3

    hipass = DigitalFilter(2)
    hipass.num = [1, -2, 1]
    hipass.set_poles(mag, phi)

    det.AddDigitalFilter(lowpass)
    det.AddDigitalFilter(hipass)

    wf_proc = np.copy(
        det.MakeSimWaveform(25, 0, 25, 1, 125, 0.95, 1000, smoothing=20))
    wf_compare = np.copy(wf_proc)

    f, ax = plt.subplots(2, 2, figsize=(15, 8))
    ax[0, 0].plot(wf_compare, color="r")

    cmap = cm.get_cmap('viridis')

    phis = np.logspace(-20, -8, 100, base=np.pi)
    mags = 1 - np.logspace(-7.5, -6.5, 100, base=10)
    # phis = np.pi - phis

    w, h = get_freq_resp(hipass)
    ax[0, 1].loglog(w, h, color="r")

    # for phi2 in phis:
    # color = cmap( (phi2 - phis[0])/(phis[-1] - phis[0]) )
    # mag2=mag
    for mag2 in mags:
        phi2 = phi
        color = cmap((mag2 - mags[0]) / (mags[-1] - mags[0]))

        hipass.set_poles(mag2, phi2)

        wf_proc = np.copy(
            det.MakeSimWaveform(25, 0, 25, 1, 125, 0.95, 1000, smoothing=20))

        try:
            ax[0, 0].plot(wf_proc,
                          label="{}, {}".format(phi, mag),
                          color=color)
            ax[1, 0].plot(wf_proc - wf_compare,
                          label="{}, {}".format(phi, mag),
                          color=color)
        except TypeError:
            continue

        w, h2 = get_freq_resp(hipass)
        ax[0, 1].loglog(w, h2, color=color)

    # plt.legend()
    plt.show()
Exemple #13
0
def oscillation(det):
    '''
    How do I get me a decaying oscillation?
    '''

    lowpass = DigitalFilter(2)
    lowpass.num = [1, 2, 1]
    lowpass.set_poles(0.975, 0.007)

    hipass = DigitalFilter(1)
    hipass.num, hipass.den = rc_decay(82, 1E9)

    det.AddDigitalFilter(lowpass)
    # det.AddDigitalFilter(hipass)

    wf_proc = np.copy(
        det.MakeSimWaveform(25, 0, 25, 1, 125, 0.95, wf_length, smoothing=20))
    wf_compare = np.copy(wf_proc)

    f, ax = plt.subplots(2, 2, figsize=(15, 8))
    # plt.figure()
    ax[0, 0].plot(wf_compare, color="r")
    cmap = cm.get_cmap('viridis')

    new_filt = DigitalFilter(2)
    det.AddDigitalFilter(new_filt)
    new_filt.num = [1, 2, 1]

    p_mags = 1 - np.logspace(-3, -2, 20, base=10)
    p_phis = [0.5 * np.pi**-3]
    # p_phis = np.logspace(-5, 1, 4, base=np.pi)
    # z_mags = 1 - np.logspace(-4, -2, 20, base=10)

    pole_phi = 0.5 * np.pi**-3
    pole_mag = 0.995

    for i in range(3):

        # for pole_phi in p_phis:
        #     for pole_mag in p_mags:
        # zero_mag = 1-zero_mag
        # pole_mag = zero_mag + pole_mag
        # if zero_mag == pole_mag: continue

        color = get_color(cmap, pole_mag, p_mags)
        if i == 0:
            color = "k"
        elif i == 1:
            new_filt.set_zeros(0.99, 0.01)
            color = "b"
        elif i == 2:
            new_filt.set_zeros(0.995, 0.001)
            color = "g"
        new_filt.set_poles(pole_mag, pole_phi)

        # print (new_filt.num, np.sum(new_filt.num))
        # print (new_filt.den, np.sum(new_filt.den))
        # exit()

        wf_proc = np.copy(
            det.MakeSimWaveform(25, 0, 25, 1, 125, 0.95, 1000, smoothing=20))

        try:
            # if wf_proc[155] < 1.00001: continue
            # # if np.amax(wf_proc) > 1.1: continue
            # print( zero_mag, pole_mag)
            p = ax[0, 0].plot(wf_proc, color=color)
            # color = p[0].get_color()
            ax[1, 0].plot(wf_proc - wf_compare, color=color)
        except (TypeError, IndexError) as e:
            continue

        w, h2 = get_freq_resp(new_filt, w=np.logspace(-15, 0, 500, base=np.pi))
        ax[0, 1].loglog(w, h2, color=color)
        ax[0, 1].axvline(pole_phi / (np.pi / nyq_freq))

        # p[0] = ax[1,1].scatter(zero_mag, 0, color=color)
        ax[1, 1].scatter(pole_mag * np.cos(pole_phi),
                         pole_mag * np.sin(pole_phi),
                         color=color,
                         marker="x")
        an = np.linspace(0, np.pi, 200)
        ax[1, 1].plot(np.cos(an), np.sin(an), c="k")
        ax[1, 1].plot(np.cos(an), -np.sin(an), c="k")
        ax[1, 1].axis("equal")

    plt.show()
Exemple #14
0
def aliasing_filter(det):
    '''
    We know there's a 1-pole antialiasing filter at ~1/(2 * 49.9 * 33E-12) Hz
    How big a difference should that make?
    '''

    lowpass = DigitalFilter(2)
    lowpass.num = [1,2,1]
    lowpass.set_poles(0.975, 0.007)

    hipass = DigitalFilter(1)
    hipass.num, hipass.den = rc_decay(72, 1E9)

    det.AddDigitalFilter(lowpass)
    det.AddDigitalFilter(hipass)

    wf_proc = np.copy(det.MakeSimWaveform(25, 0, 25, 1, 125, 0.95, wf_length, smoothing=20))
    wf_compare = np.copy(wf_proc)

    f, ax = plt.subplots(2,1,figsize=(15,8))
    ax[0].plot (wf_compare,  color="r")

    lopass2 = DigitalFilter(1)
    lopass2.num = [1,1]
    rc = (2 * 49.9 * 33E-12)
    lopass2.den = [1, -np.exp( -1./rc/1E9)]
    det.AddDigitalFilter(lopass2)

    wf_proc = np.copy(det.MakeSimWaveform(25, 0, 25, 1, 125, 0.95, wf_length, smoothing=20))

    ax[0].plot (wf_proc,  color="g")
    ax[1].plot (wf_compare-wf_proc,  color="g")

    plt.show()
    exit()