Source code for turbo_seti.find_doppler.merge_dats_logs

r''' Source file for merge_dats_logs() '''

from os import chdir, getcwd, listdir, remove, rename

PREFIX = "_c_"
DEBUGGING = False
DATLNFMT = '{:>4s}  {:>12s}  {:>12s}  {:>12s}  {:>12s}  {:>9s}  {:>12s}  {:>12s}' \
    + '{:>4s}  {:>12s}  {:>5s}  {:>9s}\n'

[docs]def merge_dats_logs(arg_h5: str, arg_dir: str, arg_type: str, cleanup='n'): r""" Merge multiple DAT (or LOG) files. Parameters ---------- arg_h5 : str HDF5 file used by :func:`~turbo_seti.find_doppler.find_doppler.FindDoppler.search` to produce the DAT and LOG files. arg_dir : str Directory holding multiple DAT and LOG files after FindDoppler.search() which ran with more than 1 partition. arg_type : str File extension of interest ('dat' or 'log'). """ print("merge_dats_logs: dir={}, type={}, cleanup={}" .format(arg_dir, arg_type, cleanup)) RETURN_TO = getcwd() # Save our current directory path chdir(arg_dir) # Change directory suffix = '.' + arg_type # E.g. .dat files = [] filenamestem = arg_h5.split('/')[-1].replace('.h5', '') len_filenamestem = len(filenamestem) print('merge_dats_logs: Working on filename-stem {} type {}' .format(filenamestem, arg_type)) sorted_file_list = sorted(listdir(arg_dir)) counter = 0 if DEBUGGING: print("DEBUG merge_dats_logs: listdir=", sorted_file_list) for cur_file in sorted_file_list: cur_type = cur_file.split('.')[-1] if cur_type == arg_type and not cur_file.startswith(PREFIX): # This is the type of file we are looking for. # and it is not the combination version we are building. # Does cur_file match the HDF5 file? if cur_file[0:len_filenamestem] == filenamestem: files.append(cur_file) if DEBUGGING: print("DEBUG merge_dats_logs: Selected for merging: ", cur_file) counter += 1 if counter < 1: print("*** merge_dats_logs: Nothing selected for merging") chdir(RETURN_TO) return # Append the combo file with each list member. path_prefixed_combo = PREFIX + filenamestem + suffix with open(path_prefixed_combo, "w") as outfile: # Write first file encountered fully. with open(files[0], "r") as fd: for line in fd: outfile.write(line) # Write subsequent files, filtering out comment lines (start with '#') if arg_type == 'dat': tophit_counter = 0 for cur_file in files[1:]: with open(cur_file, "r") as fd: for inline in fd: if not inline.startswith("#"): # not a comment if arg_type == 'dat': # renumber tophit number field tophit_counter += 1 outlist = inline.split() if DEBUGGING: print('DEBUG outlst:', outlist) outlist[0] = str(tophit_counter) outfile.write(DATLNFMT.format(*outlist)) else: # log file outfile.write(inline) # if cleanup is requested, do it now. if cleanup == 'y': # Remove all of the partitions. for cur_file in files: remove(cur_file) if DEBUGGING: print("merge_dats_logs: Removed: ", cur_file) # Rename the merged file path_merge_file = filenamestem + suffix try: rename(path_prefixed_combo, path_merge_file) print("merge_dats_logs: Merged into", path_merge_file) except Exception as exc: print("*** os.rename({}, {}) failed, reason:{}\n" .format(path_prefixed_combo, path_merge_file, str(exc))) # Change back to caller's current directory chdir(RETURN_TO)