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()
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 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()
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()
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