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