def models_related_to_report(data): """What models are required for this data['report'] Args: data (dict): simulation Returns: list: Named models, model fields or values (dict, list) that affect report """ r = data['report'] res = template_common.report_fields(data, r, _REPORT_STYLE_FIELDS) + [ 'bendingMagnet', 'electronBeam', 'geometricSource', 'rayFilter', 'simulation.istar1', 'simulation.npoint', 'simulation.sourceType', 'sourceDivergence', 'wiggler', ] if r == 'initialIntensityReport' and len(data['models']['beamline']): res.append([data['models']['beamline'][0]['position']]) #TODO(pjm): only include items up to the current watchpoint if template_common.is_watchpoint(r): res.append('beamline') for f in template_common.lib_files(data): res.append(f.mtime()) return res
def _create_zip(sim_type, sim_id, want_python): """Zip up the json file and its dependencies Args: sim_type (str): simulation type sim_id (str): simulation id want_python (bool): include template's python source? Returns: py.path.Local: zip file name """ from pykern import pkio from sirepo import simulation_db from sirepo.template import template_common #TODO(robnagler) need a lock with pkio.save_chdir(simulation_db.tmp_dir()): res = py.path.local(sim_id + '.zip') data = simulation_db.open_json_file(sim_type, sid=sim_id) files = template_common.lib_files(data) files.insert(0, simulation_db.sim_data_file(data.simulationType, sim_id)) if want_python: files.append(_python(data)) with zipfile.ZipFile( str(res), mode='w', compression=zipfile.ZIP_DEFLATED, allowZip64=True, ) as z: for f in files: z.write(str(f), f.basename) return res, data
def _create_zip(sim_type, sim_id, want_python): """Zip up the json file and its dependencies Args: sim_type (str): simulation type sim_id (str): simulation id want_python (bool): include template's python source? Returns: py.path.Local: zip file name """ from pykern import pkio from sirepo import simulation_db from sirepo.template import template_common #TODO(robnagler) need a lock with pkio.save_chdir(simulation_db.tmp_dir()): res = py.path.local(sim_id + '.zip') data = simulation_db.open_json_file(sim_type, sid=sim_id) if 'report' in data: del data['report'] files = template_common.lib_files(data) files.insert(0, simulation_db.sim_data_file(data.simulationType, sim_id)) if want_python: files.append(_python(data)) with zipfile.ZipFile( str(res), mode='w', compression=zipfile.ZIP_DEFLATED, allowZip64=True, ) as z: for f in files: z.write(str(f), f.basename) return res, data
def _create_example(example): data = simulation_db.save_new_example(example) # ensure all datafiles for the new example exist in the sim lib dir for f in template_common.lib_files(data): if not f.exists(): r = template_common.resource_dir(data.simulationType).join(f.basename) assert r.exists(), 'Example missing resource file: {}'.format(f) pkio.mkdir_parent_only(f) r.copy(f)
def read_zip(stream, template=None): """Read zip file and store contents Args: stream (IO): file to read template (module): expected app Returns: dict: data """ from pykern import pkcollections from sirepo import simulation_db from sirepo.template import template_common import py.path import re import zipfile tmp = simulation_db.tmp_dir() data = None zipped = pkcollections.Dict() with zipfile.ZipFile(stream, 'r') as z: for i in z.infolist(): b = py.path.local(i.filename).basename c = z.read(i) if b.lower() == simulation_db.SIMULATION_DATA_FILE: assert not data, \ 'too many db files {} in archive'.format(b) data = read_json(c, template) if not template: import sirepo.template template = sirepo.template.import_module( data.simulationType) continue if re.match('__MACOSX', i.filename): continue #TODO(robnagler) ignore identical files hash assert not b in zipped, \ '{} duplicate file in archive'.format(i.filename) fn = tmp.join(b) with open(str(fn), 'wb') as f: f.write(c) zipped[b] = fn assert data, \ 'missing {} in archive'.format(simulation_db.SIMULATION_DATA_FILE) needed = pkcollections.Dict() for n in template_common.lib_files(data): assert n.basename in zipped or n.check(file=True, exists=True), \ 'auxiliary file {} missing in archive'.format(n.basename) needed[n.basename] = n lib_d = simulation_db.simulation_lib_dir(template.SIM_TYPE) for b, src in zipped.items(): if b in needed: src.copy(needed[b]) return data
def read_zip(stream, template=None): """Read zip file and store contents Args: stream (IO): file to read template (module): expected app Returns: dict: data """ from pykern import pkcollections from sirepo import simulation_db from sirepo.template import template_common import py.path import zipfile tmp = simulation_db.tmp_dir() data = None zipped = pkcollections.Dict() with zipfile.ZipFile(stream, 'r') as z: for i in z.infolist(): b = py.path.local(i.filename).basename c = z.read(i) if b.lower() == simulation_db.SIMULATION_DATA_FILE: assert not data, \ 'too many db files {} in archive'.format(b) data = read_json(c, template) if not template: import sirepo.template template = sirepo.template.import_module(data.simulationType) continue #TODO(robnagler) ignore identical files hash assert not b in zipped, \ '{} duplicate file in archive'.format(i.filename) fn = tmp.join(b) with open(str(fn), 'wb') as f: f.write(c) zipped[b] = fn assert data, \ 'missing {} in archive'.format(simulation_db.SIMULATION_DATA_FILE) needed = pkcollections.Dict() for n in template_common.lib_files(data): assert n.basename in zipped or n.check(file=True, exists=True), \ 'auxiliary file {} missing in archive'.format(n.basename) needed[n.basename] = n lib_d = simulation_db.simulation_lib_dir(template.SIM_TYPE) for b, src in zipped.items(): if b in needed: src.copy(needed[b]) return data
def models_related_to_report(data): """What models are required for this data['report'] Args: data (dict): simulation Returns: list: Named models, model fields or values (dict, list) that affect report """ r = data['report'] res = [] if r == 'twissReport' or 'bunchReport' in r: res = ['bunch', 'bunchSource', 'bunchFile'] for f in template_common.lib_files(data): if f.exists(): res.append(f.mtime()) if r == 'twissReport': res += ['elements', 'beamlines', 'commands', 'simulation.activeBeamlineId'] return res
def models_related_to_report(data): """What models are required for this data['report'] Args: data (dict): simulation Returns: list: Named models, model fields or values (dict, list) that affect report """ r = data['report'] res = [] if r == 'twissReport' or 'bunchReport' in r: res = template_common.report_fields(data, r, _REPORT_STYLE_FIELDS) + [ 'bunch', 'bunchSource', 'bunchFile' ] for f in template_common.lib_files(data): if f.exists(): res.append(f.mtime()) if r == 'twissReport': res += ['elements', 'beamlines', 'simulation.activeBeamlineId'] return res
def models_related_to_report(data): """What models are required for this data['report'] Args: data (dict): simulation Returns: list: Named models, model fields or values (dict, list) that affect report """ r = data['report'] if r == 'animation': return [] res = template_common.report_fields(data, r, _REPORT_STYLE_FIELDS) + [ 'beam', 'ellipticalDistribution', 'energyPhaseDistribution', 'solenoid', 'sphericalDistribution', 'twissDistribution', ] for f in template_common.lib_files(data): res.append(f.mtime()) return res