Ejemplo n.º 1
0
def test5():
    '''Test the measure_multipleX function in sp.C, which trys to locate the signal by seaching the maximum and use the period info to find others. It's used used only for calibration.'''
    s1 = SigProc(nSamples=16384, nAdcCh=20, nSdmCh=19, adcSdmCycRatio=5)
    data1 = (s1.ANALYSIS_WAVEFORM_BASE_TYPE * (s1.nSamples * s1.nAdcCh))()

    sp = SignalProcessor()
    sp.fltParam.clear()

    P = 1. / 0.006 / 2500 / 1024 * 5000000
    for x in [30, 50, 200, P]:
        sp.fltParam.push_back(x)

    sp.CF_chan_en.clear()
    sp.IO_mAvg.clear()
    for i in range(20):
        sp.CF_chan_en.push_back(1)
        sp.IO_mAvg.push_back(0.)


#     inRoot = 'data/fpgaLin/Feb28t3_data_0.root'
    inRoot = 'data/fpgaLin/Mar05T1a_data_0.root'
    fout1 = TFile(inRoot, 'read')
    tree1 = fout1.Get('tree1')
    tree1.SetBranchAddress('adc', data1)

    N = 2000  # 2500 Hz

    Vs = array('f', [0] * (20 * 8))
    #     for i in range(20*8)

    for ievt in range(3):
        tree1.GetEntry(ievt)
        sp.measure_multipleX(data1, N, Vs)

        for i in range(20):
            print i, ':',
            for j in range(8):
                #                 print i*8+j,
                print Vs[i * 8 + j],
            print
Ejemplo n.º 2
0
class Train(threading.Thread):
    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])

    def setupOutput(self, outRootName='tt_test.root'):
        s1 = self.cd.sigproc
        self.fout1 = TFile(outRootName, 'recreate')
        self.tree1 = TTree(
            'tree1', "tune data for {0:d} channels, {1:d} samples".format(
                s1.nAdcCh, s1.nSamples))
        self.tree1.Branch('tag', self.Tag, 'tag/I')
        self.tree1.Branch('T', self.T, 'T/i')
        self.tree1.Branch('adc', self.data1,
                          "adc[{0:d}][{1:d}]/F".format(s1.nAdcCh, s1.nSamples))
        self.tree1.Branch('ret', self.ret1, "ret[{0:d}]/F".format(s1.nAdcCh))
        self.tree1.Branch(
            'par', self.par1,
            "par[{0:d}][{1:d}]/F".format(self.cd.nCh, len(self.cd.inputVs)))
        self.tree1.Branch(
            'val', self.t_values,
            "val[{0:d}][{1:d}]/F".format(self.cd.nAdcCh, self.NVAL))

    def plot_data(self):
        #         item = self.q.get()
        if self.axs is None:
            print("creating the plot......")
            import matplotlib
            matplotlib.rcParams['toolbar'] = 'None'
            plt.ion()
            fig, self.axs = plt.subplots(self.cd.nAdcCh, 1, sharex=True)
            # Remove horizontal space between axes
            plt.tight_layout(pad=0)
            fig.subplots_adjust(hspace=0)
            self.plot_x = [self.cd.adcDt * i for i in range(self.cd.nSamples)]

        for i in range(self.cd.nAdcCh):
            self.axs[i].cla()
            #             self.axs[i].plot(self.cd.adcData[i])
            #             self.axs[i].step(array.array('f', self.cd.adcData[i]), where='post')
            #             self.axs[i].plot(self.plot_x, array.array('f', self.cd.adcData[i]))
            self.axs[i].plot(
                self.plot_x,
                self.data1[i * self.cd.nSamples:(i + 1) * self.cd.nSamples])
        plt.draw()
#         self.q.task_done()

    def test_update_sensor(self, inputVs=None):
        print('/' * 40)
        if inputVs is None:
            inputVs = [[1.379, 1.546, 1.626, 1.169, 1.357, 2.458],
                       [1.379, 1.546, 1.626, 1.169, 1., 2.]]
        #### update sensor configurations
        ss = set()
        for i, p in enumerate(inputVs):
            if p is None: continue
            self.cd.set_sensor(i, p)
            ss.add(self.sc.tms1mmX19chainSensors[
                self.sc.tms1mmX19sensorInChain[i]][0])

        ### apply the configurations
        print(ss)
        for isr in ss:
            self.sc.update_sensor(isr)
        print('\\' * 40)

    def take_data2(self, NEVT=100):
        '''return an array of FOM'''
        s1 = self.cd.sigproc

        for ievt in range(NEVT):
            self.T[0] = int(time.time())
            self.cd.dataSocket.sendall(self.cd.cmd.send_pulse(1 << 2))
            buf = self.cd.cmd.acquire_from_datafifo(self.cd.dataSocket,
                                                    self.cd.nWords,
                                                    self.cd.sampleBuf)
            s1.demux_fifodata(buf, self.data1, self.cd.sdmData)

            ### measure
            self.sp.measure_multipleX(self.data1, 2000, self.t_values)

            ### save
            self.tree1.Fill()

    def take_data(self):
        '''return an array of FOM'''
        s1 = self.cd.sigproc

        NV = 8
        NEVT = 100
        Values = [[0.] * (NV * NEVT) for i in range(self.cd.nAdcCh)]

        for ievt in range(NEVT):
            self.cd.dataSocket.sendall(self.cd.cmd.send_pulse(1 << 2))
            buf = self.cd.cmd.acquire_from_datafifo(self.cd.dataSocket,
                                                    self.cd.nWords,
                                                    self.cd.sampleBuf)
            s1.demux_fifodata(buf, self.data1, self.cd.sdmData)

            self.sp.measure_multipleX(self.data1, 2000, self.t_values)
            #             if ievt == 0:
            #                 print("EVT",ievt)
            # #                 print([self.t_values[i] for i in range(NV*self.cd.nAdcCh)])
            #                 print([self.t_values[6*NV+i] for i in range(NV)])

            for ich in range(self.cd.nAdcCh):
                for ipeak in range(NV):
                    Values[ich][ievt * NV + ipeak] = self.t_values[ich * NV +
                                                                   ipeak]

        for i in range(s1.nAdcCh):
            #             self.ret1[i] = np.std(Values[i])/np.mean(Values[i])
            self.ret1[i] = -np.mean(Values[i]) / np.std(Values[i])
            #             if i==6:
# #                 print(i,'->', Values[i][20*8:21*8])
#                 print(i,'->', Values[i][0*8:1*8])
#             print(i, np.std(Values[i]), np.mean(Values[i]), self.ret1[i])

        self.T[0] = int(time.time())
        #         print(self.ret1[3],self.ret1[0])
        #         for i in range(self.cd.nAdcCh): print(i,self.ret1[i])
        self.tree1.Fill()

        if self.T[0] - self.saveT0 > 200:
            self.tree1.AutoSave('SaveSelf')
            self.saveT0 = self.T[0]

    def run(self):
        nPar = len(self.cd.inputVs)

        ### save the initial values
        for i in range(self.cd.nCh):
            for kk in range(nPar):
                self.par1[i * nPar + kk] = self.cd.tms1mmReg.dac_code2volt(
                    self.sensorVcodes[i][kk])

        while self.on:
            cnt = 0
            #             cnt1 = 0
            ss = set()
            for i, q in enumerate(self.rx_qs):
                if q is None: continue
                cnt += 1
                #                 x = q.get()
                #                 self.pars[i] = x

                if not q.empty():
                    #                     cnt1 += 1
                    x = q.get()
                    self.mask[i] = 1
                    #                     print('--- {0:d} get'.format(i)+' ['+','.join([str(a) for a in x])+']')
                    #                     self.pars[i] = x
                    #                     print(i,x)
                    self.cd.set_sensor(i, x)
                    for kk in range(nPar):
                        self.par1[i * nPar + kk] = x[kk]
                    ss.add(self.sc.tms1mmX19chainSensors[
                        self.sc.tms1mmX19sensorInChain[i]][0])

            if cnt == 0: self.on = False
            if len(ss) == 0: continue
            #             if cnt1 == 0: continue

            #### update sensor configurations
            #             ss = set()
            #             for i,p in enumerate(self.pars):
            #                 if self.mask[i] == 1:
            #                     self.cd.set_sensor(i,p)
            #                     ss.append(self.sc.tms1mmX19chainSensors[self.sc.tms1mmX19sensorInChain[i]][0])

            ### apply the configurations
            for isr in ss:
                self.sc.update_sensor(isr, quiet=1)

            ### take data
            self.pltCnt += 1
            t = None
            if self.pltCnt % self.pltN == 0:
                self.plot_data()
#                 t = threading.Thread(target=self.plot_data)
#                 t.daemon = True
#                 t.start()
#                 self.q.put('run')

            time.sleep(30)
            if t is not None: t.join()

            self.take_data()
            ret = self.ret1

            ### return
            needUpdate = False
            for i, t in enumerate(self.tx_qs):
                if self.mask[i] == 1:
                    t.put(ret[i])
                    self.mask[i] = 0

                    ### save the values if it's the best so far
                    if ret[i] < self.retBest[i]:
                        print("find better parameters for channel", i)
                        print('old:', self.sensorVcodes[i], self.retBest[i])
                        self.retBest[i] = ret[i]
                        self.sensorVcodes[i] = [
                            a for a in self.cd.sensorVcodes[i]
                        ]
                        print('new:', self.sensorVcodes[i], self.retBest[i])
                        needUpdate = True


#                     print("--- {0:d} {1:g}".format(i, self.meas[i]))
            if needUpdate:
                self.sc.write_config_fileX(self.bestConfigFile,
                                           self.sensorVcodes)
        print('Stopping the train.....')
        plt.close('all')
        self.tree1.Write()
        self.fout1.Close()
Ejemplo n.º 3
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