def calculate_spec_quantification():
    als_spec = als_process2019.get_als_spectra()
    lcls_specs = get_constant_absorbed_specs()
    xmcd_norm = _integrate_range(als_spec['xmcd']['phot'],
                                 als_spec['xmcd']['spec'], XMCD_RANGE)
    energies = []
    err_energies = []
    xmcds = []
    err_xmcds = []
    fluences = []
    for spec in lcls_specs:
        holes_per_ev = spec['xas']['diff'] / D
        energy_per_ev = holes_per_ev * (FERMI_ENERGY - spec['xas']['phot'])
        energy_current = _integrate_range(spec['xas']['phot'], energy_per_ev,
                                          ENERGIES_RANGE)
        xmcd_current = _integrate_range(
            spec['xmcd']['phot'], spec['xmcd']['spec'], XMCD_RANGE) / xmcd_norm
        variance_energy_per_ev = ((spec['plus']['err'] / 2)**2 +
                                  (spec['minus']['err'] / 2)**2) * (
                                      FERMI_ENERGY - spec['xas']['phot'])**2
        variance_energy_current = _integrate_range(spec['xas']['phot'],
                                                   variance_energy_per_ev,
                                                   ENERGIES_RANGE)
        variance_xmcd_per_ev = (spec['plus']['err']**2 +
                                spec['minus']['err']**2) / (xmcd_norm**2)
        variance_xmcd_current = _integrate_range(spec['xmcd']['phot'],
                                                 variance_xmcd_per_ev,
                                                 XMCD_RANGE)
        err_energy_current = np.sqrt(variance_energy_current)
        err_xmcd_current = np.sqrt(variance_xmcd_current)
        energies.append(energy_current)
        err_energies.append(err_energy_current)
        xmcds.append(xmcd_current)
        err_xmcds.append(err_xmcd_current)
        fluences.append(spec['absorbed_fluence2'])
    fluences = np.array(fluences)
    absorbed_energies = fluences * FLUENCE2ABSORBEDENERGY
    eV_to_meV = 1000
    spec_energies = np.array(energies) * eV_to_meV
    line_zero_offset = lambda x, slope: x * slope
    fraction_within_2eV, unused = curve_fit(line_zero_offset,
                                            absorbed_energies / 2,
                                            spec_energies,
                                            p0=0.8)
    cascade_duration = calc_cascade_response.calculate_cascade_time(
        fraction_within_2eV)
    return {
        'absorbed_fluences': fluences,
        'absorbed_energies': absorbed_energies,
        'pulse_averaged_absorbed_energies': absorbed_energies / 2,
        'spec_energies': spec_energies,
        'err_spec_energies': np.array(err_energies) * eV_to_meV,
        'xmcds': np.array(xmcds),
        'err_xmcds': np.array(err_xmcds),
        'fraction_within_2eV': fraction_within_2eV,
        'cascade_duration': cascade_duration
    }
Ejemplo n.º 2
0
def get_absorbed_fluence(data):
    als_spec = als_process2019.get_als_spectra()
    absorbed_fluences = []
    for ind in np.arange(len(data['phot'])):
        if data['magnet_dir'][ind] == 1:
            absorption = np.interp(data['phot'][ind], als_spec['plus']['phot'],
                                   als_spec['plus']['spec'])
        if data['magnet_dir'][ind] == -1:
            absorption = np.interp(data['phot'][ind],
                                   als_spec['minus']['phot'],
                                   als_spec['minus']['spec'])
        else:
            absorption = np.interp(data['phot'][ind], als_spec['xas']['phot'],
                                   als_spec['xas']['spec'])
        absorb_fraction = 1 - np.exp(-1 * absorption)
        absorbed_fluences.append(absorb_fraction * data['fluence_in'][ind])
    return {'absorbed_fluence': np.array(absorbed_fluences)}
Ejemplo n.º 3
0
def get_source_data():
    raw_mcp_and_andor = get_raw_mcp_and_andor_waveforms()
    no_sample_data = get_no_sample_data()
    als_spec = als_process2019.get_als_spectra()
    lcls_specs = abs_get_processed_data.get_incident_specs()
    source_data = {'Time (us)': raw_mcp_and_andor[b'mcp'][b'x'],
                   'Voltage (V)': raw_mcp_and_andor[b'mcp'][b'y'],
                   'Pixel': raw_mcp_and_andor[b'andor'][b'x'],
                   'Counts/1E3': raw_mcp_and_andor[b'andor'][b'y'],
                   'Raw I0': no_sample_data['Raw I0'],
                   'Raw I1': no_sample_data['Raw I1'],
                   'Corrected I0': no_sample_data['Corrected I0'],
                   'Corrected I1': no_sample_data['Corrected I1'],
                   'ALS Photon Energy': als_spec['xas']['phot'],
                   'ALS XAS': als_spec['xas']['spec'],
                   '2.7 mJ/cm^2 Photon Energy': lcls_specs[-3]['xas']['phot'],
                   '2.7 mJ/cm^2 XAS': lcls_specs[-3]['xas']['spec'],
                   '43 mJ/cm^2 Photon Energy': lcls_specs[-1]['xas']['phot'],
                   '43 mJ/cm^2 XAS': lcls_specs[-1]['xas']['spec']}
    return source_data
Ejemplo n.º 4
0
# LCLS psana to read raw data
# (needs to be imported if loading raw data, otherwise can be
#  commented out)
#import psana

import visualize.set_plot_params
visualize.set_plot_params.init_paper_small()

# To get processed data
import abs_hdf2rec
import abs_ana
import abs_get_processed_data

# Get ALS data
import als_process2019
ALS_SPEC = als_process2019.get_als_spectra()

# Short dash linestyle:
SD = (0, (3, 1.5))

RAW_MCP_AND_ANDOR_FILE = '../../data/raw/raw_mcp_and_andor.p'

def get_raw_mcp_and_andor_waveforms():
    """Return raw mcp and andor waveforms that were
    saved from raw data
    """
    pickle_out = open(RAW_MCP_AND_ANDOR_FILE, 'rb')
    raw_mcp_and_andor = pickle.load(pickle_out, encoding='bytes')
    pickle_out.close()
    return raw_mcp_and_andor