Example #1
0
def test_validate_formula():
    examples = {
        'H2O': True,
        'Mn(SO4)2(H2O)7': True,
        'Mn(SO42(H2O)7': False,
        'Z': False
    }
    for formula, cert in examples.items():
        ret = validate_formula(formula)
        assert (ret == cert)
Example #2
0
def reflectivity(material=None):
    message = []
    ref_plot = angc_plot = {}
    has_data = False
    de = '50'
    if request.method == 'POST':
        formula1 = request.form.get('formula1', 'None')
        density1 = request.form.get('density1', '')
        angle1 = request.form.get('angle1', '0')
        material1 = request.form.get('mats1', 'silicon')

        e1 = request.form.get('e1', '1000')
        e2 = request.form.get('e2', '50000')
        de = request.form.get('de', '50')
        mode = request.form.get('mode', 'Linear')
        roughness = request.form.get('roughness')
        polarization = request.form.get('polarization')

        if not xraydb.validate_formula(formula1):
            message.append("cannot interpret chemical formula")

        try:
            density = max(0, float(density1))
        except:
            message.append('Density must be a positive number.')

        if len(message) == 0:
            has_data = True
            en_array = energy_array(e1, e2, de)
            use_log = mode.lower() == 'log'

            ref_array = xraydb.mirror_reflectivity(formula1,
                                                   0.001 * float(angle1),
                                                   en_array,
                                                   density,
                                                   roughness=float(roughness),
                                                   polarization=polarization)
            title = "%s, %s mrad" % (formula1, angle1)
            ref_plot = make_plot(en_array,
                                 ref_array,
                                 title,
                                 formula1,
                                 yformat='.3f',
                                 ytitle='Reflectivity',
                                 ylog_scale=use_log)

            title = "%s Reflectivity, %s mrad" % (formula1, angle1)
            ref_plot = make_plot(en_array,
                                 ref_array,
                                 title,
                                 formula1,
                                 yformat='.3f',
                                 ytitle='Reflectivity',
                                 ylog_scale=use_log)

            _del, _bet, _ = xraydb.xray_delta_beta(formula1, density, en_array)
            ang_crit = 1000 * np.arccos(1 - _del - 1j * _bet).real

            title = "%s, Critical Angle" % (formula1)
            angc_plot = make_plot(en_array,
                                  ang_crit,
                                  title,
                                  formula1,
                                  ytitle='Critical Angle (mrad)',
                                  ylog_scale=use_log)

    else:
        request.form = {
            'mats1': 'silicon',
            'formula1': materials_['silicon'].formula,
            'density1': materials_['silicon'].density,
            'angle1': 2.5,
            'mats2': 'None',
            'formula2': '',
            'density2': '',
            'angle2': 2.5,
            'e1': 1000,
            'e2': 50000,
            'de': de,
            'polarization': 's',
            'roughness': '0',
            'mode': 'Linear'
        }

    return render_template('reflectivity.html',
                           message=message,
                           errors=len(message),
                           ref_plot=ref_plot,
                           angc_plot=angc_plot,
                           has_data=has_data,
                           matlist=mirror_mat,
                           de=int(de),
                           materials_dict=materials_dict)
Example #3
0
def atten(material=None,
          density=None,
          t='1.0',
          e1='1000',
          e2='51000',
          de='50'):
    message = []
    mu_plot = atten_plot = {}
    num = errors = 0
    mode = 'Linear'
    datalink = None
    do_plot = True
    if request.method == 'POST':
        formula = request.form.get('formula')
        matname = request.form.get('matname')
        mode = request.form.get('mode')
        density = float(request.form.get('density'))
        e1 = float(request.form.get('e1'))
        e2 = float(request.form.get('e2'))
        de = float(request.form.get('de'))
        t = float(request.form.get('thickness'))
        #input validation
        if not xraydb.validate_formula(formula):
            message.append("cannot interpret chemical formula")

        try:
            density = max(0, float(density))
        except:
            message.append('Density must be a positive number.')

    else:
        e1 = float(e1)
        e2 = float(e2)
        de = float(de)
        t = float(t)
        if material in materials_:
            mats = material
            formula = materials_['material'].formula
            density = materials_['material'].density

        elif material is not None and density is not None:
            formula = material
            density = float(density)
            mats = None
        else:
            do_plot = False
            mats = 'silicon'
            formula = materials_['silicon'].formula
            density = materials_['silicon'].density

        request.form = {
            'mats': mats,
            'formula': formula,
            'density': density,
            'e1': e1,
            'e2': e2,
            'de': de,
            'thickness': t,
            'mode': 'Linear'
        }

    if do_plot and formula is not None:
        # make plot
        en_array = energy_array(e1, e2, de)
        num = en_array.size
        mu_array = xraydb.material_mu(formula,
                                      en_array,
                                      density=float(density))
        trans = np.exp(-0.1 * t * mu_array)
        atten = 1 - trans
        use_log = mode.lower() == 'log'
        mu_plot = make_plot(en_array,
                            10 / mu_array,
                            material,
                            formula,
                            ylog_scale=use_log,
                            ytitle='1/e length (mm)')
        atten_plot = make_plot(en_array,
                               trans,
                               material,
                               "%.3f mm %s" % (t, formula),
                               ylog_scale=use_log,
                               y2=atten,
                               ytitle='transmitted/attenuated fraction',
                               y1label='transmitted',
                               y2label='attenuated')

    return render_template('attenuation.html',
                           message=message,
                           errors=len(message),
                           datalink=datalink,
                           mu_plot=mu_plot,
                           de=int(de),
                           atten_plot=atten_plot,
                           matlist=matlist,
                           materials_dict=materials_dict)  # , input=input)
Example #4
0
def validate_input(formula,
                   density,
                   step,
                   energy1='1000',
                   energy2='50000',
                   mode='Log',
                   material=None,
                   angle='0.001',
                   roughness='0.0',
                   page='formula'):
    output = {}
    message = []
    message.append('Error(s): ')
    df = ef = ef2 = sf = af = rf = 0
    isLog = True

    if not formula:
        message.append('Formula is a required field.')
    elif not material:
        #verify formula using function
        if not xraydb.validate_formula(formula):
            message.append('Unable to compute formula.')

    if density:
        try:
            df = float(density)
            if df <= 0:
                message.append('Density must be a positive number.')
        except:
            message.append('Density must be a positive number.')
    else:
        message.append('Density is a required field.')

    if energy1:
        ef = float(energy1)
    else:
        ef = 1000.0

    if energy2:
        ef2 = float(energy2)
    else:
        ef2 = 50000.0

    sf = float(step)

    if ef > ef2:
        message.append('Energy1 must be less than Energy2.')

    isLog = True if mode == 'Log' else False

    if page == 'reflectivity':
        if angle:
            af = float(angle)
        else:
            af = 0.001

        if roughness:
            rf = float(roughness)
        else:
            rf = 0.0

    if len(message) == 1:
        message[0] = 'Input is valid'

    output['message'] = message
    if message[0] == 'Input is valid':
        output['df'] = df
        output['ef'] = ef
        output['ef2'] = ef2
        output['sf'] = sf
        output['isLog'] = isLog
        output['af'] = af
        output['rf'] = rf
    #print(message)
    return output
Example #5
0
def atten(material=None):
    message = []
    energies = []
    mu_plot = atten_plot = {}
    num = errors = 0
    mode = 'Linear'
    datalink = None
    if request.method == 'POST':
        formula = request.form.get('formula')
        matname = request.form.get('matname')
        density = request.form.get('density')
        energy1 = request.form.get('energy1')
        energy2 = request.form.get('energy2')
        estep = request.form.get('step')
        mode = request.form.get('mode')
        thickness = request.form.get('thickness')

        #input validation
        if not xraydb.validate_formula(formula):
            message.append("cannot interpret chemical formula")

        try:
            density = max(0, float(density))
        except:
            message.append('Density must be a positive number.')

        if len(message) == 0:
            use_log = mode.lower() == 'log'
            # make plot
            en_array = np.arange(float(energy1), float(energy2)+float(estep), float(estep))

            num = en_array.size
            mu_array = xraydb.material_mu(formula, en_array, density=float(density))
            t = float(thickness)
            trans = np.exp(-0.1*t*mu_array)
            atten = 1 - trans

            mu_plot = make_plot(en_array, 10/mu_array, material, formula,
                                ylog_scale=use_log, ytitle='1/e length (mm)')
            atten_plot = make_plot(en_array, trans,
                                   material, "%.3f mm %s" % (t, formula),
                                   ylog_scale=use_log,
                                   y2=atten,
                                   ytitle='transmitted/attenuated fraction',
                                   y1label='transmitted',
                                   y2label='attenuated')
        


    else:
        request.form = {'mats': 'silicon',
                        'formula': materials_['silicon'].formula,
                        'density': materials_['silicon'].density,
                        'energy1':  1000,
                        'energy2': 51000,
                        'step': "50",
                        'thickness': 1.00,
                        'mode': 'Linear'}

    return render_template('attenuation.html', message=message, errors=len(message),
                           datalink=datalink, mu_plot=mu_plot,
                           atten_plot=atten_plot, matlist=matlist,
                           materials_dict=materials_dict, input=input)