0001 function tsys = calcTsys(d)
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016 sources = unique(d.antenna0.tracker.source);
0017 for m=1:length(sources)
0018 [sourceNum(m) sourceFlux(m)] = sourceCorrespondance(sources(m));
0019 end
0020 if(all(sourceNum==99))
0021 display('calcTsysPolOnly:: No Calibrator Source Observations in this schedule');
0022 display('calcTsysPolOnly:: Can not calculate system temperatures');
0023 tsys = [];
0024 return;
0025 end
0026
0027
0028
0029
0030 numNoiseObs = size(d.correction.alpha.indices,1);
0031 cal.whatSource = zeros(numNoiseObs,1);
0032 cal.onSource = zeros(numNoiseObs,1);
0033 cal.time = zeros(numNoiseObs,1);
0034 cal.tau = zeros(numNoiseObs,1);
0035 cal.sourceFlux = zeros(numNoiseObs,1);
0036 indices = d.correction.alpha.indices;
0037 for m=1:numNoiseObs
0038 ind = zeros(size(d.antenna0.receiver.utc));
0039 ind(indices(m,1):indices(m,3)) = 1;
0040 ind = logical(ind);
0041 dc = framecut(d, ind);
0042
0043 switch(size(d.antenna0.receiver.data,2))
0044 case 10
0045 dataNoiseOn = d.antenna0.receiver.data((indices(m,4)+5):indices(m,2), [1 9]);
0046 dataNoiseOff= d.antenna0.receiver.data([indices(m,1):(indices(m,4)-5) ...
0047 (indices(m,2)+5):indices(m,3)], [1 9]);
0048
0049 case 8
0050 dataNoiseOn = d.antenna0.receiver.data((indices(m,4)+5):indices(m,2), [1 8]);
0051 dataNoiseOff= d.antenna0.receiver.data([indices(m,1):(indices(m,4)-5) ...
0052 (indices(m,2)+5):indices(m,3)], [1 8]);
0053 end
0054
0055
0056
0057 tau = calcOpacity(5, dc.array.weather.airTemperature+273.15, ...
0058 dc.array.weather.relativeHumidity, ...
0059 length(dc.array.weather.relativeHumidity), 1);
0060 cal.tau(m,1) = mean(tau)./cos( mean(dc.antenna0.servo.el)*pi/180);
0061
0062
0063 thisSource = unique(dc.antenna0.tracker.source);
0064 if(length(thisSource)>1)
0065 cal.whatSource(m,1) = 99;
0066 else
0067 [cal.whatSource(m,1) cal.sourceFlux(m,1)] = sourceCorrespondance(thisSource);
0068 end
0069
0070 if(cal.whatSource(m) ~= 99)
0071
0072 offsets = unique(dc.antenna0.tracker.horiz_off(:,1));
0073 if(offsets==0)
0074 cal.onSource(m,1) = 1;
0075 end
0076 cal.time(m,1) = dc.antenna0.receiver.utc(1);
0077 cal.PnoiseOn(m,:) = mean(dataNoiseOn);
0078 cal.PnoiseOff(m,:) = mean(dataNoiseOff);
0079 cal.varNoiseOn(m,:) = var(dataNoiseOn);
0080 cal.varNoiseOff(m,:) = var(dataNoiseOff);
0081 else
0082 cal.PnoiseOn(m,1:2) = nan;
0083 cal.PnoiseOff(m,1:2) = nan;
0084 cal.varNoiseOn(m,1:2) = nan;
0085 cal.varNoiseOff(m,1:2) = nan;
0086 end
0087
0088 end
0089
0090
0091
0092 ind = cal.whatSource == 99;
0093
0094 cal = structcut(cal, ~ind);
0095
0096
0097
0098
0099
0100 if(~isstruct(cal) || length(cal.whatSource)<1)
0101 display('calcTsysPolOnly:: No Calibrator Source Observations in this schedule');
0102 display('calcTsysPolOnly:: Can not calculate system temperatures');
0103 tsys = [];
0104 return;
0105 end
0106
0107
0108 if(d.array.frame.utc > date2mjd(2011, 06, 01))
0109 bw = [763 696]*1e6;
0110 else
0111 bw = [1000 1000]*1e6;
0112 end
0113
0114
0115
0116
0117 index = 1;
0118 for m=1:(length(cal.time)/2)
0119
0120
0121 ind = cal.whatSource==cal.whatSource(2*m-1) & ...
0122 cal.onSource == ~cal.onSource(2*m-1);
0123 f = find(ind);
0124
0125 ff = find( abs(cal.time(f) - cal.time(2*m-1)) == min(abs(cal.time(f) - ...
0126 cal.time(2*m-1))));
0127 matchVal = f(ff);
0128
0129
0130 if(cal.onSource(2*m-1))
0131 Psrc_noiseon = cal.PnoiseOn(2*m-1,:);
0132 Psrc_noiseoff = cal.PnoiseOff(2*m-1,:);
0133 Pblank_noiseon = cal.PnoiseOn(matchVal,:);
0134 Pblank_noiseoff = cal.PnoiseOff(matchVal,:);
0135 Vsrc_noiseon = cal.varNoiseOn(2*m-1,:);
0136 Vsrc_noiseoff = cal.varNoiseOff(2*m-1,:);
0137 Vblank_noiseon = cal.varNoiseOn(matchVal,:);
0138 Vblank_noiseoff = cal.varNoiseOff(matchVal,:);
0139 else
0140 Psrc_noiseon = cal.PnoiseOn(matchVal,:);
0141 Psrc_noiseoff = cal.PnoiseOff(matchVal,:);
0142 Pblank_noiseon = cal.PnoiseOn(2*m-1,:);
0143 Pblank_noiseoff = cal.PnoiseOff(2*m-1,:);
0144 Vsrc_noiseon = cal.varNoiseOn(matchVal,:);
0145 Vsrc_noiseoff = cal.varNoiseOff(matchVal,:);
0146 Vblank_noiseon = cal.varNoiseOn(2*m-1,:);
0147 Vblank_noiseoff = cal.varNoiseOff(2*m-1,:);
0148 end
0149
0150
0151
0152
0153 ynoisesrc = Psrc_noiseoff./Psrc_noiseon;
0154 ynoisesky = Pblank_noiseoff./Pblank_noiseon;
0155
0156 ycrazysrc = (Psrc_noiseon - Psrc_noiseoff)./(Psrc_noiseoff - ...
0157 Pblank_noiseoff);
0158 ycrazysky = (Pblank_noiseon - Pblank_noiseoff)./(Psrc_noiseoff - ...
0159 Pblank_noiseoff);
0160
0161
0162
0163
0164
0165
0166
0167
0168
0169
0170 apEff = 0.55;
0171 k_b = 1.38e-23;
0172 Tsrc = cal.sourceFlux(2*m-1).*(pi*(6.1/2).^2*apEff)./(2*k_b*1e26);
0173
0174
0175 tauVal = mean(cal.tau([2*m-1 matchVal]));
0176
0177
0178
0179 tsys.tnoise.src(index,:) = ycrazysrc.*Tsrc.*exp(-tauVal);
0180 tsys.tnoise.sky(index,:) = ycrazysky.*Tsrc.*exp(-tauVal);
0181
0182 Tcmb = 2.728*exp(-tauVal);
0183 Tatm = mean(dc.array.weather.airTemperature + 273.15).*(1-exp(-tauVal));
0184 Tload = mean(dc.antenna0.thermal.coldLoad);
0185
0186
0187
0188 tsys.tground.src(index,:) = Tload - Tcmb - Tatm + ...
0189 tsys.tnoise.src(index,:)./(ynoisesrc-1);
0190 tsys.tground.sky(index,:) = Tload - Tcmb - Tatm + ...
0191 tsys.tnoise.sky(index,:)./(ynoisesky-1);
0192
0193 tsys.time(index,1) = cal.time(2*m-1);
0194 tsys.source(index,1) = cal.whatSource(2*m-1);
0195 tsys.Tsrc(index,:) = Tsrc;
0196 tsys.tau(index,:) = tauVal;
0197
0198 tsys.ynoise.src(index,:) = ynoisesrc;
0199 tsys.ycrazy.src(index,:) = ycrazysrc;
0200 tsys.ynoise.sky(index,:) = ynoisesky;
0201 tsys.ycrazy.sky(index,:) = ycrazysky;
0202
0203
0204 g1src = (Psrc_noiseon - ...
0205 Psrc_noiseoff)./(k_b*tsys.tnoise.src(index,:).*bw);
0206 g1sky = (Pblank_noiseon - ...
0207 Pblank_noiseoff)./(k_b*tsys.tnoise.sky(index,:).*bw);
0208
0209 g1srcdB = 10*log10(g1src);
0210 g1skydB = 10*log10(g1sky);
0211
0212 thisGain = [cal.time(2*m-1) g1src cal.time(matchVal) g1sky];
0213 thisGaindB = [cal.time(2*m-1) g1srcdB cal.time(matchVal) g1skydB];
0214
0215 tsys.gain(index,:) = thisGain;
0216 tsys.gaindB(index,:) = thisGaindB;
0217
0218
0219
0220
0221
0222
0223
0224
0225 index = index+1;
0226 end
0227
0228
0229
0230 tsys.val = nan(size(tsys.tnoise.sky));
0231
0232
0233 return;
0234
0235
0236