plt.ylim(-50,100) ''' max_corrs = {} delays = {} for channel in range(8): max_corrs['ch%i'%channel] = numpy.zeros(len(eventids)) delays['ch%i'%channel] = numpy.zeros(len(eventids)) ''' max_corrs = numpy.zeros((len(eventids),8)) delays = numpy.zeros((len(eventids),8)) for event_index, eventid in enumerate(eventids): sys.stdout.write('\r(%i/%i)'%(event_index+1,len(eventids))) sys.stdout.flush() reader.setEntry(eventid) wfs = numpy.zeros((8,original_wf_len)) for channel in range(8): wfs[channel] = reader.wf(channel) wfs = scipy.signal.resample(wfs,upsample_wf_len,axis=1) #Apply filter wfs = numpy.fft.irfft(numpy.multiply(filter_y,numpy.fft.rfft(wfs,axis=1)),axis=1) #Can't find a way to vectorize corr scaled_wfs = wfs/numpy.tile(numpy.std(wfs,axis=1),(numpy.shape(wfs)[1],1)).T corr = numpy.zeros((8,numpy.shape(wfs)[1]*2 - 1)) for channel in range(8): corr[channel] = scipy.signal.correlate(templates_scaled_2d[channel],scaled_wfs[channel])/(len_template) #should be roughly normalized between -1,1
eventids = numpy.sort(known_pulser_ids['run%i' % run]) else: eventids = {} eventids['hpol'] = numpy.sort( known_pulser_ids['run%i' % run]['hpol']) eventids['vpol'] = numpy.sort( known_pulser_ids['run%i' % run]['vpol']) if ignore_eventids == True: if 'run%i' % run in list(ignorable_pulser_ids.keys()): if type(eventids) is dict: eventids = eventids[~numpy.isin( eventids, ignorable_pulser_ids['run%i' % run])] reader = Reader(datapath, run) reader.setEntry(eventids[0]) tdc = TimeDelayCalculator( reader, final_corr_length=final_corr_length, crit_freq_low_pass_MHz=crit_freq_low_pass_MHz, crit_freq_high_pass_MHz=crit_freq_high_pass_MHz, low_pass_filter_order=low_pass_filter_order, high_pass_filter_order=high_pass_filter_order) time_shifts, corrs, pairs = tdc.calculateMultipleTimeDelays( eventids) for pair_index, pair in enumerate(pairs): if pair in hpol_pairs: all_hpol_delays[str(pair)] = numpy.append( all_hpol_delays[str(pair)], time_shifts[pair_index])
crit_freq_high_pass_MHz = 35 filter_order = 6 plot_filter = True power_sum_cut_location = 50 #index power_sum_cut_value = 13000 #Events with larger power sum then this are ignored. peak_cut = 60 #At least one channel has to have a signal cross this thresh. for run_index, run in enumerate(runs): eventids = known_pulser_ids['run%i' % run] reader = Reader(datapath, run) waveform_times = reader.t() waveforms_upsampled = {} waveforms_raw = {} #Prepare filter reader.setEntry(98958) wf = reader.wf(0) wf, waveform_times = scipy.signal.resample(wf, len(wf) * resample_factor, t=reader.t()) dt = waveform_times[1] - waveform_times[0] filter_y, freqs = makeFilter(waveform_times, crit_freq_low_pass_MHz, crit_freq_high_pass_MHz, filter_order, plot_filter=plot_filter) try: for channel in range(8): waveforms_upsampled['ch%i' % channel] = numpy.zeros( (len(eventids),
def getSpectData(datapath, run, event_limit, bin_size=10, trigger_type=1, group_fft=False): ''' This function obtains the data for a spectrogram. Parameters ---------- datapath : str The path to the data where the runs are stored. This is the same as the input to the reader class. run : int The run number to be loaded. event_limit : int This limits the number of events to load. Loads from beginning of run to end, so reducing this speeds up the calculation by cutting off the later portions of the run. bin_size : int This is the number of seconds to include in each time slice of the spectrogram. The average spectra will be computed per bin. Default is 10. trigger_type : int This is the trigger type of events included in the spectrogram. The default is 1. group_fft : bool This enables the fft calculation to be performed simultaneously for all events, rather than per waveform as they are loaded in. This may be faster but requires more memory. Default is False. Returns ------- reader : examples.beacon_data_reader.Reader This is the reader for the selected run. freqs : numpy.ndarray of floats This is the list of frequencies for corresponding to the y-axis of the spectrogram data. spectra_dbish_binned : dict This is the data corresponding to the spectrogram. Each entry in the dictionary contains the spectrogram data for a particular channel. This are returned in dB-like units. I.e. they are calculated as if the waveforms were in volts, but in reality the waveforms are in adu. Some there is some offset from these values to true dB units. ''' reader = Reader(datapath, run) N = reader.N() if event_limit == None else min(reader.N(), abs(event_limit)) print('\nReader:') d = tools.interpret.getReaderDict(reader) pprint(d) print('\nHeader:') h = tools.interpret.getHeaderDict(reader) pprint(h) print('\nStatus:') s = tools.interpret.getStatusDict(reader) pprint(s) if reader.N() == 0: print('No events found in the selected run.') else: def rfftWrapper(channel, waveform_times, *args, **kwargs): spec = numpy.fft.rfft(*args, **kwargs) real_power_multiplier = 2.0 * numpy.ones_like( spec ) #The factor of 2 because rfft lost half of the power except for dc and Nyquist bins (handled below). if len(numpy.shape(spec)) != 1: real_power_multiplier[:, [0, -1]] = 1.0 else: real_power_multiplier[[0, -1]] = 1.0 spec_dbish = 10.0 * numpy.log10( real_power_multiplier * spec * numpy.conj(spec) / len(waveform_times) ) #10 because doing power in log. Dividing by N to match monutau. return channel, spec_dbish waveform_times = reader.t() freq_step = 1.0 / (len(waveform_times) * (numpy.diff(waveform_times)[0] * 1e-9)) freqs = numpy.arange(len(waveform_times) // 2 + 1) * freq_step freq_nyquist = 1 / (2.0 * numpy.diff(waveform_times)[0] * 1e-9) if group_fft == True: waveforms = {} spectra_dbish = {} readout_times = [] for channel in range(8): if group_fft == True: waveforms['ch%i' % channel] = numpy.zeros( (N, reader.header().buffer_length), dtype=int) spectra_dbish['ch%i' % channel] = numpy.zeros( (N, reader.header().buffer_length // 2 + 1), dtype=float) print('') for event_index, eventid in enumerate( range(N if event_limit == None else event_limit)): sys.stdout.write('\r(%i/%i)' % (eventid + 1, N)) sys.stdout.flush() reader.setEntry(eventid) readout_times.append(getattr(reader.header(), 'readout_time')) for channel in range(8): if group_fft == True: waveforms['ch%i' % channel][event_index] = reader.wf(channel) else: spectra_dbish['ch%i' % channel][event_index] = rfftWrapper( 'ch%i' % channel, waveform_times, reader.wf(channel))[1] if group_fft == True: with concurrent.futures.ThreadPoolExecutor( max_workers=cpu_count()) as executor: thread_results = [] for channel in range(8): thread_results.append( executor.submit(rfftWrapper, 'ch%i' % channel, waveform_times, waveforms['ch%i' % channel])) print('Weaving threads') sys.stdout.flush() for index, future in enumerate( concurrent.futures.as_completed(thread_results)): spectra_dbish[future.result()[0]] = future.result()[1] print('%i/8 Channel FFTs Completed' % (index + 1)) bin_edges = numpy.arange(min(readout_times), max(readout_times) + bin_size, bin_size) bin_L_2d = numpy.tile(bin_edges[:-1], (len(readout_times), 1)) bin_R_2d = numpy.tile( numpy.roll(bin_edges, -1)[:-1], (len(readout_times), 1)) readout_times_2d = numpy.tile(readout_times, (len(bin_edges) - 1, 1)).T cut_2d = numpy.logical_and(readout_times_2d >= bin_L_2d, readout_times_2d < bin_R_2d).T del bin_L_2d del bin_R_2d del readout_times_2d spectra_dbish_binned = {} for channel in range(8): spectra_dbish_binned['ch%i' % channel] = numpy.zeros( (len(freqs), len(bin_edges) - 1)) for index, cut in enumerate(cut_2d): spectra_dbish_binned['ch%i' % channel][:, index] = numpy.mean( spectra_dbish['ch%i' % channel][cut], axis=0) spectra_dbish_binned['ch%i' % channel] = numpy.flipud( numpy.ma.array(spectra_dbish_binned['ch%i' % channel], mask=numpy.isnan( spectra_dbish_binned['ch%i' % channel]))) return reader, freqs, spectra_dbish_binned
if 'run%i' % run in list(known_pulser_ids.keys()): try: print('run%i\n' % run) eventids = {} eventids['hpol'] = numpy.sort(known_pulser_ids['run%i' % run]['hpol']) eventids['vpol'] = numpy.sort(known_pulser_ids['run%i' % run]['vpol']) all_eventids = numpy.sort( numpy.append(eventids['hpol'], eventids['vpol'])) hpol_eventids_cut = numpy.isin(all_eventids, eventids['hpol']) vpol_eventids_cut = numpy.isin(all_eventids, eventids['vpol']) reader = Reader(datapath, run) reader.setEntry(all_eventids[0]) tdc = TimeDelayCalculator( reader, final_corr_length=final_corr_length, crit_freq_low_pass_MHz=crit_freq_low_pass_MHz, crit_freq_high_pass_MHz=crit_freq_high_pass_MHz, low_pass_filter_order=low_pass_filter_order, high_pass_filter_order=high_pass_filter_order, waveform_index_range=waveform_index_range, plot_filters=plot_filters, apply_phase_response=apply_phase_response) if sine_subtract == True: tdc.addSineSubtract(sine_subtract_min_freq_GHz, sine_subtract_max_freq_GHz, sine_subtract_percent, max_failed_iterations=3,
# this is a random event if type(eventid) == None: eventid = numpy.array([numpy.random.randint(reader.N())]) elif type(eventid) == int: eventid = numpy.array([eventid]) elif type(eventid) == list: eventid = numpy.array(eventid) elif type(eventid) == numpy.ndarray: pass else: print('event id not set in valid way, setting to random') eventid = numpy.array([numpy.random.randint(reader.N())]) eventid = [2401] for eid in eventid: reader.setEntry(eid) ## dump the headers and status, just to show they're there if verbose == True: print('\nReader:') pprint(tools.interpret.getReaderDict(reader)) print('\nHeader:') pprint(tools.interpret.getHeaderDict(reader)) print('\nStatus:') pprint(tools.interpret.getStatusDict(reader)) reader.header().Dump() reader.status().Dump() #print reader.N() # plot all waveforms
_eventids) roi_impulsivity = ds.getDataFromParam(roi_eventids, 'impulsivity_h') roi_impulsivity_sort = numpy.argsort( roi_impulsivity )[::-1] #Reverse sorting so high numbers are first. if len(roi_eventids) > limit_events: print( 'LIMITING TIME DELAY CALCULATION TO %i MOST IMPULSIVE EVENTS' % limit_events) roi_eventids = numpy.sort( roi_eventids[roi_impulsivity_sort[0:limit_events]]) argmaxs = [] reader.setEntry(roi_eventids[0]) for channel in range(8): argmaxs.append(numpy.argmax(reader.wf(channel))) waveform_index_range = (int(numpy.min(argmaxs) - 40), int(numpy.max(argmaxs) + 100)) tdc = TimeDelayCalculator( reader, final_corr_length=final_corr_length, crit_freq_low_pass_MHz=None, crit_freq_high_pass_MHz=None, low_pass_filter_order=None, high_pass_filter_order=None, waveform_index_range=waveform_index_range, plot_filters=False,
trigger_type = loadTriggerTypes(reader) times = reader.t() #The times of a waveform in ns. Not upsampled. for trig_type in [1, 2, 3]: print('Plotting %i eventids of trig type %i' % (plot_N_per_type, trig_type)) trig_eventids = eventids[ trigger_type == trig_type] #All eventids of this trig type trig_eventids = numpy.sort( numpy.random.choice(trig_eventids, 2) ) #Randomly choosing a subset and sorting for faster loading of events for eventid in trig_eventids: reader.setEntry( eventid ) #Actually makes the wf function adress the correct event. fig = plt.figure() fig.canvas.set_window_title('Run %i event %i, Trig Type %i' % (run, eventid, trig_type)) plt.title('Run %i event %i, Trig Type %i' % (run, eventid, trig_type)) plt.subplot(2, 1, 1) plt.ylabel('Hpol Adu') plt.subplot(2, 1, 2) plt.ylabel('Vpol Adu') plt.xlabel('t (ns)') for channel in range(8): plt.subplot(2, 1, channel % 2 + 1)