def show_event(ind, track, mom, classifier): """ Plot stuff for one event. geant4 is cyan ridge-following is light green moments is magenta """ if track.g4track.energy_tot_kev < 100: print('Low energy event: {} keV'.format(track.g4track.energy_tot_kev)) return None mom.reconstruct() try: _, HTinfo = ht.reconstruct(track) except ht.HybridTrackError: HTinfo = None # geant4 position g4x, g4y = tp.get_image_xy(track) g4x0 = np.array([g4x[0], g4y[0]]) # geant4 direction (radians) g4_alpha_deg = track.g4track.alpha_deg g4_alpha_rad = g4_alpha_deg * np.pi / 180.0 # moments mom_arc, mom_ep = tp.get_arc2(mom) mom_alpha_rad = mom.alpha reject_flag, reject_reason = mom_reject(mom) mom_da = ev.AlphaUncertainty.delta_alpha( g4_alpha_deg, mom_alpha_rad * 180.0 / np.pi) # ridge-following # HTinfo = track.algorithms['python HT v1.52'].info ridge_ep = (HTinfo.ridge[HTinfo.measurement_start_pt].coordinates_pix - np.array([1, 1])) ridge_alpha_rad = (track.algorithms['python HT v1.52'].alpha_deg * np.pi / 180.0) ridge_da = ev.AlphaUncertainty.delta_alpha( g4_alpha_deg, ridge_alpha_rad * 180.0 / np.pi) titlebase = ( r'{}' + '\n' + r'E={:.0f}keV, $\beta$={:.0f}{deg}, ' + r'scattering {:.1f}{deg}, E_end={:.1f}keV' + '\n' + r'Rejection: {}' + '\n') titlestr = titlebase.format( ind, track.g4track.energy_tot_kev, track.g4track.beta_deg, classifier.total_scatter_angle * 180 / np.pi, mom.end_energy, reject_reason, deg=DEG,) if np.abs(classifier.g4track.beta_deg) > 60: titlestr += '[Beta > 60{}]'.format(DEG) if classifier.early_scatter: titlestr += ' [Early scatter in 25um]' if classifier.overlap: titlestr += ' [Overlapping]' if classifier.wrong_end: titlestr += ' [Wrong end]' # PLOTS fig = plt.figure() # top left: ridge-following, zoomed plt.subplot(2, 2, 1) # g4 plot_track(track.image) plt.plot(g4y, g4x, '.c') tp.plot_arrow(g4x0, g4_alpha_rad, color='c') # ridge ridge = HTinfo.ridge[HTinfo.measurement_start_pt:HTinfo.measurement_end_pt] tp.plot_ridgepoints( plt.gca(), ridge, fmtstring='.', offset=[1, 1], color=[0, 1, 0]) tp.plot_arrow(ridge_ep, ridge_alpha_rad, color=[0, 1, 0]) # general xoff = mom.end_segment_offsets[1] yoff = mom.end_segment_offsets[0] plt.xlim((xoff - 1, xoff + mom.end_segment_image.shape[1] + 1)) plt.ylim((yoff - 1, yoff + mom.end_segment_image.shape[0] + 1)) plt.xlabel('y [pixels]') plt.ylabel('x [pixels]') plt.colorbar() # bottom left: ridge-following, full plt.subplot(2, 2, 3) # g4 plot_track(track.image) plt.plot(g4y, g4x, '.c') tp.plot_arrow(g4x0, g4_alpha_rad, color='c') # ridge ridge = HTinfo.ridge[HTinfo.measurement_start_pt:HTinfo.measurement_end_pt] tp.plot_ridgepoints( plt.gca(), ridge, fmtstring='.', offset=[1, 1], color=[0, 1, 0]) tp.plot_arrow(ridge_ep, ridge_alpha_rad, color=[0, 1, 0]) # general plt.xlim((0, track.image.shape[1] - 1)) plt.ylim((0, track.image.shape[0] - 1)) plt.xlabel('y [pixels]') plt.ylabel('x [pixels]') plt.colorbar() plt.title(r'Ridge-following, $\Delta_\alpha$ = {:2.1f}{}'.format( ridge_da, DEG)) # top right: moments, zoomed plt.subplot(2, 2, 2) # g4 plot_track(track.image) plt.plot(g4y, g4x, '.c') tp.plot_arrow(g4x0, g4_alpha_rad, color='c') # moments plt.plot(mom.box_y, mom.box_x, 'm') if reject_flag: plt.plot(mom_arc[1, :], mom_arc[0, :], 'm', lw=2.5, ls='dashed') tp.plot_arrow(mom_ep, mom_alpha_rad, color='m', ls='dashed') else: plt.plot(mom_arc[1, :], mom_arc[0, :], 'm', lw=2.5) tp.plot_arrow(mom_ep, mom_alpha_rad, color='m') # general xoff = mom.end_segment_offsets[1] yoff = mom.end_segment_offsets[0] plt.xlim((xoff - 1, xoff + mom.end_segment_image.shape[1] + 1)) plt.ylim((yoff - 1, yoff + mom.end_segment_image.shape[0] + 1)) plt.xlabel('y [pixels]') plt.ylabel('x [pixels]') plt.colorbar() # bottom right: moments, full plt.subplot(2, 2, 4) # g4 plot_track(track.image) plt.plot(g4y, g4x, '.c') tp.plot_arrow(g4x0, g4_alpha_rad, color='c') # moments plt.plot(mom.box_y, mom.box_x, 'm') if reject_flag: plt.plot(mom_arc[1, :], mom_arc[0, :], 'm', lw=2.5, ls='dashed') tp.plot_arrow(mom_ep, mom_alpha_rad, color='m', ls='dashed') else: plt.plot(mom_arc[1, :], mom_arc[0, :], 'm', lw=2.5) tp.plot_arrow(mom_ep, mom_alpha_rad, color='m') # general plt.xlim((0, track.image.shape[1] - 1)) plt.ylim((0, track.image.shape[0] - 1)) plt.xlabel('y [pixels]') plt.ylabel('x [pixels]') plt.colorbar() plt.title(r'Moments, $\Delta_\alpha$ = {:2.1f}{}'.format(mom_da, DEG)) fig.suptitle(titlestr) figManager = plt.get_current_fig_manager() figManager.window.showMaximized() plt.show() return fig
def classify_etc(loadfile, savefile, v): """ 1. Moments algorithm 2. HybridTrack algorithm 3. Classify """ progressflag = not file_vars()[0] pn = 'pix10_5noise15' HTname = 'python HT v1.52' MTname = 'moments v1.0' vprint(v, 1, 'Starting {} at {} with {}% mem usage'.format( loadfile, time.ctime(), psutil.virtual_memory().percent)) pyobj_to_h5 = {} try: with h5py.File(loadfile, 'a', driver='core') as f, h5py.File( savefile, 'a', driver='core') as h5save: # n = 0 if progressflag: pbar = progressbar.ProgressBar( widgets=[progressbar.Percentage(), ' ', progressbar.Bar(), ' ', progressbar.ETA()], maxval=len(f)) pbar.start() keylist = f.keys() keylist.sort() for ind in keylist: vprint(v, 3, 'Beginning track {} in {}'.format(ind, loadfile)) if int(ind) % 50 == 0: vprint(v, 2, 'Beginning track {} in {}'.format(ind, loadfile)) # evt is for the G4Track object evt = f[ind] # shouldn't get a KeyError because we are looping over ind # trk is for the Track object try: trk = evt[pn] except KeyError: vprint(v, 1, '**Missing key {} in {}{}, skipping'.format( pn, loadfile, evt.name)) continue trkpath = ind + '/' + pn errorcode = 0 n += 1 if n > 50: # testing # vprint(v, 1, 'Finished 50 files, exiting') # break pass # load G4Track vprint(v, 3, 'Loading G4Track {} in {}'.format(ind, loadfile)) try: this_g4track = G4Track.from_dth5(evt) except trackio.InterfaceError: vprint(v, 2, 'InterfaceError in G4Track at {}, {}'.format( loadfile, ind)) continue # load Track vprint(v, 3, 'Loading Track {} in {}'.format(ind, loadfile)) try: this_track = Track.from_dth5(trk, g4track=this_g4track) except trackio.InterfaceError: vprint(v, 2, 'InterfaceError in Track at {}, {}'.format( loadfile, ind)) continue # check for error codes - Track.from_dth5 may return an int if isinstance(this_track, int): this_save = h5save.create_group(trkpath) this_save.attrs.create( 'errorcode', this_track, shape=np.shape(this_track)) continue # run moments algorithm vprint(v, 3, 'Running moments on track {} in {}'.format( ind, loadfile)) try: mom = tm.MomentsReconstruction(this_track.image) mom.reconstruct() except ht.NoEndsFound: mom.alpha = None errorcode = 4 this_save = h5save.create_group('mom_' + trkpath) this_save.attrs.create( 'errorcode', errorcode, shape=np.shape(errorcode)) else: # write into savefile trackio.write_object_to_hdf5( mom, h5save, 'mom_' + trkpath, pyobj_to_h5=pyobj_to_h5) # write into track object if mom.alpha: this_track.add_algorithm( MTname, alpha_deg=mom.alpha * 180 / np.pi, beta_deg=np.nan, info=None) else: this_track.add_algorithm( MTname, alpha_deg=np.nan, beta_deg=np.nan, info=None) # run HT algorithm (v1.52) vprint(v, 3, 'Running HT on track {} in {}'.format( ind, loadfile)) try: _, HTinfo = ht.reconstruct(this_track) except (ht.InfiniteLoop, ht.NoEndsFound): # write empty into track object this_track.add_algorithm( HTname, alpha_deg=np.nan, beta_deg=np.nan, info=None) else: # trim memory usage if hasattr(HTinfo, 'ridge'): if HTinfo.ridge: for ridgept in HTinfo.ridge: ridgept.cuts = None ridgept.best_cut = None # write into track object this_track.add_algorithm( HTname, alpha_deg=HTinfo.alpha_deg, beta_deg=HTinfo.beta_deg, info=HTinfo) # write py HDF5 format into savefile (including alg outputs) try: trackio.write_object_to_hdf5( this_track, h5save, trkpath, pyobj_to_h5=pyobj_to_h5) except trackio.InterfaceError: vprint(v, 1, 'InterfaceError writing to file at ' + '{}, {}'.format(savefile, ind)) continue # run classifier vprint(v, 3, 'Running MC classifier on track {} in {}'.format( ind, loadfile)) classifier = cl.Classifier(this_track.g4track) try: classifier.mc_classify() except cl.TrackTooShortError: classifier.error = 'TrackTooShortError' else: vprint(v, 3, 'Running ends classifier on track {} in {}'.format( ind, loadfile)) try: classifier.end_classify(this_track, mom=mom) except tp.G4TrackTooBigError: classifier.error = 'G4TrackTooBigError' except cl.NoEnds: classifier.error = 'NoEnds' # write into savefile vprint(v, 3, 'Writing classifier into {} for track {}'.format( savefile, ind)) trackio.write_object_to_hdf5( classifier, h5save, 'cl_' + trkpath, pyobj_to_h5=pyobj_to_h5) if progressflag: pbar.update(n) if progressflag: pbar.finish() # f gets closed here except NotImplementedError: pass
def test_Track(): """ """ def test_Track_read(track): # test Track data format from etrack.io import trackio import os filebase = ''.join( chr(i) for i in np.random.randint(97, 122, size=(8, ))) filename = '.'.join([filebase, 'h5']) with h5py.File(filename, 'a') as h5file: trackio.write_object_to_hdf5(track, h5file, 'track') with h5py.File(filename, 'r') as h5file: track2 = trackio.read_object_from_hdf5(h5file['track']) assert track2['is_modeled'] == track.is_modeled assert track2['pixel_size_um'] == track.pixel_size_um assert track2['noise_ev'] == track.noise_ev assert track2['label'] == track.label assert track2['energy_kev'] == track.energy_kev assert np.all(track2['image'] == track.image) assert track2['algorithms']['python HT v1.5']['alpha_deg'] == 120.5 assert track2['algorithms']['python HT v1.5']['beta_deg'] == 43.5 test_Track_from_pydict(track, track2) test_Track_from_hdf5() os.remove(filename) def test_Track_from_pydict(track, track2): """ track is the original generated Track object track2 is the pydict from file Returns the track object constructed from pydict. """ track3 = Track.from_pydict(track2) assert track3.is_modeled == track.is_modeled assert track3.pixel_size_um == track.pixel_size_um assert track3.noise_ev == track.noise_ev assert track3.label == track.label assert track3.energy_kev == track.energy_kev assert np.all(track3.image == track.image) assert track3.algorithms['python HT v1.5'].alpha_deg == 120.5 assert track3.algorithms['python HT v1.5'].beta_deg == 43.5 return track3 def test_Track_from_hdf5(): """ as previously, but test the Track.from_hdf5() constructor. """ # TODO print('test_Track_from_hdf5 not implemented yet!') pass def test_TrackExceptions(): """ """ image = hybridtrack.test_input() try: Track(image) raise RuntimeError('Failed to raise error on Track instantiation') except InputError: pass try: Track(image, is_modeled=True, is_measured=True) raise RuntimeError('Failed to raise error on Track instantiation') except InputError: pass try: Track(image, is_modeled=False, is_measured=False) raise RuntimeError('Failed to raise error on Track instantiation') except InputError: pass # test_Track() main image = hybridtrack.test_input() track = Track(image, is_modeled=True, pixel_size_um=10.5, noise_ev=0.0, label='MultiAngle', energy_kev=np.sum(image)) options, info = hybridtrack.reconstruct(track) track.add_algorithm('python HT v1.5', 120.5, 43.5, info=info) test_Track_read(track) test_TrackExceptions()
def test_Track(): """ """ def test_Track_read(track): # test Track data format from etrack.io import trackio import os filebase = ''.join( chr(i) for i in np.random.randint(97, 122, size=(8,))) filename = '.'.join([filebase, 'h5']) with h5py.File(filename, 'a') as h5file: trackio.write_object_to_hdf5( track, h5file, 'track') with h5py.File(filename, 'r') as h5file: track2 = trackio.read_object_from_hdf5( h5file['track']) assert track2['is_modeled'] == track.is_modeled assert track2['pixel_size_um'] == track.pixel_size_um assert track2['noise_ev'] == track.noise_ev assert track2['label'] == track.label assert track2['energy_kev'] == track.energy_kev assert np.all(track2['image'] == track.image) assert track2['algorithms']['python HT v1.5']['alpha_deg'] == 120.5 assert track2['algorithms']['python HT v1.5']['beta_deg'] == 43.5 test_Track_from_pydict(track, track2) test_Track_from_hdf5() os.remove(filename) def test_Track_from_pydict(track, track2): """ track is the original generated Track object track2 is the pydict from file Returns the track object constructed from pydict. """ track3 = Track.from_pydict(track2) assert track3.is_modeled == track.is_modeled assert track3.pixel_size_um == track.pixel_size_um assert track3.noise_ev == track.noise_ev assert track3.label == track.label assert track3.energy_kev == track.energy_kev assert np.all(track3.image == track.image) assert track3.algorithms['python HT v1.5'].alpha_deg == 120.5 assert track3.algorithms['python HT v1.5'].beta_deg == 43.5 return track3 def test_Track_from_hdf5(): """ as previously, but test the Track.from_hdf5() constructor. """ # TODO print('test_Track_from_hdf5 not implemented yet!') pass def test_TrackExceptions(): """ """ image = hybridtrack.test_input() try: Track(image) raise RuntimeError('Failed to raise error on Track instantiation') except InputError: pass try: Track(image, is_modeled=True, is_measured=True) raise RuntimeError('Failed to raise error on Track instantiation') except InputError: pass try: Track(image, is_modeled=False, is_measured=False) raise RuntimeError('Failed to raise error on Track instantiation') except InputError: pass # test_Track() main image = hybridtrack.test_input() track = Track(image, is_modeled=True, pixel_size_um=10.5, noise_ev=0.0, label='MultiAngle', energy_kev=np.sum(image)) options, info = hybridtrack.reconstruct(track) track.add_algorithm('python HT v1.5', 120.5, 43.5, info=info) test_Track_read(track) test_TrackExceptions()
def show_event(ind, track, mom, classifier): """ Plot stuff for one event. geant4 is cyan ridge-following is light green moments is magenta """ if track.g4track.energy_tot_kev < 100: print('Low energy event: {} keV'.format(track.g4track.energy_tot_kev)) return None mom.reconstruct() try: _, HTinfo = ht.reconstruct(track) except ht.HybridTrackError: HTinfo = None # geant4 position g4x, g4y = tp.get_image_xy(track) g4x0 = np.array([g4x[0], g4y[0]]) # geant4 direction (radians) g4_alpha_deg = track.g4track.alpha_deg g4_alpha_rad = g4_alpha_deg * np.pi / 180.0 # moments mom_arc, mom_ep = tp.get_arc2(mom) mom_alpha_rad = mom.alpha reject_flag, reject_reason = mom_reject(mom) mom_da = ev.AlphaUncertainty.delta_alpha(g4_alpha_deg, mom_alpha_rad * 180.0 / np.pi) # ridge-following # HTinfo = track.algorithms['python HT v1.52'].info ridge_ep = (HTinfo.ridge[HTinfo.measurement_start_pt].coordinates_pix - np.array([1, 1])) ridge_alpha_rad = (track.algorithms['python HT v1.52'].alpha_deg * np.pi / 180.0) ridge_da = ev.AlphaUncertainty.delta_alpha(g4_alpha_deg, ridge_alpha_rad * 180.0 / np.pi) titlebase = (r'{}' + '\n' + r'E={:.0f}keV, $\beta$={:.0f}{deg}, ' + r'scattering {:.1f}{deg}, E_end={:.1f}keV' + '\n' + r'Rejection: {}' + '\n') titlestr = titlebase.format( ind, track.g4track.energy_tot_kev, track.g4track.beta_deg, classifier.total_scatter_angle * 180 / np.pi, mom.end_energy, reject_reason, deg=DEG, ) if np.abs(classifier.g4track.beta_deg) > 60: titlestr += '[Beta > 60{}]'.format(DEG) if classifier.early_scatter: titlestr += ' [Early scatter in 25um]' if classifier.overlap: titlestr += ' [Overlapping]' if classifier.wrong_end: titlestr += ' [Wrong end]' # PLOTS fig = plt.figure() # top left: ridge-following, zoomed plt.subplot(2, 2, 1) # g4 plot_track(track.image) plt.plot(g4y, g4x, '.c') tp.plot_arrow(g4x0, g4_alpha_rad, color='c') # ridge ridge = HTinfo.ridge[HTinfo.measurement_start_pt:HTinfo.measurement_end_pt] tp.plot_ridgepoints(plt.gca(), ridge, fmtstring='.', offset=[1, 1], color=[0, 1, 0]) tp.plot_arrow(ridge_ep, ridge_alpha_rad, color=[0, 1, 0]) # general xoff = mom.end_segment_offsets[1] yoff = mom.end_segment_offsets[0] plt.xlim((xoff - 1, xoff + mom.end_segment_image.shape[1] + 1)) plt.ylim((yoff - 1, yoff + mom.end_segment_image.shape[0] + 1)) plt.xlabel('y [pixels]') plt.ylabel('x [pixels]') plt.colorbar() # bottom left: ridge-following, full plt.subplot(2, 2, 3) # g4 plot_track(track.image) plt.plot(g4y, g4x, '.c') tp.plot_arrow(g4x0, g4_alpha_rad, color='c') # ridge ridge = HTinfo.ridge[HTinfo.measurement_start_pt:HTinfo.measurement_end_pt] tp.plot_ridgepoints(plt.gca(), ridge, fmtstring='.', offset=[1, 1], color=[0, 1, 0]) tp.plot_arrow(ridge_ep, ridge_alpha_rad, color=[0, 1, 0]) # general plt.xlim((0, track.image.shape[1] - 1)) plt.ylim((0, track.image.shape[0] - 1)) plt.xlabel('y [pixels]') plt.ylabel('x [pixels]') plt.colorbar() plt.title(r'Ridge-following, $\Delta_\alpha$ = {:2.1f}{}'.format( ridge_da, DEG)) # top right: moments, zoomed plt.subplot(2, 2, 2) # g4 plot_track(track.image) plt.plot(g4y, g4x, '.c') tp.plot_arrow(g4x0, g4_alpha_rad, color='c') # moments plt.plot(mom.box_y, mom.box_x, 'm') if reject_flag: plt.plot(mom_arc[1, :], mom_arc[0, :], 'm', lw=2.5, ls='dashed') tp.plot_arrow(mom_ep, mom_alpha_rad, color='m', ls='dashed') else: plt.plot(mom_arc[1, :], mom_arc[0, :], 'm', lw=2.5) tp.plot_arrow(mom_ep, mom_alpha_rad, color='m') # general xoff = mom.end_segment_offsets[1] yoff = mom.end_segment_offsets[0] plt.xlim((xoff - 1, xoff + mom.end_segment_image.shape[1] + 1)) plt.ylim((yoff - 1, yoff + mom.end_segment_image.shape[0] + 1)) plt.xlabel('y [pixels]') plt.ylabel('x [pixels]') plt.colorbar() # bottom right: moments, full plt.subplot(2, 2, 4) # g4 plot_track(track.image) plt.plot(g4y, g4x, '.c') tp.plot_arrow(g4x0, g4_alpha_rad, color='c') # moments plt.plot(mom.box_y, mom.box_x, 'm') if reject_flag: plt.plot(mom_arc[1, :], mom_arc[0, :], 'm', lw=2.5, ls='dashed') tp.plot_arrow(mom_ep, mom_alpha_rad, color='m', ls='dashed') else: plt.plot(mom_arc[1, :], mom_arc[0, :], 'm', lw=2.5) tp.plot_arrow(mom_ep, mom_alpha_rad, color='m') # general plt.xlim((0, track.image.shape[1] - 1)) plt.ylim((0, track.image.shape[0] - 1)) plt.xlabel('y [pixels]') plt.ylabel('x [pixels]') plt.colorbar() plt.title(r'Moments, $\Delta_\alpha$ = {:2.1f}{}'.format(mom_da, DEG)) fig.suptitle(titlestr) figManager = plt.get_current_fig_manager() figManager.window.showMaximized() plt.show() return fig