0001 function rfiFlags = boxRejection(d, nSigma, nTime, upperLimit, lowerLimit)
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027 switch(nargin)
0028
0029 case 1
0030 nSigma = 5;
0031 nTime = 15;
0032 upperLimit = 8000;
0033 lowerLimit = -8000;
0034
0035 case 2
0036 nTime = 15;
0037 upperLimit = 8000;
0038 lowerLimit = -8000;
0039
0040 case 3
0041 upperLimit = 8000;
0042 lowerLimit = -8000;
0043
0044 case 4
0045 lowerLimit = -8000;
0046
0047 case 5
0048
0049 otherwise
0050 error('Wrong number of inputs');
0051 end
0052
0053
0054
0055 rfiFlags = zeros(size(d.antenna0.receiver.data,1),1);
0056
0057
0058
0059 upLimFlags = sum(d.antenna0.receiver.data > upperLimit,2)>0;
0060 loLimFlags = sum(d.antenna0.receiver.data < lowerLimit,2)>0;
0061
0062
0063 nSize = round(nTime./(mean(diff(d.antenna0.receiver.utc))*24*60*60));
0064
0065 [flags] = boxCarReject(d.antenna0.receiver.data, nSigma, nSize, upperLimit);
0066 rfiFlags = flags>0 | upLimFlags | loLimFlags;
0067
0068 return;
0069
0070
0071
0072
0073
0074
0075
0076
0077
0078
0079
0080 function [fullFlagVec] = boxCarReject(data,nSigma, nSize, upperLimit)
0081
0082
0083 if(nSize > size(data,1))
0084 nSize = size(data,1);
0085 end
0086 numBox = floor(size(data,1)/nSize);
0087
0088 finalFlags = [];
0089 finalData = [];
0090 soFar = 0;
0091 meanVals = [];
0092 rmsVals = [];
0093 indexVec = [];
0094 for m=1:numBox
0095 if(m==numBox)
0096 thisBin = data((m-1)*nSize+1:size(data,1),:,:);
0097 indexVec((m-1)*nSize+1:size(data,1)) = m;
0098 else
0099 thisBin = data((m-1)*nSize+1:m*nSize,:,:);
0100 indexVec((m-1)*nSize+1:m*nSize) = m;
0101 end
0102
0103 meanVals(m,:) = nanmean(thisBin);
0104 rmsVals(m,:) = sqrt(nanvar(thisBin));
0105 end
0106 indexVec = indexVec';
0107
0108
0109
0110 medVals = nanmedian(rmsVals);
0111 medVals = repmat(medVals, [size(meanVals,1) 1])*1.1;
0112
0113 flagged = rmsVals>medVals;
0114
0115
0116 flagVec = flagged(:,1) + flagged(:,6) > 0;
0117 f = find(flagVec);
0118 fullFlagVec = zeros(size(indexVec));
0119 for m=1:length(f)
0120 fullFlagVec(indexVec==f(m)) = 1;
0121 end
0122
0123 return;
0124
0125
0126
0127
0128
0129
0130
0131
0132
0133 function [data saveFlags] = outlier(thisBin, nSigma, upperLimit)
0134
0135 nSize = size(thisBin,1);
0136
0137 f=1;
0138 saveFlags = zeros(size(thisBin));
0139 if(size(thisBin,1) == 1)
0140 flags = thisBin>upperLimit;
0141 data = thisBin;
0142 return;
0143 end
0144 if(any(nanmean(thisBin,1) > upperLimit))
0145 display(['Mean value greater than upper limit']);
0146 display(['Readjusting upper limit ']);
0147 upperLimit = max(nanmean(thisBin,1)) + 5;
0148 end
0149 while(~isempty(f))
0150 thisMean = repmat(nanmean(thisBin,1), [nSize 1 1]);
0151 thisStd = repmat(nanstd(thisBin,1), [nSize 1 1]);
0152 flags = (thisBin > thisMean + nSigma*thisStd | thisBin < thisMean - ...
0153 nSigma*thisStd | thisBin > upperLimit);
0154 f = find(flags);
0155 saveFlags = saveFlags + flags;
0156 thisBin = ~flags.*thisBin + thisMean.*flags;
0157 saveFlags = saveFlags>0;
0158 end
0159
0160 data = thisBin;
0161
0162 return;