def findOneSubEvent(waveform, cfdconf, config, ch): """ waveform: numpy array cfdconf: cfd.cfdiscConfig ch: int """ # calculate expectation in first bin #pbin1_fast = config.fastfraction*prob_exp( 0, cfdconf.nspersample, 1.0/config.fastconst ) #pbin1_slow = config.slowfraction*prob_exp( 0, cfdconf.nspersample, 1.0/config.slowconst ) #pbin1 = pbin1_fast + pbin1_slow # expected fraction of combined slow-fast exponential in first bin # Find peaks cfdvec = cfd.runCFdiscriminator(waveform, cfdconf) peaks_sorted = cfdvec.getAmpOrderedList(reverse=True) # Sort by diff height, get biggest and make a subevent out of it if len(peaks_sorted) > 0: tstart = peaks_sorted[0].tfire maxamp = peaks_sorted[0].maxamp tmax = peaks_sorted[0].tmax #scale = waveform[tmax]/pbin1 tend = tstart spe_sigma = 4.0 * cfdconf.nspersample # python #expectation = calcExpectation() # cythonized! #expectation = cyse.calcScintResponse( np.maximum(0,tmax-20), len(waveform), tmax, spe_sigma, (maxamp-cfdconf.pedestal), config.fastconst, config.slowconst, cfdconf.nspersample ) # native c++ expectation = cyse.pyCalcScintResponse(np.maximum(0, tmax - 20), len(waveform), tmax, spe_sigma, (maxamp - cfdconf.pedestal), config.fastconst, config.slowconst, cfdconf.nspersample) tend = tstart + len(expectation) #print expectation[:10] #print expectation_old[:10] #raw_input() return ChannelSubEvent(ch, tstart, tend, tmax, maxamp, expectation) return None
def findOneSubEvent( waveform, cfdconf, config, ch ): """ waveform: numpy array cfdconf: cfd.cfdiscConfig ch: int """ # calculate expectation in first bin #pbin1_fast = config.fastfraction*prob_exp( 0, cfdconf.nspersample, 1.0/config.fastconst ) #pbin1_slow = config.slowfraction*prob_exp( 0, cfdconf.nspersample, 1.0/config.slowconst ) #pbin1 = pbin1_fast + pbin1_slow # expected fraction of combined slow-fast exponential in first bin # Find peaks cfdvec = cfd.runCFdiscriminator( waveform, cfdconf ) peaks_sorted = cfdvec.getAmpOrderedList( reverse=True ) # Sort by diff height, get biggest and make a subevent out of it if len(peaks_sorted)>0: tstart = peaks_sorted[0].tfire maxamp = peaks_sorted[0].maxamp tmax = peaks_sorted[0].tmax #scale = waveform[tmax]/pbin1 tend = tstart spe_sigma = 4.0*cfdconf.nspersample # python #expectation = calcExpectation() # cythonized! #expectation = cyse.calcScintResponse( np.maximum(0,tmax-20), len(waveform), tmax, spe_sigma, (maxamp-cfdconf.pedestal), config.fastconst, config.slowconst, cfdconf.nspersample ) # native c++ expectation = cyse.pyCalcScintResponse( np.maximum(0,tmax-20), len(waveform), tmax, spe_sigma, (maxamp-cfdconf.pedestal), config.fastconst, config.slowconst, cfdconf.nspersample ) tend = tstart + len(expectation) #print expectation[:10] #print expectation_old[:10] #raw_input() return ChannelSubEvent( ch, tstart, tend, tmax, maxamp, expectation ) return None
def calcEventRates( cfdsettings, inputfile, nevents, outfile, wffile=False, rawdigitfile=False, VISUALIZE=False ): # check that the data file type was selected if wffile==False and rawdigitfile==False: print "Select either wffile or rawdigitfile" return # load data if wffile==True: opdata = WFOpData( inputfile ) elif rawdigitfile==True: opdata = RawDigitsOpData( inputfile ) out = rt.TFile( outfile, "RECREATE" ) # Event tree eventtree = rt.TTree("eventtree","PMT Rates") event = array('i',[0]) samples = array('i',[0]) nfires = array('i',[0]*NCHANS) echmax = array('f',[0]) eventtree.Branch( 'event', event,'event/I' ) eventtree.Branch( 'samples', samples, 'samples/I' ) eventtree.Branch( 'nfires', nfires, 'nfires[%d]/I'%(NCHANS) ) eventtree.Branch( 'chmax', echmax, 'chmax/F' ) # Pulse Tree pulsetree = rt.TTree("pulsetree","PMT Rates") pch = array('i',[0]) pt = array( 'f',[0] ) pwindt = array( 'f',[0] ) pchdt = array( 'f',[0] ) pmaxamp = array('f',[0]) ped = array('f',[0]) pchmaxamp = array('f',[0]) parea = array('f',[0]) pulsetree.Branch( 'event', event, 'event/I' ) pulsetree.Branch( 'ch',pch,'ch/I' ) pulsetree.Branch( 't',pt,'t/F' ) pulsetree.Branch( 'windt',pwindt,'windt/F' ) pulsetree.Branch( 'chdt',pchdt,'chdt/F' ) pulsetree.Branch( 'amp',pmaxamp,'amp/F' ) pulsetree.Branch( 'area',parea,'area/F' ) pulsetree.Branch( "ped",ped,"ped/F") pulsetree.Branch( 'chmaxamp',pchmaxamp,'chmaxamp/F' ) first_event = opdata.first_event if VISUALIZE and PYQTGRAPH: opdisplay = OpDetDisplay( opdata ) opdisplay.show() more = opdata.getEvent( first_event ) ievent = first_event #for ievent in range(first_event,first_event+nevents+1): while more: if ievent%50==0: print "Event: ",ievent event[0] = ievent if VISUALIZE: more = opdisplay.gotoEvent( ievent ) # for each event gather disc fires and sort by time event_times = [] event_discs = {} echmax[0] = 0 chpedestals = {} chmaxamps = {} for femch in range(0,NCHANS): wfm = opdata.getData(slot=5)[:,femch] discs = runCFdiscriminator( wfm, cfdsettings ) theped = getpedestal( wfm, 10, 2 ) if theped is None: ped[0] = 2048.0 else: ped[0] = theped chpedestals[femch] = ped[0] nfires[femch] = len(discs) pch[0] = femch pchmaxamp[0] = np.max( wfm - ped[0] ) chmaxamps[femch] = pchmaxamp[0] if echmax[0]<pchmaxamp[0]: echmax[0] = pchmaxamp[0] samples[0] = len(wfm) pchdt[0] = -1 pmaxamp[0] = 0 if len(discs)==0: print "Discriminator found zero pusles in channel=",femch," event=",event[0] for idisc,disc in enumerate(discs): disc.ch = femch t = disc.tfire + 0.01*disc.ch # the channel number is just to keep a unique tag event_times.append( t ) event_discs[t] = disc tdisc = disc.tfire disc.pmaxamp = np.max( wfm[tdisc:tdisc+cfdsettings.deadtime]-ped[0] ) pped = getpedestal( wfm[ np.maximum(0,tdisc-20):tdisc ] , 5, 2 ) if pped is None: pped = ped[0] disc.parea = np.sum( wfm[tdisc:tdisc+cfdsettings.deadtime] ) - cfdsettings.deadtime*pped if idisc>0: disc.pchdt = tdisc - discs[idisc-1].tfire else: disc.pchdt = -1 if VISUALIZE and PYQTGRAPH: discfire = pg.PlotCurveItem() x = np.linspace( 15.625*(tdisc-5), 15.625*(tdisc+5+cfdsettings.deadtime), cfdsettings.deadtime+10 ) y = np.ones( cfdsettings.deadtime+10 )*femch y[5:5+cfdsettings.deadtime] += 2 discfire.setData( x=x, y=y, pen=(255,0,0,255) ) opdisplay.addUserWaveformItem( discfire, femch ) event_times.sort() for idisc,t in enumerate(event_times): disc = event_discs[t] pch[0] = disc.ch pt[0] = disc.tfire pmaxamp[0] = disc.pmaxamp pchdt[0] = disc.pchdt ped[0] = chpedestals[disc.ch] pchmaxamp[0] = chmaxamps[disc.ch] parea[0] = disc.parea if idisc==0: pwindt[0] = -1 else: pwindt[0] = disc.tfire-event_discs[ event_times[idisc-1] ].tfire pulsetree.Fill() if VISUALIZE: print "please enjoy plot" raw_input() eventtree.Fill() more = opdata.getNextEvent() ievent = opdata.current_event if not more: print "no more" break eventtree.Write() pulsetree.Write()
def calcEventRates(cfdsettings, inputfile, nevents, outfile, wffile=False, rawdigitfile=False, VISUALIZE=False): # check that the data file type was selected if wffile == False and rawdigitfile == False: print "Select either wffile or rawdigitfile" return # load data if wffile == True: opdata = WFOpData(inputfile) elif rawdigitfile == True: opdata = RawDigitsOpData(inputfile) out = rt.TFile(outfile, "RECREATE") # Event tree eventtree = rt.TTree("eventtree", "PMT Rates") event = array('i', [0]) samples = array('i', [0]) nfires = array('i', [0] * NCHANS) echmax = array('f', [0]) eventtree.Branch('event', event, 'event/I') eventtree.Branch('samples', samples, 'samples/I') eventtree.Branch('nfires', nfires, 'nfires[%d]/I' % (NCHANS)) eventtree.Branch('chmax', echmax, 'chmax/F') # Pulse Tree pulsetree = rt.TTree("pulsetree", "PMT Rates") pch = array('i', [0]) pt = array('f', [0]) pwindt = array('f', [0]) pchdt = array('f', [0]) pmaxamp = array('f', [0]) ped = array('f', [0]) pchmaxamp = array('f', [0]) parea = array('f', [0]) pulsetree.Branch('event', event, 'event/I') pulsetree.Branch('ch', pch, 'ch/I') pulsetree.Branch('t', pt, 't/F') pulsetree.Branch('windt', pwindt, 'windt/F') pulsetree.Branch('chdt', pchdt, 'chdt/F') pulsetree.Branch('amp', pmaxamp, 'amp/F') pulsetree.Branch('area', parea, 'area/F') pulsetree.Branch("ped", ped, "ped/F") pulsetree.Branch('chmaxamp', pchmaxamp, 'chmaxamp/F') first_event = opdata.first_event if VISUALIZE and PYQTGRAPH: opdisplay = OpDetDisplay(opdata) opdisplay.show() more = opdata.getEvent(first_event) ievent = first_event #for ievent in range(first_event,first_event+nevents+1): while more: if ievent % 50 == 0: print "Event: ", ievent event[0] = ievent if VISUALIZE: more = opdisplay.gotoEvent(ievent) # for each event gather disc fires and sort by time event_times = [] event_discs = {} echmax[0] = 0 chpedestals = {} chmaxamps = {} for femch in range(0, NCHANS): wfm = opdata.getData(slot=5)[:, femch] discs = runCFdiscriminator(wfm, cfdsettings) theped = getpedestal(wfm, 10, 2) if theped is None: ped[0] = 2048.0 else: ped[0] = theped chpedestals[femch] = ped[0] nfires[femch] = len(discs) pch[0] = femch pchmaxamp[0] = np.max(wfm - ped[0]) chmaxamps[femch] = pchmaxamp[0] if echmax[0] < pchmaxamp[0]: echmax[0] = pchmaxamp[0] samples[0] = len(wfm) pchdt[0] = -1 pmaxamp[0] = 0 if len(discs) == 0: print "Discriminator found zero pusles in channel=", femch, " event=", event[ 0] for idisc, disc in enumerate(discs): disc.ch = femch t = disc.tfire + 0.01 * disc.ch # the channel number is just to keep a unique tag event_times.append(t) event_discs[t] = disc tdisc = disc.tfire disc.pmaxamp = np.max(wfm[tdisc:tdisc + cfdsettings.deadtime] - ped[0]) pped = getpedestal(wfm[np.maximum(0, tdisc - 20):tdisc], 5, 2) if pped is None: pped = ped[0] disc.parea = np.sum( wfm[tdisc:tdisc + cfdsettings.deadtime]) - cfdsettings.deadtime * pped if idisc > 0: disc.pchdt = tdisc - discs[idisc - 1].tfire else: disc.pchdt = -1 if VISUALIZE and PYQTGRAPH: discfire = pg.PlotCurveItem() x = np.linspace( 15.625 * (tdisc - 5), 15.625 * (tdisc + 5 + cfdsettings.deadtime), cfdsettings.deadtime + 10) y = np.ones(cfdsettings.deadtime + 10) * femch y[5:5 + cfdsettings.deadtime] += 2 discfire.setData(x=x, y=y, pen=(255, 0, 0, 255)) opdisplay.addUserWaveformItem(discfire, femch) event_times.sort() for idisc, t in enumerate(event_times): disc = event_discs[t] pch[0] = disc.ch pt[0] = disc.tfire pmaxamp[0] = disc.pmaxamp pchdt[0] = disc.pchdt ped[0] = chpedestals[disc.ch] pchmaxamp[0] = chmaxamps[disc.ch] parea[0] = disc.parea if idisc == 0: pwindt[0] = -1 else: pwindt[0] = disc.tfire - event_discs[event_times[idisc - 1]].tfire pulsetree.Fill() if VISUALIZE: print "please enjoy plot" raw_input() eventtree.Fill() more = opdata.getNextEvent() ievent = opdata.current_event if not more: print "no more" break eventtree.Write() pulsetree.Write()