def plot_jitter(x1, y1, x2, y2, name, scale = 1e9): """Calc and plot jitter of pulse pairs""" sep, jitter, jittErr = calc.calcJitter(x1, y1, x2, y2) bins = np.arange((sep-8*jitter)*scale, (sep+8*jitter)*scale, (jitter/5.)*scale) hist = ROOT.TH1D("%s" % name,"%s" % name, len(bins), bins[0], bins[-1]) hist.SetTitle("Jitter between signal and trigger out") hist.GetXaxis().SetTitle("Pulse separation (ns)") p1 = calc.positive_check(y1) p2 = calc.positive_check(y2) for i in range(len(y1[:,0])-1): m1 = calc.calcSinglePeak(p1, y1[i,:]) m2 = calc.calcSinglePeak(p2, y2[i,:]) time_1 = calc.interpolate_threshold(x1, y1[i,:], 0.1*m1, rise=p1) time_2 = calc.interpolate_threshold(x2, y2[i,:], 0.1*m2, rise=p2) hist.Fill((time_1 - time_2)*scale) return hist, jitter, jittErr
def plot_jitter(x1, y1, x2, y2, name, scale=1e9): """Calc and plot jitter of pulse pairs""" sep, jitter, jittErr = calc.calcJitter(x1, y1, x2, y2) bins = np.arange((sep - 8 * jitter) * scale, (sep + 8 * jitter) * scale, (jitter / 5.) * scale) hist = ROOT.TH1D("%s" % name, "%s" % name, len(bins), bins[0], bins[-1]) hist.SetTitle("Jitter between signal and trigger out") hist.GetXaxis().SetTitle("Pulse separation (ns)") p1 = calc.positive_check(y1) p2 = calc.positive_check(y2) for i in range(len(y1[:, 0]) - 1): m1 = calc.calcSinglePeak(p1, y1[i, :]) m2 = calc.calcSinglePeak(p2, y2[i, :]) time_1 = calc.interpolate_threshold(x1, y1[i, :], 0.1 * m1, rise=p1) time_2 = calc.interpolate_threshold(x2, y2[i, :], 0.1 * m2, rise=p2) hist.Fill((time_1 - time_2) * scale) return hist, jitter, jittErr
runs = [1, 2, 3, 4, 5] for i in runs: run = "run_%i" % i fileName = "%s%s.pkl" % (dataPath, run) # Read data fileRead = time.time() x1, y1 = calc.readPickleChannel(fileName, 1) x2, y2 = calc.readPickleChannel(fileName, 2) print "Reading %d pulses from %s took %1.2f s" % (len( y1[:, 0]), fileName, (time.time() - fileRead)) # Calculate and print parameters calc.printParams(x1, y1, "Trigger") calc.printParams(x2, y2, "Signal") separation, Jitter, JittErr = calc.calcJitter(x1, y1, x2, y2) print "\nJitter = %1.2f +/- %1.2f ps\n" % (Jitter * 1e12, JittErr * 1e12) print "Reading + calcs on %d pulses from file took %1.2f s" % (len( y1[:, 0]), (time.time() - fileRead)) plot_eg_pulses(x1, y1, x2, y2, 5, fname="results/plots/EgPulses_%s.png" % run) plot_trig_sig_ph_corr(y1, y2, fname="results/plots/PH_corr_%s.png" % run)
def sweep_timing(dir_out,box,channel,width,delay,scope,min_volt=None): """Perform a measurement using a default number of pulses, with user defined width, channel and rate settings. """ print '____________________________' print width #fixed options height = 16383 fibre_delay = 0 trigger_delay = 0 pulse_number = 11100 #first select the correct channel and provide settings logical_channel = (box-1)*8 + channel sc.select_channel(logical_channel) sc.set_pulse_width(width) sc.set_pulse_height(16383) sc.set_pulse_number(pulse_number) sc.set_pulse_delay(delay) sc.set_fibre_delay(fibre_delay) sc.set_trigger_delay(trigger_delay) # first, run a single acquisition with a forced trigger, effectively to clear the waveform scope._connection.send("trigger:state ready") time.sleep(0.1) scope._connection.send("trigger force") time.sleep(0.1) # Get pin read time.sleep(0.1) sc.fire_sequence() # previously fire_sequence! #wait for the sequence to end tsleep = pulse_number * (delay*1e-3 + 210e-6) time.sleep(tsleep) #add the offset in sc.stop() # File system stuff check_dir("%s/raw_data/" % (dir_out)) directory = check_dir("%s/raw_data/Channel_%02d/" % (dir_out,logical_channel)) channels = [1,4] fnames = [] fnames.append("%sPMTPulseWidth%05d" % (directory,width)) fnames.append("%sTriggerPulseWidth%05d" % (directory,width)) # Check scope ck = find_and_set_scope_y_scale(1,height,width,delay,scope,scaleGuess=min_volt) scope.set_edge_trigger(1.4, 4 , falling=False) # Rising edge trigger if ck == True: print "Saving raw files to: %s and %s" % (fnames[0],fnames[1]) sc.fire_continuous() time.sleep(0.2) save_ck = save_scopeTraces_Multiple(fnames, scope, channels, 100) sc.stop() time.sleep(5) if save_ck == True: # Calc and return params xPMT,yPMT = calc.readPickleChannel(fnames[0], 1) xTrigger,yTrigger = calc.readPickleChannel(fnames[1], 1) meanJitter, JitterDev, JitterErrorOnMean = calc.calcJitter(xTrigger,yTrigger,xPMT,yPMT) return meanJitter, JitterErrorOnMean
def sweep_timing(dir_out, box, channel, width, delay, scope, min_volt=None): """Perform a measurement using a default number of pulses, with user defined width, channel and rate settings. """ print '____________________________' print width #fixed options height = 16383 fibre_delay = 0 trigger_delay = 0 pulse_number = 11100 #first select the correct channel and provide settings logical_channel = (box - 1) * 8 + channel sc.select_channel(logical_channel) sc.set_pulse_width(width) sc.set_pulse_height(16383) sc.set_pulse_number(pulse_number) sc.set_pulse_delay(delay) sc.set_fibre_delay(fibre_delay) sc.set_trigger_delay(trigger_delay) # first, run a single acquisition with a forced trigger, effectively to clear the waveform scope._connection.send("trigger:state ready") time.sleep(0.1) scope._connection.send("trigger force") time.sleep(0.1) # Get pin read time.sleep(0.1) sc.fire_sequence() # previously fire_sequence! #wait for the sequence to end tsleep = pulse_number * (delay * 1e-3 + 210e-6) time.sleep(tsleep) #add the offset in sc.stop() # File system stuff check_dir("%s/raw_data/" % (dir_out)) directory = check_dir("%s/raw_data/Channel_%02d/" % (dir_out, logical_channel)) channels = [1, 4] fnames = [] fnames.append("%sPMTPulseWidth%05d" % (directory, width)) fnames.append("%sTriggerPulseWidth%05d" % (directory, width)) # Check scope ck = find_and_set_scope_y_scale(1, height, width, delay, scope, scaleGuess=min_volt) scope.set_edge_trigger(1.4, 4, falling=False) # Rising edge trigger if ck == True: print "Saving raw files to: %s and %s" % (fnames[0], fnames[1]) sc.fire_continuous() time.sleep(0.2) save_ck = save_scopeTraces_Multiple(fnames, scope, channels, 100) sc.stop() time.sleep(5) if save_ck == True: # Calc and return params xPMT, yPMT = calc.readPickleChannel(fnames[0], 1) xTrigger, yTrigger = calc.readPickleChannel(fnames[1], 1) meanJitter, JitterDev, JitterErrorOnMean = calc.calcJitter( xTrigger, yTrigger, xPMT, yPMT) return meanJitter, JitterErrorOnMean