123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309 |
- """
- Created on Wed Aug 15 23:33:19 2018
- @author: USER
- """
- from __future__ import absolute_import
- """Read raw data"""
- import numpy as np
- def contral_vars(varl,
- key_list = ['roughness',
- 'vacancy',
- 'absorption',
- 'dis',
- 'dw',
- 'ocu',
- 'pos',
- 'scale',
- 'lattice',
- 'lattice_abc']):
-
- """
- contral independent var list
- """
-
-
- ubr_index = {}
-
- for slab in varl:
-
-
- ubr_slab_index = {}
-
-
-
-
-
- if slab == 'substrate':
- ubr_slab_index['scale'] = 1e-4
- ubr_slab_index['beta'] = 0
-
- for key in key_list:
-
- slab_dict = varl[slab]
-
-
- if key == 'roughness':
-
- ubr_slab_index[key] = 1
-
-
- elif key == 'vacancy':
-
- ubr_slab_index[key] = np.array([1,1,1,1])
-
- elif key == 'absorption':
-
- ubr_slab_index[key] = 1
-
- elif key == 'scale':
-
- ubr_slab_index[key] = 0
-
- elif key == 'lattice_abc':
-
- ubr_slab_index[key] = np.array([1,1,1])
-
- else:
-
- ubr_slab_index[key] = np.mat(np.ones(slab_dict[key].shape))
-
- ubr_index[slab] = ubr_slab_index
-
-
-
- ubr_index['intensity'] = 1
-
- return ubr_index
-
- def initialize_contral_vars(ubr_index,slabs,keys):
-
- """
- for multi-dimensional minimum, variables should be a list or array
- """
-
-
- def tolist(mat):
-
-
- c,r = mat.shape
-
- tlist = []
-
-
-
-
- for ci in range(c):
- for ri in range(r):
- tlist.append(mat[ci,ri])
-
- return tlist
-
-
- slab_ubr = []
-
- slab_ubr_index = []
-
- for slab in slabs:
-
- slab_index = []
- ubr_slab = ubr_index[slab]
-
-
- for key in keys:
-
- ubr_key = ubr_slab[key]
-
-
- if key in ['absorption','beta','roughness','scale']:
-
- slab_index.append([key,1])
- slab_ubr.append(ubr_key)
-
-
- elif key in ['vacancy','lattice_abc']:
-
- slab_index.append([key,len(ubr_key)])
- for i in ubr_key:
- slab_ubr.append(float(i))
-
-
- else:
- slab_index.append([key,ubr_key.size])
- tlist = tolist(ubr_key)
- for i in tlist:
- slab_ubr.append(i)
-
- slab_ubr_index.append([slab,slab_index])
-
- return slab_ubr, slab_ubr_index
-
- def indicator_contral_vars(slab_ubr,slab_index,slab,key):
-
- """
- Note! slab is str,not a list
- indicator value
- """
-
- indicator_slab = 0
- indicator_keys = 0
- indicator_ubrs = [0,0]
-
-
- exit_flag = 0
-
- for slab_part in slab_index:
-
- if slab in slab_part:
-
-
- indicator_slab = 0
-
-
- for key_part in slab_part[1]:
-
-
- if key in key_part:
-
-
-
- indicator_keys = 0
- indicator_ubrs[1] = indicator_ubrs[0] + key_part[1] - 1
-
-
- exit_flag = 1
- break
-
- else:
-
-
- indicator_keys = indicator_keys + 1
-
- indicator_ubrs[0] = indicator_ubrs[0] + key_part[1]
-
-
- if exit_flag:
- break
-
- else:
-
-
- indicator_slab = indicator_slab + 1
-
- indicator_keys = indicator_keys + len(slab_part[1]) - 1
-
- for key_part in slab_part[1]:
- indicator_ubrs[0] = indicator_ubrs[0] + key_part[1]
-
-
- if exit_flag:
- break
-
-
- return [indicator_ubrs[0],indicator_ubrs[1]+1]
- def refresh_index(ubr_index,slab_ubr,slab_index):
-
-
- for slabi in slab_index:
-
- slab_k = slabi[0]
-
- for keyi in slabi[1]:
-
- key = keyi[0]
-
- ir = indicator_contral_vars(slab_ubr,slab_index,slab_k,key)
-
- iedr = slab_ubr[ir[0]:ir[1]]
-
- ogr = ubr_index[slab_k][key]
-
-
- if key in ['absorption',
- 'roughness',
- 'scale']:
- ubr_index[slab_k][key] = iedr
-
- elif key in ['lattice_abc',
- 'vacancy']:
- ubr_index[slab_k][key] = iedr
-
- elif key in ['dis','dw','lattice','ocu','pos']:
- iedr_m = np.reshape(iedr,ogr.shape)
- ubr_index[slab_k][key] = iedr_m
-
- return ubr_index
- def bragg_mask(iq,w,weight,mode = 'yang',limit = 0):
-
- """
- set bargg_mask for weight fitting
- """
-
- qs = int(iq[ 0]) + 1
- qe = int(iq[-1])
-
-
- bg = range(qs, qe + 1)
-
-
- pb = []
-
- for bp in bg:
-
- pb.append(np.argmin(abs(iq - bp)))
-
- if pb[0] < w or (len(iq) - pb[-1]) < w:
- print('Warning!mask width is too large!!')
-
-
- yang_mask = np.zeros(len(iq))
- yin_mask = np.ones(len(iq))
- bragg_mask = np.zeros(len(iq))
-
-
- for p in pb:
-
- if mode == 'yang':
- yang_mask[p-w:p+w] = 1
- yang_mask[0:int(limit)] = 1
- bragg_mask = yang_mask
-
- elif mode == 'yin':
- yin_mask[p-w:p+w] = 0
- yin_mask[0:int(limit)] = 0
- bragg_mask = yin_mask
-
- return bragg_mask*weight
-
|