56 lines
1.8 KiB
Matlab
56 lines
1.8 KiB
Matlab
function [DataInt,EInt]=IntAngle(Data,ACorr,ECorr,Interval)
|
|
% [DataInt,EInt]=IntAngle(Data,ACorr,ECorr [,Interval]) integrates 2D/3D
|
|
% array Data over 1D/2D array ACorr of angles within Interval (default
|
|
% is 90% of the ACorr range). The outputs are respectively 1D/2D integrated
|
|
% data array DataInt and 1D energy vector EInt
|
|
% Rev. 07.07.2019
|
|
|
|
disp('- Angle integrating')
|
|
% parameters
|
|
% - angular interval
|
|
if nargin<4; Interval=0.9*[max(ACorr(:,1)) min(ACorr(:,end))]; end
|
|
% - dimensions
|
|
nE=size(Data,1); nA=size(Data,2); nS=size(Data,3);
|
|
% - extend energy array to the data array
|
|
if size(ECorr,2)==1; ECorr=repmat(ECorr,1,nA); end
|
|
if nS>1&&size(ECorr,3)==1; ECorr=repmat(ECorr,1,1,nS); end
|
|
% - reference energy grid
|
|
if nA==1&&nS==1; EInt=ECorr;
|
|
else eMin=max(max(ECorr(1,:,:))); eMax=min(min(ECorr(end,:,:))); EInt=linspace(eMin,eMax,nE)';
|
|
end
|
|
% data within the angular interval/normalization
|
|
if size(ACorr,1)==1
|
|
% - 1D-ACorr
|
|
Data=Data(:,Interval(1)<=ACorr&ACorr<=Interval(2),:);
|
|
nA=size(Data,2); Data=Data/nA;
|
|
else
|
|
% - 2D-ACorr
|
|
Out=find(Interval(1)>ACorr|ACorr>Interval(2)); Data(Out)=0;
|
|
Supp=ones(size(Data)); Supp(Out)=0;
|
|
Weight=sum(Supp,2); Weight=repmat(Weight,1,nA);
|
|
Data=Data.*Supp./Weight;
|
|
end
|
|
|
|
% cycle over scans
|
|
DataInt=zeros(nE,nS);
|
|
for iS=1:nS
|
|
% cycle over angles in triads for speed
|
|
IntScan=zeros(size(EInt));
|
|
for iA=2:3:nA-1
|
|
% interpolation on the reference grid
|
|
if nS>1
|
|
DCorr=interp1(ECorr(:,iA,iS),sum(Data(:,iA-1:iA+1,iS),2),EInt);
|
|
else
|
|
if nA>1
|
|
DCorr=interp1(ECorr(:,iA),sum(Data(:,iA-1:iA+1),2),EInt);
|
|
else DCorr=interp1(ECorr,sum(Data(:,iA-1:iA+1),2),EInt);
|
|
end
|
|
end
|
|
% angle integration
|
|
IntScan=IntScan+DCorr;
|
|
end
|
|
% check
|
|
% figure; plot(EInt,DD,EInt,DDS);
|
|
% output and normalization
|
|
DataInt(:,iS)=IntScan;
|
|
end |