Ejemplo n.º 1
0
def readSignal4b(argX, runPattern='.*_data_(\d+).root'):
    '''For Mar08 data processing, take the decay time from configuration file'''
    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')
    apply_config(sp1, 'Hydrogen/c3')

    fin1 = TFile(inRoot, 'read')
    tree1 = fin1.Get('tree1')

    tree2 = 0
    outRoot = os.path.dirname(inRoot) + '/' + oTag + os.path.basename(inRoot)
    tf = sp1.processFile(tree1, tree2, outRoot, run)
    tf.Close()
Ejemplo n.º 2
0
    def __init__(self, cd):
        threading.Thread.__init__(self)
        self.cd = cd
        self.tx_qs = None
        self.rx_qs = None
        self.on = True
        self.mask = [0] * cd.nCh
        self.nSig = 3

        ### this copy of sensorVcodes is used to save the best value find so far
        self.sensorVcodes = [[v for v in cd.sensorVcodes[i]]
                             for i in range(cd.nCh)]
        #         self.bestConfigFile = 'current_best_config.json'
        self.bestConfigFile = 'C3_tt6_config.json'
        self.retBest = [0.] * cd.nAdcCh

        ### for data taking
        self.sc = None

        ### plotting
        self.axs = None
        self.plot_x = None
        self.pltCnt = 0
        self.pltN = 20

        self.sp = SignalProcessor()
        apply_config(self.sp, 'Helium')

        self.NVAL = 8
        s1 = self.cd.sigproc
        self.data1 = (s1.ANALYSIS_WAVEFORM_BASE_TYPE *
                      (s1.nSamples * s1.nAdcCh))()
        self.ret1 = array.array('f', [0] * s1.nAdcCh)
        self.par1 = array.array('f',
                                [0] * (self.cd.nCh * len(self.cd.inputVs)))
        self.t_values = array.array('f', [0] * (s1.nAdcCh * self.NVAL))
        self.keepAllData = False
        self.saveT0 = -1
        self.T = array.array('i', [0])
        self.Tag = array.array('i', [0])
Ejemplo n.º 3
0
def test3():
    '''To test the event reconstruction'''
    gStyle.SetOptStat(0)
    gROOT.ProcessLine('.L Pal.C')
    gStyle.SetPalette(55)
    gStyle.SetPadRightMargin(0.15)

    #     from ROOT import Pal2
    #     Pal2()

    data1 = array('f', [0] * (16384 * 20))
    #     inRoot = 'data/fpgaLin/Feb27a_data_40.root'
    inRoot = 'data/fpgaLin/Mar08D1a/Mar08D1a_data_70.root'
    fout1 = TFile(inRoot, 'read')
    tree1 = fout1.Get('tree1')
    tree1.SetBranchAddress('adc', data1)

    ### here comes the constructor
    sp1 = SignalProcessor()
    #     sp1.nAdcCh=20
    sp1.IO_adcData = data1
    apply_config(sp1, 'Hydrogen')

    #     sp1.fltParam.clear()
    #     for x in [30, 100, 300, -1]: sp1.fltParam.push_back(x)
    #     thre = [0.001]*sp1.nAdcCh
    #     thre[19] = 0.02
    #
    #     sp1.ch_thre.clear()
    #     for x in thre: sp1.ch_thre.push_back(x)

    Unit = 0.2
    h3 = TH3F('h3', 'h3;x [cm];y [cm];t [ps]', 9, -1.8, 1.8, 9, -1.8, 1.8, 100,
              -1. * Unit * sp1.CF_uSize, Unit * sp1.CF_dSize)
    h2 = TH2F('h2', 'h2;t [ps];Channel;Q', (sp1.CF_uSize + sp1.CF_dSize),
              -1. * Unit * sp1.CF_uSize, Unit * sp1.CF_dSize, 20, 0, 20)

    cx = TCanvas('cx', 'cx', 1500, 700)
    cx.Divide(2, 1)
    for i in range(tree1.GetEntries()):
        tree1.GetEntry(i)
        sp1.reco()

        for ich in range(sp1.nAdcCh):
            for s in sp1.signals[ich]:
                print ich, ':', s.idx, s.im, s.Q, s.w0, s.w1, s.w2

        for e in sp1.IO_evts:
            print e.trigID, len(e.sigs)
            h3.Reset()
            h2.Reset()
            showEvent(e, h3, h2)

            cx.cd(1)
            h3.Draw('BOX2')
            cx.cd(2)
            t = h2.GetBinContent(h2.GetMaximumBin()) * 1.06
            h2.GetZaxis().SetRangeUser(-0.05 * t, t * 0.95)
            h2.Draw('colz')
            #             h2.Draw('axis same')

            cx.cd(0)
            waitRootCmdX()
Ejemplo n.º 4
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.º 5
0
def tune_check():
    '''The same configuration as the tune'''
    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()
    print "using configuration:", apply_config(sp1, 'Helium')
    for i in range(sp1.nAdcCh):
        sp1.CF_chan_en[i] = 1 if i == ich else 0

    plt.ion()
    plt.show()
    #     fig, ax1 = plt.subplots(1, 1, figsize=(28, 10))
    fig, ax1 = plt.subplots(1, 1, figsize=(14, 5))
    #     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

    NVAL = 8
    t_values = array('f', [0] * (sp1.nAdcCh * NVAL))
    while ievt < NMax:

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

        va = data1[ich * sp1.nSamples:(ich + 1) * sp1.nSamples]
        #         be1.correct(data1, ich)
        #         apply_wiener_filter(data1, ich)

        #         sp1.measure_pulse2(data1, ich)
        sp1.measure_multipleX(data1, 2000, t_values)

        vx = np.array([sp1.scrAry[i] for i in range(sp1.nSamples)])
        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
        for x in t_values[ich * NVAL:(ich + 1) * NVAL]:
            print x
#         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:])
                    for i in range(sp1.nAdcCh):
                        sp1.CF_chan_en[i] = 1 if i == ich else 0
                    print "Switching to channel:", ich
                    break
                except ValueError:
                    continue
            elif len(x) > 0 and x[0] == 'p':
                ievt -= 1
                break
            else:
                try:
                    ievt = int(x)
                except ValueError:
                    ievt += 1
                break