def test_astropy_return(): hrcI_file = os.path.abspath( os.path.dirname(os.path.abspath(__file__)) + '/data/hrcI_evt1_testfile.fits.gz') hrcI_evt1_df = hypercore.HRCevt1(hrcI_file) hrcI_evt1_table = hypercore.HRCevt1(hrcI_file, as_astropy_table=True) assert isinstance(hrcI_evt1_df.data, pd.DataFrame) assert type(hrcI_evt1_table.data) is astropy.table.table.Table
def hrcS_evt1(): print("Loading test HRC-S EVT1 File as a pytest Fixture") hrcS_file = os.path.abspath( os.path.dirname(os.path.abspath(__file__)) + '/data/hrcS_evt1_testfile.fits.gz') hrcS_evt1 = hypercore.HRCevt1(hrcS_file) return hrcS_evt1
def hrcS_evt1_sparsetap(): print( "Loading test HRC-S EVT1 File, which includes some sparsely rung taps, as a pytest Fixture" ) hrcS_file = os.path.abspath( os.path.dirname(os.path.abspath(__file__)) + '/data/hrcS_evt1_sparsetap_testfile.fits.gz') hrcS_evt1_sparsetap = hypercore.HRCevt1(hrcS_file) return hrcS_evt1_sparsetap
def screenHRCevt1(input_fits_file, hyperscreen_results_dict=None, comparison_products=True, savepath=None, verbose=True, backup=True): obsid = fits.getheader(input_fits_file)['OBS_ID'] # Get the root string to use as our naming convention file_name = input_fits_file.split('/')[-1] # Split off the path # Split off the .fits (or .fits.gz) file_root = file_name.split('.fits')[0].split('_')[0] file_path = os.path.realpath(os.path.dirname(input_fits_file)) print(file_path) if savepath is None: savepath = file_path backup_dir = os.path.join( savepath, '{}_hyperscreen_report'.format(obsid)) if not os.path.exists(backup_dir): os.makedirs(backup_dir) if verbose is True: print("Made HyperScreen Products Directory {}".format(backup_dir)) # Check if the passed input file is a string ending with .fits or .fits.gz if isinstance(input_fits_file, str): filetype_match = input_fits_file.split( '.')[-1] == 'fits' or input_fits_file.split('.')[-1] == 'gz' if filetype_match is False: raise Exception( 'ERROR: Input given ({}) is not recognized as a .fits[.gz] or HRCevt1 object.'.format(input_fits_file)) if hyperscreen_results_dict is None: # Then you need to make it! if verbose is True: print("Applying HyperScreen algorithm to {}".format(file_name)) obs = hypercore.HRCevt1(input_fits_file) hyperscreen_results = obs.hyperscreen() else: hyperscreen_results = hyperscreen_results_dict # if backup is True: # if not os.path.exists(backup_dir): # os.makedirs(backup_dir) # if verbose is True: # print("Made backup directory {}".format(backup_dir)) # if verbose is True: # print("Backing up (copying) input fits file {} to {}".format( # input_fits_file.split('/')[-1], backup_dir)) # copyfile(input_fits_file, os.path.join( # file_path, '{}_original_event_list.fits'.format(obsid))) # hyperscreen_fits_file = file_path + '/hyperscreen_' + file_name hyperscreen_fits_file = os.path.join(file_path, 'hyperscreen_' + file_name) rejected_events_file = os.path.join( backup_dir, '{}_hyperscreen_rejected_events.fits'.format(obsid)) # difference_map_file = file_path + '/hyperscreen_DIFFERENCE_MAP_' + file_name survival_mask = hyperscreen_results['All Survivals (boolean mask)'] failure_mask = hyperscreen_results['All Failures (boolean mask)'] with fits.open(input_fits_file) as hdul: original_data = hdul[1].data hdul[1].data = hdul[1].data[survival_mask] if verbose is True: print("Masking data with HyperScreen Results") hdul.writeto(hyperscreen_fits_file, overwrite=True) if verbose is True: print( "Wrote new HyperScreen-filtered evt1 file to {}".format(hyperscreen_fits_file)) if comparison_products is True: hdul[1].data = original_data[failure_mask] hdul.writeto(rejected_events_file, overwrite=True) if verbose is True: print("Wrote Rejected Events Map {}".format(rejected_events_file)) original_evt1_file_path = os.path.join( file_path, '{}_original_event_list.fits'.format(obsid)) os.rename(input_fits_file, original_evt1_file_path) print("Backed up original evt1 file to {}".format(original_evt1_file_path))
def screener(evt1file, verbose=False, savepath=None, make_reportCard=True, make_fitsfiles=False, save_json=True, show=False, overwrite=False): # pragma: no cover obs = hypercore.HRCevt1(evt1file) if verbose is True: print( "Gathering HyperScreen performance statistics for {} | {}, {} ksec, {:,} counts" .format(obs.obsid, obs.detector, round(obs.exptime / 1000., 2), obs.numevents)) # if make_reportCard is True: # reportCard(obs, show=show, savepath=savepath) # if verbose is True: # print("Report Card generated for {} | {}, {} ksec, {} counts".format( # obs.obsid, obs.detector, round(obs.exptime/1000.,2), obs.numevents)) try: results_dict = obs.hyperscreen() if save_json is True: json_savepath = os.path.join( savepath, '{}_{}_{}_hyperResults.json'.format( obs.obsid, obs.target.replace(' ', '_'), obs.detector)) if os.path.exists(json_savepath) and overwrite is False: print("{} exists and overwrite=False. Skipping.".format( json_savepath.split('/')[-1])) else: if os.path.exists(json_savepath) and verbose is True: print("Overwriting existing {}".format( json_savepath.split('/')[-1])) # We don't want JSONify the full results dictionary (which includes embedded dictionaries!) json_reduced_results_dict = { "ObsID": results_dict['ObsID'], "Target": results_dict['Target'], "Exposure Time": results_dict['Exposure Time'], "Detector": results_dict['Detector'], "Number of Events": results_dict['Number of Events'], "Number of Good Time Events": results_dict['Number of Good Time Events'], # YOU CAN'T JSONIFY AN NDARRAY. MUST MAKE IT A LIST! "All Survivals (event indices)": results_dict['All Survivals (event indices)'].tolist(), "All Survivals (boolean mask)": results_dict['All Survivals (boolean mask)'].tolist(), "All Failures (boolean mask)": results_dict['All Failures (boolean mask)'].tolist(), "Percent rejected by Tapscreen": results_dict['Percent rejected by Tapscreen'], "Percent rejected by Hyperbola": results_dict['Percent rejected by Hyperbola'], "Percent improvement": results_dict['Percent improvement'] } with open(json_savepath, 'w') as json_file: json.dump(json_reduced_results_dict, json_file, sort_keys=True, indent=4) if verbose is True: print("Created {}".format(json_savepath.split('/')[-1])) if make_reportCard is True: reportCard_savepath = os.path.join( savepath, '{}_{}_{}_hyperReport.pdf'.format(obs.obsid, obs.target.replace(' ', '_'), obs.detector)) if os.path.exists(reportCard_savepath) and overwrite is False: print("{} exists and overwrite=False. Skipping.".format( reportCard_savepath.split('/')[-1])) else: if os.path.exists(reportCard_savepath) and verbose is True: print("Overwriting existing {}".format( reportCard_savepath.split('/')[-1])) reportCard(obs, hyperscreen_results_dict=results_dict, show=show, reportCard_savepath=reportCard_savepath) if verbose is True: print( "Report Card generated for {} | {}, {} ksec, {:,} counts" .format(obs.obsid, obs.detector, round(obs.exptime / 1000., 2), obs.numevents)) if make_fitsfiles is True: evtscreen.screenHRCevt1(evt1file, hyperscreen_results_dict=results_dict, savepath=savepath, comparison_products=True, verbose=True) except Exception as exception_message: print( "ERROR on {} ({} | {} ksec | {:,} events | {:,} good time events), pressing on" .format(obs.obsid, obs.detector, round(obs.exptime / 1000, 2), obs.numevents, obs.goodtimeevents)) print("Exception message is: {}".format(exception_message))