Home > antHealth > antHealth.m

antHealth

PURPOSE ^

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

SYNOPSIS ^

function antHealth(date,output_dir)

DESCRIPTION ^

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

   function antHealth(date)

     function that will generate some daily plots for us. 

     call as: antHealth('DD-MON-YEAR','NAME_OF_OUTPUT_DIR');

   This function will be called automatically from the cronjob, so it is
   assumed that daily flag summaries will already exist.

   N.B. NAME_OF_OUTPUT_DIR should be relative to cbass_analysis, 
   so if you want to put in e.g. reduc/20111111_surveys specify
   'reduc/20111111_surveys' - these script will then make a directory called    
   'antenna_health' within that directory

   what it should do: 
     generate daily plots of az/el, rxtemp, coldload, conetemp, weather
     schedules observed (and times)
     sources observed (and frequency)
     generate daily plots of noise diode, tsys, and opacity
     generate plots of noise diode, tsys, opacity for all time listed. 
     daily flag summaries (% flagged)
     daily pointing checks
     generate the daily maps.


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

CROSS-REFERENCE INFORMATION ^

This function calls: This function is called by:

SUBFUNCTIONS ^

SOURCE CODE ^

0001 function antHealth(date,output_dir)
0002 
0003 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
0004 %
0005 %   function antHealth(date)
0006 %
0007 %     function that will generate some daily plots for us.
0008 %
0009 %     call as: antHealth('DD-MON-YEAR','NAME_OF_OUTPUT_DIR');
0010 %
0011 %   This function will be called automatically from the cronjob, so it is
0012 %   assumed that daily flag summaries will already exist.
0013 %
0014 %   N.B. NAME_OF_OUTPUT_DIR should be relative to cbass_analysis,
0015 %   so if you want to put in e.g. reduc/20111111_surveys specify
0016 %   'reduc/20111111_surveys' - these script will then make a directory called
0017 %   'antenna_health' within that directory
0018 %
0019 %   what it should do:
0020 %     generate daily plots of az/el, rxtemp, coldload, conetemp, weather
0021 %     schedules observed (and times)
0022 %     sources observed (and frequency)
0023 %     generate daily plots of noise diode, tsys, and opacity
0024 %     generate plots of noise diode, tsys, opacity for all time listed.
0025 %     daily flag summaries (% flagged)
0026 %     daily pointing checks
0027 %     generate the daily maps.
0028 %
0029 %
0030 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
0031 warning off
0032 
0033   I_filename = [date,'-daily_map_T.png'];
0034   Q_filename = [date,'-daily_map_Q.png'];
0035   U_filename = [date,'-daily_map_U.png'];
0036   hits_filename = [date,'-daily_map_hits.png'];
0037 
0038 start = sprintf('''%s:00:00:00''',date);
0039 stop = sprintf('''%s:23:59:59''',date);
0040 
0041 regs = {'array.frame.received'...
0042     'array.frame.utc double',...
0043     'array.frame.features',...
0044     'array.weather.utc double',...
0045     'array.weather.pressure double',...
0046     'array.weather.airTemperature double',...
0047     'array.weather.windSpeed[0] double',...
0048     'array.weather.windDirection[0] double',...
0049     'array.weather.status double',...
0050     'array.weather.relativeHumidity double',...
0051     'antenna0.receiver.gateVoltage[0-3][0-2] double',...
0052     'antenna0.receiver.drainVoltage[0-3][0-2] double',...
0053     'antenna0.receiver.drainCurrent[0-3][0-2] double',...
0054     'antenna0.thermal.lsTemperatureSensors double',...
0055     'antenna0.thermal.ccTemperatureLoad double',...
0056     'antenna0.thermal.utc double',...
0057     'antenna0.thermal.dlpTemperatureSensors double',...
0058     'antenna0.servo.utc double',...
0059     'antenna0.servo.slow_az_pos double',...
0060     'antenna0.servo.slow_el_pos double'};
0061 %    'antenna0.tracker.source'};
0062 
0063 
0064 % ok. read in today's data.
0065 eval(sprintf('d = read_arc(%s, %s, regs);', start, stop))
0066 d.antenna0.servo.az = d.antenna0.servo.slow_az_pos;
0067 d.antenna0.servo.el = d.antenna0.servo.slow_el_pos;
0068 [d.year, d.month, d.day, hours, minutes, seconds] = ...
0069     mjd2date(d.array.frame.utc);
0070 d.time = hours + minutes/60 + seconds/3600;
0071 
0072 
0073 %make files/directories.
0074 if(nargin==1)
0075   dir = sprintf('%4d%02d%02d',d.year(1),d.month(1),d.day(1));
0076 else
0077   dir = [output_dir,'/antenna_health'];
0078 end
0079 disp(['antHealth:: Will output to ',dir]);
0080 eval(sprintf('system(''rm -fr %s'');',dir));
0081 eval(sprintf('system(''mkdir -p %s'');',dir));
0082 eval(sprintf('system(''mkdir -p %s/intro'');',dir));
0083 eval(sprintf('system(''mkdir -p %s/pointing'');',dir));
0084 eval(sprintf('system(''mkdir -p %s/daily'');',dir));
0085 
0086 % let's remove the 'receiver' field 'cause it'll mess up all the plotting
0087 d.antenna0.bias = d.antenna0.receiver;
0088 d.antenna0 = rmfield(d.antenna0, 'receiver');
0089 
0090 %%%%%%%%%%%%%%%%%
0091 %%Schedules Run%%
0092 %%%%%%%%%%%%%%%%%
0093 
0094 if(nargin==1)
0095   sched = antSchedOrig(dir);
0096 else
0097   sched = antSched(output_dir);
0098 end
0099 
0100 %%%%%%%%%%%%%%%%%%%%%
0101 %%Calibrators Used %%
0102 %%%%%%%%%%%%%%%%%%%%%
0103 try
0104   [dcal, dpt, dblank] = antCals(d);
0105 catch
0106     display('antHealth:: Problem checking calibrators')
0107     dcal=[];
0108     dpt=[];
0109     dblank=0;
0110 end
0111 
0112 %%%%%%%%%%%%%%%
0113 %%Daily Plots%%
0114 %%%%%%%%%%%%%%%
0115 
0116 plotparams.save = 1;
0117 plotparams.plot = 1;
0118 plotparams.interactive = 0;
0119 parm = [];
0120 field = 'daily';
0121 
0122 % make the standard daily plots
0123 packd(d, [], 'daily', 'az_el', plotparams, [], field, [], dir);
0124 packd(d, [], 'daily', 'rx_temp', plotparams, [], field, [], dir);
0125 packd(d, [], 'daily', 'cold_load', plotparams, [], field, [], dir);
0126 packd(d, [], 'daily', 'cone_temp', plotparams, [], field, [], dir);
0127 packd(d, [], 'daily', 'wx', plotparams, [], field, [], dir);
0128 
0129 
0130 % make the plots from the pipeline.
0131 % these include:  tnoise, tsys
0132 
0133 try
0134   plotday(d, 'noise', plotparams, dir);
0135 catch
0136     display('antHealth:: Could not plot tnoise')
0137 end
0138 try
0139   plotday(d, 'tsys', plotparams, dir);
0140 catch
0141     display('antHealth:: Could not plot tsys')
0142 end
0143 
0144 try
0145   plotday(d, 'nonlin', plotparams, dir);
0146 catch
0147     display('antHealth:: Could not plot Nonlin factors');
0148 end
0149 
0150 %%%%%%%%%%%%%%%%
0151 %%Flag Summary%%
0152 %%%%%%%%%%%%%%%%
0153 try
0154   flag = dailyFlag(d, dir);
0155 catch
0156     display('antHealth:: Could not report back flags')
0157     flag.info = [];
0158 end
0159 
0160 %%%%%%%%%%%%%%%%%%
0161 %%Radio Pointing%%
0162 %%%%%%%%%%%%%%%%%%
0163 try
0164   dpt = checkRadPt(dpt, plotparams, dir);
0165 catch
0166     display('antHealth:: Could not report back pointing')
0167     dpt =[];
0168 end
0169 
0170 
0171 %%%%%%%%%%%%%%%%%%%%
0172 %%Make the webpage%%
0173 %%%%%%%%%%%%%%%%%%%%
0174 
0175 try
0176 write2web(date, sched, dir, dcal, dpt, flag, d);
0177 catch
0178     display('antHealth:: Problems writing to the web')
0179 end
0180 
0181 %display('At some point we should link to the daily maps and coverage');
0182 
0183 
0184 return;
0185 
0186 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
0187 function checkNewMonth(data)
0188 
0189 [day rest] = strtok(date, '-');
0190 day = str2num(day);
0191 if(day==1)
0192   display(' antHealth::checkNewMonth:: HAPPY NEW MONTH!!!');
0193   display(['antHealth::checkNewMonth:: You have been unlucky enough to be the observer at the' ...
0194     ' end of a month.']);
0195   display(['antHealth::checkNewMonth:: checkNewMonthAs such, you will also update the monthly plots']);
0196   display('antHealth::checkNewMonth:: We will now read a full month''s worth of data.');
0197   display('antHealth::checkNewMonth:: I hope you have a book with you...or go get some tea.');
0198   display('antHealth::checkNewMonth:: .....this will take a while....');
0199   mon = rest(2:4);
0200   year = str2num(rest(6:9));
0201   [MONTH month Month] = getmonth;
0202   if(isempty(strmatch(mon, MONTH)))
0203     m = strmatch(mon, month);
0204     if(isempty(m))
0205       m = strmatch(mon, Month);
0206       if(isempty(m))
0207     error(['antHealth::checkNewMonth:: could not recognize the month, either capitalize it all,' ...
0208           ' or use all lower case']);
0209       end
0210     end
0211   else
0212     m = strmatch(mon, MONTH);
0213   end
0214   newM= m-1;
0215   if(newM == 0)
0216     newM=12;
0217     year = year-1;
0218   end
0219   %  monthlyPlots()
0220 end
0221                      
0222 return;
0223 
0224 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
0225 
0226 function sched = antSched(output_dir)
0227 
0228 
0229 % Here we want to have the function know which directory to look for the
0230 % data depending on the machine name.
0231 [defaultDataDir defaultCalFile defaultReaderPath defaultLogDir] = whichHost();
0232 
0233 base_dir = regexp(output_dir,'_','split');
0234 base_dir2 = regexp(base_dir{1},'/','split');
0235 
0236 %JL: This does not seem to work (not on elephant anyway)
0237 %logFiles = sprintf('%s/%s*', defaultLogDir, base_dir2{1});
0238 %replaced with the following which does work
0239 
0240 logFiles = sprintf('%s/%s*', defaultLogDir, base_dir2{2});
0241 
0242 command = sprintf('./log/logSearch ''%s''', logFiles);
0243 
0244 
0245 [stat, result] = system(command);
0246 
0247 if(stat==1)
0248   sched = result;
0249 else
0250   sched = 'COULD NOT DETERMINE WHICH SCHEDULES WERE RUN';
0251 end
0252 
0253 return;
0254 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
0255 
0256 function sched = antSchedOrig(dir)
0257 
0258 
0259 % Here we want to have the function know which directory to look for the
0260 % data depending on the machine name.
0261 [defaultDataDir defaultCalFile defaultReaderPath defaultLogDir] = ...
0262     whichHost();
0263 
0264 logFiles = sprintf('%s/%s*', defaultLogDir, dir);
0265 
0266 command = sprintf('./log/logSearch ''%s''', logFiles);
0267 
0268 
0269 [stat, result] = system(command);
0270 
0271 if(stat==1)
0272   sched = result;
0273 else
0274   sched = 'COULD NOT DETERMINE WHICH SCHEDULES WERE RUN';
0275 end
0276 
0277 return;
0278     
0279           
0280 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
0281 
0282 function [dcal dpt dblank] = antCals(d, dir)
0283 
0284 %f1 is also a cal source
0285 %f2 is the cal source
0286 %f3 is also cal source
0287 %f4 is the blank sky data
0288 %f0+f7 are radio pointing scans
0289 
0290 indrapt = bitsearch(d.array.frame.features, 7, 'any');
0291 indcal  = bitsearch(d.array.frame.features, 1, 'any') | bitsearch(d.array.frame.features, 2, 'any') | ...
0292     bitsearch(d.array.frame.features, 3, 'any');
0293 indblank = bitsearch(d.array.frame.features, 4, 'only');
0294 
0295 % first let us find the cal sources.
0296 [startcal stopcal] = findStartStop(indcal);
0297 goodEvents = (stopcal - startcal)>120;
0298 
0299 
0300 if(~isempty(find(indrapt)))
0301   [startpt stoppt] = findStartStop(indrapt);
0302   noPoint = 0;
0303 else 
0304   startpt = [];
0305   stoppt  = [];
0306   noPoint = 1;
0307 end
0308 [startcal stopcal] = findStartStop(indcal);
0309 [startblank stopblank] = findStartStop(indblank);
0310 
0311 % samples that are too long will cause things to crash
0312 f = find( (stoppt - startpt)>10*60);
0313 startpt(f) = []; stoppt(f) = [];
0314 f = find( (stopcal - startcal)>10*60);
0315 startcal(f) = []; stopcal(f) = [];
0316 f = find( (stopblank - startblank)>10*60);
0317 startblank(f) = []; stopblank(f) = [];
0318 
0319 % set return variables to empty
0320 dcal    = [];
0321 dpt     = [];
0322 dblank  = [];
0323 sources = [];
0324 
0325 % check if there are too many.  We only need about 10 radio pointing crosses
0326 % per day max.
0327 %if(length(startpt)>10)
0328 %  startpt(11:length(startpt)) = [];
0329 %  stoppt(11:length(stoppt)) = [];
0330 %end
0331 
0332 
0333 
0334 for m=1:length(startpt)
0335   if(m==1)
0336     dpt = read_arc(mjd2string(d.array.frame.utc(startpt(m))), ...
0337     mjd2string(d.array.frame.utc(stoppt(m))));
0338     dpt = determineIndices(dpt);
0339     dpt.index.radio_point_scan.slow(length(dpt.index.radio_point_scan.slow)) = 0;
0340     dpt.array.frame.features(length(dpt.array.frame.features))=0;
0341   else
0342     thisd = read_arc(mjd2string(d.array.frame.utc(startpt(m))), mjd2string(d.array.frame.utc(stoppt(m))));
0343     thisd = determineIndices(thisd);
0344     dpt = catstruct(1, [dpt thisd]);
0345     dpt.index.radio_point_scan.slow(length(dpt.index.radio_point_scan.slow)) = 0;
0346     dpt.array.frame.features(length(dpt.array.frame.features))=0;
0347   end
0348 end
0349 
0350 sources = [];
0351 for m=1:length(startcal)
0352   if(m==1)
0353     dcal = read_arc(mjd2string(d.array.frame.utc(startcal(m))), ...
0354     mjd2string(d.array.frame.utc(stopcal(m))));
0355     aa = unique(dcal.antenna0.tracker.source);
0356     sources{m} = aa{1};
0357   else
0358     thisd = read_arc(mjd2string(d.array.frame.utc(startcal(m))), mjd2string(d.array.frame.utc(stopcal(m))));
0359     aa = unique(thisd.antenna0.tracker.source);
0360     sources{m} = aa{1};
0361     dcal = catstruct(1, [dcal thisd]);
0362   end
0363 end
0364 
0365 for m=1:length(startblank)
0366   if(m==1)
0367     dblank = read_arc(mjd2string(d.array.frame.utc(startblank(m))), ...
0368     mjd2string(d.array.frame.utc(stopblank(m))));
0369   else
0370     thisd = read_arc(mjd2string(d.array.frame.utc(startblank(m))), mjd2string(d.array.frame.utc(stopblank(m))));
0371     dblank = catstruct(1, [dblank thisd]);
0372   end
0373 end
0374 
0375 % parse the sources
0376 uniqueSource = unique(sources);
0377 for m=1:length(uniqueSource)
0378   numMatch = strmatch(uniqueSource{m}, sources, 'exact');
0379   uniqueObs(m) = length(numMatch);
0380 end
0381 
0382 dcal.uniqueSources = uniqueSource;
0383 dcal.uniqueObs     = uniqueObs;
0384 
0385 return;
0386 
0387 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
0388 
0389 function dpt = checkRadPt(dpt, plotparams, maindir)
0390 
0391 if(isempty(dpt))
0392   dpt.off = [];
0393   dpt.obs = [];
0394   return;
0395 end
0396 dpt = flagMask(dpt);
0397 dpt = flagData(dpt, [0 1 5 6 7 8 10 12], []);
0398 dpt = apparentAzEl(dpt);
0399 
0400 if(mean(dpt.antenna0.receiver.data(:,1)) < 0 & ...
0401       mean(dpt.antenna0.receiver.data(:,6))<0)
0402   dpt.antenna0.receiver.data = abs(dpt.antenna0.receiver.data);
0403 end
0404 
0405 
0406 [obs off ide] = radPointPlots(dpt, plotparams, 'scan', 'daily', maindir, 1);
0407 
0408 % next we save the values.
0409 %if(~isempty(off.az))
0410 %  % form is:  [time, sourceName, sourceaz, sourceel, offaz, offel];
0411 %  for m=1:length(obs.name)
0412 %    srcNum(m) = sourceCorrespondance(obs.name(m));
0413 %  end%
0414 %
0415 %  thisCross = [obs.timeVal' srcNum' obs.az' obs.el' off.az off.el];%
0416 %
0417 %  [home,installeddir]=where_am_i();
0418 %
0419 %  % and now we save it for posterity
0420 %  %system('cvs update constants/pointing_crosses.txt');
0421 %  allCross  = load([home,'/',installeddir,'/constants/daily_pointing_crosses.txt']);
0422 %  allCross  = [allCross; thisCross];
0423 %else
0424 %  display('NO GOOD CROSSES IN YOUR DATA SET');
0425 %  d.correction.pointing = [];
0426 %end
0427 
0428 
0429 
0430 display(sprintf('antHealth::checkRadPt:: Only kept %d good points', length(obs.az)));
0431 
0432 % Check how our model is working
0433 % we only want to fit the collimation and flexure
0434 om(:,1)=dpt.antenna0.tracker.flexure(:,1);
0435 om(:,2)=dpt.antenna0.tracker.flexure(:,2);
0436 om(:,3)=dpt.antenna0.tracker.tilts(:,1);
0437 om(:,4)=dpt.antenna0.tracker.tilts(:,2);
0438 om(:,5)=dpt.antenna0.tracker.tilts(:,3);
0439 om(:,6)=dpt.antenna0.tracker.fixedCollimation(:,1);
0440 om(:,7)=dpt.antenna0.tracker.fixedCollimation(:,2);
0441 om(:,8)=dpt.antenna0.tracker.encoder_off(:,1);
0442 om(:,9)=dpt.antenna0.tracker.encoder_off(:,2);
0443 om = mean(om);
0444 
0445 off.azErr(isnan(off.azErr)) = max(off.azErr);
0446 off.elErr(isnan(off.elErr)) = max(off.elErr);
0447 
0448 om = om(1,:);
0449 
0450 
0451 setPlotDisplay(plotparams.plot);
0452 [rmssao ind sa0] = plot_res(om, ide, obs, 'No Fit', 0);
0453 sa0 = mean(sa0);
0454 
0455 if(plotparams.save)
0456   dbclear if error
0457   set(gcf,'paperposition',[0 0 6.0 9.0])
0458   filename = sprintf('%s/pointing/fit_residual.png', maindir);
0459   eval(sprintf('print -dpng -r70 %s', filename));
0460   dbstop if error
0461 end
0462 
0463 
0464 angoff = spaceangle(obs.az, obs.el, obs.az+off.az', obs.el+off.el');
0465 
0466 dpt.obs = obs;
0467 dpt.off = off;
0468 dpt.ide = ide;
0469 dpt.sa0 = sa0;
0470 dpt.ang = angoff;
0471 
0472 
0473 return;
0474 
0475 
0476 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
0477 
0478 function makeBiasTable(d, fid)
0479 
0480 gateV  = d.antenna0.bias.gateVoltage;
0481 drainV = d.antenna0.bias.drainVoltage;
0482 drainI = d.antenna0.bias.drainCurrent;
0483 badVals = gateV == 0 | drainV == 0 | drainI == 0;
0484 gaveV(badVals)  = nan;
0485 drainV(badVals) = nan;
0486 drainI(badVals) = nan;
0487 bias.gateV.mean  = squeeze(nanmean(gateV));
0488 bias.gateV.rms   = sqrt(squeeze(nanvar(gateV)));
0489 bias.drainV.mean = squeeze(nanmean(drainV));
0490 bias.drainV.rms  = sqrt(squeeze(nanvar(drainV)));
0491 bias.drainI.mean = squeeze(nanmean(drainI));
0492 bias.drainI.rms  = sqrt(squeeze(nanvar(drainI)));
0493 bias.utc         = d.array.frame.utc(1);
0494 
0495 
0496 if(bias.utc < date2mjd(2011, 06, 01))
0497   drainVolt = [ 1.97 4.05 3.95; 1.9 4.01 3.96; 2.01 3.78 4.11; 1.99 4.52 ...
0498     4.03];
0499   drainCurr = [8.47 16.08 16.28; 7.89 15.0 14.96; 8.52 14.42 15.89; 8.52 ...
0500     14.91 14.96];
0501 elseif( bias.utc >= date2mjd(2011, 06, 01) & bias.utc < date2mjd(2011, 10, 01))
0502   drainVolt = [2 4 4; 1.9 4 4 ; 2 4 4 ; 2 4 4];
0503   drainCurr = [8.5 15 15; 7.8 15.0 15.5; 8.5 12 12; 8.5 15 15];
0504 elseif( bias.utc >= date2mjd(2011, 10,01) & bias.utc < date2mjd(2012, 03, 13) )
0505   drainVolt = [2 4 4; 2 4 4 ; 2 4 4 ; 2 4 4];
0506   drainCurr = [8 16 16; 8 16 16; 8 16 16; 8 16 16.1];
0507 elseif( bias.utc >= date2mjd(2012, 03, 13))
0508   drainVolt = [2 4.5 4.5; 2 4 4 ; 2 4 4 ; 2 4 4];
0509   drainCurr = [8.5 13.9 12.9; 8 16 16; 8 16 16; 8 16 16.1];
0510 end
0511 
0512 % ok, next we calculate the differences
0513 delta.drainI = abs(bias.drainI.mean - drainCurr);
0514 delta.drainV = abs(bias.drainV.mean - drainVolt);
0515 delta.drainIBad = delta.drainI > 0.25;  % need to include whether hte RMS is good or bad
0516 delta.drainVBad = delta.drainV > 0.1;   % need to include whether hte RMS is good or bad
0517 delta.gateVBad  = bias.gateV.mean < -0.3;
0518 
0519 
0520 fprintf(fid, '<table width="75%%" border="1"> \n');
0521 fprintf(fid, '  <tr>  <td> </td> <th> Stage 1 </th> <th> Stage 2 </th> <th> Stage 3 </th> </tr>\n');
0522 fprintf(fid, '  <tr> <th> AMP 1 </th>\n');
0523 fprintf(fid, '       <td>\n');
0524 fprintf(fid, '           <table width="75%%" border="1"> <tr> <td> </td> <td> Expected </td> <td> Mean </td> <td> RMS </td> <td> Delta </td> <td> BAD </td> </tr>\n');
0525 if(delta.drainIBad(1,1))
0526   fprintf(fid, '           <tr> <td> Id </td> <td> %3.2f </td> <td> %3.2f </td> <td> %3.2f </td> <td> %3.2f </td> <td bgcolor="#ff0000"> %i </td> </tr>\n', drainCurr(1,1), bias.drainI.mean(1,1), bias.drainI.rms(1,1), delta.drainI(1,1), delta.drainIBad(1,1));
0527 else
0528   fprintf(fid, '           <tr> <td> Id </td> <td> %3.2f </td> <td> %3.2f  </td> <td> %3.2f </td> <td> %3.2f </td> <td> %i </td> </tr>\n', drainCurr(1,1), bias.drainI.mean(1,1), bias.drainI.rms(1,1), delta.drainI(1,1), delta.drainIBad(1,1));
0529 end
0530 if(delta.drainVBad(1,1))
0531   fprintf(fid, '           <tr> <td> Vd </td> <td> %3.2f </td> <td> %3.2f </td> <td> %3.2f </td> <td> %3.2f </td> <td bgcolor="#ff0000"> %i </td> </tr>\n', drainVolt(1,1), bias.drainV.mean(1,1), bias.drainV.rms(1,1), delta.drainV(1,1), delta.drainVBad(1,1));
0532 else
0533   fprintf(fid, '           <tr> <td> Vd </td> <td> %3.2f </td> <td> %3.2f </td> <td> %3.2f </td> <td> %3.2f </td> <td> %i </td> </tr>\n', drainVolt(1,1), bias.drainV.mean(1,1), bias.drainV.rms(1,1), delta.drainV(1,1), delta.drainVBad(1,1));  
0534 end
0535 if(delta.gateVBad(1,1))
0536   fprintf(fid, '           <tr> <td> Vg </td> <td> <0 </td> <td> %3.2f  </td> <td> %3.2f </td> <td> NA </td> <td bgcolor="#ff0000"> %i </td> </tr>\n', bias.gateV.mean(1,1), bias.gateV.rms(1,1), delta.gateVBad(1,1));
0537 else
0538   fprintf(fid, '           <tr> <td> Vg </td> <td> <0 </td> <td> %3.2f </td> <td> %3.2f </td> <td> NA </td> <td> %i </td> </tr>\n', bias.gateV.mean(1,1), bias.gateV.rms(1,1), delta.gateVBad(1,1));
0539 end
0540 fprintf(fid, '           </table>\n');
0541 fprintf(fid, '       </td>\n');
0542 fprintf(fid, '       <td>\n');
0543 fprintf(fid, '           <table width="75%%" border="1"> <tr> <td> </td> <td> Expected </td> <td> Mean </td> <td> RMS </td> <td> Delta </td> <td> BAD </td> </tr>\n');
0544 if(delta.drainIBad(1,2))
0545   fprintf(fid, '           <tr> <td> Id </td> <td> %3.2f </td> <td> %3.2f </td> <td> %3.2f </td> <td> %3.2f </td> <td bgcolor="#ff0000"> %i </td> </tr>\n', drainCurr(1,2), bias.drainI.mean(1,2), bias.drainI.rms(1,2), delta.drainI(1,2), delta.drainIBad(1,2));
0546 else
0547   fprintf(fid, '           <tr> <td> Id </td> <td> %3.2f </td> <td> %3.2f </td> <td> %3.2f </td> <td> %3.2f </td> <td> %i </td> </tr>\n', drainCurr(1,2), bias.drainI.mean(1,2), bias.drainI.rms(1,2), delta.drainI(1,2), delta.drainIBad(1,2));  
0548 end
0549 if(delta.drainVBad(1,2))
0550   fprintf(fid, '           <tr> <td> Vd </td> <td> %3.2f </td> <td> %3.2f </td> <td> %3.2f </td> <td> %3.2f </td> <td bgcolor="#ff0000"> %i </td> </tr>\n', drainVolt(1,2), bias.drainV.mean(1,2), bias.drainV.rms(1,2), delta.drainV(1,2), delta.drainVBad(1,2));
0551 else
0552   fprintf(fid, '           <tr> <td> Vd </td> <td> %3.2f </td> <td> %3.2f </td> <td> %3.2f </td> <td> %3.2f </td> <td> %i </td> </tr>\n', drainVolt(1,2), bias.drainV.mean(1,2), bias.drainV.rms(1,2), delta.drainV(1,2), delta.drainVBad(1,2));
0553 end
0554 if(delta.gateVBad(1,2))
0555   fprintf(fid, '           <tr> <td> Vg </td> <td> <0 </td> <td> %3.2f </td> <td> %3.2f </td> <td> NA </td> <td bgcolor="#ff0000"> %i </td> </tr>\n', bias.gateV.mean(1,2), bias.gateV.rms(1,2), delta.gateVBad(1,2));
0556 else
0557   fprintf(fid, '           <tr> <td> Vg </td> <td> <0 </td> <td> %3.2f </td> <td> %3.2f </td> <td> NA </td> <td> %i </td> </tr>\n', bias.gateV.mean(1,2), bias.gateV.rms(1,2), delta.gateVBad(1,2));
0558 end
0559 fprintf(fid, '           </table>\n');
0560 fprintf(fid, '       </td>\n');
0561 fprintf(fid, '       <td>\n');
0562 fprintf(fid, '           <table width="75%%" border="1"> <tr> <td> </td> <td> Expected </td> <td> Mean </td> <td> RMS </td> <td> Delta </td> <td> BAD </td> </tr>\n');
0563 if(delta.drainIBad(1,3))
0564   fprintf(fid, '           <tr> <td> Id </td> <td> %3.2f </td> <td> %3.2f </td> <td> %3.2f </td> <td> %3.2f </td> <td bgcolor="#ff0000"> %i </td> </tr>\n', drainCurr(1,3), bias.drainI.mean(1,3), bias.drainI.rms(1,3), delta.drainI(1,3), delta.drainIBad(1,3));
0565 else
0566   fprintf(fid, '           <tr> <td> Id </td> <td> %3.2f </td> <td> %3.2f </td> <td> %3.2f </td> <td> %3.2f </td> <td> %i </td> </tr>\n', drainCurr(1,3), bias.drainI.mean(1,3), bias.drainI.rms(1,3), delta.drainI(1,3), delta.drainIBad(1,3));  
0567 end
0568 if(delta.drainVBad(1,3))
0569   fprintf(fid, '           <tr> <td> Vd </td> <td> %3.2f </td> <td> %3.2f </td> <td> %3.2f </td> <td> %3.2f </td> <td bgcolor="#ff0000"> %i </td> </tr>\n', drainVolt(1,3), bias.drainV.mean(1,3), bias.drainV.rms(1,3), delta.drainV(1,3), delta.drainVBad(1,3));
0570 else
0571   fprintf(fid, '           <tr> <td> Vd </td> <td> %3.2f </td> <td> %3.2f </td> <td> %3.2f </td> <td> %3.2f </td> <td> %i </td> </tr>\n', drainVolt(1,3), bias.drainV.mean(1,3), bias.drainV.rms(1,3), delta.drainV(1,3), delta.drainVBad(1,3));
0572 end
0573 if(delta.gateVBad(1,3))
0574   fprintf(fid, '           <tr> <td> Vg </td> <td> <0 </td> <td> %3.2f </td> <td> %3.2f </td> <td> NA </td> <td bgcolor="#ff0000"> %i </td> </tr>\n', bias.gateV.mean(1,3), bias.gateV.rms(1,3), delta.gateVBad(1,3));
0575 else
0576   fprintf(fid, '           <tr> <td> Vg </td> <td> <0 </td> <td> %3.2f </td> <td> %3.2f </td> <td> NA </td> <td> %i </td> </tr>\n', bias.gateV.mean(1,3), bias.gateV.rms(1,3), delta.gateVBad(1,3));
0577 end
0578 fprintf(fid, '           </table>\n');
0579 fprintf(fid, '       </td>\n');
0580 
0581 fprintf(fid, '  <tr> <th> AMP 2 </th>\n');
0582 fprintf(fid, '       <td>\n');
0583 fprintf(fid, '           <table width="75%%" border="1"> <tr> <td> </td> <td> Expected </td> <td> Mean </td> <td> RMS </td> <td> Delta </td> <td> BAD </td> </tr>\n');
0584 if(delta.drainIBad(2,1))
0585   fprintf(fid, '           <tr> <td> Id </td> <td> %3.2f </td> <td> %3.2f </td> <td> %3.2f </td> <td> %3.2f </td> <td bgcolor="#ff0000"> %i </td> </tr>\n', drainCurr(2,1), bias.drainI.mean(2,1), bias.drainI.rms(2,1), delta.drainI(2,1), delta.drainIBad(2,1));
0586 else
0587   fprintf(fid, '           <tr> <td> Id </td> <td> %3.2f </td> <td> %3.2f  </td> <td> %3.2f </td> <td> %3.2f </td> <td> %i </td> </tr>\n', drainCurr(2,1), bias.drainI.mean(2,1), bias.drainI.rms(2,1), delta.drainI(2,1), delta.drainIBad(2,1));
0588 end
0589 if(delta.drainVBad(2,1))
0590   fprintf(fid, '           <tr> <td> Vd </td> <td> %3.2f </td> <td> %3.2f </td> <td> %3.2f </td> <td> %3.2f </td> <td bgcolor="#ff0000"> %i </td> </tr>\n', drainVolt(2,1), bias.drainV.mean(2,1), bias.drainV.rms(2,1), delta.drainV(2,1), delta.drainVBad(2,1));
0591 else
0592   fprintf(fid, '           <tr> <td> Vd </td> <td> %3.2f </td> <td> %3.2f </td> <td> %3.2f </td> <td> %3.2f </td> <td> %i </td> </tr>\n', drainVolt(2,1), bias.drainV.mean(2,1), bias.drainV.rms(2,1), delta.drainV(2,1), delta.drainVBad(2,1));  
0593 end
0594 if(delta.gateVBad(2,1))
0595   fprintf(fid, '           <tr> <td> Vg </td> <td> <0 </td> <td> %3.2f  </td> <td> %3.2f </td> <td> NA </td> <td bgcolor="#ff0000"> %i </td> </tr>\n', bias.gateV.mean(2,1), bias.gateV.rms(2,1), delta.gateVBad(2,1));
0596 else
0597   fprintf(fid, '           <tr> <td> Vg </td> <td> <0 </td> <td> %3.2f </td> <td> %3.2f </td> <td> NA </td> <td> %i </td> </tr>\n', bias.gateV.mean(2,1), bias.gateV.rms(2,1), delta.gateVBad(2,1));
0598 end
0599 fprintf(fid, '           </table>\n');
0600 fprintf(fid, '       </td>\n');
0601 fprintf(fid, '       <td>\n');
0602 fprintf(fid, '           <table width="75%%" border="1"> <tr> <td> </td> <td> Expected </td> <td> Mean </td> <td> RMS </td> <td> Delta </td> <td> BAD </td> </tr>\n');
0603 if(delta.drainIBad(2,2))
0604   fprintf(fid, '           <tr> <td> Id </td> <td> %3.2f </td> <td> %3.2f </td> <td> %3.2f </td> <td> %3.2f </td> <td bgcolor="#ff0000"> %i </td> </tr>\n', drainCurr(2,2), bias.drainI.mean(2,2), bias.drainI.rms(2,2), delta.drainI(2,2), delta.drainIBad(2,2));
0605 else
0606   fprintf(fid, '           <tr> <td> Id </td> <td> %3.2f </td> <td> %3.2f </td> <td> %3.2f </td> <td> %3.2f </td> <td> %i </td> </tr>\n', drainCurr(2,2), bias.drainI.mean(2,2), bias.drainI.rms(2,2), delta.drainI(2,2), delta.drainIBad(2,2));  
0607 end
0608 if(delta.drainVBad(2,2))
0609   fprintf(fid, '           <tr> <td> Vd </td> <td> %3.2f </td> <td> %3.2f </td> <td> %3.2f </td> <td> %3.2f </td> <td bgcolor="#ff0000"> %i </td> </tr>\n', drainVolt(2,2), bias.drainV.mean(2,2), bias.drainV.rms(2,2), delta.drainV(2,2), delta.drainVBad(2,2));
0610 else
0611   fprintf(fid, '           <tr> <td> Vd </td> <td> %3.2f </td> <td> %3.2f </td> <td> %3.2f </td> <td> %3.2f </td> <td> %i </td> </tr>\n', drainVolt(2,2), bias.drainV.mean(2,2), bias.drainV.rms(2,2), delta.drainV(2,2), delta.drainVBad(2,2));
0612 end
0613 if(delta.gateVBad(2,2))
0614   fprintf(fid, '           <tr> <td> Vg </td> <td> <0 </td> <td> %3.2f </td> <td> %3.2f </td> <td> NA </td> <td bgcolor="#ff0000"> %i </td> </tr>\n', bias.gateV.mean(2,2), bias.gateV.rms(2,2), delta.gateVBad(2,2));
0615 else
0616   fprintf(fid, '           <tr> <td> Vg </td> <td> <0 </td> <td> %3.2f </td> <td> %3.2f </td> <td> NA </td> <td> %i </td> </tr>\n', bias.gateV.mean(2,2), bias.gateV.rms(2,2), delta.gateVBad(2,2));
0617 end
0618 fprintf(fid, '           </table>\n');
0619 fprintf(fid, '       </td>\n');
0620 fprintf(fid, '       <td>\n');
0621 fprintf(fid, '           <table width="75%%" border="1"> <tr> <td> </td> <td> Expected </td> <td> Mean </td> <td> RMS </td> <td> Delta </td> <td> BAD </td> </tr>\n');
0622 if(delta.drainIBad(2,3))
0623   fprintf(fid, '           <tr> <td> Id </td> <td> %3.2f </td> <td> %3.2f </td> <td> %3.2f </td> <td> %3.2f </td> <td bgcolor="#ff0000"> %i </td> </tr>\n', drainCurr(2,3), bias.drainI.mean(2,3), bias.drainI.rms(2,3), delta.drainI(2,3), delta.drainIBad(2,3));
0624 else
0625   fprintf(fid, '           <tr> <td> Id </td> <td> %3.2f </td> <td> %3.2f </td> <td> %3.2f </td> <td> %3.2f </td> <td> %i </td> </tr>\n', drainCurr(2,3), bias.drainI.mean(2,3), bias.drainI.rms(2,3), delta.drainI(2,3), delta.drainIBad(2,3));  
0626 end
0627 if(delta.drainVBad(2,3))
0628   fprintf(fid, '           <tr> <td> Vd </td> <td> %3.2f </td> <td> %3.2f </td> <td> %3.2f </td> <td> %3.2f </td> <td bgcolor="#ff0000"> %i </td> </tr>\n', drainVolt(2,3), bias.drainV.mean(2,3), bias.drainV.rms(2,3), delta.drainV(2,3), delta.drainVBad(2,3));
0629 else
0630   fprintf(fid, '           <tr> <td> Vd </td> <td> %3.2f </td> <td> %3.2f </td> <td> %3.2f </td> <td> %3.2f </td> <td> %i </td> </tr>\n', drainVolt(2,3), bias.drainV.mean(2,3), bias.drainV.rms(2,3), delta.drainV(2,3), delta.drainVBad(2,3));
0631 end
0632 if(delta.gateVBad(2,3))
0633   fprintf(fid, '           <tr> <td> Vg </td> <td> <0 </td> <td> %3.2f </td> <td> %3.2f </td> <td> NA </td> <td bgcolor="#ff0000"> %i </td> </tr>\n', bias.gateV.mean(2,3), bias.gateV.rms(2,3), delta.gateVBad(2,3));
0634 else
0635   fprintf(fid, '           <tr> <td> Vg </td> <td> <0 </td> <td> %3.2f </td> <td> %3.2f </td> <td> NA </td> <td> %i </td> </tr>\n', bias.gateV.mean(2,3), bias.gateV.rms(2,3), delta.gateVBad(2,3));
0636 end
0637 fprintf(fid, '           </table>\n');
0638 fprintf(fid, '       </td>\n');
0639 
0640 
0641 fprintf(fid, '  <tr> <th> AMP 3 </th>\n');
0642 fprintf(fid, '       <td>\n');
0643 fprintf(fid, '           <table width="75%%" border="1"> <tr> <td> </td> <td> Expected </td> <td> Mean </td> <td> RMS </td> <td> Delta </td> <td> BAD </td> </tr>\n');
0644 if(delta.drainIBad(3,1))
0645   fprintf(fid, '           <tr> <td> Id </td> <td> %3.2f </td> <td> %3.2f </td> <td> %3.2f </td> <td> %3.2f </td> <td bgcolor="#ff0000"> %i </td> </tr>\n', drainCurr(3,1), bias.drainI.mean(3,1), bias.drainI.rms(3,1), delta.drainI(3,1), delta.drainIBad(3,1));
0646 else
0647   fprintf(fid, '           <tr> <td> Id </td> <td> %3.2f </td> <td> %3.2f  </td> <td> %3.2f </td> <td> %3.2f </td> <td> %i </td> </tr>\n', drainCurr(3,1), bias.drainI.mean(3,1), bias.drainI.rms(3,1), delta.drainI(3,1), delta.drainIBad(3,1));
0648 end
0649 if(delta.drainVBad(3,1))
0650   fprintf(fid, '           <tr> <td> Vd </td> <td> %3.2f </td> <td> %3.2f </td> <td> %3.2f </td> <td> %3.2f </td> <td bgcolor="#ff0000"> %i </td> </tr>\n', drainVolt(3,1), bias.drainV.mean(3,1), bias.drainV.rms(3,1), delta.drainV(3,1), delta.drainVBad(3,1));
0651 else
0652   fprintf(fid, '           <tr> <td> Vd </td> <td> %3.2f </td> <td> %3.2f </td> <td> %3.2f </td> <td> %3.2f </td> <td> %i </td> </tr>\n', drainVolt(3,1), bias.drainV.mean(3,1), bias.drainV.rms(3,1), delta.drainV(3,1), delta.drainVBad(3,1));  
0653 end
0654 if(delta.gateVBad(3,1))
0655   fprintf(fid, '           <tr> <td> Vg </td> <td> <0 </td> <td> %3.2f  </td> <td> %3.2f </td> <td> NA </td> <td bgcolor="#ff0000"> %i </td> </tr>\n', bias.gateV.mean(3,1), bias.gateV.rms(3,1), delta.gateVBad(3,1));
0656 else
0657   fprintf(fid, '           <tr> <td> Vg </td> <td> <0 </td> <td> %3.2f </td> <td> %3.2f </td> <td> NA </td> <td> %i </td> </tr>\n', bias.gateV.mean(3,1), bias.gateV.rms(3,1), delta.gateVBad(3,1));
0658 end
0659 fprintf(fid, '           </table>\n');
0660 fprintf(fid, '       </td>\n');
0661 fprintf(fid, '       <td>\n');
0662 fprintf(fid, '           <table width="75%%" border="1"> <tr> <td> </td> <td> Expected </td> <td> Mean </td> <td> RMS </td> <td> Delta </td> <td> BAD </td> </tr>\n');
0663 if(delta.drainIBad(3,2))
0664   fprintf(fid, '           <tr> <td> Id </td> <td> %3.2f </td> <td> %3.2f </td> <td> %3.2f </td> <td> %3.2f </td> <td bgcolor="#ff0000"> %i </td> </tr>\n', drainCurr(3,2), bias.drainI.mean(3,2), bias.drainI.rms(3,2), delta.drainI(3,2), delta.drainIBad(3,2));
0665 else
0666   fprintf(fid, '           <tr> <td> Id </td> <td> %3.2f </td> <td> %3.2f </td> <td> %3.2f </td> <td> %3.2f </td> <td> %i </td> </tr>\n', drainCurr(3,2), bias.drainI.mean(3,2), bias.drainI.rms(3,2), delta.drainI(3,2), delta.drainIBad(3,2));  
0667 end
0668 if(delta.drainVBad(3,2))
0669   fprintf(fid, '           <tr> <td> Vd </td> <td> %3.2f </td> <td> %3.2f </td> <td> %3.2f </td> <td> %3.2f </td> <td bgcolor="#ff0000"> %i </td> </tr>\n', drainVolt(3,2), bias.drainV.mean(3,2), bias.drainV.rms(3,2), delta.drainV(3,2), delta.drainVBad(3,2));
0670 else
0671   fprintf(fid, '           <tr> <td> Vd </td> <td> %3.2f </td> <td> %3.2f </td> <td> %3.2f </td> <td> %3.2f </td> <td> %i </td> </tr>\n', drainVolt(3,2), bias.drainV.mean(3,2), bias.drainV.rms(3,2), delta.drainV(3,2), delta.drainVBad(3,2));
0672 end
0673 if(delta.gateVBad(3,2))
0674   fprintf(fid, '           <tr> <td> Vg </td> <td> <0 </td> <td> %3.2f </td> <td> %3.2f </td> <td> NA </td> <td bgcolor="#ff0000"> %i </td> </tr>\n', bias.gateV.mean(3,2), bias.gateV.rms(3,2), delta.gateVBad(3,2));
0675 else
0676   fprintf(fid, '           <tr> <td> Vg </td> <td> <0 </td> <td> %3.2f </td> <td> %3.2f </td> <td> NA </td> <td> %i </td> </tr>\n', bias.gateV.mean(3,2), bias.gateV.rms(3,2), delta.gateVBad(3,2));
0677 end
0678 fprintf(fid, '           </table>\n');
0679 fprintf(fid, '       </td>\n');
0680 fprintf(fid, '       <td>\n');
0681 fprintf(fid, '           <table width="75%%" border="1"> <tr> <td> </td> <td> Expected </td> <td> Mean </td> <td> RMS </td> <td> Delta </td> <td> BAD </td> </tr>\n');
0682 if(delta.drainIBad(3,3))
0683   fprintf(fid, '           <tr> <td> Id </td> <td> %3.2f </td> <td> %3.2f </td> <td> %3.2f </td> <td> %3.2f </td> <td bgcolor="#ff0000"> %i </td> </tr>\n', drainCurr(3,3), bias.drainI.mean(3,3), bias.drainI.rms(3,3), delta.drainI(3,3), delta.drainIBad(3,3));
0684 else
0685   fprintf(fid, '           <tr> <td> Id </td> <td> %3.2f </td> <td> %3.2f </td> <td> %3.2f </td> <td> %3.2f </td> <td> %i </td> </tr>\n', drainCurr(3,3), bias.drainI.mean(3,3), bias.drainI.rms(3,3), delta.drainI(3,3), delta.drainIBad(3,3));  
0686 end
0687 if(delta.drainVBad(3,3))
0688   fprintf(fid, '           <tr> <td> Vd </td> <td> %3.2f </td> <td> %3.2f </td> <td> %3.2f </td> <td> %3.2f </td> <td bgcolor="#ff0000"> %i </td> </tr>\n', drainVolt(3,3), bias.drainV.mean(3,3), bias.drainV.rms(3,3), delta.drainV(3,3), delta.drainVBad(3,3));
0689 else
0690   fprintf(fid, '           <tr> <td> Vd </td> <td> %3.2f </td> <td> %3.2f </td> <td> %3.2f </td> <td> %3.2f </td> <td> %i </td> </tr>\n', drainVolt(3,3), bias.drainV.mean(3,3), bias.drainV.rms(3,3), delta.drainV(3,3), delta.drainVBad(3,3));
0691 end
0692 if(delta.gateVBad(3,3))
0693   fprintf(fid, '           <tr> <td> Vg </td> <td> <0 </td> <td> %3.2f </td> <td> %3.2f </td> <td> NA </td> <td bgcolor="#ff0000"> %i </td> </tr>\n', bias.gateV.mean(3,3), bias.gateV.rms(3,3), delta.gateVBad(3,3));
0694 else
0695   fprintf(fid, '           <tr> <td> Vg </td> <td> <0 </td> <td> %3.2f </td> <td> %3.2f </td> <td> NA </td> <td> %i </td> </tr>\n', bias.gateV.mean(3,3), bias.gateV.rms(3,3), delta.gateVBad(3,3));
0696 end
0697 fprintf(fid, '           </table>\n');
0698 fprintf(fid, '       </td>\n');
0699 
0700 fprintf(fid, '  <tr> <th> AMP 4 </th>\n');
0701 fprintf(fid, '       <td>\n');
0702 fprintf(fid, '           <table width="75%%" border="1"> <tr> <td> </td> <td> Expected </td> <td> Mean </td> <td> RMS </td> <td> Delta </td> <td> BAD </td> </tr>\n');
0703 if(delta.drainIBad(4,1))
0704   fprintf(fid, '           <tr> <td> Id </td> <td> %3.2f </td> <td> %3.2f </td> <td> %3.2f </td> <td> %3.2f </td> <td bgcolor="#ff0000"> %i </td> </tr>\n', drainCurr(4,1), bias.drainI.mean(4,1), bias.drainI.rms(4,1), delta.drainI(4,1), delta.drainIBad(4,1));
0705 else
0706   fprintf(fid, '           <tr> <td> Id </td> <td> %3.2f </td> <td> %3.2f  </td> <td> %3.2f </td> <td> %3.2f </td> <td> %i </td> </tr>\n', drainCurr(4,1), bias.drainI.mean(4,1), bias.drainI.rms(4,1), delta.drainI(4,1), delta.drainIBad(4,1));
0707 end
0708 if(delta.drainVBad(4,1))
0709   fprintf(fid, '           <tr> <td> Vd </td> <td> %3.2f </td> <td> %3.2f </td> <td> %3.2f </td> <td> %3.2f </td> <td bgcolor="#ff0000"> %i </td> </tr>\n', drainVolt(4,1), bias.drainV.mean(4,1), bias.drainV.rms(4,1), delta.drainV(4,1), delta.drainVBad(4,1));
0710 else
0711   fprintf(fid, '           <tr> <td> Vd </td> <td> %3.2f </td> <td> %3.2f </td> <td> %3.2f </td> <td> %3.2f </td> <td> %i </td> </tr>\n', drainVolt(4,1), bias.drainV.mean(4,1), bias.drainV.rms(4,1), delta.drainV(4,1), delta.drainVBad(4,1));  
0712 end
0713 if(delta.gateVBad(4,1))
0714   fprintf(fid, '           <tr> <td> Vg </td> <td> <0 </td> <td> %3.2f  </td> <td> %3.2f </td> <td> NA </td> <td bgcolor="#ff0000"> %i </td> </tr>\n', bias.gateV.mean(4,1), bias.gateV.rms(4,1), delta.gateVBad(4,1));
0715 else
0716   fprintf(fid, '           <tr> <td> Vg </td> <td> <0 </td> <td> %3.2f </td> <td> %3.2f </td> <td> NA </td> <td> %i </td> </tr>\n', bias.gateV.mean(4,1), bias.gateV.rms(4,1), delta.gateVBad(4,1));
0717 end
0718 fprintf(fid, '           </table>\n');
0719 fprintf(fid, '       </td>\n');
0720 fprintf(fid, '       <td>\n');
0721 fprintf(fid, '           <table width="75%%" border="1"> <tr> <td> </td> <td> Expected </td> <td> Mean </td> <td> RMS </td> <td> Delta </td> <td> BAD </td> </tr>\n');
0722 if(delta.drainIBad(4,2))
0723   fprintf(fid, '           <tr> <td> Id </td> <td> %3.2f </td> <td> %3.2f </td> <td> %3.2f </td> <td> %3.2f </td> <td bgcolor="#ff0000"> %i </td> </tr>\n', drainCurr(4,2), bias.drainI.mean(4,2), bias.drainI.rms(4,2), delta.drainI(4,2), delta.drainIBad(4,2));
0724 else
0725   fprintf(fid, '           <tr> <td> Id </td> <td> %3.2f </td> <td> %3.2f </td> <td> %3.2f </td> <td> %3.2f </td> <td> %i </td> </tr>\n', drainCurr(4,2), bias.drainI.mean(4,2), bias.drainI.rms(4,2), delta.drainI(4,2), delta.drainIBad(4,2));  
0726 end
0727 if(delta.drainVBad(4,2))
0728   fprintf(fid, '           <tr> <td> Vd </td> <td> %3.2f </td> <td> %3.2f </td> <td> %3.2f </td> <td> %3.2f </td> <td bgcolor="#ff0000"> %i </td> </tr>\n', drainVolt(4,2), bias.drainV.mean(4,2), bias.drainV.rms(4,2), delta.drainV(4,2), delta.drainVBad(4,2));
0729 else
0730   fprintf(fid, '           <tr> <td> Vd </td> <td> %3.2f </td> <td> %3.2f </td> <td> %3.2f </td> <td> %3.2f </td> <td> %i </td> </tr>\n', drainVolt(4,2), bias.drainV.mean(4,2), bias.drainV.rms(4,2), delta.drainV(4,2), delta.drainVBad(4,2));
0731 end
0732 if(delta.gateVBad(4,2))
0733   fprintf(fid, '           <tr> <td> Vg </td> <td> <0 </td> <td> %3.2f </td> <td> %3.2f </td> <td> NA </td> <td bgcolor="#ff0000"> %i </td> </tr>\n', bias.gateV.mean(4,2), bias.gateV.rms(4,2), delta.gateVBad(4,2));
0734 else
0735   fprintf(fid, '           <tr> <td> Vg </td> <td> <0 </td> <td> %3.2f </td> <td> %3.2f </td> <td> NA </td> <td> %i </td> </tr>\n', bias.gateV.mean(4,2), bias.gateV.rms(4,2), delta.gateVBad(4,2));
0736 end
0737 fprintf(fid, '           </table>\n');
0738 fprintf(fid, '       </td>\n');
0739 fprintf(fid, '       <td>\n');
0740 fprintf(fid, '           <table width="75%%" border="1"> <tr> <td> </td> <td> Expected </td> <td> Mean </td> <td> RMS </td> <td> Delta </td> <td> BAD </td> </tr>\n');
0741 if(delta.drainIBad(4,3))
0742   fprintf(fid, '           <tr> <td> Id </td> <td> %3.2f </td> <td> %3.2f </td> <td> %3.2f </td> <td> %3.2f </td> <td bgcolor="#ff0000"> %i </td> </tr>\n', drainCurr(4,3), bias.drainI.mean(4,3), bias.drainI.rms(4,3), delta.drainI(4,3), delta.drainIBad(4,3));
0743 else
0744   fprintf(fid, '           <tr> <td> Id </td> <td> %3.2f </td> <td> %3.2f </td> <td> %3.2f </td> <td> %3.2f </td> <td> %i </td> </tr>\n', drainCurr(4,3), bias.drainI.mean(4,3), bias.drainI.rms(4,3), delta.drainI(4,3), delta.drainIBad(4,3));  
0745 end
0746 if(delta.drainVBad(4,3))
0747   fprintf(fid, '           <tr> <td> Vd </td> <td> %3.2f </td> <td> %3.2f </td> <td> %3.2f </td> <td> %3.2f </td> <td bgcolor="#ff0000"> %i </td> </tr>\n', drainVolt(4,3), bias.drainV.mean(4,3), bias.drainV.rms(4,3), delta.drainV(4,3), delta.drainVBad(4,3));
0748 else
0749   fprintf(fid, '           <tr> <td> Vd </td> <td> %3.2f </td> <td> %3.2f </td> <td> %3.2f </td> <td> %3.2f </td> <td> %i </td> </tr>\n', drainVolt(4,3), bias.drainV.mean(4,3), bias.drainV.rms(4,3), delta.drainV(4,3), delta.drainVBad(4,3));
0750 end
0751 if(delta.gateVBad(4,3))
0752   fprintf(fid, '           <tr> <td> Vg </td> <td> <0 </td> <td> %3.2f </td> <td> %3.2f </td> <td> NA </td> <td bgcolor="#ff0000"> %i </td> </tr>\n', bias.gateV.mean(4,3), bias.gateV.rms(4,3), delta.gateVBad(4,3));
0753 else
0754   fprintf(fid, '           <tr> <td> Vg </td> <td> <0 </td> <td> %3.2f </td> <td> %3.2f </td> <td> NA </td> <td> %i </td> </tr>\n', bias.gateV.mean(4,3), bias.gateV.rms(4,3), delta.gateVBad(4,3));
0755 end
0756 fprintf(fid, '           </table>\n');
0757 fprintf(fid, '       </td>\n');
0758 fprintf(fid, '  </tr>\n');
0759 fprintf(fid, '</table>\n');
0760 
0761 return;
0762 
0763 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
0764 
0765 function plotday(d, type, plotparams, maindir)
0766 
0767 % common to all plots
0768 mon = getmonth;
0769 start = mjd2date_v2(d.array.frame.utc(1));
0770 start.month = mon{start.month};
0771 txt{1}={'Intensity Channel'};
0772 txt{2}={'time [hr]'};
0773 % antenna display
0774 p.style='flag';
0775 p.featflag=0;
0776 p.swap = 0;
0777 
0778 
0779 
0780 switch type
0781   case 'noise'
0782     % load in the values
0783     [time, tnoise] = getNoiseTemps(d.array.frame.utc(1), ...
0784     last(d.array.frame.utc), 'constants/noise_diode_values.txt', 0);
0785     
0786     if(size(tnoise,2)>2)
0787       flag   = tnoise(:,7:8);
0788       tnoise = tnoise(:,3:4);
0789     else
0790       flag = isnan(tnoise);
0791     end
0792     
0793     % initialize plot axis names
0794     txt{3}={'Noise Diode Temperature '};
0795     str = 'Noise Diode Temperature Plots';
0796     str=sprintf('%s\n%02u-%s-%u:%02u:%02u:%4.2f', str, ...
0797     start.day, start.month,  start.year, start.hour, ...
0798     start.minute, start.second);
0799     txt{4}={str};
0800 
0801     time1 = (time - d.array.frame.utc(1))*24; 
0802     x{1,1} = time1;
0803     x{2,1} = tnoise;
0804     fflag{1,1} = logical(flag);
0805     fflag{2,1} = zeros(size(tnoise));
0806 
0807   if(~isempty(tnoise))
0808       if(plotparams.save)
0809         genfig(d, fflag, x, txt, [], 'daily', p, 'daily',1, maindir);
0810         eval(sprintf('system(''mv %s/daily/fig1.png %s/daily/noise_diode.png'');', maindir, maindir));
0811       else
0812         genfig(d, fflag, x, txt, [], 'daily', p, 'daily',0, maindir);
0813       end
0814   end
0815 
0816     
0817 
0818   case 'tsys'
0819     %load in the values
0820     tsysVals = getTsys(d.array.frame.utc(1), ...
0821     last(d.array.frame.utc), 'constants/tsys_values.txt', 0);    
0822 %    calVals  = getCalTemps(d.array.frame.utc(1), ...
0823 %    last(d.array.frame.utc), 'constants/calibration_values.txt', 0);
0824     % values from the alpha database (requires the noise diode temperature)
0825 %    [times,alpha,gain,r,TsysTND,temps,horz,equa] = readAlphaDatabase_DD();
0826 %    thisInd = times>d.array.frame.utc(1) & times<d.array.frame.utc(end);
0827 %    tnoise = nanmean(calVals.tnoise);
0828 %    tsysVals.val2 = TsysTND(thisInd,:);
0829 %    tsysVals.time2 = times(thisInd);
0830 %    tsysVals.tnoise = repmat(tnoise, [length(tsysVals.time2) 1]);
0831 %    tsysVals.val2 = tsysVals.val2.*tsysVals.tnoise;
0832 
0833     % get data ready for plotting.
0834     str = 'System Temperature Plots';
0835     txt{3}={'System Temperature '};
0836     str=sprintf('%s\n%02u-%s-%u:%02u:%02u:%4.2f', str, start.day, ...
0837     start.month,  start.year, start.hour, start.minute, ...
0838     start.second);
0839     txt{4}={str};
0840 
0841     time1 = (tsysVals.time - d.array.frame.utc(1))*24;
0842     if(isempty(time1))
0843       time1 = tsysVals.time2(1);
0844       tsysVals.val = [nan nan];
0845     end
0846 
0847     x{1,1} = time1;
0848     x{2,1} = tsysVals.val;
0849     fflag{1,1} = tsysVals.flag;
0850     fflag{2,1} = zeros(size(tsysVals.flag));
0851 %    time2 = (tsysVals.time2 - d.array.frame.utc(1))*24;
0852 %    x{3,1} = time2;
0853 %    x{4,1} = tsysVals.val2;
0854 
0855     if(plotparams.save)
0856       genfig(d, fflag, x, txt, [], 'daily', p, 'daily',1, maindir);
0857       eval(sprintf('system(''mv %s/daily/fig1.png %s/daily/system_temperature.png'');', maindir, maindir));
0858     else
0859       genfig(d, fflag, x, txt, [], 'daily', p, 'daily',0, maindir);
0860     end
0861                   
0862   case 'gain'
0863     % read in, sort it.
0864     gainVals = load('constants/gain_values.txt');
0865     aDate  = gainVals(:,1);
0866     [aDateChron, sortOrder] = sort(aDate);
0867     aChron     = gainVals(sortOrder,:);
0868     reps   = find(diff(aDateChron)==0);
0869     aDateChron(reps,:) = [];
0870     aChron(reps,:) = [];
0871     ind = aChron(:,1) >= d.array.frame.utc(1) & aChron(:,1) <= ...
0872     last(d.array.frame.utc);
0873     time1 = (aChron(ind,1) - d.array.frame.utc(1))*24;
0874     gainDb = aChron(ind,2:3);
0875     
0876     % initialize plot axis names
0877     str = 'Gain Plots';
0878     txt{3}={'System Gain [dB]'};
0879     str=sprintf('%s\n%02u-%s-%u:%02u:%02u:%4.2f', str, ...
0880     start.day, start.month,  start.year, start.hour, ...
0881     start.minute, start.second);
0882     txt{4}={str};
0883 
0884     x{1,1} = time1;
0885     x{2,1} = gainDb;
0886     fflag{1,1} = isnan(gainDb);
0887     fflag{2,1} = zeros(size(gainDb));
0888 
0889     if(plotparams.save)
0890       genfig(d, fflag, x, txt, [], 'daily', p, 'daily',1, maindir);
0891       eval(sprintf('system(''mv %s/daily/fig1.png %s/daily/receiver_gain.png'');', maindir, maindir));
0892     else
0893       genfig(d, fflag, x, txt, [], 'daily', p, 'daily',0, maindir);
0894     end
0895     
0896   case 'nonlin'
0897     % read in, sort it.
0898     nonlinVals = load('constants/nonlin_values.txt');
0899     aDate  = nonlinVals(:,1);
0900     [aDateChron, sortOrder] = sort(aDate);
0901     aChron     = nonlinVals(sortOrder,:);
0902     reps   = find(diff(aDateChron)==0);
0903     aDateChron(reps,:) = [];
0904     aChron(reps,:) = [];
0905     ind = aChron(:,1) >= d.array.frame.utc(1) & aChron(:,1) <= ...
0906     last(d.array.frame.utc);
0907     time1 = (aChron(ind,1) - d.array.frame.utc(1))*24;
0908     source = aChron(ind,2);
0909     nonlinRatios = aChron(ind,3:4);
0910     
0911     
0912     % let's turn the sources into real source names
0913     % initialize plot axis names
0914     str = 'Non-linearity Plots';
0915     txt{3}={'Non-linearity Ratio'};
0916     str=sprintf('%s\n%02u-%s-%u:%02u:%02u:%4.2f', str, ...
0917     start.day, start.month,  start.year, start.hour, ...
0918     start.minute, start.second);
0919     txt{4}={str};
0920 
0921     
0922     
0923     plottypes = {'b+', 'r+', 'c+', 'k+', 'g+', 'bo', 'ro', 'co', 'ko', 'go'};
0924     
0925     % fuck it, just plot it ourselves in this case
0926     setPlotDisplay(plotparams.plot);
0927     setwinsize(gcf, 1000, 400);
0928     unsource = unique(source);
0929     for m=1:length(unsource)
0930       ind = source == unsource(m);
0931       subplot(2,1,1)
0932       plot(time1(ind), nonlinRatios(ind,1), plottypes{m});
0933       hold on
0934       leg{m} = getSourceName(unsource(m));
0935     end
0936     legend(leg);
0937     xlabel('Time [hrs]');
0938     ylabel('Non-linearity Ratio');
0939     title('Total Intensity 1');
0940     for m=1:length(unsource)
0941       ind = source == unsource(m);
0942       subplot(2,1,2)
0943       plot(time1(ind), nonlinRatios(ind,2), plottypes{m});
0944       hold on    
0945     end
0946     legend(leg);
0947     title('Total Intensity 2');
0948     xlabel('Time [hrs]');
0949     ylabel('Non-linearity Ratio');
0950     gtitle('Non-linearity Plots');
0951     if(plotparams.save)
0952       dbclear if error
0953       set(gcf,'paperposition',[0 0 6.0 6.0])
0954       eval(sprintf('print -dpng -r200 %s/daily/fig1.png;', ...
0955       maindir));
0956       dbstop if error
0957       eval(sprintf('system(''mv %s/daily/fig1.png %s/daily/receiver_nonlin.png'');', maindir, maindir));      
0958     end
0959     
0960   case 'flag'
0961     display('antHealth::plotdayFlag:: percentage not done yet');
0962   
0963     
0964 end
0965 
0966 return;
0967 
0968 
0969 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
0970 
0971 function write2web(date, sched, dir, dcal, dpt, flag, d)
0972 
0973 I_filename = [date,'-daily_map_T.png'];
0974 Q_filename = [date,'-daily_map_Q.png'];
0975 U_filename = [date,'-daily_map_U.png'];
0976 hits_filename = [date,'-daily_map_hits.png'];
0977 
0978 %display('here1')
0979 
0980 months = {'January', 'February', 'March', 'April', 'May', 'June', 'July', ...
0981     'August', 'September', 'October', 'November', 'December'};
0982 
0983 redDate = mjd2date_v2(dcal.array.frame.utc(1));
0984 redDateString = sprintf('%s %02d, %04d', months{redDate.month}, ...
0985     redDate.day, redDate.year);
0986 
0987 nowDate = clock;
0988 nowDateString = sprintf('%s %02d, %04d at %02d:%02d', months{nowDate(2)}, ...
0989     nowDate(3), nowDate(1), nowDate(4), nowDate(5));
0990 
0991 %display('here2')
0992 % this function should collate all our data and put it into a webpage
0993 
0994 
0995 fn = strcat(dir, '/', 'index.html');
0996 fid = fopen(fn, 'w');
0997 
0998 % header info
0999 header(fid);
1000 fprintf(fid, '<a name=top>\n');
1001 fprintf(fid, '<h2> CBASS Daily Antenna Health Page for %s UTC </h2> \n\n', redDateString);
1002 fprintf(fid, '<h4> Generated on at %s </h4>\n\n', nowDateString);
1003 
1004 % schedules run
1005 fprintf(fid, '<a name=sched>\n');
1006 fprintf(fid,' <h3> Schedules Run </h3>\n');
1007 printMenu(fid);
1008 fprintf(fid, '<pre>');
1009 fprintf(fid, sched);
1010 fprintf(fid, '</pre>');
1011 fprintf(fid, '\n <hr> \n \n');
1012 %display('here3')
1013 % astronomical calibrators
1014 
1015 fprintf(fid, '<a name=astrocal>');
1016 fprintf(fid, '<h3> Astronomical Calibrators Observed </h3>');
1017 printMenu(fid);
1018 fprintf(fid, '<pre>');
1019 if(isempty(dcal.uniqueObs))
1020   fprintf(fid, '  No Calibrator sources were observed on this day');
1021 else
1022   fprintf(fid, 'Source \t \t \t Number of times\n');
1023   fprintf(fid, '-------------------------------------------\n');
1024   for m=1:length(dcal.uniqueObs)
1025     if(length(dcal.uniqueSources{m}) < 5)
1026       fprintf(fid, '%s \t \t \t \t %d\n', dcal.uniqueSources{m}, ...
1027       dcal.uniqueObs(m));
1028     else
1029       fprintf(fid, '%s \t \t \t %d\n', dcal.uniqueSources{m}, ...
1030       dcal.uniqueObs(m));
1031     end
1032   end
1033 end
1034 fprintf(fid, '</pre>');
1035 fprintf(fid, '\n <hr> \n \n');
1036 
1037 
1038     %display('here4')
1039 % Flagging report
1040 fprintf(fid, '<a name=dataflags>');
1041 fprintf(fid, '<h3> Flagging Report </h3> \n');
1042 printMenu(fid);
1043 if(isempty(flag.info))
1044   fprintf(fid, 'No Flagging data to report');
1045 else
1046   printFlagSum(flag.info, flag.fieldNames, fid);
1047   fprintf(fid, '\n <hr> \n \n');
1048 end
1049 
1050 % Bias report
1051 fprintf(fid, '<a name=rxbias>');
1052 fprintf(fid, '<h3> Receiver Bias </h3> \n');
1053 printMenu(fid);
1054 if(~isfield(d.antenna0, 'bias'));
1055   fprintf(fid, 'No Receiver Bias Data');
1056 else
1057   makeBiasTable(d, fid);
1058   fprintf(fid, '\n <hr> \n \n');
1059 end
1060     
1061 % Radio Pointing
1062 %display('here5')
1063 %if (dpt=0)
1064     fprintf(fid, '<a name=pointing>');
1065     fprintf(fid, '<h3> Pointing Report </h3> \n');
1066     printMenu(fid);
1067     fprintf(fid, '<pre>');
1068     fprintf(fid, 'There was a problem calculating the pointing');
1069 %else
1070 
1071     if(isempty(dpt.off))
1072         fprintf(fid, 'No Good Pointing crosses taken today');
1073     else
1074         fprintf(fid, 'Measured pointing crosses on %d sources\n', length(dpt.off));
1075         fprintf(fid, 'Offsets in Arcminutes\n');
1076 
1077 %        fprintf(fid, 'Source \t \t Az:  \t El: \t  off: \n');
1078     fprintf(fid, 'Source \t \t Az:  \t El: \t  Azoff: \t  Eloff: \t  Sky_Off: \n');
1079     for m=1:length(dpt.off.az)
1080       thisOff = dpt.ang(m)*60;
1081             if(length(dpt.obs.name{m}) < 7)
1082           fprintf(fid, '%s \t \t %3.1f \t %3.1f  \t %+03.2f \t \t %03.2f \t \t %03.2f \n', ...
1083                     dpt.obs.name{m}, dpt.obs.az(m), dpt.obs.el(m), ...
1084             dpt.off.az(m)*60, dpt.off.el(m)*60, thisOff);
1085             else
1086                 fprintf(fid, '%s \t %3.1f \t %3.1f \t  %+03.2f  \t %+03.2f  \t %03.2f \n', ...
1087                     dpt.obs.name{m}, dpt.obs.az(m), dpt.obs.el(m), ...
1088             dpt.off.az(m)*60, dpt.off.el(m)*60, thisOff);
1089             end
1090         end
1091         fprintf(fid, '\n');
1092         fprintf(fid, 'Pointing model residuals on these sources is %3.2f arcmin\n', ...
1093             dpt.sa0);
1094         
1095         if(dpt.sa0 < 8)
1096             fprintf(fid, 'Pointing model residuals low:  model still good');
1097         else
1098             fprintf(fid, 'Pointing model residuals high:  <strong> Suggest doing a pointing model run </strong>');
1099         end
1100     end
1101     fprintf(fid, '</pre>');
1102     fprintf(fid, '\n <hr> \n \n');
1103 %end
1104 %display('here6')
1105 % Antenna Hardware Plots!!
1106 %display('here7')
1107 fprintf(fid, '<a name=antplots>');
1108 fprintf(fid, '<h3> Antenna Hardware Plots </h3> \n');
1109 printMenu(fid);
1110 fprintf(fid, '\n\n');
1111 
1112 fprintf(fid, '<table><tr>\n');
1113 fprintf(fid, '<td align=top>\n');
1114 fprintf(fid, '<h4> Telescope Slewing </h4>\n\n');
1115 fprintf(fid, '<a href="intro/fig1.png"><img height=500 width=500 src="intro/fig1.png"></a><br><br>\n');
1116 fprintf(fid, '</td>');
1117 
1118 fprintf(fid, '<td align=top>\n');
1119 fprintf(fid, '<h4> Weather Data </h4>\n\n');
1120 fprintf(fid, '<a href="intro/fig1.png"><img height=500 width=500 src="intro/fig5.png"></a><br><br>\n');
1121 fprintf(fid, '</td>\n');
1122 fprintf(fid, '</tr>\n');
1123 
1124 fprintf(fid, '<tr>\n');
1125 fprintf(fid, '<td align=top>\n');
1126 fprintf(fid, '<h4> Receiver Temperature </h4>\n\n');
1127 fprintf(fid, '<a href="intro/fig3.png"><img height=500 width=500 src="intro/fig3.png"></a><br><br>\n');
1128 fprintf(fid, '</td>\n');
1129 
1130 fprintf(fid, '<td align=top>\n');
1131 fprintf(fid, '<h4> Cone/Electronics Box Temperature </h4>\n\n');
1132 fprintf(fid, '<a href="intro/fig4.png"><img height=500 width=500 src="intro/fig4.png"></a><br><br>\n');
1133 fprintf(fid, '</td>\n');
1134 fprintf(fid, '</tr>\n');
1135 
1136 fprintf(fid, '<tr>\n');
1137 fprintf(fid, '<td align=top>\n');
1138 fprintf(fid, '<h4> Cold Load Temperature </h4>\n\n');
1139 fprintf(fid, '<a href="intro/fig2.png"><img height=500 width=500 src="intro/fig2.png"></a><br><br>\n');
1140 fprintf(fid, '</td>\n');
1141 
1142 fprintf(fid, '</tr></table>\n');
1143 
1144 fprintf(fid, '\n <hr> \n \n');
1145 
1146 %display('here8')
1147 
1148 % System Plots!
1149 %display('here9')
1150 fprintf(fid, '<a name=sysplots>');
1151 fprintf(fid, '<h3> Antenna System Plots </h3> \n');
1152 printMenu(fid);
1153 fprintf(fid, '\n\n');
1154 
1155 fprintf(fid, '<table><tr>\n');
1156 fprintf(fid, '<td align=top>\n');
1157 fprintf(fid, '<h4> Noise Diode Temperature </h4>\n\n');
1158 fprintf(fid, '<a href="daily/noise_diode.png"><img height=500 width=500 src="daily/noise_diode.png"></a><br><br>\n');
1159 fprintf(fid, '</td>');
1160 
1161 fprintf(fid, '<td align=top>\n');
1162 fprintf(fid, '<h4> System Temperature </h4>\n\n');
1163 fprintf(fid, '<a href="daily/system_temperature.png"><img height=500 width=500 src="daily/system_temperature.png"></a><br><br>\n');
1164 fprintf(fid, '</td>\n');
1165 fprintf(fid, '</tr>\n');
1166 
1167 fprintf(fid, '<tr>\n');
1168 fprintf(fid, '<td align=top>\n');
1169 fprintf(fid, '<h4> Receiver Nonlinearity </h4>\n\n');
1170 fprintf(fid, '<a href="daily/receiver_nonlin.png"><img height=500 width=500 src="daily/receiver_nonlin.png"></a><br><br>\n');
1171 fprintf(fid, '</td>\n');
1172 
1173 fprintf(fid, '<td align=top>\n');
1174 fprintf(fid, '<h4> Pointing Model </h4>\n\n');
1175 fprintf(fid, '<a href="pointing/fit_residual.png"><img height=500 width=500 src="pointing/fit_residual.png"></a><br><br>\n');
1176 fprintf(fid, '</td>\n');
1177 fprintf(fid, '</tr>\n');
1178 
1179 
1180 fprintf(fid, '</tr></table>\n');
1181 
1182 fprintf(fid, '\n <hr> \n \n');
1183 
1184 
1185 fprintf(fid, '<a name=maps>');
1186 fprintf(fid, '<h3> Daily Maps</h3> \n');
1187 printMenu(fid);
1188 fprintf(fid, '\n\n');
1189 fprintf(fid, '<h4> HITS, I,Q and U </h4>\n\n');
1190 
1191 fprintf(fid, '<table><tr>\n');
1192 fprintf(fid, '<td align=top>\n');
1193 fprintf(fid, '<h4> Coverage </h4>\n\n');
1194 fprintf(fid, '<a href="../%s"><img height=500 width=500 src="../%s"></a><br><br>\n',hits_filename,hits_filename);
1195 fprintf(fid, '</td>');
1196 
1197 fprintf(fid, '<td align=top>\n');
1198 fprintf(fid, '<h4> I </h4>\n\n');
1199 fprintf(fid, '<a href="../%s"><img height=500 width=500 src="../%s"></a><br><br>\n',I_filename,I_filename);
1200 fprintf(fid, '</td>\n');
1201 fprintf(fid, '</tr>\n');
1202 
1203 fprintf(fid, '<tr>\n');
1204 fprintf(fid, '<td align=top>\n');
1205 fprintf(fid, '<h4> Q </h4>\n\n');
1206 fprintf(fid, '<a href="../%s"><img height=500 width=500 src="../%s"></a><br><br>\n',Q_filename,Q_filename);
1207 fprintf(fid, '</td>\n');
1208 
1209 fprintf(fid, '<td align=top>\n');
1210 fprintf(fid, '<h4> U </h4>\n\n');
1211 fprintf(fid, '<a href="../%s"><img height=500 width=500 src="../%s"></a><br><br>\n',U_filename,U_filename);
1212 fprintf(fid, '</td>\n');
1213 fprintf(fid, '</tr>\n');
1214 
1215 fprintf(fid, '</tr></table>\n');
1216 
1217 fprintf(fid, '\n <hr> \n \n');
1218 
1219 %display('here10')
1220 
1221 fclose(fid);
1222 
1223 return;
1224 
1225 
1226 
1227 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1228 function header(fid)
1229 
1230 fprintf(fid,'<html><body>\n\n');
1231 fprintf(fid,'<p>\n\n');
1232 
1233 return;
1234 
1235 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1236 
1237 function printMenu(fid)
1238 
1239 fprintf(fid, '<p> [<a href=#top>Top</a>] [<a href=#sched>Schedules</a>] [<a href=#astrocal>Calibrators</a>][<a href=#dataflags>Flagging</a>] [<a href=#rxbias>Receiver Bias</a>][<a href=#pointing>Pointing</a>] [<a href=#antplots>Hardware Plots</a>][<a href=#sysplots>System Plots</a>][<a href=#maps>Daily Maps</a>]');
1240 
1241 return;
1242 
1243 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1244 function flag = dailyFlag(d, dir)
1245 
1246 % first we read in the flag percentage based on "intent"
1247 [home,installeddir]=where_am_i();
1248 allFlag1 = load([home,'/',installeddir,'/constants/flag_intent.txt']);
1249 %  ---- FORMAT ----
1250 % starttime stoptime numscans inttime perflag source.time source.flag
1251 % elscan.time elscan.flag cal.time cal.scan, .... noiseevent.time
1252 % noiseevent.flag
1253 % --- ACTION ---
1254 % find the tracks that are contained in this date.
1255 f = find(allFlag1(:,1) > d.array.frame.utc(1) & allFlag1(:,1) < ...
1256     last(d.array.frame.utc) );
1257 intentFlag = allFlag1(f,:);
1258 
1259 % sort it so only the last value for each time is used.
1260 [aDateChron, sortOrder] = sort(intentFlag(:,1));
1261 reps       = find(diff(aDateChron)==0);
1262 intentFlag = intentFlag(sortOrder,:);
1263 intentFlag(reps,:) = []; % now intentFlags will have no repeats.
1264 
1265 % load in the features values.
1266 featureFields;
1267 
1268 % lastly, we combine the __ however many __ tracks there are.
1269 flags = intentFlag(:,4:size(intentFlag,2));
1270 timeIndices = 1:2:size(flags,2);
1271 perIndex =  2:2:size(flags,2);
1272 
1273 timeOnIntent = sum(flags(:,timeIndices));
1274 timeFlagged  = sum(flags(:,timeIndices).*flags(:,perIndex)/100);
1275 perFlagged   = timeFlagged./timeOnIntent*100;
1276 perFlagged(isnan(perFlagged)) = 0;
1277 
1278 % next we calculate how long each track is (in minutes)
1279 trackLength = (intentFlag(:,2) - intentFlag(:,1) )*24*60;
1280 totalDataLength = sum(trackLength);
1281 
1282 % let's regenerate a structure much like the one we want to write out our
1283 % flags.
1284 info.track.number = size(intentFlag,1);
1285 info.track.intTime = totalDataLength;
1286 info.track.perFlag = sum(timeFlagged)./sum(timeOnIntent)*100;
1287 for m=1:length(fieldNames)
1288   eval(sprintf('info.%s.intTime = timeOnIntent(m);', fieldNames{m}));
1289   eval(sprintf('info.%s.perFlag = perFlagged(m);', fieldNames{m}));
1290 end
1291 
1292 % next, for the second part of it: flagging per step
1293 % FILE 2 FORMAT  -- flags per step
1294 % starttime stoptime numscans inttime perflag antennaflag userflag timeflag
1295 % deglitchflag .... rfactorflag totalflag
1296 allFlag1 = load([home,'/',installeddir,'/constants/flag_step.txt']);
1297 % --- ACTION ---
1298 % find the tracks that are contained in this date.
1299 f = find(allFlag1(:,1) > d.array.frame.utc(1) & allFlag1(:,1) < ...
1300     last(d.array.frame.utc) );
1301 stepFlag = allFlag1(f,:);
1302 
1303 % sort it so only the last value for each time is used.
1304 [aDateChron, sortOrder] = sort(stepFlag(:,1));
1305 reps       = find(diff(aDateChron)==0);
1306 stepFlag   = stepFlag(sortOrder,:);
1307 stepFlag(reps,:) = []; % now intentFlags will have no repeats.
1308 
1309 % only the steps themselves
1310 stepFlag(:,1:5) = [];
1311 % next the flag names
1312 fa = getFlagNames(); 
1313 for m=1:length(fa)
1314   eval(sprintf('info.flag.%s = mean(stepFlag(:,m));', fa{m}));
1315 end
1316 info.flag.total = mean(stepFlag(:,m+1));
1317 
1318 flag.info = info;
1319 flag.fieldNames = fieldNames;
1320 
1321 return;
1322 
1323 
1324 
1325 function printFlagSum(info, fieldNames, fid);
1326 % next we want to print this out to a txt array, which we will subsequently
1327 % feed into the writer.
1328 fprintf(fid,'<pre>\n');
1329 fprintf(fid,'                         Flag Summary\n');
1330 fprintf(fid,'================================================================\n');
1331 fprintf(fid,'  Number of Tracks: %d\n', info.track.number);
1332 fprintf(fid,'  Total time of Data Analyzed [min]: %2.2f\n', info.track.intTime);
1333 fprintf(fid,'  Percent of total Data Flagged: %2.2f\n', info.track.perFlag);
1334 fprintf(fid,'</pre>');
1335 fprintf(fid,'<table border="1">');
1336 fprintf(fid,'<tr>');
1337 fprintf(fid,'<td> <b> Routine </b> </td> <td> <b> Integration [min] </b> </td> <td>  <b> Percent Flagged </b> </td>');
1338 fprintf(fid,'</tr>');
1339 names = fieldnames(info);
1340 for m=2:length(names)-1
1341   thisName = names{m};
1342   eval(sprintf('thisData = info.%s;', thisName));
1343   
1344   fprintf(fid,'<tr>');
1345   
1346   fprintf(fid,'<td> %s </td>',thisName);
1347   fprintf(fid,'<td> %8.2f </td>',thisData.intTime);
1348   fprintf(fid,'<td> %8.2f </td>',thisData.perFlag);
1349   fprintf(fid,'</tr>');
1350 end
1351 fprintf(fid,'</table>');
1352 
1353 fprintf(fid, '\n');
1354 fprintf(fid, '\n');
1355 fprintf(fid,'<table border="1">');
1356 fprintf(fid,'<tr>');
1357 fprintf(fid,'<td> <b> Routine  </b> </td>  <td> <b>  Average Flag %% </b> </td>');
1358 fprintf(fid,'</tr>');
1359 names = fieldnames(info.flag);
1360 for m=1:length(names)
1361   if(strmatch(names{m}, 'tsys', 'exact'))
1362     % don't do anything
1363   elseif(strmatch(names{m}, 'noise', 'exact'))
1364     % nothing
1365   elseif(strmatch(names{m}, 'nonlin', 'exact'))
1366     %nothing
1367   elseif(strmatch(names{m}, 'tau', 'exact'))
1368     % nothing
1369   else
1370     eval(sprintf('thisData = info.flag.%s; ', names{m}));
1371     
1372     
1373     if(m==1 | m==4 | m==6 | m==7 | m==10 | m==17)
1374       
1375       txt = sprintf('<tr> <td> %s  </td> <td>  %4.2f </td> </tr>', names{m}, thisData(1));
1376     else
1377       txt = sprintf('<tr> <td> %s  </td> <td>  %4.2f </td> </tr>', names{m}, thisData(1));
1378     end
1379     fprintf(fid,txt);
1380   end
1381 end
1382 fprintf(fid,'</table>');
1383 
1384 return;

Generated on Sun 14-Jun-2015 17:12:45 by m2html © 2005