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()
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()
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()
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()
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()
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()
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()
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()
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()
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()
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()
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()
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()
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()