def is_simulation_completed(card_path): """ Returns True if the simulation is completed. :param str card_path: Directory including run.card :returns: True if the simulation is completed :rtype: *boolean* """ # Check cards exist if RUN_CARD not in os.listdir(card_path): raise NoRunCardFound(card_path) else: run_card = os.path.join(card_path, RUN_CARD) # Extract info from cards config = SectionParser('Configuration') config.read(run_card) return config.get('periodstate').strip('"') == 'Completed'
def yield_xml_from_card(card_path): """ Yields XML path from run.card and config.card attributes. :param str card_path: Directory including run.card and config.card :returns: The XML paths to use :rtype: *iter* """ # Check cards exist if RUN_CARD not in os.listdir(card_path): raise NoRunCardFound(card_path) else: run_card = os.path.join(card_path, RUN_CARD) if CONF_CARD not in os.listdir(card_path): raise NoConfigCardFound(card_path) else: conf_card = os.path.join(card_path, CONF_CARD) # Extract config info from config.card config = SectionParser('UserChoices') config.read(conf_card) xml_attrs = dict() xml_attrs['root'] = FILEDEF_ROOT xml_attrs['longname'] = config.get('longname').strip('"') xml_attrs['experimentname'] = config.get('experimentname').strip('"') if config.has_option('modelname'): xml_attrs['modelname'] = config.get('modelname').strip('"') else: xml_attrs['modelname'] = 'IPSL-CM6A-LR' xml_attrs['member'] = config.get('member').strip('"') # Extract first and last simulated years from run.card with open(run_card, 'r') as f: lines = f.read().split('\n') # Get run table without header lines = [line for line in lines if line.count('|') == 8][1:] year_start = int(lines[0].split()[3][:4]) year_end = int(lines[-1].split()[5][:4]) for year in range(year_start, year_end + 1): xml_attrs['year'] = str(year) yield FILEDEF_DIRECTORY_FORMAT.format(**xml_attrs)