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)
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)
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)
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
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)