yuanpeng / isodistort_403_error.html
Utoljára aktív
1 | '<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">\n<html><head>\n<title>403 Forbidden</title>\n</head><body>\n<h1>Forbidden</h1>\n<p>You don\'t have permission to access this resource.</p>\n<hr>\n<address>Apache/2.4.52 (Ubuntu) Server at iso.byu.edu Port 443</address>\n</body></html>\n' |
yuanpeng / isodistort_request_working.json
Utoljára aktív
1 | { |
2 | "input": "displaydistort", |
3 | "spacegroup": "187 P-6m2 D3h-1", |
4 | "settingaxesm": "a(b)c ", |
5 | "settingcell": "1", |
6 | "settingorigin": "2", |
7 | "settingaxesh": "h", |
8 | "settingaxeso": "abc ", |
9 | "settingssg": "standard", |
10 | "parentsetting": "283", |
yuanpeng / isodistort_request_not_working.json
Utoljára aktív
1 | { |
2 | "input": "displaydistort", |
3 | "spacegroup": "187 P-6m2 D3h-1", |
4 | "settingaxesm": "a(b)c ", |
5 | "settingcell": "1", |
6 | "settingorigin": "2", |
7 | "settingaxesh": "h", |
8 | "settingaxeso": "abc ", |
9 | "settingssg": "standard", |
10 | "parentsetting": "283", |
yuanpeng / info_share.md
Utoljára aktív
衍射数据本身就是“衍射数据”,literally,没有bragg散射(Bragg diffraction)还是全散射(total scattering)的区分,只是在数据分析的时候是选择focus on Bragg peaks还是整个pattern,“focus on Bragg peaks”的意思就是说除了Bragg peaks之外的地方都当作背景拿掉,这个当然没有问题,自从有衍射技术以来一直都是这样做的,因为衍射峰的强度对应的就是从晶体结构中可以计算得到的structure factor,对应的是一个一个离散的hkl peak,给定lattice,给定晶体结构,包括对称性,初始原子位置,进而构建整个unit cell,在这个基础上可以计算得到structure factor,按照同样的路线返回去,如果知道structure factor,就可以原路返回推导出晶体结构,包括lattice,对称性以及原子位置,这个就是从Bragg diffraction解晶体结构以及Rietveld refinement的过程。这里就涉及到一个概念,就是average structure的概念,意思就是用一个unit cell去代表整个晶体,在unit cell之前我们认为晶体完美的周期重复,换个角度可以这样想,实际的晶体就是一堆原子在空间内的某种无限排列,我们找到一个unit cell,整个晶体按照我们选定的unit cell做周期重复,当然从一个unit cell到另一个unit cell肯定会有变化,但是不要紧,我们还是可以把所有的unit cell都平移到同一个unit cell当中去,这样就会得到一个collapsed unit cell,在每一个原子位置周围都聚集着很多原子,位置稍有不同,对应的就是unit cell之间的variation。在这个基础上我们可以计算每一个原子位置的平均位置,这样就可以得到一个average structure,在这个average structure的基础上可以计算不同hkl peak的structure factor,对应就是Bragg peaks intensities。当然实际的实验过程中因为仪器的分辨率总是有限的,这样原本应该是一个一个的delta function(对应一个一个的hkl peak)就变成了一个一个叠加在一起的有一定宽度的衍射峰,每一个衍射峰对应一个仪器展宽之后的hkl peak。当然还可能有其他因素带来的展宽,包括size effect,strain effect等等,这里就不做细分了,总是结果就是原来的delta hkl diffraction peaks变成了一个一个的有一定宽度的peak,这些peak有可能重叠在一起,这样的话就带来一个严重的问题,就是当多个peak重叠在一起的时候,如何提取每一个单独的hkl的intensity就变得很困难了。这个时候就必须要提到Rietveld的贡献了,他就提出用一个统一的peak profile function来描述由仪器带来的展宽效应,这个函数的自变量是diffraction peak的横轴,比如time of flight或者是2theta,意思就是说仪器的展宽效应本身并不是一个constant,而是随着横轴的量的变换而变化的,但是无所谓,如果我们能找到这样的合适的函数形式,这个函数带有一些参数,这些参数一起决定仪器展宽是如何随着横轴的量的变换而变化的,我们不知道这些参数是什么,但是没关系,给定函数形式,给定这些参数,就可以得到一个具体的braodening函数,把这个函数卷积到从晶体结构当中计算的到的hkl peaks delta functions就可以构建起来整个diffraction pattern,之后的事情就比较容易了,从实验测得的diffraction 出发,就可以用least square的办法去拟合所有的那些未知的参数,包括仪器展宽的参数,原子位置,lattice parameters等等,这就跟从一系列二维平面内的点去拟合一条直线得到fitted slope和intercept是一样的道理。当然实际操作中通常是用一个已知的标准样比如Si去标定仪器的展宽参数,然后在拟合样品结构的时候仪器参数就固定不动了,但是原理上还是像上面说的这个过程,没有本质上的区别。
上面说的就是average structure分析的整个过程,从中可以看到我们通常所说的average structure具体指的是什么,它对应的衍射数据的哪一部分(就是那些Bragg diffraction peaks),具体操作过程中是怎么从衍射峰的强度,位置等等这些出发通过拟合反推得到average structure。在这个过程当中我们只关心那些diffraction peaks,就是一个一个离散的hkl peak position,但是实际上,一个diffraction pattern不只是只有在hkl峰对应的那些位置上的intensity是有意义的。这里可以这样理解,回到上面提到的实际晶体的三维结构,我们用一个unit cell去描述晶体结构,这里我们先不考虑仪器的展宽效应,那么假设我们真的有一个完美的晶体,就是从一个unit cell到另一个unit cell就是完美的重复,那么这个时候我们“实验”上得到的衍射数据确实会只有在hkl peak的那些地方有值,数学上这就相当于是一些列出于不同横轴位置的delta function的和。但是实际上完美的晶体是不存在的,从一个unit cell到另一个unit cell肯定是有变化的,一旦有了变化,那么原本的hkl peak intensities就会下降,因为不同的unit cell对于intensity的贡献已经不再集中在同一个位置了,变得分散了,这就所谓的diffuse scattering当中‘diffuse’这个词的含义。对于上面提到的average structure分析来说,这些diffuse scattering的信号不是我们关心的,我们关心的就只是diffraction peak位置上的intensities,还是同样的根据原子的平均位置计算structure factor,然后由于atomic distortion导致的diffraction intensities的下降我们也可以用平均的办法来解决。这个需要一点数学上的推导,也不复杂,有些晶体学书上可能有推导过程,我写的一个材料里边也有(这里,https://pv.iris-home.net/s/I0OTY1O,section-2.3)。最后的结果就是Debye-Waller factor,其实就是一个q-space的Gaussian dampening function。对于各向异性的情况数学上稍微复杂一些,但是也是复杂的地方只是局限在exponential dampening function的指数部分的计算上,里边涉及到一个张量的计算,对外的反应还是diffraction peak intensity的dampening effect。但是不管是isotropic还是anisotropic的情况,总之我们都是用一个或者几个参数来描述每一个原子平均位置周围来自所有不同的unit cell的原子的平均分布情况。从这个角度说的话,其实不存在它准确不准确的问题,只是关注diffraction peak intensities的变化进而分析晶体的average structure只是对待diffraction data的一种方式,在这种方式下得到的我们对于晶体结构的一个画像是我们从average structure的角度给出的一个画像,一种描述,包括原子的平均位置,以及对应的atomic displacement parameters,各向同性也好,各向异性也好,都是从average structure的角度给出的描述。但是average structure只是描述晶体结构的方式当中的其中一种,另外一种典型的描述就涉及到diffuse scattering的部分。刚刚提到,对于average structure的分析来说,所有的diffuse scattering的信息都被忽略了,他们被当成背景的一部分被扣除掉了,通常就是用一个polynomial函数去描述背景,这个背景不仅包括真正的背景(来自于container,instrument的散射等等)也同时包括diffuse scattering的信号。只是因为average structure的分析用不到diffuse scattering的信号,所以就把它当成背景的一部分扣掉了。这给我们带来一些方便,一个是在测试的时候我们不需要搞那么复杂,我们知道仪器会贡献一些背景散射,我们知道样品的容器也会贡献一些,还有其他一些因素都会贡献一些背景散射,但是无所谓,因为我们不需要把这一部分背景和diffuse scattering的信号区分开,所以就无所谓了,在分析的时候就把他们都当成背景仪器扣掉就好了。另外就是在数据处理的时候也不需要那么复杂,只要我们能保证各个hkl peak之间的relative intensity是准确的就好了。回到diffuse scattering的话题上,如果我们不只关心从平均角度看到的原子平均位置以及它们各自在平均位置周围的平均分布,而是要进一步关心从一个unit cell到另一个unit cell这些原子偏离平均位置的变化以及它们之间是如何关联的,比如相邻的unit cells里边某一个原子位置对应的distortion是倾向于都指向一个方向,或者相反的方向,或者是毫无关联,那么只关注diffraction peak intensities的变化就不够了,因为所有这些从unit cell到unit cell的变化的信息都丢掉了。而这一部分信息就在diffuse scattering的信号里。对应的,如果我们在做测试和数据处理的时候仔细的把来自于仪器和容器等等这些背景的贡献都扣除掉,那么我们就可以分理出diffuse scattering的信号,进而通过分析得到那些unit cells之间的variation的信息。这就是total scattering的概念,就是说我们不只是关心diffraction peak intensities(which yields the average structure, as mentioned),同时也关心diffuse scattering的信号,把它们放在一起就是total scattering,which not only keeps the information about average structure, but also can provide the information about how the variation goes from one unit cell to another。总结起来就回到一开始说的,衍射数据本身就是“衍射数据“,并没有什么Bragg diffraction和total scattering的区分,只是由于在分析的时候有不同的角度,我们是选择忽略或者保留diffuse scattering的部分才会有所区别。当然了,diffuse scattering的部分也不是说我们想保留就一定能保留的,需要有足够高的signal-to-noise level,还要有足够大的q-space access,这就是为什么需要到一些大的facility上来做全散射的实验,同时在数据处理上也要有相对复杂一些的处理过程。
这里边还有一个问题没有提到,就是在做bragg diffraction data analysis和PDF analysis的时候,都可以得到ADPs,从这个角度说的话这两种分析都是用一个unit cell来描述晶体,同样得到的也都是原子的平均位置以及它们的平均分布,那岂不是说这两个分析手段得到的都是average structure,也就是说两者得到的结论应该是一致的,不一致的话就一定是哪里有问题?答案是,不是这样的。虽然两种分析手段最后得到都是average structure,但是它们的含义并不一样,对于bragg diffraction data analysis来说,它”看到“的average structure是原子位置的平均,而对于PDF analysis得到的average structure,它”看到“的是一个一个原子对之间的距离,基于这个反推回一个unit cell,得到原子的平均位置。这里这张图对理解这种区别会有帮助,https://powder.ornl.gov/imgs/local_ave_diff.png。对于图示的情况,保持中间的atom-1的位置不动,如果做bragg diffraction data analysis,那最后得到的结果一定是另外一个原子处于黄色的点的位置上,它对应的是所有在那个红色虚线弧上的原子可能位置的平均。如果是做PDF analysis的话,那么最后得到的结果一定是atom-2是处于红色虚线弧上的某一个位置。从这里就可以看出,这两种分析手段虽然最后都可以得到一个所谓的“average structure”,这里边包括原子的平均位置以及ADPs,但是它们不一定是一样的,就像是这个图示里展示的这种简单的情况这样。而且这里边没有哪一个是正确的,哪一个更侧重什么方面,其实都不是,只是这两种分析方式得到的对于晶体结构的描述方式是不同的,仅此而已。
yuanpeng / poly_info.md
Utoljára aktív
The neighbour_list
program only works with the old format of the supercell configuration.
These days we almost always use the rmc6f
format, but before this format, there was an old
version of the configuration in the rmc3
format. The data2config
program can be used to
convert from rmc6f
to rmc3
(with the extension of cfg
). For the conversion, we basically
want to generate a 1x1x1
'supercell' from the input rmc6f
configuration, so nothing is
really happening except from the format conversion.
The neighbour_list
command can then be run with the created cfg
file from previous step,
and we just need to follow the prompt to provide answers to those questions about the center
and surrounding atoms, the maximum distance between them and the output file. Multiple files
yuanpeng / hb2c_pd_red_test.py
Utoljára aktív
HB2C PD reduction test script
1 | from mantid.simpleapi import * |
2 | import matplotlib.pyplot as plt |
3 | import numpy as np |
4 | |
5 | LoadWAND( |
6 | IPTS="22745", |
7 | RunNumbers="1612206", |
8 | Grouping="4x4", |
9 | OutputWorkspace="neutron_bucket" |
10 | ) |
yuanpeng / Fe45Cr_Notes.md
Utoljára aktív
Texture Correction for Fe45Cr
-
It seems this sample is with stronger texture effect, causing weird behavior in the high angle region. If you grab the files ending with "_corrected_bkg_rm_fittedbkg.dat", you will see the input data for the second stage correction. Those files are the scattering patterns for each of the 2Theta band after the first stage correction and background subtraction. For the background subtraction, we fitted an exponential function with the form of 'a + b * exp[-c * Q^2]' and after the subtraction, we expect the pattern sitting on the baseline, i.e., 0. Here below I am showing some of the patterns with the background subtracted, from which you can see the weird effect in the patterns for 157 and 162. For the two regions labeled out with red arrows, there are no peaks at all for 157 and 162, in which case there is no hope for any corrections and therefore we have to remove them. To do this, we can either delete all files corresponding to the two 2Theta's. Or, we can change the input change file to remove them from group. You can find my latest input json file at
/SNS/users/y8z/NOM_Shared/Yuanpeng/texture_correction_Mar2025/Fe45Cr_ZYP/ttheta_group_params_new_new_new_new_new_new_new.json
-
Though we implemented the background subtraction before the second stage correction, still sometimes the patterns are not perfectly suitable for the integration purpose. In some regions, the pattern is either above the baseline by a bit offset or part of the peak is below the baseline. This makes the peak area calculation and therefore the spherical harmonics fitting inaccurate, yielding weirdly looking outcome. For example, if part of the peak is below the baseline, there are some negative intensities, potentially making the overall intensity close to 0. The fitted coefficient then could be very big, leading to a huge peak with part of the peak above and part of the peak below the baseline. To solve the issue, I did change the script a bit to offset the pattern after the background subtraction to make sure we don't have any negative intensity. The new script is located at
/SNS/users/y8z/NOM_Shared/Yuanpeng/texture_correction_Mar2025/Fe45Cr_ZYP/texture_proc_real_1step_not_aligned_2step_aligned.py
-
The original chunk definition is too coarse in some regions for both group-1 and group-2. You can find the chunk definition in my new json file mentioned above.
yuanpeng / texture_corr_steps.md
Utoljára aktív
Steps for Texture Correction
-
First, we need to prepare the grouping file, which will divide detectors into small groups according to the polar and azimuthal angles. The
MantidTotalScattering
(MTS) reduction will then take the grouping file for reducing data into those small groups.-
Go to
/SNS/NOM/shared/scripts/texture
and run thetexture_group_gen.py
script like this,mantidpython texture_group_gen.py
-
yuanpeng / output_group.json
Utoljára aktív
1 | { |
2 | "bank_1": [0, 35], |
3 | "bank_2": [35, 55], |
4 | "bank_3": [55, 75], |
5 | "bank_4": [75, 105], |
6 | "bank_5": [105, 135], |
7 | "bank_6": [135, 180] |
8 | } |