0%

XRD_FitPeakProfile

所用软件

Jade 6.0, XRD_FileConversion,Sublime_text 3,Matlab R2016b。
软件安装点我Software

Jade这个软件对于在材料方面搬砖的小伙伴来说,重要性大家都知道吧(不知道的面壁(╯-_-)╯╧╧)。它的功能十分强大,比同类型的Highscore不知道高到哪里去了。

虽然在分析方面很强,但是在图像表现方面却不行,所以在这里我借助MATLAB这一利器。思路就是:先用Jade分峰,然后把分出来的峰的分布(TwoTheta~Intensity)导出成txt文件,然后用MATLAB绘图。

为啥不用Origin绘图?把时间花在重复性的简单的没有技术含量的为了添加某个东西而要用鼠标点各种按钮的重复性不好的编辑说图片不行要推倒重来的字体极度不友好的Oringin上面太没意思了吧<(ˉ^ˉ)>。

Matlab则不一样,其程式化的代码可以实现学者的任何想法,并且在处理大量相似流程方面具有很大的便捷性,只要写好了处理一个的代码,其他情况只需要修改初始条件,便可再次计算,最后得到的数据也可以按照学者的想法进行存储。熟悉的人都知道,除了不能生孩子,Matlab什么都会。

步骤

1. 截取XRD数据

使用XRD_FileConversion完成。详细教程…

2. 分峰

使用Jade完成。详细教程…

3. 将数据导出

详细教程…

4. 用Matlab处理数据

详细教程…

Source code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
%%  全局变量&命令
clc %清除命令窗口的内容,对工作环境中的全部变量无任何影响
clear %清除工作空间的所有变量
close all %关闭所有的Figure窗口

format short
format compact

StepLength=0.013;
axis_ymax_1=1;
text_dy=0.05;

TwoTheta=cell(6,1);
PeakPosition=cell(6,1);
C1=cell(5,2);
C2=cell(6,5,3); %生成一个6*5*3的元胞数组,意义见草稿纸
PeakPosition_temp=zeros(3,3); %生成一个3行3列的零矩阵,用于暂时存储峰的位置,三列分别表示角度,强度(绝对值), 强度(相对值)

%读取第i种实验条件下,各个峰形分布的角度信息
for i=1:6
TwoTheta{i,1}=load(['TwoTheta_', i, '.txt');
end
% 上述循环等价于
% TwoTheta{1,1}=load('TwoTheta_1.txt');
% TwoTheta{2,1}=load('TwoTheta_2.txt');
% TwoTheta{3,1}=load('TwoTheta_3.txt');
% TwoTheta{4,1}=load('TwoTheta_4.txt');
% TwoTheta{5,1}=load('TwoTheta_5.txt');
% TwoTheta{6,1}=load('TwoTheta_6.txt');

for i=1:6 %这里有6种情形,每一种情形要找5条曲线出来
X_err_temp=TwoTheta{i,1}
X_err=X_err_temp(6,1);
%//temp第1行分别表示第1个峰的开始角度,结束角度,数据个数
%//temp第2行分别表示第2个峰的开始角度,结束角度,数据个数
%//temp第3行分别表示第3个峰的开始角度,结束角度,数据个数
%//temp第4行分别表示背底的开始角度,结束角度,数据个数
%//temp第5行分别表示整体的开始角度,结束角度,数据个数
%//temp第6行第一列数据为: 矫正角度(正数表示数据需要整体右移,负数表示左移),其他三列都是0,用于充数,实现矩阵完整性。


switch i
case 1
%这里可以用一个跟前面相似的循环优化,下面也是,哎,一开始存数据的时候没命名好,就先就这样吧
C1{1,1}=load('Fitted_1_1.1.txt');
C1{1,2}=load('Fitted_1_1.2.txt');
C1{2,1}=load('Fitted_1_2.1.txt');
C1{2,2}=load('Fitted_1_2.2.txt');
C1{3,1}=load('Fitted_1_3.1.txt');
C1{3,2}=load('Fitted_1_3.2.txt');
C1{4,1}=load('Fitted_1_bg_1.txt');
C1{4,2}=load('Fitted_1_bg_2.txt');
C1{5,1}=load('Fitted_1_total_1.txt');
C1{5,2}=load('Fitted_1_total_2.txt') ;
case 2
C1{1,1}=load('Fitted_2_1.1.txt');
C1{1,2}=load('Fitted_2_1.2.txt');
C1{2,1}=load('Fitted_2_2.1.txt');
C1{2,2}=load('Fitted_2_2.2.txt');
C1{3,1}=load('Fitted_2_3.1.txt');
C1{3,2}=load('Fitted_2_3.2.txt');
C1{4,1}=load('Fitted_2_bg_1.txt');
C1{4,2}=load('Fitted_2_bg_2.txt');
C1{5,1}=load('Fitted_2_total_1.txt');
C1{5,2}=load('Fitted_2_total_2.txt') ;
case 3
C1{1,1}=load('Fitted_3_1.1.txt');
C1{1,2}=load('Fitted_3_1.2.txt');
C1{2,1}=load('Fitted_3_2.1.txt');
C1{2,2}=load('Fitted_3_2.2.txt');
C1{3,1}=load('Fitted_3_3.1.txt');
C1{3,2}=load('Fitted_3_3.2.txt');
C1{4,1}=load('Fitted_3_bg_1.txt');
C1{4,2}=load('Fitted_3_bg_2.txt');
C1{5,1}=load('Fitted_3_total_1.txt');
C1{5,2}=load('Fitted_3_total_2.txt') ;
case 4
C1{1,1}=load('Fitted_4_1.1.txt');
C1{1,2}=load('Fitted_4_1.2.txt');
C1{2,1}=load('Fitted_4_2.1.txt');
C1{2,2}=load('Fitted_4_2.2.txt');
C1{3,1}=load('Fitted_4_3.1.txt');
C1{3,2}=load('Fitted_4_3.2.txt');
C1{4,1}=load('Fitted_4_bg_1.txt');
C1{4,2}=load('Fitted_4_bg_2.txt');
C1{5,1}=load('Fitted_4_total_1.txt');
C1{5,2}=load('Fitted_4_total_2.txt') ;
case 5
C1{1,1}=load('Fitted_5_1.1.txt');
C1{1,2}=load('Fitted_5_1.2.txt');
C1{2,1}=load('Fitted_5_2.1.txt');
C1{2,2}=load('Fitted_5_2.2.txt');
C1{3,1}=load('Fitted_5_3.1.txt');
C1{3,2}=load('Fitted_5_3.2.txt');
C1{4,1}=load('Fitted_5_bg_1.txt');
C1{4,2}=load('Fitted_5_bg_2.txt');
C1{5,1}=load('Fitted_5_total_1.txt');
C1{5,2}=load('Fitted_5_total_2.txt') ;
case 6
C1{1,1}=load('Fitted_6_1.1.txt');
C1{1,2}=load('Fitted_6_1.2.txt');
C1{2,1}=load('Fitted_6_2.1.txt');
C1{2,2}=load('Fitted_6_2.2.txt');
C1{3,1}=load('Fitted_6_3.1.txt');
C1{3,2}=load('Fitted_6_3.2.txt');
C1{4,1}=load('Fitted_6_bg_1.txt');
C1{4,2}=load('Fitted_6_bg_2.txt');
C1{5,1}=load('Fitted_6_total_1.txt');
C1{5,2}=load('Fitted_6_total_2.txt') ;
end

for j=1:5
%[1]角度分布
X_temp=TwoTheta{i,1}
X_begin=X_temp(j,1)+X_err;
X_end=X_temp(j,2)+X_err;
X=X_begin:StepLength:X_end;
C2{i,j,1}=X;

%[2]强度分布(绝对值)
Y_1=C1{j,1};
Y_2=C1{j,2};
Y=MultiLineIntoOne(Y_1,Y_2);
C2{i,j,2}=Y;

%[3]峰的坐标(绝对值)(只找前三个峰,故i<=3)
if j<=3
Y_max=max(Y);
[m,n]=find(Y==max(Y_max));
m=round(median(m)); %Y是行向量,m自然是1
n=round(median(n)); %Y_max在Y中的序数,并取中位数,以应对连续相同的最大值;下同
TwoTheta_j=X(1,n); %这个地方一开始直接用的TwoTheta,导致覆盖了之前的矩阵TwoTheta,所以出错!命名要小心!
Intensity_j=Y(1,n);
PeakPosition_temp(j,:)=[TwoTheta_j Intensity_j 0];
end
end

PeakPosition{i,1}=PeakPosition_temp;

%[3]
%强度分布(相对值)
F=0.9/PeakPosition_temp(3,2);
C2{i,1,3}=F*C2{i,1,2};
C2{i,2,3}=F*C2{i,2,2};
C2{i,3,3}=F*C2{i,3,2};
C2{i,4,3}=F*C2{i,4,2};
C2{i,5,3}=F*C2{i,5,2};

%峰强度归一(相对值)
for k=1:3
PeakPosition_temp(k,3)=F*PeakPosition_temp(k,2);
end
PeakPosition{i,1}=PeakPosition_temp;


%% 【画峰形】
f=figure(i);
plot(C2{i,1,1},C2{i,1,2},'Linewidth',5,'Color',[0,150,71]/255)
hold on
plot(C2{i,2,1},C2{i,2,2},'Linewidth',5,'Color',[246,179,11]/255)
hold on
plot(C2{i,3,1},C2{i,3,2},'Linewidth',5,'Color',[228,29,37]/255)
hold on
plot(C2{i,4,1},C2{i,4,2},'Linestyle','--','Linewidth',1,'Color','k')
hold on
plot(C2{i,5,1},C2{i,5,2},'Linestyle','-.','Linewidth',2,'Color','k')


%【添加峰的指示线】
for k=1:3
hold on
plot([PeakPosition_temp(k,1) PeakPosition_temp(k,1)],[0 PeakPosition_temp(k,2)],'b','Linestyle','--')
end

%【坐标设置】
set(gca,'Xlim',([35 46]),'Fontname','Arial','Fontsize',25);
set(gca,'Ylim',([0 2000]),'Fontname','Arial','Fontsize',25);
%【图片设置】
set(f,'units','normalized','position',[0 0 0.7 0.9]);
set(gca,'units','normalized','Position',[.15 .15 .75 .75]);
%【标注设置】
fs=40;
xlabel('2\Theta(degree)','Fontname','Arial','Fontsize',fs)
ylabel('Intensity(relative value)','Fontname','Arial','Fontsize',fs)
% title('XRD of [V-Cu-Nb-Cu][h=48nm L=576nm][RT 6E16]','Fontname','Times','Fontsize',fs_1)

fs=30;
text(PeakPosition_temp(1,1),PeakPosition_temp(1,2)+text_dy,'Nb(110)','Fontname','Arial','fontsize',fs,'color',[0,150,71]/255);
text(PeakPosition_temp(2,1),PeakPosition_temp(2,2)+text_dy,'V(110)','Fontname','Arial','fontsize',fs,'color',[246,179,11]/255);
text(PeakPosition_temp(3,1),PeakPosition_temp(3,2)+text_dy,'Cu(111)','Fontname','Arial','fontsize',fs,'color',[228,29,37]/255);


a=get(gca);
x=a.XLim; %获取横坐标上下限
y=a.YLim; %获取纵坐标上下限
k=[0.05 0.9]; %给定text相对位置
x0=x(1)+k(1)*(x(2)-x(1)); %获取text横坐标
y0=y(1)+k(2)*(y(2)-y(1)); %获取text纵坐标
text(x0,y0,'(b) 48nm 6E16 RT','Fontname','Arial','fontsize',40,'color','k');

legend({'Nb','V','Cu','Overall','Background'},'Fontname','Arial','fontsize',30,'location',[0.2475 0.55 0.2 0.2])


%【存图】
saveas(f,strcat(num2str(i),'.tif'));

% %如果存的时候就要命名完整的话,采用如下
% switch i
% case 1
% saveas(f,strcat(num2str(i),'.tif'));
% case 2
% imwrite(f,strcat('V-Cu-Nb-Cu',num2str(i),'.tif'));
% end

end