def process_file(root, name, index, files, selection="S"): # Get the volume ID temp = root.upper() volume_id = '"' + temp[temp.index("COVIMS_00"):][:11] + '"' # Create the file specification name temp = os.path.join(root, name) temp = temp[temp.index("/data/"):][1:] filespec = '"%-57s"' % temp # Create the prefix for the ring_observation_id roid_prefix = ring_observation_id(name) logstr = "%4d/%4d %s" % (index, files, roid_prefix) # Don't abort if cspice throws a runtime error try: # Create observations (vis,ir) observations = vims.from_file(os.path.join(root, name)) # For each detector... for obs in observations: # Ignore empty VIMS channels if obs is None: continue # Ignore certain mission phases if obs.dict["MISSION_PHASE_NAME"] in IGNORED_PHASE_NAMES: return # Write lines to the output files if necessary roid = "%-33s" % (roid_prefix + obs.detector) # Get the target target = target_name(obs.dict) if target in TRANSLATIONS.keys(): target = TRANSLATIONS[target] # Create the backplane # (meshgrid, times) = meshgrid_and_times(obs) # backplane = oops.Backplane(obs, meshgrid, times) backplane = oops.Backplane(obs) # Print a log of progress. This records where errors occurred logstr = "%s %4d/%4d %s %s" % (volume_id[1:-1], index, files, roid, target) print logstr # Inventory the bodies in the FOV (including targeted irregulars) if (target not in SYSTEM_NAMES and oops.Body.exists(target) and \ target != 'SUN'): body_names = SYSTEM_NAMES + [target] else: body_names = SYSTEM_NAMES inventory_names = obs.inventory(body_names, expand=0.) # Write a record into the inventory file prefixes = [volume_id, filespec, '"' + roid + '"'] inventory_file.write(",".join(prefixes)) for name in inventory_names: inventory_file.write(',"' + name + '"') inventory_file.write("\r\n") # Use <CR><LF> line termination # Convert the inventory into a list of moon names if len(inventory_names) > 0 and inventory_names[0] == PLANET: moon_names = inventory_names[1:] else: moon_names = inventory_names # Define a blocker moon, if any if target in moon_names: blocker = target else: blocker = None # Add an irregular moon to the dictionaries if necessary if target in moon_names and target not in MOON_SUMMARY_DICT: MOON_SUMMARY_DICT[target] = meta.replace( MOON_SUMMARY_COLUMNS, MOONX, target) MOON_DETAILED_DICT[target] = meta.replace( MOON_DETAILED_COLUMNS, MOONX, target) MOON_TILE_DICT[target] = meta.replace(MOON_TILES, MOONX, target) # Write the summary files for the rings and for the planet if "S" in selection: meta.write_record(prefixes, backplane, blocker, ring_summary, RING_SUMMARY_COLUMNS, PLANET) meta.write_record(prefixes, backplane, blocker, planet_summary, PLANET_SUMMARY_COLUMNS, PLANET, moon=PLANET, moon_length=NAME_LENGTH) # Write the detailed files for the rings and for the planet if "D" in selection: meta.write_record(prefixes, backplane, blocker, ring_detailed, RING_DETAILED_COLUMNS, PLANET, tiles=RING_TILES, tiling_min=10) meta.write_record(prefixes, backplane, blocker, planet_detailed, PLANET_DETAILED_COLUMNS, PLANET, moon=PLANET, moon_length=NAME_LENGTH, tiles=PLANET_TILES, tiling_min=10) # Write the moon files for name in moon_names: # ...but skip tiny moons with no intercepts if name != target: mask = backplane.where_intercepted(name) if not mask.any(): continue if "S" in selection: meta.write_record(prefixes, backplane, blocker, moon_summary, MOON_SUMMARY_DICT[name], PLANET, moon=name, moon_length=NAME_LENGTH) if "D" in selection: meta.write_record(prefixes, backplane, blocker, moon_detailed, MOON_DETAILED_DICT[name], PLANET, moon=name, moon_length=NAME_LENGTH, tiles=MOON_TILE_DICT[name], tiling_min=10) # A RuntimeError is probably caused by missing spice data. There is # probably nothing we can do. except RuntimeError as e: if logstr.endswith("/"): print logstr print e log_file.write(40 * "*" + "\n" + logstr + "\n") log_file.write(str(e)) log_file.write("\n\n") # Other kinds of errors are genuine bugs. For now, we just log the # problem, and jump over the image; we can deal with it later. except (AssertionError, AttributeError, IndexError, KeyError, LookupError, TypeError, ValueError, ZeroDivisionError, pyparsing.ParseException): if logstr.endswith("/"): print logstr traceback.print_exc() log_file.write(40 * "*" + "\n" + logstr + "\n") log_file.write(traceback.format_exc()) log_file.write("\n\n")
def process_file(root, name, index, files, selection="S"): # Don't abort if cspice throws a runtime error try: (volume_id, file_spec) = volume_and_filespec(root, name) roid = ring_observation_id(name) logstr = "%s %4d/%4d %s" % (volume_id, index, files, roid) print logstr, terminated_print = False i20 = name.index("20") year = int(name[i20:i20 + 4]) if year < 2004: print "skipped" return prefixes = [ '"' + volume_id + '"', '"' + file_spec + '"', '"' + roid + '"' ] # Create the observation object obs = uvis.from_file(os.path.join(root, name), enclose=True) # Get the target target = obs.dict["TARGET_NAME"].upper() if target in TRANSLATIONS.keys(): target = TRANSLATIONS[target] print " " + target terminated_print = True # Create the backplane cad = obs.cadence if cad.steps <= MAX_TIMESTEPS: steps = cad.steps tstride = cad.tstride else: steps = MAX_TIMESTEPS tstride = (cad.time[1] - cad.time[0]) / steps time_vals = cad.tstart + tstride * np.arange(0.5, steps) if len(obs.shape) > 1: time = oops.Scalar(time_vals[:, np.newaxis]) else: time = oops.Scalar(time_vals) backplane = oops.Backplane(obs, time=time) # Catch SPICE NOFRAMECONNECT exceptions before going any further ignore = backplane.right_ascension() # Define a list of moon names and the blocker moon if target in SYSTEM_NAMES and target != PLANET: blocker = target moon_names = [target] else: blocker = None moon_names = [] # Write the summary files for the rings and for the planet if "S" in selection: meta.write_record(prefixes, backplane, blocker, ring_summary, RING_SUMMARY_COLUMNS, PLANET, ignore_shadows=True) meta.write_record(prefixes, backplane, blocker, planet_summary, PLANET_SUMMARY_COLUMNS, PLANET, moon=PLANET, moon_length=NAME_LENGTH, ignore_shadows=True) # Write the detailed files for the rings and for the planet if "D" in selection: meta.write_record(prefixes, backplane, blocker, ring_detailed, RING_DETAILED_COLUMNS, PLANET, tiles=RING_TILES, ignore_shadows=True) meta.write_record(prefixes, backplane, blocker, planet_detailed, PLANET_DETAILED_COLUMNS, PLANET, moon=PLANET, moon_length=NAME_LENGTH, tiles=PLANET_TILES, ignore_shadows=True) # Write the moon files for name in moon_names: if "S" in selection: meta.write_record(prefixes, backplane, blocker, moon_summary, MOON_SUMMARY_DICT[name], PLANET, moon=name, moon_length=NAME_LENGTH, ignore_shadows=True) if "D" in selection: meta.write_record(prefixes, backplane, blocker, moon_detailed, MOON_DETAILED_DICT[name], PLANET, moon=name, moon_length=NAME_LENGTH, tiles=MOON_TILE_DICT[name], ignore_shadows=True) # A RuntimeError is probably caused by missing spice data. There is # probably nothing we can do. except RuntimeError as e: if "NOFRAMECONNECT" in str(e): print "**** SPICE(NOFRAMECONNECT)" noframe_file.write(PREFIX + "\n") else: if not terminated_print: print print e error_file.write(40 * "*" + "\n" + logstr + "\n") error_file.write(str(e)) error_file.write("\n\n") # Other kinds of errors are genuine bugs. For now, we just log the # problem, and jump over the image; we can deal with it later. except (AssertionError, AttributeError, IndexError, KeyError, LookupError, TypeError, ValueError, ZeroDivisionError, pyparsing.ParseException): if not terminated_print: print traceback.print_exc() error_file.write(40 * "*" + "\n" + logstr + "\n") error_file.write(traceback.format_exc()) error_file.write("\n\n")
def process_index(input_filename, selection="S"): """Process one index file and write a selection of metadata files. Input: input_filename the name of the label for an ISS index file. selection a string containing... "S" to generate summary files; "D" to generate detailed files. """ snapshots = iss.from_index(input_filename) volume_id = snapshots[0].dict["VOLUME_ID"] records = len(snapshots) # Open the output files (path, filename) = os.path.split(input_filename) path = path.replace("/index", "") path = path.replace("/INDEX", "") prefix = path + "/" + volume_id log_file = open(prefix + "_log.txt", "w") inventory_file = open(prefix + "_inventory.tab", "w") if "S" in selection: ring_summary = open(prefix + "_ring_summary.tab", "w") planet_summary = open(prefix + "_%s_summary.tab" % PLANET.lower(), "w") moon_summary = open(prefix + "_moon_summary.tab", "w") if "D" in selection: ring_detailed = open(prefix + "_ring_detailed.tab", "w") planet_detailed = open(prefix + "_%s_detailed.tab" % PLANET.lower(), "w") moon_detailed = open(prefix + "_moon_detailed.tab", "w") # Loop through the snapshots... for i in range(records): snapshot = snapshots[i] target = target_name(snapshot.dict) if target in TRANSLATIONS.keys(): target = TRANSLATIONS[target] # Don't abort if cspice throws a runtime error try: # Create the record prefix volume_id = snapshot.dict["VOLUME_ID"] filespec = snapshot.dict["FILE_SPECIFICATION_NAME"] roid = ring_observation_id(snapshot.dict) prefixes = [ '"' + volume_id + '"', '"%-45s"' % filespec.replace(".IMG", ".LBL"), '"' + roid + '"' ] # Create the backplane meshgrid = MESHGRIDS[(snapshot.detector, snapshot.sampling)] backplane = oops.Backplane(snapshot, meshgrid) # Print a log of progress. This records where errors occurred logstr = "%s %4d/%4d %s %s" % (volume_id, i + 1, records, roid, target) print logstr # Inventory the bodies in the FOV (including targeted irregulars) if (target not in SYSTEM_NAMES and oops.Body.exists(target) and target != 'SUN'): body_names = SYSTEM_NAMES + [target] else: body_names = SYSTEM_NAMES inventory_names = snapshot.inventory(body_names, expand=EXPAND) # Write a record into the inventory file inventory_file.write(",".join(prefixes)) for name in inventory_names: inventory_file.write(',"' + name + '"') inventory_file.write("\r\n") # Use <CR><LF> line termination # Convert the inventory into a list of moon names if len(inventory_names) > 0 and inventory_names[0] == PLANET: moon_names = inventory_names[1:] else: moon_names = inventory_names # Define a blocker moon, if any if target in moon_names: blocker = target else: blocker = None # Add an irregular moon to the dictionaries if necessary if target in moon_names and target not in MOON_SUMMARY_DICT.keys(): MOON_SUMMARY_DICT[target] = meta.replace( MOON_SUMMARY_COLUMNS, MOONX, target) MOON_DETAILED_DICT[target] = meta.replace( MOON_DETAILED_COLUMNS, MOONX, target) MOON_TILE_DICT[target] = meta.replace(MOON_TILES, MOONX, target) # Write the summary files if "S" in selection: meta.write_record(prefixes, backplane, blocker, ring_summary, RING_SUMMARY_COLUMNS, PLANET, count_length=COUNT_LENGTH) meta.write_record(prefixes, backplane, blocker, planet_summary, PLANET_SUMMARY_COLUMNS, PLANET, moon=PLANET, moon_length=NAME_LENGTH, count_length=COUNT_LENGTH) for name in moon_names: meta.write_record(prefixes, backplane, blocker, moon_summary, MOON_SUMMARY_DICT[name], PLANET, moon=name, moon_length=NAME_LENGTH, count_length=COUNT_LENGTH) # Write the detailed files if "D" in selection: meta.write_record(prefixes, backplane, blocker, ring_detailed, RING_DETAILED_COLUMNS, PLANET, count_length=COUNT_LENGTH, tiles=RING_TILES) meta.write_record(prefixes, backplane, blocker, planet_detailed, PLANET_DETAILED_COLUMNS, PLANET, moon=PLANET, moon_length=NAME_LENGTH, count_length=COUNT_LENGTH, tiles=PLANET_TILES) for name in moon_names: meta.write_record(prefixes, backplane, blocker, moon_detailed, MOON_DETAILED_DICT[name], PLANET, moon=name, moon_length=NAME_LENGTH, count_length=COUNT_LENGTH, tiles=MOON_TILE_DICT[name]) # A RuntimeError is probably caused by missing spice data. There is # probably nothing we can do. except RuntimeError as e: print e log_file.write(40 * "*" + "\n" + logstr + "\n") log_file.write(str(e)) log_file.write("\n\n") # Other kinds of errors are genuine bugs. For now, we just log the # problem, and jump over the image; we can deal with it later. except (AssertionError, AttributeError, IndexError, KeyError, LookupError, TypeError, ValueError): traceback.print_exc() log_file.write(40 * "*" + "\n" + logstr + "\n") log_file.write(traceback.format_exc()) log_file.write("\n\n") # Close all files log_file.close() inventory_file.close() if "S" in selection: ring_summary.close() planet_summary.close() moon_summary.close() if "D" in selection: ring_detailed.close() planet_detailed.close() moon_detailed.close()
def process_index(input_filename, selection='S'): """Process one index file and write a selection of metadata files. Input: input_filename the name of the label for a LORRI supplemental index file. selection a string containing... 'S' to generate summary files; 'D' to generate detailed files; """ snapshots = lorri.from_index(input_filename) volume_id = snapshots[0].dict['VOLUME_ID'] records = len(snapshots) # Open the output files (path, filename) = os.path.split(input_filename) prefix = path + '/' + volume_id log_file = open(prefix + '_log.txt', 'w') inventory_file = open(prefix + '_inventory.tab', 'w') if 'S' in selection: ring_summary = open(prefix + '_ring_summary.tab', 'w') planet_summary = open(prefix + '_pluto_summary.tab', 'w') charon_summary = open(prefix + '_charon_summary.tab', 'w') moon_summary = open(prefix + '_moon_summary.tab', 'w') if 'D' in selection: ring_detailed = open(prefix + '_ring_detailed.tab', 'w') planet_detailed = open(prefix + '_pluto_detailed.tab', 'w') charon_detailed = open(prefix + '_charon_detailed.tab', 'w') moon_detailed = open(prefix + '_moon_detailed.tab', 'w') # Loop through the snapshots... for i in range(records): snapshot = snapshots[i] target = target_name(snapshot.dict) # Don't abort if cspice throws a runtime error try: # Create the record prefix volume_id = snapshot.dict['VOLUME_ID'] filespec = snapshot.dict['FILE_SPECIFICATION_NAME'].lower() roid = ring_observation_id(snapshot.dict) prefixes = [ '"' + volume_id + '"', '"%-52s"' % filespec, '"' + roid + '"' ] # Create the backplane meshgrid = MESHGRIDS[snapshot.dict['BINNING_MODE']] backplane = oops.Backplane(snapshot, meshgrid) # Print a log of progress. This records where errors occurred logstr = '%s %4d/%4d %s %s' % (volume_id, i + 1, records, roid, target) print logstr # Inventory the bodies in the FOV (including targeted irregulars) if target not in SYSTEM_NAMES and oops.Body.exists(target): body_names = SYSTEM_NAMES + [target] else: body_names = SYSTEM_NAMES inventory_names = snapshot.inventory(body_names, expand=EXPAND) # Write a record into the inventory file inventory_file.write(','.join(prefixes)) for name in inventory_names: inventory_file.write(',"' + name + '"') inventory_file.write('\r\n') # Use <CR><LF> line termination # Convert the inventory into a list of moon names if len(inventory_names) > 0 and inventory_names[0] == PLANET: moon_names = inventory_names[1:] else: moon_names = inventory_names if len(inventory_names) > 0 and inventory_names[0] == BIGMOON: moon_names = inventory_names[1:] else: moon_names = inventory_names # Define a blocker moon, if any if target in moon_names: blocker = target else: blocker = None # Add an irregular moon to the dictionaries if necessary if target in moon_names and target not in MOON_SUMMARY_DICT.keys(): MOON_SUMMARY_DICT[target] = meta.replace( MOON_SUMMARY_COLUMNS, MOONX, target) MOON_DETAILED_DICT[target] = meta.replace( MOON_DETAILED_COLUMNS, MOONX, target) MOON_TILE_DICT[target] = meta.replace(MOON_TILES, MOONX, target) # Write the summary files if 'S' in selection: meta.write_record(prefixes, backplane, blocker, ring_summary, RING_SUMMARY_COLUMNS, PLANET) meta.write_record(prefixes, backplane, blocker, planet_summary, PLANET_SUMMARY_COLUMNS, PLANET, moon=PLANET, moon_length=NAME_LENGTH) meta.write_record(prefixes, backplane, blocker, charon_summary, CHARON_SUMMARY_COLUMNS, PLANET, moon=BIGMOON, moon_length=NAME_LENGTH) for name in moon_names: if name == 'CHARON' or name == 'PLUTO': continue meta.write_record(prefixes, backplane, blocker, moon_summary, MOON_SUMMARY_DICT[name], PLANET, moon=name, moon_length=NAME_LENGTH) # Write the detailed files if 'D' in selection: meta.write_record(prefixes, backplane, blocker, ring_detailed, RING_DETAILED_COLUMNS, PLANET, tiles=(RING_TILES, OUTER_RING_TILES)) meta.write_record(prefixes, backplane, blocker, planet_detailed, PLANET_DETAILED_COLUMNS, PLANET, moon=PLANET, moon_length=NAME_LENGTH, tiles=PLANET_TILES) meta.write_record(prefixes, backplane, blocker, charon_detailed, CHARON_DETAILED_COLUMNS, PLANET, moon=BIGMOON, moon_length=NAME_LENGTH, tiles=CHARON_TILES) for name in moon_names: if name == 'CHARON': continue meta.write_record(prefixes, backplane, blocker, moon_detailed, MOON_DETAILED_DICT[name], PLANET, moon=name, moon_length=NAME_LENGTH, tiles=MOON_TILE_DICT[name]) # A RuntimeError is probably caused by missing spice data. There is # probably nothing we can do. except RuntimeError as e: print e log_file.write(40 * '*' + '\n' + logstr + '\n') log_file.write(str(e)) log_file.write('\n\n') # Other kinds of errors are genuine bugs. For now, we just log the # problem, and jump over the image; we can deal with it later. except (AssertionError, AttributeError, IndexError, KeyError, LookupError, TypeError, ValueError): traceback.print_exc() log_file.write(40 * '*' + '\n' + logstr + '\n') log_file.write(traceback.format_exc()) log_file.write('\n\n') # Close all files log_file.close() inventory_file.close() if 'S' in selection: ring_summary.close() planet_summary.close() charon_summary.close() moon_summary.close() if 'D' in selection: ring_detailed.close() planet_detailed.close() charon_detailed.close() moon_detailed.close()