0001 function d = flagMask(d, antenna)
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
0028
0029
0030
0031
0032
0033
0034
0035
0036
0037
0038
0039
0040
0041
0042
0043
0044
0045 rxTempLim = 20;
0046 elevLim = 10;
0047 sunLim = 30;
0048 moonLim = 5;
0049 controlBldg = [214.5 226];
0050
0051 if ~exist('antenna','var')
0052 antenna = 1;
0053 end
0054
0055 switch antenna
0056 case 1
0057 antname = 'ovro';
0058 case 2
0059 antname = 'hrao';
0060 case 3
0061 antname = 'karoo';
0062 otherwise
0063 error('Antenna #%d not known to C-BASS',antenna)
0064 end
0065
0066
0067 if(length(unique(d.antenna0.receiver.utc)) ~= ...
0068 length(d.antenna0.receiver.utc))
0069 display('BACKEND IN BAD STATE DURING TRACK');
0070 display('ALL YOUR DATA IS BAD');
0071 error('Pick a different time to analyze');
0072
0073 end
0074
0075
0076
0077
0078
0079
0080 d.flags.mask.slow = zeros(size(d.array.frame.utc));
0081 d.flags.mask.medium = zeros(size(d.antenna0.servo.utc));
0082 d.flags.mask.fast = zeros(size(d.antenna0.receiver.utc));
0083
0084
0085
0086 flagRegTemp = double(d.antenna0.frame.received ~=2);
0087 d = applyFlag(d, flagRegTemp, [],[],0);
0088
0089
0090
0091 antenna
0092 switch antenna
0093 case 1
0094 flagRegTemp = d.antenna0.thermal.lsTemperatureSensors(:,1:4) > rxTempLim;
0095 case 2
0096 flagRegTemp = d.antenna0.thermal.lsTemperatureSensors(:,[5,6,8]) > rxTempLim;
0097 case 3
0098 flagRegTemp = d.antenna0.thermal.lsTemperatureSensors(:,[5,6,8]) > rxTempLim;
0099 end
0100
0101 flagRegTemp = sum(flagRegTemp,2)>0;
0102 d = applyFlag(d, flagRegTemp, [],[],1);
0103
0104
0105 flagRegTemp = double(d.antenna0.tracker.offSource);
0106 d = applyFlag(d, flagRegTemp, [],[],2);
0107
0108
0109 flagRegTemp = (double(d.antenna0.tracker.lacking>0 & ...
0110 d.antenna0.tracker.lacking<1025));
0111 d = applyFlag(d, flagRegTemp, [],[],3);
0112
0113
0114 flagRegTemp = double(d.array.weather.status~=0);
0115 d = applyFlag(d, flagRegTemp, [],[],5);
0116
0117
0118
0119 if(isfield(d.antenna0.servo, 'el'))
0120 flagServTemp = double(d.antenna0.servo.el < elevLim | ...
0121 d.antenna0.servo.el > 88) ;
0122 d = applyFlag(d, [], [], flagServTemp, 4);
0123 else
0124 flagServTemp = double(d.antenna0.servo.fast_el_pos < elevLim | ...
0125 d.antenna0.servo.fast_el_pos > 88) ;
0126 d = applyFlag(d, [], flagServTemp,[],4);
0127 end
0128
0129
0130 flagServTemp = d.flags.interpFlags.medium;
0131 d = applyFlag(d, [], flagServTemp, [], 10);
0132
0133
0134
0135 if(d.array.frame.utc(1) < date2mjd(2011,06, 01))
0136 flagRxTemp = bitand(d.antenna0.receiver.flags, 2^4)==0;
0137 d = applyFlag(d, [], [],flagRxTemp, 6);
0138 end
0139
0140
0141 switch antenna
0142 case 1
0143
0144 flagRxTemp = d.antenna0.receiver.diagnostics(:,1)>10;
0145 d = applyFlag(d, [], [],flagRxTemp, 7);
0146
0147
0148
0149 flagRxTemp = bitand(d.antenna0.receiver.flags, 2^8)==0;
0150 d = applyFlag(d, [], [],flagRxTemp, 8);
0151
0152
0153
0154 flagRxTemp = bitand(d.antenna0.receiver.flags, 2^9)==0;
0155 d = applyFlag(d, [], [],flagRxTemp, 9);
0156
0157
0158 flagRxTemp = d.flags.interpFlags.fast;
0159 d = applyFlag(d, [], [], flagRxTemp, 11);
0160
0161
0162 flagRxTemp = d.antenna0.receiver.diagnostics(:,4) == 254;
0163 d = applyFlag(d, [], [], flagRxTemp, 12);
0164 end
0165
0166
0167 d = apparentAzEl(d,0);
0168
0169
0170 [dist az el] = calcSourceDist(d, 'sun');
0171 d.antenna0.servo.solarDist = dist;
0172 az = wrap360(az);
0173 raz=round(60*az);
0174 raz(raz >= 21600) = 0;
0175
0176 bindata=fitsread(strcat('constants/',antname,'_horizon.fits'),'bintable');
0177 horizonInf = bindata{:,2};
0178
0179
0180
0181 if(antenna>1)
0182 horizonInf=horizonInf*0.0;
0183 end
0184
0185
0186 horizonEl = horizonInf(raz+1)';
0187
0188 d.flags.dayNight = ones(size(az),'uint8');
0189 d.flags.dayNight(el < (horizonEl - 1.)) = 0;
0190 d.flags.dayNight(el > (horizonEl + 1.)) = 2;
0191
0192 flagRxTemp=(dist < sunLim) & (el > (horizonEl - 0.25));
0193
0194
0195 clear dist az el horizonEl;
0196 d = applyFlag(d, [], [], flagRxTemp, 13);
0197
0198
0199
0200
0201
0202
0203 [dist az el] = calcSourceDist(d, 'moon');
0204 az = wrap360(az);
0205 raz = round(60*az);
0206 raz(raz >= 21600) = 0;
0207 horizonEl = horizonInf(raz+1)';
0208 flagRxTemp = (dist < moonLim) & (el > (horizonEl - 0.25));
0209 clear dist az el horizonEl;
0210 d = applyFlag(d, [], [], flagRxTemp, 14);
0211
0212
0213
0214
0215
0216
0217
0218 d.flags = rmfield(d.flags, 'interpFlags');
0219
0220
0221
0222
0223
0224 d.flags.bit.slow = uint32(zeros(size(d.flags.mask.slow)));
0225 d.flags.bit.medium = uint32(zeros(size(d.flags.mask.medium)));
0226 d.flags.bit.fast = uint32(zeros(length(d.flags.mask.fast), 3));
0227
0228 d.flags.slow = false(size(d.flags.mask.slow));
0229 d.flags.medium = false(size(d.flags.mask.medium));
0230 d.flags.fast = false(length(d.flags.mask.fast), 3);
0231
0232 return;
0233
0234
0235
0236 function d = applyFlag(d, flagRegTemp, flagServTemp, ...
0237 flagRxTemp, bitNum)
0238
0239 if(~isempty(flagRegTemp))
0240 flagServTemp = repmat(flagRegTemp, [1 5]);
0241 flagServTemp = flagServTemp';
0242 flagServTemp = flagServTemp(:);
0243
0244 flagRxTemp = repmat(flagRegTemp, [1 100]);
0245 flagRxTemp = flagRxTemp';
0246 flagRxTemp = flagRxTemp(:);
0247
0248 elseif(~isempty(flagServTemp))
0249 flagRegTemp = reshape(flagServTemp, [5, length(flagServTemp)/5]);
0250 flagRegTemp = mean(flagRegTemp) == 1;
0251 flagRegTemp = flagRegTemp';
0252
0253 flagRxTemp = repmat(flagServTemp, [1 20]);
0254 flagRxTemp = flagRxTemp';
0255 flagRxTemp = flagRxTemp(:);
0256 elseif(~isempty(flagRxTemp))
0257 flagRegTemp = reshape(flagRxTemp, [100, length(flagRxTemp)/100]);
0258 flagRegTemp = mean(flagRegTemp) == 1;
0259 flagRegTemp = flagRegTemp';
0260
0261 flagServTemp = reshape(flagRxTemp, [20, length(flagRxTemp)/20]);
0262 flagServTemp = mean(flagServTemp) == 1;
0263 flagServTemp = flagServTemp';
0264 else
0265 error('No flags passed');
0266 end
0267
0268 d.flags.mask.slow = d.flags.mask.slow + 2^(bitNum)*double(flagRegTemp);
0269 d.flags.mask.medium = d.flags.mask.medium + 2^(bitNum)*double(flagServTemp);
0270 d.flags.mask.fast = d.flags.mask.fast+ 2^(bitNum)*double(flagRxTemp);
0271
0272 return;
0273
0274
0275
0276
0277
0278
0279
0280
0281
0282
0283
0284
0285
0286
0287
0288
0289
0290
0291
0292
0293
0294
0295
0296
0297
0298
0299
0300
0301
0302