Files
2023-08-10 09:19:49 +02:00

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