Ejemplo n.º 1
0
def overlayFilters(inRoot):
    sp1 = SignalProcessor()
    sp1.nSamples = 16384
    sp1.nAdcCh = 20
    sp1.fltParam.clear()
    sp1.x_thre = 0.1

    # sp3a
    for x in [30, 15, 50, 2500]:
        sp1.fltParam.push_back(x)
    #     for x in [50, 5, 15, 2500]: sp1.fltParam.push_back(x)

    # sp3b
    #     for x in [50, 500, 700, 2500]: sp1.fltParam.push_back(x)
    run = int(inRoot.rstrip('.root').split('_')[-1])

    data1 = array('f', [0] * (sp1.nSamples * sp1.nAdcCh))
    dataT = array('i', [0])

    fin1 = TFile(inRoot, 'read')
    tree1 = fin1.Get('tree1')
    tree1.SetBranchAddress('adc', data1)
    tree1.SetBranchAddress('T', dataT)

    oTag = 'flt_'
    fout1 = TFile(
        os.path.dirname(inRoot) + '/' + oTag + os.path.basename(inRoot),
        'recreate')
    tup1 = TNtuple('flt', "filter analysis tuple", 'run:evt:ch:ip:V')

    NPOINTS = 200

    ch = 19
    NEVT = tree1.GetEntries()
    for ievt in range(NEVT):
        tree1.GetEntry(ievt)

        sp1.measure_pulse2(data1, ch)

        for ip in range(NPOINTS):
            tup1.Fill(run, ievt, ch, ip, sp1.scrAry[ip])
    tup1.Write()
    fout1.Close()
Ejemplo n.º 2
0
def readSignal3(argX, runPattern='.*_data_(\d+).root'):
    args = argX.split(';')
    inRoot = args[0]
    oTag = args[1]
    print "Starting", inRoot, oTag

    ### pulse test
    dV = -1
    dvPattern = '.*_(\d+)mV_f\d+.root'
    m = re.match(dvPattern, inRoot)
    if m:
        try:
            dV = int(m.group(1))
        except ValueError:
            print "Failed to get the dV in file:", iRoot

    ### data check
    run = -1
    if runPattern is not None:
        m = re.match(runPattern, inRoot)
        if m:
            try:
                run = int(m.group(1))
            except ValueError:
                print "Run number not exatracted for file", iRoot
                return
        else:
            if dV < 0:
                print "Run number not exatracted for file", iRoot
                return

    sp1 = SignalProcessor()
    sp1.nSamples = 16384
    sp1.nAdcCh = 20
    sp1.fltParam.clear()
    #     for i in range(sp1.nAdcCh): sp1.ch_thre[i] = 0.002
    #     sp1.ch_thre[19] = 0.05
    thre = [0.002] * sp1.nAdcCh
    thre[2] = 0.0008
    thre[4] = 0.001
    thre[6] = 0.001
    thre[7] = 0.001
    thre[10] = 0.001
    thre[11] = 0.0007
    thre[14] = 0.0007
    thre[17] = 0.001
    thre[19] = 0.05

    sp1.ch_thre.clear()
    for x in thre:
        sp1.ch_thre.push_back(x)

    # sp3a
    #     for x in [30, 15, 50, 2500]: sp1.fltParam.push_back(x)
    #     flt = [50, 50, 250, 2500]
    #     flt = [50, 50, 150, -1]
    flt = [50, 100, 500, -1]  # dp01a
    #     flt = [30, 250, 350, 2500]
    #     flt = [50, 10, 150, 2500]
    #     flt = [50, 500, 600, 2500]
    #     flt = [50, 5, 100, 2500]
    for x in flt:
        sp1.fltParam.push_back(x)

    # sp3b
    #     for x in [50, 500, 700, 2500]: sp1.fltParam.push_back(x)

    data1 = array('f', [0] * (sp1.nSamples * sp1.nAdcCh))
    dataT = array('i', [0])

    fin1 = TFile(inRoot, 'read')
    tree1 = fin1.Get('tree1')
    tree1.SetBranchAddress('adc', data1)
    tree1.SetBranchAddress('T', dataT)

    fout1 = TFile(
        os.path.dirname(inRoot) + '/' + oTag + os.path.basename(inRoot),
        'recreate')
    tup1 = TNtuple('tup1', "filter analysis tuple",
                   'run:evt:ch:B:dB:iA:imean:imax:A:w0:w1:w2:T:dV')
    a = TObjString("filter:" + str(flt))
    a.Write('Info')

    ### for background subtraction
    be1 = bkgEstimator()

    #     chs = [19]
    chs = None
    for ievt in range(tree1.GetEntries()):
        tree1.GetEntry(ievt)

        #         apply_wiener_filter(data1, ich=19)
        #         be1.correct(data1, 19)

        sp1.measure_pulse2(data1)
        for ich in range(sp1.nAdcCh):
            if chs and (ich not in chs): continue
            #             print "processing channle", ich
            ss = sp1.signals[ich]

            itmp = sp1.nMeasParam * ich
            iA = 0
            for ii in ss:
                tup1.Fill(run, ievt, ich, sp1.measParam[itmp],
                          sp1.measParam[itmp + 1], iA, ii.im, ii.idx, ii.Q,
                          ii.w0, ii.w1, ii.w2, dataT[0] - 788947200, dV)
                iA += 1

    tup1.Write()
    fout1.Close()
Ejemplo n.º 3
0
def readSignal4c(argX, runPattern='.*_data_(\d+).root'):
    '''Based on readSignal4b; for single channel. And IO is from readSignal3'''
    args = argX.split(';')
    inRoot = args[0]
    oTag = args[1]
    print "Starting", inRoot, oTag

    ### pulse test
    dV = -1
    dvPattern = '.*_(\d+)mV_f\d+.root'
    m = re.match(dvPattern, inRoot)
    if m:
        try:
            dV = int(m.group(1))
        except ValueError:
            print "Failed to get the dV in file:", iRoot

    ### data check
    run = -1
    if runPattern is not None:
        m = re.match(runPattern, inRoot)
        if m:
            try:
                run = int(m.group(1))
            except ValueError:
                print "Run number not exatracted for file", iRoot
                return
        else:
            if dV < 0:
                print "Run number not exatracted for file", iRoot
                return

    sp1 = SignalProcessor()
    apply_config(sp1, 'Hydrogen')

    ### IO configuration
    data1 = array('f', [0] * (sp1.nSamples * sp1.nAdcCh))
    dataT = array('i', [0])

    fin1 = TFile(inRoot, 'read')
    tree1 = fin1.Get('tree1')
    tree1.SetBranchAddress('adc', data1)
    tree1.SetBranchAddress('T', dataT)

    fout1 = TFile(
        os.path.dirname(inRoot) + '/' + oTag + os.path.basename(inRoot),
        'recreate')
    tup1 = TNtuple('tup1', "filter analysis tuple",
                   'run:evt:ch:B:dB:iA:imean:imax:A:w0:w1:w2:T:dV')
    a = TObjString("filter:" + str(sp1.fltParam))
    a.Write('Info')

    chs = [0]
    chx = chs[0] if (chs and len(chs) == 1) else -1
    for ievt in range(tree1.GetEntries()):
        tree1.GetEntry(ievt)

        sp1.measure_pulse2(data1, chx)
        for ich in range(sp1.nAdcCh):
            if chs and (ich not in chs): continue
            ss = sp1.signals[ich]

            itmp = sp1.nMeasParam * ich
            iA = 0
            for ii in ss:
                tup1.Fill(run, ievt, ich, sp1.measParam[itmp],
                          sp1.measParam[itmp + 1], iA, ii.im, ii.idx, ii.Q,
                          ii.w0, ii.w1, ii.w2, dataT[0] - 788947200, dV)
                iA += 1

    tup1.Write()
    fout1.Close()
Ejemplo n.º 4
0
def check1b(argX,
            chs=None,
            nEvt=None,
            runPattern='.*_data_(\d+).root',
            step2=False):
    '''Use various filters to extract the results'''
    args = argX.split(';')
    inRoot = args[0]
    oTag = args[1]
    outRoot = os.path.dirname(inRoot) + '/' + oTag + os.path.basename(inRoot)
    #     outRoot = inRoot.rstrip('.root')+oTag+'.root'
    print "Starting", inRoot, '->', outRoot

    if os.path.exists(outRoot):
        print "has:", inRoot, outRoot
        return

    run = -1
    if runPattern is not None:
        m = re.match(runPattern, inRoot)
        if m: run = int(m.group(1))
        else: print "Run number not exatracted for file", iRoot

    sp1 = SignalProcessor()
    sp1.nSamples = 16384
    sp1.nAdcCh = 20

    testPulseOnly = False
    ### look for signal peak in the expected regions only
    if testPulseOnly:
        freq = 1000
        n1 = int(1 / (0.2 * freq * 0.000001))
        sp1.sRanges.clear()
        ip = 0
        dn = 2500 % n1  ## 2500 is the expected position of the signal
        while ip + dn < sp1.nSamples:
            sp1.sRanges.push_back((ip, min(ip + n1, sp1.nSamples)))
            ip += n1

    ### for storing data
    data1 = array('f', [0] * (sp1.nSamples * sp1.nAdcCh))
    dataT = array('i', [0])

    fin1 = TFile(inRoot, 'read')
    tree1 = fin1.Get('tree1')
    tree1.SetBranchAddress('adc', data1)
    tree1.SetBranchAddress('T', dataT)
    if nEvt is None: nEvt = tree1.GetEntries()
    if chs is None: chs = range(sp1.nAdcCh)
    ch = chs[0] if len(chs) == 1 else -1

    fout1 = TFile(outRoot, 'recreate')
    #     tup1 = TNtuple('tup1',"filter analysis tuple",'evt:fR:fW:ich:b:bE:im:idx:A')
    tup1 = TNtuple('tup1', "filter analysis tuple",
                   'run:evt:fR:fW:ch:B:dB:iA:imean:imax:A:w0:w1:w2:T')

    chs = [19]

    rRange = range(10, 200, 20)
    wRange = range(50, 300, 20)
    ### start processing
    INTV = 1000 if nEvt > 10000 else max(nEvt / 10, 1)
    for ievt in range(nEvt):
        tree1.GetEntry(ievt)
        if ievt % INTV == 0: print ievt, ' events processed'

        for R in rRange:
            for W in wRange:
                sp1.fltParam.clear()
                for x in [500, R, W, 2500.]:
                    sp1.fltParam.push_back(x)
                sp1.measure_pulse2(data1, ch)

                for ich in chs:
                    ss = sp1.signals[ich]

                    iA = 0
                    for ii in ss:
                        tup1.Fill(run, ievt, R, W, ich, 0, 0, iA, ii.im,
                                  ii.idx, ii.Q, ii.w0, ii.w1, ii.w2,
                                  dataT[0] - 788947200)
                        iA += 1
    tup1.Write()

    ### save the ENC results
    tup2 = TNtuple('tup2', "filter analysis tuple enc",
                   'ich:fR:fW:m:mE:sigma:sigmaE:fq:fStatus')
    for R in rRange:
        for W in wRange:
            for ich in chs:
                gDirectory.Delete('h1*')
                tup1.Draw(
                    'A>>h1',
                    'int(fW)=={0:d}&&int(fR)=={1:d}&&ch=={2:d}'.format(
                        W, R, ich), 'goff')
                h1 = gDirectory.Get('h1')
                r = h1.Fit('gaus', 'S0')
                fun1 = h1.GetFunction('gaus')
                tup2.Fill(ich, R, W, fun1.GetParameter(1), fun1.GetParError(1),
                          fun1.GetParameter(2), fun1.GetParError(2), r.Prob(),
                          r.Status())

    tup2.Write()
    fout1.Close()
Ejemplo n.º 5
0
def test2b():
    '''What?'''
    be1 = bkgEstimator()
    #     be1.show_data()

    s1 = SigProc(nSamples=16384, nAdcCh=20, nSdmCh=19, adcSdmCycRatio=5)
    data1 = (s1.ANALYSIS_WAVEFORM_BASE_TYPE * (s1.nSamples * s1.nAdcCh))()
    data1 = array('f', [0] * (16384 * 20))

    #     pTag = 'Feb09b'
    pTag = 'Feb25a'
    tagA = 'data/fpgaLin/' + pTag + '_data_'
    inRoot = 'data/fpgaLin/' + pTag + '_data_1138.root'
    if len(sys.argv) > 1:
        if os.path.exists(sys.argv[1]):
            inRoot = sys.argv[1]
        elif os.path.exists(tagA + sys.argv[1] + '.root'):
            inRoot = tagA + sys.argv[1] + '.root'
        else:
            files = sorted([f for f in glob(tagA + '*.root')],
                           key=lambda f: os.path.getmtime(f))

            a = -1
            try:
                a = int(sys.argv[1])
            except TypeError:
                pass
            if time.time() - os.path.getmtime(files[-1]) < 10:
                print "dropping the latest file, which probably is still being written:", files[
                    -1]
                if a != 0: files.pop()
                else: a = -1

            if abs(a) < len(files):
                inRoot = files[a]
            else:
                print "Index {0:d} out of range:{1:d}".format(a, len(files))
                return

    print "Using file:", inRoot
    fout1 = TFile(inRoot, 'read')
    tree1 = fout1.Get('tree1')
    tree1.SetBranchAddress('adc', data1)

    print "Entries in the tree:", tree1.GetEntries()

    run = -1
    runPattern = '.*_data_(\d+).root'
    if runPattern is not None:
        m = re.match(runPattern, inRoot)
        if m:
            try:
                run = int(m.group(1))
            except ValueError:
                print "Run number not exatracted for file", iRoot

    i = 56
    ich = 1
    sp1 = SignalProcessor()
    apply_config(sp1, 'Hydrogen')

    plt.ion()
    plt.show()
    fig, ax1 = plt.subplots(1, 1, figsize=(28, 10))
    #     fig.set_size_inches(11,8)
    ax1.set_xlabel('time index')
    ax1.set_ylabel('U [V]', color='b')
    ax1.tick_params('y', colors='b')
    ax2 = ax1.twinx()
    ax2.set_ylabel('U [V]', color='r')
    ax2.tick_params('y', colors='r')

    #     for ievt in range(tree1.GetEntries()):

    NMax = tree1.GetEntries()
    ievt = 0
    prev_ievt = -1
    while ievt < NMax:
        if ievt != prev_ievt:
            print "Event:", ievt
            tree1.GetEntry(ievt)
            va = data1[ich * sp1.nSamples:(ich + 1) * sp1.nSamples]
            prev_ievt = ievt

        ### FIXME: be careful, data1 might not be updated yet
#         be1.correct(data1, ich)
#         apply_wiener_filter(data1, ich)

        sp1.measure_pulse2(data1, ich)

        vx = np.array([sp1.scrAry[i] for i in range(sp1.nSamples)])
        vo = va
        #         vo = data1[ich*sp1.nSamples:(ich+1)*sp1.nSamples]

        ax1.clear()
        ax2.clear()
        ax1.plot(va, label='Raw', color='b')
        #         ax1.plot(vo, label='Wiener', color='g')
        ax2.plot(vx, label='Filtered', color='r')
        #         ax2.plot([vo[i]-va[i] for i in range(sp1.nSamples)], label='Correction', color='k')
        ylim1 = ax1.get_ylim()
        ylim2 = ax2.get_ylim()

        x1 = min(ylim1[0], ylim2[0] + vo[0])
        x2 = max(ylim1[1], ylim2[1] + vo[0])
        #         print x1,x2
        ax1.set_ylim(x1, x2)
        ax2.set_ylim(x1 - vo[0], x2 - vo[0])

        #         print sp1.signals[ich].size()
        x1 = []
        y1 = []
        iss = 0
        if len(sp1.signals[ich]) > 0:
            print "idx: iMax iMidian A w0 w1 w2"
            print '-' * 30
        for s in sp1.signals[ich]:
            print iss, ':', s.idx, s.im, s.Q, s.w0, s.w1, s.w2
            x1.append(s.im)
            y1.append(s.Q)
            plt.axvline(x=s.im, linestyle='--', color='black')
            iss += 1

        plt.text(0.04,
                 0.1,
                 'run {0:d} event {1:d}, ch {2:d}'.format(run, ievt, ich),
                 horizontalalignment='center',
                 verticalalignment='center',
                 transform=ax2.transAxes)
        plt.xlim(auto=False)
        if x1: ax2.scatter(x1, y1, c="g", marker='o', s=220, label='Analysis')

        fig.tight_layout()
        plt.draw()
        plt.legend()
        plt.grid(True)
        plt.pause(0.001)

        while True:
            x = raw_input("Next:")
            if x == 'q': sys.exit()
            elif len(x) > 0 and x[0] == 's':
                for name in x.split()[1:]:
                    dirx = os.path.dirname(name)
                    if not os.path.exists(dirx): os.makedirs(dirx)
                    plt.savefig(name)
                    print "saved figure to", name
            elif len(x) > 2 and x[:2] == 'ch':
                try:
                    ich = int(x[2:])
                    print "Switching to channel:", ich
                    break
                except ValueError:
                    continue
            else:
                try:
                    ievt = int(x)
                except ValueError:
                    ievt += 1
                break
Ejemplo n.º 6
0
def test2a():
    #     be1 = bkgEstimator()
    #     be1.show_data()

    s1 = SigProc(nSamples=16384, nAdcCh=20, nSdmCh=19, adcSdmCycRatio=5)
    data1 = (s1.ANALYSIS_WAVEFORM_BASE_TYPE * (s1.nSamples * s1.nAdcCh))()
    data1 = array('f', [0] * (16384 * 20))

    #     pTag = 'Feb09b'
    pTag = 'Feb25a'
    tagA = 'data/fpgaLin/' + pTag + '_data_'
    inRoot = 'data/fpgaLin/' + pTag + '_data_1138.root'
    if len(sys.argv) > 1:
        #         import os
        if os.path.exists(sys.argv[1]):
            inRoot = sys.argv[1]
        elif os.path.exists(tagA + sys.argv[1] + '.root'):
            inRoot = tagA + sys.argv[1] + '.root'
        else:
            files = sorted([f for f in glob(tagA + '*.root')],
                           key=lambda f: os.path.getmtime(f))

            a = -1
            try:
                a = int(sys.argv[1])
            except TypeError:
                pass
            if time.time() - os.path.getmtime(files[-1]) < 10:
                print "dropping the latest file, which probably is still being written:", files[
                    -1]
                if a != 0: files.pop()
                else: a = -1

            if abs(a) < len(files):
                inRoot = files[a]
            else:
                print "Index {0:d} out of range:{1:d}".format(a, len(files))
                return

    print "Using file:", inRoot
    fout1 = TFile(inRoot, 'read')
    tree1 = fout1.Get('tree1')
    tree1.SetBranchAddress('adc', data1)

    print "Entries in the tree:", tree1.GetEntries()

    run = -1
    runPattern = '.*_data_(\d+).root'
    if runPattern is not None:
        m = re.match(runPattern, inRoot)
        if m:
            try:
                run = int(m.group(1))
            except ValueError:
                print "Run number not exatracted for file", iRoot

    i = 56
    ich = 1
    sp1 = SignalProcessor()
    sp1.fltParam.clear()

    #     P is the constant using 0.2 ps as unit wit
    #     0.006 is the constant using 1/2500/1024 as unit 1/0.006 T = 1/0.006 * 1/2500/1024 s = 1/0.006 *1/2500/1024* 5000000 pts
    #     for x in [500, 500, 700, 2500]: sp1.fltParam.push_back(x)
    #     for x in [500, 5, 15, 2500]: sp1.fltParam.push_back(x)
    #     for x in [500, 50, 150, 2500]: sp1.fltParam.push_back(x)
    #     for x in [30, 15, 50, 2500]: sp1.fltParam.push_back(x)
    #     for x in [30, 50, 250, 2500]: sp1.fltParam.push_back(x)
    P = 1. / 0.006 / 2500 / 1024 * 5000000
    for x in [30, 50, 200, P]:
        sp1.fltParam.push_back(x)
    #     for x in [50, 100, 500, -1]: sp1.fltParam.push_back(x)
    #     for x in [30, 5, 100, 2500]: sp1.fltParam.push_back(x)
    #     for x in [30, 250, 350, 2500]: sp1.fltParam.push_back(x)
    #     sp1.x_thre = 0.002
    #     for i in range(20): sp1.ch_thre[i] = 0.002
    #     sp1.ch_thre[19] = 0.05
    thre = [0.002] * sp1.nAdcCh
    thre[19] = 0.05
    sp1.ch_thre.clear()
    for x in thre:
        sp1.ch_thre.push_back(x)

    plt.ion()
    fig, axs = plt.subplots(nrows=20,
                            ncols=1,
                            sharex=True,
                            sharey=False,
                            squeeze=True,
                            figsize=(13, 12.5),
                            dpi=72)
    plt.subplots_adjust(left=0.1,
                        right=0.98,
                        top=0.98,
                        bottom=0.05,
                        hspace=0,
                        wspace=0)
    plt.show()

    #     fig, ax1 = plt.subplots(1, 1, figsize=(28, 10))
    #     fig.set_size_inches(11,8)
    #     ax1.set_xlabel('time index')
    #     ax1.set_ylabel('U [V]', color='b')
    #     ax1.tick_params('y', colors='b')
    #     ax2 = ax1.twinx()
    #     ax2.set_ylabel('U [V]', color='r')
    #     ax2.tick_params('y', colors='r')

    #     for ievt in range(tree1.GetEntries()):

    NMax = tree1.GetEntries()
    ievt = 0
    while ievt < NMax:

        print "Event:", ievt
        tree1.GetEntry(ievt)

        for ich in range(sp1.nAdcCh):
            va = data1[ich * sp1.nSamples:(ich + 1) * sp1.nSamples]
            sp1.measure_pulse2(data1, ich)

            vx = np.array([sp1.scrAry[i] for i in range(sp1.nSamples)])
            vo = data1[ich * sp1.nSamples:(ich + 1) * sp1.nSamples]

            axs[ich].clear()
            axs[ich].plot(vo)

            tx = axs[ich].twinx()
            tx.clear()
            tx.plot(vx, color='r')
        plt.draw()
        plt.grid(True)
        plt.pause(0.001)

        while True:
            x = raw_input("Next:")
            if x == 'q': sys.exit()
            elif len(x) > 0 and x[0] == 's':
                for name in x.split()[1:]:
                    dirx = os.path.dirname(name)
                    if not os.path.exists(dirx): os.makedirs(dirx)
                    plt.savefig(name)
                    print "saved figure to", name
            elif len(x) > 2 and x[:2] == 'ch':
                try:
                    ich = int(x[2:])
                    print "Switching to channel:", ich
                    break
                except ValueError:
                    continue
            else:
                try:
                    ievt = int(x)
                except ValueError:
                    ievt += 1
                break