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
Beispiel #2
0
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
Beispiel #3
0
    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 
Beispiel #5
0
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