def ToF_sweep_action(self): filter_parameters = get_filter_parameters(self) ce_filtered = filter_clusters(self.ce, filter_parameters) number_bins = int(self.tofBins.text()) bus_start = self.module_min.value() bus_stop = self.module_max.value() ToF_Sweep_Animation(ce_filtered, number_bins, bus_start, bus_stop)
def ToF_Overlay_action(self): paths = QFileDialog.getOpenFileNames(self, "", "../data")[0] if len(paths) > 0: # Declare parameters filter_parameters = get_filter_parameters(self) number_bins = int(self.tofBins.text()) labels = ['Beam', 'Background'] # Plot fig = plt.figure() hists = [] bin_centers_vec = [] range = [0, 71e3] for path, label in zip(paths, labels): # Get data data_set = path.rsplit('/', 1)[-1][:-3] + '.zip' ce = pd.read_hdf(path, 'ce') ce_filtered = filter_clusters(ce, filter_parameters) # Get normalization norm = 1 / self.BM_counts_dict[data_set] # Plot hist, bins = ToF_histogram(ce_filtered, number_bins, label, norm, range) hists.append(hist) bin_centers_vec.append(bins) plt.plot(bin_centers_vec[0], hists[0] - hists[1], label='Difference', zorder=5) plt.title('ToF') plt.xlabel('ToF [$\mu$s]') plt.ylabel('Counts (Normalized by beam monitor)') plt.legend() plt.grid(True, which='major', linestyle='--', zorder=0) plt.grid(True, which='minor', linestyle='--', zorder=0) fig.show()
def PHS_wires_vs_grids_action(self): if (self.data_sets != ''): filter_parameters = get_filter_parameters(self) ce_filtered = filter_clusters(self.ce, filter_parameters) bus_start = self.module_min.value() bus_stop = self.module_max.value() fig = PHS_wires_vs_grids_plot(ce_filtered, bus_start, bus_stop) fig.show()
def Multiplicity_action(self): if (self.data_sets != ''): filter_parameters = get_filter_parameters(self) ce_filtered = filter_clusters(self.ce, filter_parameters) bus_start = self.module_min.value() bus_stop = self.module_max.value() fig = multiplicity_plot(ce_filtered, bus_start, bus_stop) fig.show()
def CE_2D_comparison_action(self): paths = QFileDialog.getOpenFileNames(self, "", "../data")[0] if len(paths) > 0: # Declare parameters filter_parameters = get_filter_parameters(self) front_hists = [] top_hists = [] side_hists = [] # Extract histogram data for i, path in enumerate(paths): # Import data data_set = path.rsplit('/', 1)[-1][:-3] + '.zip' ce = pd.read_hdf(path, 'ce') ce_filtered = filter_clusters(ce, filter_parameters) # Extract histograms bus_start = self.module_min.value() bus_stop = self.module_max.value() norm = 1 / self.BM_counts_dict[data_set] __, histograms = coincidences_projections_plot( ce_filtered, bus_start, bus_stop, norm) front_hists.append(np.transpose(histograms[0])) top_hists.append(np.transpose(histograms[1])) side_hists.append(np.transpose(histograms[2])) # Take difference between histograms projections_hists = [front_hists, top_hists, side_hists] diffs = [] for hists in projections_hists: diffs.append(hists[0] - hists[1]) # Define figure properties labels_vec = [['Front view', 'Row', 'Grid'], ['Top view', 'Row', 'Layer'], ['Side view', 'Layer', 'Grid']] limits_vec = [[3e-6, 2e-3], [3e-4, 4e-3], [3e-5, 2e-3]] # Plot difference fig = plt.figure() fig.set_figheight(5) fig.set_figwidth(17) for i, (diff, labels, limits) in enumerate(zip(diffs, labels_vec, limits_vec)): vmin, vmax = limits plt.subplot(1, 3, 1 + i) plt.imshow(diff, cmap='jet', norm=LogNorm(), origin='lower', interpolation='nearest', aspect='auto', vmin=vmin, vmax=vmax) # Stylize plot title, xlabel, ylabel = labels plt.title(title) plt.xlabel(xlabel) plt.ylabel(ylabel) cbar = plt.colorbar() cbar.set_label('Counts (Normalized to beam monitor)') plt.tight_layout() fig.show()
def Energy_Resolution_action(self): if (self.data_sets != ''): filter_parameters = get_filter_parameters(self) ce_filtered = filter_clusters(self.ce, filter_parameters) dE_values = calculate_energy_transfer(ce_filtered, Ei) # NEED A WAY TO GET HE3 VALUES FWHM = calculate_energy_resolution(dE_values, self.Ei, filter_parameters) print('FWHM: %.2f' % FWHM)
def Animation_3D_action(self): filter_parameters = get_filter_parameters(self) ce_filtered = filter_clusters(self.ce, filter_parameters) origin_voxel = [ int(self.bus_origin.text()), int(self.gCh_origin.text()), int(self.wCh_origin.text()) ] Animation_3D_plot(ce_filtered, origin_voxel)
def Coincidences_3D_action(self): if self.data_sets != '': filter_parameters = get_filter_parameters(self) ce_filtered = filter_clusters(self.ce, filter_parameters) origin_voxel = [ int(self.bus_origin.text()), int(self.gCh_origin.text()), int(self.wCh_origin.text()) ] coincidences_3D_plot(ce_filtered, origin_voxel)
def PHS_1D_action(self): if self.data_sets != '': filter_parameters = get_filter_parameters(self) ce_filtered = filter_clusters(self.ce, filter_parameters) number_bins = int(self.phsBins.text()) fig = plt.figure() fig.set_figheight(5) fig.set_figwidth(10) PHS_1D_plot(ce_filtered, number_bins) fig.show()
def time_sweep_action(self): filter_parameters = get_filter_parameters(self) ce_filtered = filter_clusters(self.ce, filter_parameters) origin_voxel = [ int(self.bus_origin.text()), int(self.gCh_origin.text()), int(self.wCh_origin.text()) ] number_bins = int(self.tofBins.text()) bus_start = self.module_min.value() bus_stop = self.module_max.value() Time_Sweep_Animation(ce_filtered, number_bins, origin_voxel, bus_start, bus_stop)
def Count_Rate_action(self): if (self.data_sets != ''): # Declare parameters number_bins = int(self.tofBins.text()) time_offset = (0.6e-3) period_time = (1 / 14) filter_parameters = get_filter_parameters(self) ce_filtered = filter_clusters(self.ce, filter_parameters) ToF_values = (ce_filtered.ToF * 62.5e-9 + time_offset) % period_time fig = plt.figure() count_rate = calculate_count_rate(ToF_values, self.measurement_time, number_bins) fig.show() print('Count rate: %.1f [Hz]' % count_rate)
def Wavelength_action(self): if (self.data_sets != ''): filter_parameters = get_filter_parameters(self) ce_filtered = filter_clusters(self.ce, filter_parameters) number_bins = int(self.dE_bins.text()) origin_voxel = [ int(self.bus_origin.text()), int(self.gCh_origin.text()), int(self.wCh_origin.text()) ] fig = plt.figure() start = 0 stop = 10 plot_energy = False energy_plot(ce_filtered, origin_voxel, number_bins, start, stop, plot_energy) fig.show()
def Coincidences_2D_action(self): if self.data_sets != '': filter_parameters = get_filter_parameters(self) ce_filtered = filter_clusters(self.ce, filter_parameters) bus_start = self.module_min.value() bus_stop = self.module_max.value() fig, histograms = coincidences_2D_plot(ce_filtered, self.measurement_time, bus_start, bus_stop) # Export histograms to text dir_name = os.path.dirname(__file__) output_path = os.path.join(dir_name, '../output/') for bus, histogram in enumerate(histograms): path = output_path + '2D_Coincidences_Bus_%d.txt' % bus np.savetxt(path, histogram, fmt="%d", delimiter=",") # Plot figure fig.show()
def Timestamp_action(self): if (self.data_sets != ''): filter_parameters = get_filter_parameters(self) ce_filtered = filter_clusters(self.ce, filter_parameters) number_bins = int(self.tofBins.text()) unit = 'hours' fig = plt.figure() bus_start = self.module_min.value() bus_stop = self.module_max.value() for Bus in np.arange(bus_start, bus_stop + 1, 1): df_temp = ce_filtered[ce_filtered.Bus == Bus] if df_temp.shape[0] > 0: Time = (df_temp.Time * 62.5e-9) / (60**2) label = 'Bus %d' % Bus timestamp_plot(Time, number_bins, unit, label) plt.legend(loc=2) fig.show()
def ToF_MG_vs_ToF_He3_action(self): # Get filter parameters for MG and He-3 parameters_MG = get_filter_parameters(self) parameters_He3 = get_He3_filter_parameters(self) # Filter data MG_red = filter_clusters(self.ce, parameters_MG) He3_red = filter_He3(self.He3_df, parameters_He3) # Declare paremeters number_bins = int(self.tofBins.text()) MG_label, He3_label = self.data_sets, self.He3_data_sets useMaxNorm = True # Plot data fig = plt.figure() He3_ToF_plot(He3_red, number_bins, He3_label) ToF_histogram(MG_red, number_bins, MG_label) plt.legend() fig.show()
def Wavelength_overlay_action(self): paths = QFileDialog.getOpenFileNames(self, "", "../data")[0] number_bins = int(self.dE_bins.text()) origin_voxel = [ int(self.bus_origin.text()), int(self.gCh_origin.text()), int(self.wCh_origin.text()) ] MG_filter_parameters = get_filter_parameters(self) He3_filter_parameters = get_He3_filter_parameters(self) fig = plt.figure() # Multi-Grid for i, path in enumerate(paths): label = path.rsplit('/', 1)[-1] ce = pd.read_hdf(path, 'ce') ce_filtered = filter_clusters(ce, MG_filter_parameters) duration = get_duration(ce) norm = 1 / duration energy = calculate_energy(ce_filtered, origin_voxel) plt.hist(meV_to_A(energy), bins=number_bins, range=[0, 10], zorder=5, histtype='step', label=label, weights=norm * np.ones(len(energy))) print('Progress: %d/%d' % (i + 1, len(paths))) # He-3 He3_df_red = filter_He3(self.He3_df, He3_filter_parameters) energy_He3 = calculate_He3_energy(He3_df_red) norm_He3 = 1 / 54304 plt.hist(meV_to_A(energy_He3), bins=number_bins, range=[0, 10], zorder=5, histtype='step', label='2019_09_HZB_He3InBeam54304s_overnight.lst', weights=norm * np.ones(len(energy_He3))) plt.grid(True, which='major', linestyle='--', zorder=0) plt.grid(True, which='minor', linestyle='--', zorder=0) plt.ylabel('Counts (Normalized to duration)') plt.xlabel('Wavelength [Å]') plt.title('Wavelength Distribution') plt.legend(loc=1) fig.show()
def Layers_action(self): # Extract origin voxel origin_voxel = [ int(self.bus_origin.text()), int(self.gCh_origin.text()), int(self.wCh_origin.text()) ] # Get MG data MG_parameters = get_filter_parameters(self) df_MG = filter_clusters(self.ce, MG_parameters) # Get He3 data #He3_parameters = get_He3_filter_parameters(self) #df_He3 = filter_He3(self.He3_df, He3_parameters) # Investigate ToF spread #investigate_layers_FWHM(df_MG, df_He3, origin_voxel) #investigate_layers_delta_ToF(df_MG, df_He3, origin_voxel) duration = get_duration(df_MG) investigate_layers_counts(df_MG, duration)
def PHS_comparison_action(self): paths = QFileDialog.getOpenFileNames(self, "", "../data")[0] if len(paths) > 0: # Declare parameters filter_parameters = get_filter_parameters(self) number_bins = int(self.phsBins.text()) ylabel = '(Normalized to beam monitor)' intervals = [[0, 4095], [0, 10000]] # Extract histogram data fig = plt.figure() fig.set_figheight(5) fig.set_figwidth(10) labels = ['(Beam)', '(Background)'] hists = [] bins_vec = [] errors = [] norms = [] # Plot data for path, label in zip(paths, labels): # Import data data_set = path.rsplit('/', 1)[-1][:-3] + '.zip' ce = pd.read_hdf(path, 'ce') ce_filtered = filter_clusters(ce, filter_parameters) # Extract normalization norm = 1 / self.BM_counts_dict[data_set] bins, hist = PHS_1D_plot(ce_filtered, number_bins, label, norm, ylabel, intervals) hists.append(np.array(hist)) errors.append(np.array(hist) / norm) norms.append(norm) bins_vec.append(bins) # Plot difference for i in range(0, 2): plt.subplot(1, 2, i + 1) plt.plot( bins_vec[0][i], hists[0][i] - hists[1][i], #np.sqrt((errors[0][i]*norms[0]) ** 2 + (errors[1][i]*norms[1]) ** 2), #fmt='.-', capsize=5, zorder=3, label='Difference') plt.legend(loc=1) fig.show()
def PHS_comparison_region_action(self): if (self.data_sets != ''): # Declare parameters number_bins = int(self.phsBins.text()) filter_parameters = get_filter_parameters(self) df = filter_clusters(self.ce, filter_parameters) # Extract data from different regions df_cross = df[(((df.Bus * 4) + df.wCh // 20) >= 4) & (((df.Bus * 4) + df.wCh // 20) <= 7) & (df.gCh >= 98) & (df.gCh <= 101)] df_neutron = df[(((df.Bus * 4) + df.wCh // 20) == 6) & (df.gCh >= 87) & (df.gCh <= 89)] norm = 1 / self.measurement_time fig = plt.figure() fig.set_figheight(5) fig.set_figwidth(10) PHS_1D_plot(df_cross, number_bins, '(Cross talk)', norm) PHS_1D_plot(df_neutron, number_bins, '(Neutrons)', norm) plt.legend() fig.show()
def ToF_action(self): if self.data_sets != '': # Filter data filter_parameters = get_filter_parameters(self) ce_filtered = filter_clusters(self.ce, filter_parameters) number_bins = int(self.tofBins.text()) # Plot data fig = plt.figure() hist, bins = ToF_histogram(ce_filtered, number_bins, range=[0, 71429]) # Save histogram in ASCII-format dir_name = os.path.dirname(__file__) output_path = os.path.join( dir_name, '../output/ToF_%s.txt' % self.data_sets[5:-5]) np.savetxt(output_path, np.transpose(np.array([bins, hist])), delimiter=",", header='ToF (µs), Counts') fig.show()
def Coincidences_Projections_action(self): if self.data_sets != '': filter_parameters = get_filter_parameters(self) ce_filtered = filter_clusters(self.ce, filter_parameters) bus_start = self.module_min.value() bus_stop = self.module_max.value() # Get beam monitor data file_name = self.data_sets[5:-5] norm = 1 / get_duration( ce_filtered) #self.BM_counts_dict[file_name] fig, histograms = coincidences_projections_plot( ce_filtered, bus_start, bus_stop, norm) # Export histograms to text dir_name = os.path.dirname(__file__) output_path = os.path.join(dir_name, '../output/') file_names = ['Front', 'Top', 'Side'] for file_name, histogram in zip(file_names, histograms): path = output_path + '2D_Coincidences_Projections_%s.txt' % file_name np.savetxt(path, histogram, fmt="%d", delimiter=",") # Plot figure fig.show()
def prepare_data(origin_voxel, MG_filter_parameters, He3_filter_parameters): """ Data is returned in following order: 1. Multi-Grid Coated Radial Blades, beam 2. Multi-Grid Non-Coated Radial Blades, beam 3. Multi-Grid Coated Radial Blades, background 4. Multi-Grid Non-Coated Radial Blades, background 5. He-3, beam 6. He-3, background Within each data-list, data is returned in following order (1. Energies - Beam Removed) <- Only for MG 2. Energies - Full 3. Histogram 4. Bin centers (5. Peaks) (6. Widths) (7. PileUp) <- Only for He-3 (8. ADCs) <- Only for He-3 """ # Declare parameters, such as distance offset and He3 duration dirname = os.path.dirname(__file__) number_bins = 5000 start = 0.8 # [meV] end = 80 # [meV] MG_distance_offsets = [1.5e-3, 0, 1.5e-3, 0] He3_distance_offset = 3e-3 He3_durations = [54304, 58094] # Declare heights used as threshold in peak finding algorithm heights_MG_coated = [20000, 10000] heights_MG_non_coated = [8000, 1000] # CHANGE TO [12000, 1000] when normal scattering analysis heights_He3 = [20000, 1000] heights_vec_MG = [heights_MG_coated, heights_MG_non_coated] # Declare file names MG_COATED = 'mvmelst_165_191002_111641_Det2_overnight3.h5' MG_COATED_BACKGROUND = 'mvmelst_169_191003_075039_Det2_He3InBeam_overnight4.h5' MG_NON_COATED = 'mvmelst_135_190930_141618_Det1_overnight2_30x80_14x60.h5' MG_NON_COATED_BACKGROUND = 'mvmelst_141_191001_120405_He3InBeam_overnight3.h5' HE_3 = '2019_09_HZB_He3InBeam54304s_overnight.h5' HE_3_BACKGROUND = '2019_09_HZB_out_of_beam_overnight_58094s.h5' MG_file_names = [MG_COATED, MG_NON_COATED, MG_COATED_BACKGROUND, MG_NON_COATED_BACKGROUND] He3_file_names = [HE_3, HE_3_BACKGROUND] # Declare list to store all data full_data = [] # Store Multi-Grid data print('Multi-Grid...') for i, file_name in enumerate(MG_file_names): path = os.path.join(dirname, '../../../data/Lineshape/%s' % file_name) # Calculate energies and histograms df = pd.read_hdf(path, 'ce') df_red = filter_clusters(df, MG_filter_parameters) duration = get_duration(df) energies = calculate_energy(df_red, origin_voxel, MG_distance_offsets[i]) hist, bins = get_hist(energies, number_bins, start, end) # Calculate energy for when row which neutron beam hits is removed energies_no_beam = None if i == 0: df_no_beam = df_red[~((((df_red.Bus * 4) + df_red.wCh//20) == 6) & (df_red.gCh >= 86) & (df_red.gCh <= 89))] energies_no_beam = calculate_energy(df_no_beam, origin_voxel, MG_distance_offsets[i]) elif i == 1: df_no_beam = df_red[~((((df_red.Bus * 4) + df_red.wCh//20) == 6) & (df_red.gCh >= 87) & (df_red.gCh <= 89))] energies_no_beam = calculate_energy(df_no_beam, origin_voxel, MG_distance_offsets[i]) # Store data data = [energies_no_beam, energies, hist, bins] if i < 2: # If it is a beam measurement, extract peaks peaks, __ = get_peaks(hist, heights_vec_MG[i], number_bins) widths, *_ = peak_widths(hist, peaks) data.extend([peaks, widths]) full_data.append(data) # Store He-3 data print('He-3...') for i, (file_name, duration) in enumerate(zip(He3_file_names, He3_durations)): path = os.path.join(dirname, '../../../data/Lineshape/%s' % file_name) df = pd.read_hdf(path, 'df') df_red = filter_He3(df, He3_filter_parameters) energies = calculate_He3_energy(df_red, He3_distance_offset) hist, bins = get_hist(energies, number_bins, start, end) data = [None, energies, hist, bins] if i < 1: # If it is a beam measurement, extract peaks and pile up info peaks, __ = get_peaks(hist, heights_He3, number_bins) widths, *_ = peak_widths(hist, peaks) data.extend([peaks, widths, df_red.PileUp, df_red.ADC]) full_data.append(data) return full_data