Esempio n. 1
0
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
Esempio n. 2
0
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
Esempio n. 3
0
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
Esempio n. 4
0
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
Esempio n. 5
0
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)
Esempio n. 6
0
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
Esempio n. 7
0
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
Esempio n. 8
0
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
Esempio n. 9
0
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
Esempio n. 10
0
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