Source code for sirepo.sim_data.silas

# -*- coding: utf-8 -*-
"""SILAS simulation data operations

:copyright: Copyright (c) 2020 RadiaSoft LLC.  All Rights Reserved.
:license: http://www.apache.org/licenses/LICENSE-2.0.html
"""
from __future__ import absolute_import, division, print_function
from pykern.pkcollections import PKDict
from pykern.pkdebug import pkdc, pkdlog, pkdp
import sirepo.sim_data


[docs] class SimData(sirepo.sim_data.SimDataBase): ANALYSIS_ONLY_FIELDS = frozenset(("colorMap",)) SOURCE_REPORTS = frozenset( ( "laserPulseAnimation", "laserPulse2Animation", ) )
[docs] @classmethod def fixup_old_data(cls, data, qcall, **kwargs): dm = data.models cls._init_models( dm, ( "crystalAnimation", "crystal3dAnimation", "laserPulse", "laserPulseAnimation", "laserPulse2Animation", "initialIntensityReport", "tempHeatMapAnimation", "tempProfileAnimation", "thermalTransportCrystal", "thermalTransportSettings", "simulation", ), ) for n in dm: if "beamlineAnimation" in n: if "dataType" in dm[n]: del dm[n]["dataType"] cls.update_model_defaults(dm[n], cls.WATCHPOINT_REPORT) for m in dm.beamline: if m.type == "crystal" and "n0" in m and not isinstance(m.n0, list): del m["n0"] if "n2" in m: del m["n2"] if m.propagationType in ("n0n2_lct", "default"): m.propagationType = "n0n2_srw" if m.type == "mirror": m.type = "mirror2" cls.update_model_defaults(m, m.type) for n in ("crystalCylinder", "crystalSettings"): if dm.get(n): del dm[n] cls.__fixup_laser_pulse(dm.laserPulse)
@classmethod def _compute_model(cls, analysis_model, *args, **kwargs): if analysis_model in ( "crystalAnimation", "crystal3dAnimation", "tempProfileAnimation", "tempHeatMapAnimation", ): return "crystalAnimation" if "beamlineAnimation" in analysis_model: return "beamlineAnimation" if analysis_model in cls.SOURCE_REPORTS: return "laserPulseAnimation" return super(SimData, cls)._compute_model(analysis_model, *args, **kwargs) @classmethod def _compute_job_fields(cls, data, r, compute_model): return [] @classmethod def __fixup_laser_pulse(cls, laser_pulse): # adjust laser pulse to new units if laser_pulse.tau_fwhm < 1e-6 or laser_pulse.tau_0 < 1e-6: laser_pulse.num_sig_long *= 2 laser_pulse.num_sig_trans *= 2 for f in ("tau_fwhm", "tau_0"): if laser_pulse[f] < 1e-6: laser_pulse[f] = round(laser_pulse[f] * 1e12, 6) @classmethod def _lib_file_basenames(cls, data): res = [] if data.models.laserPulse.distribution == "file": for f in ("ccd", "meta", "wfs"): res.append( cls.lib_file_name_with_model_field( "laserPulse", f, data.models.laserPulse[f] ) ) return res