/***************************************************************************
 *   Copyright (C) 2015 by James M Anderson                                *
 *                                                                         *
 *   This program is free software; you can redistribute it and/or modify  *
 *   it under the terms of the GNU General Public License as published by  *
 *   the Free Software Foundation; either version 3 of the License, or     *
 *   (at your option) any later version.                                   *
 *                                                                         *
 *   This program is distributed in the hope that it will be useful,       *
 *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
 *   GNU General Public License for more details.                          *
 *                                                                         *
 *   You should have received a copy of the GNU General Public License     *
 *   along with this program; if not, write to the                         *
 *   Free Software Foundation, Inc.,                                       *
 *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
 ***************************************************************************/
//===========================================================================
// SVN properties (DO NOT CHANGE)
//
// $Id: calcif2.c 6661 2015-05-15 12:53:34Z JamesAnderson $
// $HeadURL: $
// $LastChangedRevision: 6661 $
// $Author: JamesAnderson $
// $LastChangedDate: 2015-05-15 14:53:34 +0200 (Fri, 15 May 2015) $
//
//============================================================================

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include "config.h"
#include <difxio.h>

#define MAX_FILES	2

const char program[] = "compareDiFXims";
const char author[]  = "James M. Anderson <anderson@gfz-potsdam.de>";
const char version[] = VERSION;
const char verdate[] = "20150603";

typedef struct
{
	int verbose;
	int nFile;
	char *files[MAX_FILES];
} CommandLineOptions;

enum CompareObjectEnum
	{
		COEscan,
		COEsource,
		COEantenna
	};


typedef struct
{
	DifxPolyModel sum;
	DifxPolyModel sumsqr;
	DifxPolyModel fsum;
	DifxPolyModel fsumsqr;
	DifxPolyModel count;
	DifxPolyModelLMNExtension sum_lmn;
	DifxPolyModelLMNExtension sumsqr_lmn;
	DifxPolyModelLMNExtension fsum_lmn;
	DifxPolyModelLMNExtension fsumsqr_lmn;
	DifxPolyModelLMNExtension count_lmn;
	DifxPolyModelXYZExtension sum_xyz;
	DifxPolyModelXYZExtension sumsqr_xyz;
	DifxPolyModelXYZExtension fsum_xyz;
	DifxPolyModelXYZExtension fsumsqr_xyz;
	DifxPolyModelXYZExtension count_xyz;
	int total_count[MAX_MODEL_ORDER+1];
} ComparisonStruct;




static void usage()
{
	fprintf(stderr, "%s ver. %s  %s  %s\n\n", program, version, author, verdate);
	fprintf(stderr, "A program to calculate differences between two DiFX delay model outputs.\n\n");
	fprintf(stderr, "Usage : %s [options] <im file0> <im file1>\n\n", program);
	fprintf(stderr, "<im file#> should be a '.im' file as generated by calcif2.\n\n");
	fprintf(stderr, "options can include:\n");
	fprintf(stderr, "  --help\n");
	fprintf(stderr, "  -h                      Print this help and quit\n");
	fprintf(stderr, "\n");
	fprintf(stderr, "  --verbose\n");
	fprintf(stderr, "  -v                      Be more verbose in operation\n");
	fprintf(stderr, "\n");
	fprintf(stderr, "  --quiet\n");
	fprintf(stderr, "  -q                      Be less verbose in operation\n");
	fprintf(stderr, "\n");
}

static void deleteCommandLineOptions(CommandLineOptions *opts)
{
	int i;

	if(!opts)
	{
		return;
	}

	for(i = 0; i < opts->nFile; ++i)
	{
		free(opts->files[i]);
	}

	free(opts);
}

static CommandLineOptions *newCommandLineOptions(int argc, char **argv)
{
	CommandLineOptions *opts;
	int i;
	int die = 0;

	opts = (CommandLineOptions *)calloc(1, sizeof(CommandLineOptions));

	for(i = 1; i < argc; ++i)
	{
		if(argv[i][0] == '-')
		{
			if(strcmp(argv[i], "-v") == 0 ||
			   strcmp(argv[i], "--verbose") == 0)
			{
				++opts->verbose;
			}
			else if(strcmp(argv[i], "-q") == 0 ||
					strcmp(argv[i], "--quiet") == 0)
			{
				--opts->verbose;
			}
			else if(strcmp(argv[i], "-h") == 0 ||
					strcmp(argv[i], "--help") == 0)
			{
				usage();
				deleteCommandLineOptions(opts);
				
				return 0;
			}
		}
		else
		{
			opts->files[opts->nFile] = strdup(argv[i]);
			opts->nFile++;
			if(opts->nFile > MAX_FILES)
			{
				fprintf(stderr, "Error: %s: Too many files (%d max)\n", program, MAX_FILES);
				++die;
			}
		}
	}

	if(opts->nFile != MAX_FILES)
	{
		fprintf(stderr, "Error: %s: exactly %d input files are required\n", program, MAX_FILES);
		++die;
	}

	if(die)
	{
		if(die > 1)
		{
			fprintf(stderr, "%s quitting. (%d errors)\n", program, die);
		}
		else
		{
			fprintf(stderr, "%s quitting.\n", program);
		}
		fprintf(stderr, "Use -h option for %s help.\n", program);
		deleteCommandLineOptions(opts);

		return 0;
	}

	return opts;
}





static int sanity_check(const DifxInput* const D0, const DifxInput* const D1, int verbose, ComparisonStruct** Call, ComparisonStruct** Cjob, ComparisonStruct** Cantenna, ComparisonStruct** Cscan, ComparisonStruct** Csource)
{
	if(D0->nJob != D1->nJob)
	{
		fprintf(stderr, "Error: nJob differs (D0=%d D1=%d)\n", D0->nJob, D1->nJob);
		return -1;
	}
	if(D0->nAntenna != D1->nAntenna)
	{
		fprintf(stderr, "Error: nAntenna differs (D0=%d D1=%d)\n", D0->nAntenna, D1->nAntenna);
		return -1;
	}
	if(D0->nScan != D1->nScan)
	{
		fprintf(stderr, "Error: nScan differs (D0=%d D1=%d)\n", D0->nScan, D1->nScan);
		return -1;
	}
	if(D0->nSource != D1->nSource)
	{
		fprintf(stderr, "Error: nSource differs (D0=%d D1=%d)\n", D0->nSource, D1->nSource);
		return -1;
	}

	*Call     = (ComparisonStruct*)calloc(1,            sizeof(ComparisonStruct));
	*Cjob     = (ComparisonStruct*)calloc(D0->nJob,     sizeof(ComparisonStruct));
	*Cantenna = (ComparisonStruct*)calloc(D0->nAntenna, sizeof(ComparisonStruct));
	*Cscan    = (ComparisonStruct*)calloc(D0->nScan,    sizeof(ComparisonStruct));
	*Csource  = (ComparisonStruct*)calloc(D0->nSource,  sizeof(ComparisonStruct));
	return 0;
}


static int process_scan(const DifxInput* const D0, const DifxInput* const D1, int verbose, int scanId, ComparisonStruct* Call, ComparisonStruct* Cjob, ComparisonStruct* Cantenna, ComparisonStruct* Cscan, ComparisonStruct* Csource)
{
	const DifxScan* const scan0 = D0->scan+scanId;
	const DifxScan* const scan1 = D1->scan+scanId;
	int antennaId;
	int jobId;
	int polyOrder;
	int count = 0;

	jobId = scan0->jobId;
	if(jobId != scan1->jobId)
	{
		fprintf(stderr, "Error: jobIds do not match for scanId %d (%d %d)\n", scanId, scan0->jobId, scan1->jobId);
		return -1;
	}
	if(scan0->nAntenna != scan1->nAntenna)
	{
		fprintf(stderr, "Error: nAntennas do not match for scanId %d (%d %d)\n", scanId, scan0->nAntenna, scan1->nAntenna);
		return -2;
	}
	if(scan0->nPhaseCentres != scan1->nPhaseCentres)
	{
		fprintf(stderr, "Error: nPhaseCentres do not match for scanId %d (%d %d)\n", scanId, scan0->nPhaseCentres, scan1->nPhaseCentres);
		return -3;
	}
	polyOrder = D0->job[jobId].polyOrder;
	if(polyOrder != D0->job[jobId].polyOrder)
	{
		fprintf(stderr, "Error: polyOrders do not match for scanId %d (%d %d)\n", scanId, D0->job[jobId].polyOrder, D0->job[jobId].polyOrder);
		return -4;
	}
	for(antennaId = 0; antennaId < scan0->nAntenna; ++antennaId)
	{
		int k;
		for(k = 0; k <= scan0->nPhaseCentres; ++k)
		{
			int sourceId;
			int polyId;
			if(k==0)
			{
				sourceId = scan0->pointingCentreSrc;
				if(sourceId != scan1->pointingCentreSrc)
				{
					fprintf(stderr, "Error: pointingCentreSrcs do not match for scanId %d (%d %d)\n", scanId, scan0->pointingCentreSrc, scan1->pointingCentreSrc);
					return -5;
				}
			}
			else
			{
				sourceId = scan0->phsCentreSrcs[k-1];
				if(sourceId != scan1->pointingCentreSrc)
				{
					fprintf(stderr, "Error: phsCentreSrcs do not match for scanId %d (%d %d) at k-1=%d\n", scanId, scan0->phsCentreSrcs[k-1], scan1->phsCentreSrcs[k-1], k-1);
					return -6;
				}
			}
			if(scan0->nPoly != scan1->nPoly)
			{
				fprintf(stderr, "Error: nPolys do not match for scanId %d (%d %d)\n", scanId, scan0->nPoly, scan1->nPoly);
				return -7;
			}
			for(polyId = 0; polyId < scan0->nPoly; ++polyId)
			{
				const DifxPolyModel *im0 = scan0->im[antennaId][k]+polyId;
				const DifxPolyModel *im1 = scan1->im[antennaId][k]+polyId;
				const DifxPolyModelLMNExtension *imLMN0 = NULL;
				const DifxPolyModelLMNExtension *imLMN1 = NULL;
				const DifxPolyModelXYZExtension *imXYZ0 = NULL;
				const DifxPolyModelXYZExtension *imXYZ1 = NULL;
				int po;
				if(scan0->imLMN)
				{
					if(scan0->imLMN[antennaId])
					{
						if(scan0->imLMN[antennaId][k])
						{
							imLMN0 = scan0->imLMN[antennaId][k]+polyId;
						}
					}
				}
				if(scan1->imLMN)
				{
					if(scan1->imLMN[antennaId])
					{
						if(scan1->imLMN[antennaId][k])
						{
							imLMN1 = scan1->imLMN[antennaId][k]+polyId;
						}
					}
				}
				if(scan0->imXYZ)
				{
					if(scan0->imXYZ[antennaId])
					{
						if(scan0->imXYZ[antennaId][k])
						{
							imXYZ0 = scan0->imXYZ[antennaId][k]+polyId;
						}
					}
				}
				if(scan1->imXYZ)
				{
					if(scan1->imXYZ[antennaId])
					{
						if(scan1->imXYZ[antennaId][k])
						{
							imXYZ1 = scan1->imXYZ[antennaId][k]+polyId;
						}
					}
				}
				/* compare times */
				if(im0->mjd != im1->mjd)
				{
					fprintf(stderr, "Error: mjds do not match for scanId %d polyId %d (%d %d)\n", scanId, polyId, im0->mjd, im1->mjd);
					return -8;
				}
				if(im0->sec != im1->sec)
				{
					fprintf(stderr, "Error: secs do not match for scanId %d polyId %d (%d %d)\n", scanId, polyId, im0->sec, im1->sec);
					return -9;
				}
				if(im0->order != im1->order)
				{
					fprintf(stderr, "Error: orders do not match for scanId %d polyId %d (%d %d)\n", scanId, polyId, im0->order, im1->order);
					return -10;
				}
				if(im0->validDuration != im1->validDuration)
				{
					fprintf(stderr, "Error: validDurations do not match for scanId %d polyId %d (%d %d)\n", scanId, polyId, im0->validDuration, im1->validDuration);
					return -11;
				}
				++count;
				for(po = 0; po < im0->order; ++po)
				{
					double d0;
					double d1;
					double d;
					double d2;
					double c;
					double f;
					double f2;

					++Call[0].total_count[po];
					++Cjob[jobId].total_count[po];
					++Cantenna[antennaId].total_count[po];
					++Cscan[scanId].total_count[po];
					++Csource[sourceId].total_count[po];
					/* delay */
					d0 = im0->delay[po] * 1E-6;
					d1 = im1->delay[po] * 1E-6;
					if((!isnan(d0)) && (!isnan(d1)))
					{
						d = d0-d1;
						f = d/(d0+d1)*2.0;
						c = 1.0;
					}
					else
					{
						if((!isnan(d0))||(!isnan(d1)))
						{
							d = 1E300;
							f = 1E200;
							c = 1.0;
						}
						else
						{
							d = 0.0;
							f = 0.0;
							c = 0.0;
						}
					}
					d2 = d*d;
					f2 = f*f;
					Call[0].sum.delay[po] += d;
					Call[0].fsum.delay[po] += f;
					Cjob[jobId].sum.delay[po] += d;
					Cjob[jobId].fsum.delay[po] += f;
					Cantenna[antennaId].sum.delay[po] += d;
					Cantenna[antennaId].fsum.delay[po] += f;
					Cscan[scanId].sum.delay[po] += d;
					Cscan[scanId].fsum.delay[po] += f;
					Csource[sourceId].sum.delay[po] += d;
					Csource[sourceId].fsum.delay[po] += f;
					Call[0].sumsqr.delay[po] += d2;
					Call[0].fsumsqr.delay[po] += f2;
					Cjob[jobId].sumsqr.delay[po] += d2;
					Cjob[jobId].fsumsqr.delay[po] += f2;
					Cantenna[antennaId].sumsqr.delay[po] += d2;
					Cantenna[antennaId].fsumsqr.delay[po] += f2;
					Cscan[scanId].sumsqr.delay[po] += d2;
					Cscan[scanId].fsumsqr.delay[po] += f2;
					Csource[sourceId].sumsqr.delay[po] += d2;
					Csource[sourceId].fsumsqr.delay[po] += f2;
					Call[0].count.delay[po] += c;
					Cjob[jobId].count.delay[po] += c;
					Cantenna[antennaId].count.delay[po] += c;
					Cscan[scanId].count.delay[po] += c;
					Csource[sourceId].count.delay[po] += c;
					/* dry */
					d0 = im0->dry[po] * 1E-6;
					d1 = im1->dry[po] * 1E-6;
					if((!isnan(d0)) && (!isnan(d1)))
					{
						d = d0-d1;
						f = d/(d0+d1)*2.0;
						c = 1.0;
					}
					else
					{
						if((!isnan(d0))||(!isnan(d1)))
						{
							d = 1E300;
							f = 1E200;
							c = 1.0;
						}
						else
						{
							d = 0.0;
							f = 0.0;
							c = 0.0;
						}
					}
					d2 = d*d;
					f2 = f*f;
					Call[0].sum.dry[po] += d;
					Call[0].fsum.dry[po] += f;
					Cjob[jobId].sum.dry[po] += d;
					Cjob[jobId].fsum.dry[po] += f;
					Cantenna[antennaId].sum.dry[po] += d;
					Cantenna[antennaId].fsum.dry[po] += f;
					Cscan[scanId].sum.dry[po] += d;
					Cscan[scanId].fsum.dry[po] += f;
					Csource[sourceId].sum.dry[po] += d;
					Csource[sourceId].fsum.dry[po] += f;
					Call[0].sumsqr.dry[po] += d2;
					Call[0].fsumsqr.dry[po] += f2;
					Cjob[jobId].sumsqr.dry[po] += d2;
					Cjob[jobId].fsumsqr.dry[po] += f2;
					Cantenna[antennaId].sumsqr.dry[po] += d2;
					Cantenna[antennaId].fsumsqr.dry[po] += f2;
					Cscan[scanId].sumsqr.dry[po] += d2;
					Cscan[scanId].fsumsqr.dry[po] += f2;
					Csource[sourceId].sumsqr.dry[po] += d2;
					Csource[sourceId].fsumsqr.dry[po] += f2;
					Call[0].count.dry[po] += c;
					Cjob[jobId].count.dry[po] += c;
					Cantenna[antennaId].count.dry[po] += c;
					Cscan[scanId].count.dry[po] += c;
					Csource[sourceId].count.dry[po] += c;
					/* wet */
					d0 = im0->wet[po] * 1E-6;
					d1 = im1->wet[po] * 1E-6;
					if((!isnan(d0)) && (!isnan(d1)))
					{
						d = d0-d1;
						f = d/(d0+d1)*2.0;
						c = 1.0;
					}
					else
					{
						if((!isnan(d0))||(!isnan(d1)))
						{
							d = 1E300;
							f = 1E200;
							c = 1.0;
						}
						else
						{
							d = 0.0;
							f = 0.0;
							c = 0.0;
						}
					}
					d2 = d*d;
					f2 = f*f;
					Call[0].sum.wet[po] += d;
					Call[0].fsum.wet[po] += f;
					Cjob[jobId].sum.wet[po] += d;
					Cjob[jobId].fsum.wet[po] += f;
					Cantenna[antennaId].sum.wet[po] += d;
					Cantenna[antennaId].fsum.wet[po] += f;
					Cscan[scanId].sum.wet[po] += d;
					Cscan[scanId].fsum.wet[po] += f;
					Csource[sourceId].sum.wet[po] += d;
					Csource[sourceId].fsum.wet[po] += f;
					Call[0].sumsqr.wet[po] += d2;
					Call[0].fsumsqr.wet[po] += f2;
					Cjob[jobId].sumsqr.wet[po] += d2;
					Cjob[jobId].fsumsqr.wet[po] += f2;
					Cantenna[antennaId].sumsqr.wet[po] += d2;
					Cantenna[antennaId].fsumsqr.wet[po] += f2;
					Cscan[scanId].sumsqr.wet[po] += d2;
					Cscan[scanId].fsumsqr.wet[po] += f2;
					Csource[sourceId].sumsqr.wet[po] += d2;
					Csource[sourceId].fsumsqr.wet[po] += f2;
					Call[0].count.wet[po] += c;
					Cjob[jobId].count.wet[po] += c;
					Cantenna[antennaId].count.wet[po] += c;
					Cscan[scanId].count.wet[po] += c;
					Csource[sourceId].count.wet[po] += c;
					/* iono */
					d0 = im0->iono[po] * 1E-6;
					d1 = im1->iono[po] * 1E-6;
					if((!isnan(d0)) && (!isnan(d1)))
					{
						d = d0-d1;
						f = d/(d0+d1)*2.0;
						c = 1.0;
					}
					else
					{
						if((!isnan(d0))||(!isnan(d1)))
						{
							d = 1E300;
							f = 1E200;
							c = 1.0;
						}
						else
						{
							d = 0.0;
							f = 0.0;
							c = 0.0;
						}
					}
					d2 = d*d;
					f2 = f*f;
					Call[0].sum.iono[po] += d;
					Call[0].fsum.iono[po] += f;
					Cjob[jobId].sum.iono[po] += d;
					Cjob[jobId].fsum.iono[po] += f;
					Cantenna[antennaId].sum.iono[po] += d;
					Cantenna[antennaId].fsum.iono[po] += f;
					Cscan[scanId].sum.iono[po] += d;
					Cscan[scanId].fsum.iono[po] += f;
					Csource[sourceId].sum.iono[po] += d;
					Csource[sourceId].fsum.iono[po] += f;
					Call[0].sumsqr.iono[po] += d2;
					Call[0].fsumsqr.iono[po] += f2;
					Cjob[jobId].sumsqr.iono[po] += d2;
					Cjob[jobId].fsumsqr.iono[po] += f2;
					Cantenna[antennaId].sumsqr.iono[po] += d2;
					Cantenna[antennaId].fsumsqr.iono[po] += f2;
					Cscan[scanId].sumsqr.iono[po] += d2;
					Cscan[scanId].fsumsqr.iono[po] += f2;
					Csource[sourceId].sumsqr.iono[po] += d2;
					Csource[sourceId].fsumsqr.iono[po] += f2;
					Call[0].count.iono[po] += c;
					Cjob[jobId].count.iono[po] += c;
					Cantenna[antennaId].count.iono[po] += c;
					Cscan[scanId].count.iono[po] += c;
					Csource[sourceId].count.iono[po] += c;
					/* az */
					d0 = im0->az[po];
					d1 = im1->az[po];
					if((!isnan(d0)) && (!isnan(d1)))
					{
						d = d0-d1;
						f = d/(d0+d1)*2.0;
						c = 1.0;
					}
					else
					{
						if((!isnan(d0))||(!isnan(d1)))
						{
							d = 1E300;
							f = 1E200;
							c = 1.0;
						}
						else
						{
							d = 0.0;
							f = 0.0;
							c = 0.0;
						}
					}
					d2 = d*d;
					f2 = f*f;
					Call[0].sum.az[po] += d;
					Call[0].fsum.az[po] += f;
					Cjob[jobId].sum.az[po] += d;
					Cjob[jobId].fsum.az[po] += f;
					Cantenna[antennaId].sum.az[po] += d;
					Cantenna[antennaId].fsum.az[po] += f;
					Cscan[scanId].sum.az[po] += d;
					Cscan[scanId].fsum.az[po] += f;
					Csource[sourceId].sum.az[po] += d;
					Csource[sourceId].fsum.az[po] += f;
					Call[0].sumsqr.az[po] += d2;
					Call[0].fsumsqr.az[po] += f2;
					Cjob[jobId].sumsqr.az[po] += d2;
					Cjob[jobId].fsumsqr.az[po] += f2;
					Cantenna[antennaId].sumsqr.az[po] += d2;
					Cantenna[antennaId].fsumsqr.az[po] += f2;
					Cscan[scanId].sumsqr.az[po] += d2;
					Cscan[scanId].fsumsqr.az[po] += f2;
					Csource[sourceId].sumsqr.az[po] += d2;
					Csource[sourceId].fsumsqr.az[po] += f2;
					Call[0].count.az[po] += c;
					Cjob[jobId].count.az[po] += c;
					Cantenna[antennaId].count.az[po] += c;
					Cscan[scanId].count.az[po] += c;
					Csource[sourceId].count.az[po] += c;
					/* elcorr */
					d0 = im0->elcorr[po];
					d1 = im1->elcorr[po];
					if((!isnan(d0)) && (!isnan(d1)))
					{
						d = d0-d1;
						f = d/(d0+d1)*2.0;
						c = 1.0;
					}
					else
					{
						if((!isnan(d0))||(!isnan(d1)))
						{
							d = 1E300;
							f = 1E200;
							c = 1.0;
						}
						else
						{
							d = 0.0;
							f = 0.0;
							c = 0.0;
						}
					}
					d2 = d*d;
					f2 = f*f;
					Call[0].sum.elcorr[po] += d;
					Call[0].fsum.elcorr[po] += f;
					Cjob[jobId].sum.elcorr[po] += d;
					Cjob[jobId].fsum.elcorr[po] += f;
					Cantenna[antennaId].sum.elcorr[po] += d;
					Cantenna[antennaId].fsum.elcorr[po] += f;
					Cscan[scanId].sum.elcorr[po] += d;
					Cscan[scanId].fsum.elcorr[po] += f;
					Csource[sourceId].sum.elcorr[po] += d;
					Csource[sourceId].fsum.elcorr[po] += f;
					Call[0].sumsqr.elcorr[po] += d2;
					Call[0].fsumsqr.elcorr[po] += f2;
					Cjob[jobId].sumsqr.elcorr[po] += d2;
					Cjob[jobId].fsumsqr.elcorr[po] += f2;
					Cantenna[antennaId].sumsqr.elcorr[po] += d2;
					Cantenna[antennaId].fsumsqr.elcorr[po] += f2;
					Cscan[scanId].sumsqr.elcorr[po] += d2;
					Cscan[scanId].fsumsqr.elcorr[po] += f2;
					Csource[sourceId].sumsqr.elcorr[po] += d2;
					Csource[sourceId].fsumsqr.elcorr[po] += f2;
					Call[0].count.elcorr[po] += c;
					Cjob[jobId].count.elcorr[po] += c;
					Cantenna[antennaId].count.elcorr[po] += c;
					Cscan[scanId].count.elcorr[po] += c;
					Csource[sourceId].count.elcorr[po] += c;
					/* elgeom */
					d0 = im0->elgeom[po];
					d1 = im1->elgeom[po];
					if((!isnan(d0)) && (!isnan(d1)))
					{
						d = d0-d1;
						f = d/(d0+d1)*2.0;
						c = 1.0;
					}
					else
					{
						if((!isnan(d0))||(!isnan(d1)))
						{
							d = 1E300;
							f = 1E200;
							c = 1.0;
						}
						else
						{
							d = 0.0;
							f = 0.0;
							c = 0.0;
						}
					}
					d2 = d*d;
					f2 = f*f;
					Call[0].sum.elgeom[po] += d;
					Call[0].fsum.elgeom[po] += f;
					Cjob[jobId].sum.elgeom[po] += d;
					Cjob[jobId].fsum.elgeom[po] += f;
					Cantenna[antennaId].sum.elgeom[po] += d;
					Cantenna[antennaId].fsum.elgeom[po] += f;
					Cscan[scanId].sum.elgeom[po] += d;
					Cscan[scanId].fsum.elgeom[po] += f;
					Csource[sourceId].sum.elgeom[po] += d;
					Csource[sourceId].fsum.elgeom[po] += f;
					Call[0].sumsqr.elgeom[po] += d2;
					Call[0].fsumsqr.elgeom[po] += f2;
					Cjob[jobId].sumsqr.elgeom[po] += d2;
					Cjob[jobId].fsumsqr.elgeom[po] += f2;
					Cantenna[antennaId].sumsqr.elgeom[po] += d2;
					Cantenna[antennaId].fsumsqr.elgeom[po] += f2;
					Cscan[scanId].sumsqr.elgeom[po] += d2;
					Cscan[scanId].fsumsqr.elgeom[po] += f2;
					Csource[sourceId].sumsqr.elgeom[po] += d2;
					Csource[sourceId].fsumsqr.elgeom[po] += f2;
					Call[0].count.elgeom[po] += c;
					Cjob[jobId].count.elgeom[po] += c;
					Cantenna[antennaId].count.elgeom[po] += c;
					Cscan[scanId].count.elgeom[po] += c;
					Csource[sourceId].count.elgeom[po] += c;
					/* parangle */
					d0 = im0->parangle[po];
					d1 = im1->parangle[po];
					if((!isnan(d0)) && (!isnan(d1)))
					{
						d = d0-d1;
						f = d/(d0+d1)*2.0;
						c = 1.0;
					}
					else
					{
						if((!isnan(d0))||(!isnan(d1)))
						{
							d = 1E300;
							f = 1E200;
							c = 1.0;
						}
						else
						{
							d = 0.0;
							f = 0.0;
							c = 0.0;
						}
					}
					d2 = d*d;
					f2 = f*f;
					Call[0].sum.parangle[po] += d;
					Call[0].fsum.parangle[po] += f;
					Cjob[jobId].sum.parangle[po] += d;
					Cjob[jobId].fsum.parangle[po] += f;
					Cantenna[antennaId].sum.parangle[po] += d;
					Cantenna[antennaId].fsum.parangle[po] += f;
					Cscan[scanId].sum.parangle[po] += d;
					Cscan[scanId].fsum.parangle[po] += f;
					Csource[sourceId].sum.parangle[po] += d;
					Csource[sourceId].fsum.parangle[po] += f;
					Call[0].sumsqr.parangle[po] += d2;
					Call[0].fsumsqr.parangle[po] += f2;
					Cjob[jobId].sumsqr.parangle[po] += d2;
					Cjob[jobId].fsumsqr.parangle[po] += f2;
					Cantenna[antennaId].sumsqr.parangle[po] += d2;
					Cantenna[antennaId].fsumsqr.parangle[po] += f2;
					Cscan[scanId].sumsqr.parangle[po] += d2;
					Cscan[scanId].fsumsqr.parangle[po] += f2;
					Csource[sourceId].sumsqr.parangle[po] += d2;
					Csource[sourceId].fsumsqr.parangle[po] += f2;
					Call[0].count.parangle[po] += c;
					Cjob[jobId].count.parangle[po] += c;
					Cantenna[antennaId].count.parangle[po] += c;
					Cscan[scanId].count.parangle[po] += c;
					Csource[sourceId].count.parangle[po] += c;
					/* msa */
					d0 = im0->msa[po];
					d1 = im1->msa[po];
					if((!isnan(d0)) && (!isnan(d1)))
					{
						d = d0-d1;
						f = d/(d0+d1)*2.0;
						c = 1.0;
					}
					else
					{
						if((!isnan(d0))||(!isnan(d1)))
						{
							d = 1E300;
							f = 1E200;
							c = 1.0;
						}
						else
						{
							d = 0.0;
							f = 0.0;
							c = 0.0;
						}
					}
					d2 = d*d;
					f2 = f*f;
					Call[0].sum.msa[po] += d;
					Call[0].fsum.msa[po] += f;
					Cjob[jobId].sum.msa[po] += d;
					Cjob[jobId].fsum.msa[po] += f;
					Cantenna[antennaId].sum.msa[po] += d;
					Cantenna[antennaId].fsum.msa[po] += f;
					Cscan[scanId].sum.msa[po] += d;
					Cscan[scanId].fsum.msa[po] += f;
					Csource[sourceId].sum.msa[po] += d;
					Csource[sourceId].fsum.msa[po] += f;
					Call[0].sumsqr.msa[po] += d2;
					Call[0].fsumsqr.msa[po] += f2;
					Cjob[jobId].sumsqr.msa[po] += d2;
					Cjob[jobId].fsumsqr.msa[po] += f2;
					Cantenna[antennaId].sumsqr.msa[po] += d2;
					Cantenna[antennaId].fsumsqr.msa[po] += f2;
					Cscan[scanId].sumsqr.msa[po] += d2;
					Cscan[scanId].fsumsqr.msa[po] += f2;
					Csource[sourceId].sumsqr.msa[po] += d2;
					Csource[sourceId].fsumsqr.msa[po] += f2;
					Call[0].count.msa[po] += c;
					Cjob[jobId].count.msa[po] += c;
					Cantenna[antennaId].count.msa[po] += c;
					Cscan[scanId].count.msa[po] += c;
					Csource[sourceId].count.msa[po] += c;
					/* sc_gs_delay */
					d0 = im0->sc_gs_delay[po] * 1E-6;
					d1 = im1->sc_gs_delay[po] * 1E-6;
					if((!isnan(d0)) && (!isnan(d1)))
					{
						d = d0-d1;
						f = d/(d0+d1)*2.0;
						c = 1.0;
					}
					else
					{
						if((!isnan(d0))||(!isnan(d1)))
						{
							d = 1E300;
							f = 1E200;
							c = 1.0;
						}
						else
						{
							d = 0.0;
							f = 0.0;
							c = 0.0;
						}
					}
					d2 = d*d;
					f2 = f*f;
					Call[0].sum.sc_gs_delay[po] += d;
					Call[0].fsum.sc_gs_delay[po] += f;
					Cjob[jobId].sum.sc_gs_delay[po] += d;
					Cjob[jobId].fsum.sc_gs_delay[po] += f;
					Cantenna[antennaId].sum.sc_gs_delay[po] += d;
					Cantenna[antennaId].fsum.sc_gs_delay[po] += f;
					Cscan[scanId].sum.sc_gs_delay[po] += d;
					Cscan[scanId].fsum.sc_gs_delay[po] += f;
					Csource[sourceId].sum.sc_gs_delay[po] += d;
					Csource[sourceId].fsum.sc_gs_delay[po] += f;
					Call[0].sumsqr.sc_gs_delay[po] += d2;
					Call[0].fsumsqr.sc_gs_delay[po] += f2;
					Cjob[jobId].sumsqr.sc_gs_delay[po] += d2;
					Cjob[jobId].fsumsqr.sc_gs_delay[po] += f2;
					Cantenna[antennaId].sumsqr.sc_gs_delay[po] += d2;
					Cantenna[antennaId].fsumsqr.sc_gs_delay[po] += f2;
					Cscan[scanId].sumsqr.sc_gs_delay[po] += d2;
					Cscan[scanId].fsumsqr.sc_gs_delay[po] += f2;
					Csource[sourceId].sumsqr.sc_gs_delay[po] += d2;
					Csource[sourceId].fsumsqr.sc_gs_delay[po] += f2;
					Call[0].count.sc_gs_delay[po] += c;
					Cjob[jobId].count.sc_gs_delay[po] += c;
					Cantenna[antennaId].count.sc_gs_delay[po] += c;
					Cscan[scanId].count.sc_gs_delay[po] += c;
					Csource[sourceId].count.sc_gs_delay[po] += c;
					/* gs_sc_delay */
					d0 = im0->gs_sc_delay[po] * 1E-6;
					d1 = im1->gs_sc_delay[po] * 1E-6;
					if((!isnan(d0)) && (!isnan(d1)))
					{
						d = d0-d1;
						f = d/(d0+d1)*2.0;
						c = 1.0;
					}
					else
					{
						if((!isnan(d0))||(!isnan(d1)))
						{
							d = 1E300;
							f = 1E200;
							c = 1.0;
						}
						else
						{
							d = 0.0;
							f = 0.0;
							c = 0.0;
						}
					}
					d2 = d*d;
					f2 = f*f;
					Call[0].sum.gs_sc_delay[po] += d;
					Call[0].fsum.gs_sc_delay[po] += f;
					Cjob[jobId].sum.gs_sc_delay[po] += d;
					Cjob[jobId].fsum.gs_sc_delay[po] += f;
					Cantenna[antennaId].sum.gs_sc_delay[po] += d;
					Cantenna[antennaId].fsum.gs_sc_delay[po] += f;
					Cscan[scanId].sum.gs_sc_delay[po] += d;
					Cscan[scanId].fsum.gs_sc_delay[po] += f;
					Csource[sourceId].sum.gs_sc_delay[po] += d;
					Csource[sourceId].fsum.gs_sc_delay[po] += f;
					Call[0].sumsqr.gs_sc_delay[po] += d2;
					Call[0].fsumsqr.gs_sc_delay[po] += f2;
					Cjob[jobId].sumsqr.gs_sc_delay[po] += d2;
					Cjob[jobId].fsumsqr.gs_sc_delay[po] += f2;
					Cantenna[antennaId].sumsqr.gs_sc_delay[po] += d2;
					Cantenna[antennaId].fsumsqr.gs_sc_delay[po] += f2;
					Cscan[scanId].sumsqr.gs_sc_delay[po] += d2;
					Cscan[scanId].fsumsqr.gs_sc_delay[po] += f2;
					Csource[sourceId].sumsqr.gs_sc_delay[po] += d2;
					Csource[sourceId].fsumsqr.gs_sc_delay[po] += f2;
					Call[0].count.gs_sc_delay[po] += c;
					Cjob[jobId].count.gs_sc_delay[po] += c;
					Cantenna[antennaId].count.gs_sc_delay[po] += c;
					Cscan[scanId].count.gs_sc_delay[po] += c;
					Csource[sourceId].count.gs_sc_delay[po] += c;
					/* gs_clock_delay */
					d0 = im0->gs_clock_delay[po] * 1E-6;
					d1 = im1->gs_clock_delay[po] * 1E-6;
					if((!isnan(d0)) && (!isnan(d1)))
					{
						d = d0-d1;
						f = d/(d0+d1)*2.0;
						c = 1.0;
					}
					else
					{
						if((!isnan(d0))||(!isnan(d1)))
						{
							d = 1E300;
							f = 1E200;
							c = 1.0;
						}
						else
						{
							d = 0.0;
							f = 0.0;
							c = 0.0;
						}
					}
					d2 = d*d;
					f2 = f*f;
					Call[0].sum.gs_clock_delay[po] += d;
					Call[0].fsum.gs_clock_delay[po] += f;
					Cjob[jobId].sum.gs_clock_delay[po] += d;
					Cjob[jobId].fsum.gs_clock_delay[po] += f;
					Cantenna[antennaId].sum.gs_clock_delay[po] += d;
					Cantenna[antennaId].fsum.gs_clock_delay[po] += f;
					Cscan[scanId].sum.gs_clock_delay[po] += d;
					Cscan[scanId].fsum.gs_clock_delay[po] += f;
					Csource[sourceId].sum.gs_clock_delay[po] += d;
					Csource[sourceId].fsum.gs_clock_delay[po] += f;
					Call[0].sumsqr.gs_clock_delay[po] += d2;
					Call[0].fsumsqr.gs_clock_delay[po] += f2;
					Cjob[jobId].sumsqr.gs_clock_delay[po] += d2;
					Cjob[jobId].fsumsqr.gs_clock_delay[po] += f2;
					Cantenna[antennaId].sumsqr.gs_clock_delay[po] += d2;
					Cantenna[antennaId].fsumsqr.gs_clock_delay[po] += f2;
					Cscan[scanId].sumsqr.gs_clock_delay[po] += d2;
					Cscan[scanId].fsumsqr.gs_clock_delay[po] += f2;
					Csource[sourceId].sumsqr.gs_clock_delay[po] += d2;
					Csource[sourceId].fsumsqr.gs_clock_delay[po] += f2;
					Call[0].count.gs_clock_delay[po] += c;
					Cjob[jobId].count.gs_clock_delay[po] += c;
					Cantenna[antennaId].count.gs_clock_delay[po] += c;
					Cscan[scanId].count.gs_clock_delay[po] += c;
					Csource[sourceId].count.gs_clock_delay[po] += c;
					/* u */
					d0 = im0->u[po];
					d1 = im1->u[po];
					if((!isnan(d0)) && (!isnan(d1)))
					{
						d = d0-d1;
						f = d/(d0+d1)*2.0;
						c = 1.0;
					}
					else
					{
						if((!isnan(d0))||(!isnan(d1)))
						{
							d = 1E300;
							f = 1E200;
							c = 1.0;
						}
						else
						{
							d = 0.0;
							f = 0.0;
							c = 0.0;
						}
					}
					d2 = d*d;
					f2 = f*f;
					Call[0].sum.u[po] += d;
					Call[0].fsum.u[po] += f;
					Cjob[jobId].sum.u[po] += d;
					Cjob[jobId].fsum.u[po] += f;
					Cantenna[antennaId].sum.u[po] += d;
					Cantenna[antennaId].fsum.u[po] += f;
					Cscan[scanId].sum.u[po] += d;
					Cscan[scanId].fsum.u[po] += f;
					Csource[sourceId].sum.u[po] += d;
					Csource[sourceId].fsum.u[po] += f;
					Call[0].sumsqr.u[po] += d2;
					Call[0].fsumsqr.u[po] += f2;
					Cjob[jobId].sumsqr.u[po] += d2;
					Cjob[jobId].fsumsqr.u[po] += f2;
					Cantenna[antennaId].sumsqr.u[po] += d2;
					Cantenna[antennaId].fsumsqr.u[po] += f2;
					Cscan[scanId].sumsqr.u[po] += d2;
					Cscan[scanId].fsumsqr.u[po] += f2;
					Csource[sourceId].sumsqr.u[po] += d2;
					Csource[sourceId].fsumsqr.u[po] += f2;
					Call[0].count.u[po] += c;
					Cjob[jobId].count.u[po] += c;
					Cantenna[antennaId].count.u[po] += c;
					Cscan[scanId].count.u[po] += c;
					Csource[sourceId].count.u[po] += c;
					/* v */
					d0 = im0->v[po];
					d1 = im1->v[po];
					if((!isnan(d0)) && (!isnan(d1)))
					{
						d = d0-d1;
						f = d/(d0+d1)*2.0;
						c = 1.0;
					}
					else
					{
						if((!isnan(d0))||(!isnan(d1)))
						{
							d = 1E300;
							f = 1E200;
							c = 1.0;
						}
						else
						{
							d = 0.0;
							f = 0.0;
							c = 0.0;
						}
					}
					d2 = d*d;
					f2 = f*f;
					Call[0].sum.v[po] += d;
					Call[0].fsum.v[po] += f;
					Cjob[jobId].sum.v[po] += d;
					Cjob[jobId].fsum.v[po] += f;
					Cantenna[antennaId].sum.v[po] += d;
					Cantenna[antennaId].fsum.v[po] += f;
					Cscan[scanId].sum.v[po] += d;
					Cscan[scanId].fsum.v[po] += f;
					Csource[sourceId].sum.v[po] += d;
					Csource[sourceId].fsum.v[po] += f;
					Call[0].sumsqr.v[po] += d2;
					Call[0].fsumsqr.v[po] += f2;
					Cjob[jobId].sumsqr.v[po] += d2;
					Cjob[jobId].fsumsqr.v[po] += f2;
					Cantenna[antennaId].sumsqr.v[po] += d2;
					Cantenna[antennaId].fsumsqr.v[po] += f2;
					Cscan[scanId].sumsqr.v[po] += d2;
					Cscan[scanId].fsumsqr.v[po] += f2;
					Csource[sourceId].sumsqr.v[po] += d2;
					Csource[sourceId].fsumsqr.v[po] += f2;
					Call[0].count.v[po] += c;
					Cjob[jobId].count.v[po] += c;
					Cantenna[antennaId].count.v[po] += c;
					Cscan[scanId].count.v[po] += c;
					Csource[sourceId].count.v[po] += c;
					/* w */
					d0 = im0->w[po];
					d1 = im1->w[po];
					if((!isnan(d0)) && (!isnan(d1)))
					{
						d = d0-d1;
						f = d/(d0+d1)*2.0;
						c = 1.0;
					}
					else
					{
						if((!isnan(d0))||(!isnan(d1)))
						{
							d = 1E300;
							f = 1E200;
							c = 1.0;
						}
						else
						{
							d = 0.0;
							f = 0.0;
							c = 0.0;
						}
					}
					d2 = d*d;
					f2 = f*f;
					Call[0].sum.w[po] += d;
					Call[0].fsum.w[po] += f;
					Cjob[jobId].sum.w[po] += d;
					Cjob[jobId].fsum.w[po] += f;
					Cantenna[antennaId].sum.w[po] += d;
					Cantenna[antennaId].fsum.w[po] += f;
					Cscan[scanId].sum.w[po] += d;
					Cscan[scanId].fsum.w[po] += f;
					Csource[sourceId].sum.w[po] += d;
					Csource[sourceId].fsum.w[po] += f;
					Call[0].sumsqr.w[po] += d2;
					Call[0].fsumsqr.w[po] += f2;
					Cjob[jobId].sumsqr.w[po] += d2;
					Cjob[jobId].fsumsqr.w[po] += f2;
					Cantenna[antennaId].sumsqr.w[po] += d2;
					Cantenna[antennaId].fsumsqr.w[po] += f2;
					Cscan[scanId].sumsqr.w[po] += d2;
					Cscan[scanId].fsumsqr.w[po] += f2;
					Csource[sourceId].sumsqr.w[po] += d2;
					Csource[sourceId].fsumsqr.w[po] += f2;
					Call[0].count.w[po] += c;
					Cjob[jobId].count.w[po] += c;
					Cantenna[antennaId].count.w[po] += c;
					Cscan[scanId].count.w[po] += c;
					Csource[sourceId].count.w[po] += c;
					/*****************************************************/
					/* LMN */
					if(((imLMN0)) && ((imLMN1)))
					{
						/* dDelay_dl */
						d0 = imLMN0->dDelay_dl[po] * 1E-6;
						d1 = imLMN1->dDelay_dl[po] * 1E-6;
						if((!isnan(d0)) && (!isnan(d1)))
						{
							d = d0-d1;
							f = d/(d0+d1)*2.0;
							c = 1.0;
						}
						else
						{
							if((!isnan(d0))||(!isnan(d1)))
							{
								d = 1E300;
								f = 1E200;
								c = 1.0;
							}
							else
							{
								d = 0.0;
								f = 0.0;
								c = 0.0;
							}
						}
						d2 = d*d;
						f2 = f*f;
						Call[0].sum_lmn.dDelay_dl[po] += d;
						Call[0].fsum_lmn.dDelay_dl[po] += f;
						Cjob[jobId].sum_lmn.dDelay_dl[po] += d;
						Cjob[jobId].fsum_lmn.dDelay_dl[po] += f;
						Cantenna[antennaId].sum_lmn.dDelay_dl[po] += d;
						Cantenna[antennaId].fsum_lmn.dDelay_dl[po] += f;
						Cscan[scanId].sum_lmn.dDelay_dl[po] += d;
						Cscan[scanId].fsum_lmn.dDelay_dl[po] += f;
						Csource[sourceId].sum_lmn.dDelay_dl[po] += d;
						Csource[sourceId].fsum_lmn.dDelay_dl[po] += f;
						Call[0].sumsqr_lmn.dDelay_dl[po] += d2;
						Call[0].fsumsqr_lmn.dDelay_dl[po] += f2;
						Cjob[jobId].sumsqr_lmn.dDelay_dl[po] += d2;
						Cjob[jobId].fsumsqr_lmn.dDelay_dl[po] += f2;
						Cantenna[antennaId].sumsqr_lmn.dDelay_dl[po] += d2;
						Cantenna[antennaId].fsumsqr_lmn.dDelay_dl[po] += f2;
						Cscan[scanId].sumsqr_lmn.dDelay_dl[po] += d2;
						Cscan[scanId].fsumsqr_lmn.dDelay_dl[po] += f2;
						Csource[sourceId].sumsqr_lmn.dDelay_dl[po] += d2;
						Csource[sourceId].fsumsqr_lmn.dDelay_dl[po] += f2;
						Call[0].count_lmn.dDelay_dl[po] += c;
						Cjob[jobId].count_lmn.dDelay_dl[po] += c;
						Cantenna[antennaId].count_lmn.dDelay_dl[po] += c;
						Cscan[scanId].count_lmn.dDelay_dl[po] += c;
						Csource[sourceId].count_lmn.dDelay_dl[po] += c;
						/* dDelay_dm */
						d0 = imLMN0->dDelay_dm[po] * 1E-6;
						d1 = imLMN1->dDelay_dm[po] * 1E-6;
						if((!isnan(d0)) && (!isnan(d1)))
						{
							d = d0-d1;
							f = d/(d0+d1)*2.0;
							c = 1.0;
						}
						else
						{
							if((!isnan(d0))||(!isnan(d1)))
							{
								d = 1E300;
								f = 1E200;
								c = 1.0;
							}
							else
							{
								d = 0.0;
								f = 0.0;
								c = 0.0;
							}
						}
						d2 = d*d;
						f2 = f*f;
						Call[0].sum_lmn.dDelay_dm[po] += d;
						Call[0].fsum_lmn.dDelay_dm[po] += f;
						Cjob[jobId].sum_lmn.dDelay_dm[po] += d;
						Cjob[jobId].fsum_lmn.dDelay_dm[po] += f;
						Cantenna[antennaId].sum_lmn.dDelay_dm[po] += d;
						Cantenna[antennaId].fsum_lmn.dDelay_dm[po] += f;
						Cscan[scanId].sum_lmn.dDelay_dm[po] += d;
						Cscan[scanId].fsum_lmn.dDelay_dm[po] += f;
						Csource[sourceId].sum_lmn.dDelay_dm[po] += d;
						Csource[sourceId].fsum_lmn.dDelay_dm[po] += f;
						Call[0].sumsqr_lmn.dDelay_dm[po] += d2;
						Call[0].fsumsqr_lmn.dDelay_dm[po] += f2;
						Cjob[jobId].sumsqr_lmn.dDelay_dm[po] += d2;
						Cjob[jobId].fsumsqr_lmn.dDelay_dm[po] += f2;
						Cantenna[antennaId].sumsqr_lmn.dDelay_dm[po] += d2;
						Cantenna[antennaId].fsumsqr_lmn.dDelay_dm[po] += f2;
						Cscan[scanId].sumsqr_lmn.dDelay_dm[po] += d2;
						Cscan[scanId].fsumsqr_lmn.dDelay_dm[po] += f2;
						Csource[sourceId].sumsqr_lmn.dDelay_dm[po] += d2;
						Csource[sourceId].fsumsqr_lmn.dDelay_dm[po] += f2;
						Call[0].count_lmn.dDelay_dm[po] += c;
						Cjob[jobId].count_lmn.dDelay_dm[po] += c;
						Cantenna[antennaId].count_lmn.dDelay_dm[po] += c;
						Cscan[scanId].count_lmn.dDelay_dm[po] += c;
						Csource[sourceId].count_lmn.dDelay_dm[po] += c;
						/* dDelay_dn */
						d0 = imLMN0->dDelay_dn[po] * 1E-6;
						d1 = imLMN1->dDelay_dn[po] * 1E-6;
						if((!isnan(d0)) && (!isnan(d1)))
						{
							d = d0-d1;
							f = d/(d0+d1)*2.0;
							c = 1.0;
						}
						else
						{
							if((!isnan(d0))||(!isnan(d1)))
							{
								d = 1E300;
								f = 1E200;
								c = 1.0;
							}
							else
							{
								d = 0.0;
								f = 0.0;
								c = 0.0;
							}
						}
						d2 = d*d;
						f2 = f*f;
						Call[0].sum_lmn.dDelay_dn[po] += d;
						Call[0].fsum_lmn.dDelay_dn[po] += f;
						Cjob[jobId].sum_lmn.dDelay_dn[po] += d;
						Cjob[jobId].fsum_lmn.dDelay_dn[po] += f;
						Cantenna[antennaId].sum_lmn.dDelay_dn[po] += d;
						Cantenna[antennaId].fsum_lmn.dDelay_dn[po] += f;
						Cscan[scanId].sum_lmn.dDelay_dn[po] += d;
						Cscan[scanId].fsum_lmn.dDelay_dn[po] += f;
						Csource[sourceId].sum_lmn.dDelay_dn[po] += d;
						Csource[sourceId].fsum_lmn.dDelay_dn[po] += f;
						Call[0].sumsqr_lmn.dDelay_dn[po] += d2;
						Call[0].fsumsqr_lmn.dDelay_dn[po] += f2;
						Cjob[jobId].sumsqr_lmn.dDelay_dn[po] += d2;
						Cjob[jobId].fsumsqr_lmn.dDelay_dn[po] += f2;
						Cantenna[antennaId].sumsqr_lmn.dDelay_dn[po] += d2;
						Cantenna[antennaId].fsumsqr_lmn.dDelay_dn[po] += f2;
						Cscan[scanId].sumsqr_lmn.dDelay_dn[po] += d2;
						Cscan[scanId].fsumsqr_lmn.dDelay_dn[po] += f2;
						Csource[sourceId].sumsqr_lmn.dDelay_dn[po] += d2;
						Csource[sourceId].fsumsqr_lmn.dDelay_dn[po] += f2;
						Call[0].count_lmn.dDelay_dn[po] += c;
						Cjob[jobId].count_lmn.dDelay_dn[po] += c;
						Cantenna[antennaId].count_lmn.dDelay_dn[po] += c;
						Cscan[scanId].count_lmn.dDelay_dn[po] += c;
						Csource[sourceId].count_lmn.dDelay_dn[po] += c;
						/* d2Delay_dldl */
						d0 = imLMN0->d2Delay_dldl[po] * 1E-6;
						d1 = imLMN1->d2Delay_dldl[po] * 1E-6;
						if((!isnan(d0)) && (!isnan(d1)))
						{
							d = d0-d1;
							f = d/(d0+d1)*2.0;
							c = 1.0;
						}
						else
						{
							if((!isnan(d0))||(!isnan(d1)))
							{
								d = 1E300;
								f = 1E200;
								c = 1.0;
							}
							else
							{
								d = 0.0;
								f = 0.0;
								c = 0.0;
							}
						}
						d2 = d*d;
						f2 = f*f;
						Call[0].sum_lmn.d2Delay_dldl[po] += d;
						Call[0].fsum_lmn.d2Delay_dldl[po] += f;
						Cjob[jobId].sum_lmn.d2Delay_dldl[po] += d;
						Cjob[jobId].fsum_lmn.d2Delay_dldl[po] += f;
						Cantenna[antennaId].sum_lmn.d2Delay_dldl[po] += d;
						Cantenna[antennaId].fsum_lmn.d2Delay_dldl[po] += f;
						Cscan[scanId].sum_lmn.d2Delay_dldl[po] += d;
						Cscan[scanId].fsum_lmn.d2Delay_dldl[po] += f;
						Csource[sourceId].sum_lmn.d2Delay_dldl[po] += d;
						Csource[sourceId].fsum_lmn.d2Delay_dldl[po] += f;
						Call[0].sumsqr_lmn.d2Delay_dldl[po] += d2;
						Call[0].fsumsqr_lmn.d2Delay_dldl[po] += f2;
						Cjob[jobId].sumsqr_lmn.d2Delay_dldl[po] += d2;
						Cjob[jobId].fsumsqr_lmn.d2Delay_dldl[po] += f2;
						Cantenna[antennaId].sumsqr_lmn.d2Delay_dldl[po] += d2;
						Cantenna[antennaId].fsumsqr_lmn.d2Delay_dldl[po] += f2;
						Cscan[scanId].sumsqr_lmn.d2Delay_dldl[po] += d2;
						Cscan[scanId].fsumsqr_lmn.d2Delay_dldl[po] += f2;
						Csource[sourceId].sumsqr_lmn.d2Delay_dldl[po] += d2;
						Csource[sourceId].fsumsqr_lmn.d2Delay_dldl[po] += f2;
						Call[0].count_lmn.d2Delay_dldl[po] += c;
						Cjob[jobId].count_lmn.d2Delay_dldl[po] += c;
						Cantenna[antennaId].count_lmn.d2Delay_dldl[po] += c;
						Cscan[scanId].count_lmn.d2Delay_dldl[po] += c;
						Csource[sourceId].count_lmn.d2Delay_dldl[po] += c;
						/* d2Delay_dldm */
						d0 = imLMN0->d2Delay_dldm[po] * 1E-6;
						d1 = imLMN1->d2Delay_dldm[po] * 1E-6;
						if((!isnan(d0)) && (!isnan(d1)))
						{
							d = d0-d1;
							f = d/(d0+d1)*2.0;
							c = 1.0;
						}
						else
						{
							if((!isnan(d0))||(!isnan(d1)))
							{
								d = 1E300;
								f = 1E200;
								c = 1.0;
							}
							else
							{
								d = 0.0;
								f = 0.0;
								c = 0.0;
							}
						}
						d2 = d*d;
						f2 = f*f;
						Call[0].sum_lmn.d2Delay_dldm[po] += d;
						Call[0].fsum_lmn.d2Delay_dldm[po] += f;
						Cjob[jobId].sum_lmn.d2Delay_dldm[po] += d;
						Cjob[jobId].fsum_lmn.d2Delay_dldm[po] += f;
						Cantenna[antennaId].sum_lmn.d2Delay_dldm[po] += d;
						Cantenna[antennaId].fsum_lmn.d2Delay_dldm[po] += f;
						Cscan[scanId].sum_lmn.d2Delay_dldm[po] += d;
						Cscan[scanId].fsum_lmn.d2Delay_dldm[po] += f;
						Csource[sourceId].sum_lmn.d2Delay_dldm[po] += d;
						Csource[sourceId].fsum_lmn.d2Delay_dldm[po] += f;
						Call[0].sumsqr_lmn.d2Delay_dldm[po] += d2;
						Call[0].fsumsqr_lmn.d2Delay_dldm[po] += f2;
						Cjob[jobId].sumsqr_lmn.d2Delay_dldm[po] += d2;
						Cjob[jobId].fsumsqr_lmn.d2Delay_dldm[po] += f2;
						Cantenna[antennaId].sumsqr_lmn.d2Delay_dldm[po] += d2;
						Cantenna[antennaId].fsumsqr_lmn.d2Delay_dldm[po] += f2;
						Cscan[scanId].sumsqr_lmn.d2Delay_dldm[po] += d2;
						Cscan[scanId].fsumsqr_lmn.d2Delay_dldm[po] += f2;
						Csource[sourceId].sumsqr_lmn.d2Delay_dldm[po] += d2;
						Csource[sourceId].fsumsqr_lmn.d2Delay_dldm[po] += f2;
						Call[0].count_lmn.d2Delay_dldm[po] += c;
						Cjob[jobId].count_lmn.d2Delay_dldm[po] += c;
						Cantenna[antennaId].count_lmn.d2Delay_dldm[po] += c;
						Cscan[scanId].count_lmn.d2Delay_dldm[po] += c;
						Csource[sourceId].count_lmn.d2Delay_dldm[po] += c;
						/* d2Delay_dldn */
						d0 = imLMN0->d2Delay_dldn[po] * 1E-6;
						d1 = imLMN1->d2Delay_dldn[po] * 1E-6;
						if((!isnan(d0)) && (!isnan(d1)))
						{
							d = d0-d1;
							f = d/(d0+d1)*2.0;
							c = 1.0;
						}
						else
						{
							if((!isnan(d0))||(!isnan(d1)))
							{
								d = 1E300;
								f = 1E200;
								c = 1.0;
							}
							else
							{
								d = 0.0;
								f = 0.0;
								c = 0.0;
							}
						}
						d2 = d*d;
						f2 = f*f;
						Call[0].sum_lmn.d2Delay_dldn[po] += d;
						Call[0].fsum_lmn.d2Delay_dldn[po] += f;
						Cjob[jobId].sum_lmn.d2Delay_dldn[po] += d;
						Cjob[jobId].fsum_lmn.d2Delay_dldn[po] += f;
						Cantenna[antennaId].sum_lmn.d2Delay_dldn[po] += d;
						Cantenna[antennaId].fsum_lmn.d2Delay_dldn[po] += f;
						Cscan[scanId].sum_lmn.d2Delay_dldn[po] += d;
						Cscan[scanId].fsum_lmn.d2Delay_dldn[po] += f;
						Csource[sourceId].sum_lmn.d2Delay_dldn[po] += d;
						Csource[sourceId].fsum_lmn.d2Delay_dldn[po] += f;
						Call[0].sumsqr_lmn.d2Delay_dldn[po] += d2;
						Call[0].fsumsqr_lmn.d2Delay_dldn[po] += f2;
						Cjob[jobId].sumsqr_lmn.d2Delay_dldn[po] += d2;
						Cjob[jobId].fsumsqr_lmn.d2Delay_dldn[po] += f2;
						Cantenna[antennaId].sumsqr_lmn.d2Delay_dldn[po] += d2;
						Cantenna[antennaId].fsumsqr_lmn.d2Delay_dldn[po] += f2;
						Cscan[scanId].sumsqr_lmn.d2Delay_dldn[po] += d2;
						Cscan[scanId].fsumsqr_lmn.d2Delay_dldn[po] += f2;
						Csource[sourceId].sumsqr_lmn.d2Delay_dldn[po] += d2;
						Csource[sourceId].fsumsqr_lmn.d2Delay_dldn[po] += f2;
						Call[0].count_lmn.d2Delay_dldn[po] += c;
						Cjob[jobId].count_lmn.d2Delay_dldn[po] += c;
						Cantenna[antennaId].count_lmn.d2Delay_dldn[po] += c;
						Cscan[scanId].count_lmn.d2Delay_dldn[po] += c;
						Csource[sourceId].count_lmn.d2Delay_dldn[po] += c;
						/* d2Delay_dmdm */
						d0 = imLMN0->d2Delay_dmdm[po] * 1E-6;
						d1 = imLMN1->d2Delay_dmdm[po] * 1E-6;
						if((!isnan(d0)) && (!isnan(d1)))
						{
							d = d0-d1;
							f = d/(d0+d1)*2.0;
							c = 1.0;
						}
						else
						{
							if((!isnan(d0))||(!isnan(d1)))
							{
								d = 1E300;
								f = 1E200;
								c = 1.0;
							}
							else
							{
								d = 0.0;
								f = 0.0;
								c = 0.0;
							}
						}
						d2 = d*d;
						f2 = f*f;
						Call[0].sum_lmn.d2Delay_dmdm[po] += d;
						Call[0].fsum_lmn.d2Delay_dmdm[po] += f;
						Cjob[jobId].sum_lmn.d2Delay_dmdm[po] += d;
						Cjob[jobId].fsum_lmn.d2Delay_dmdm[po] += f;
						Cantenna[antennaId].sum_lmn.d2Delay_dmdm[po] += d;
						Cantenna[antennaId].fsum_lmn.d2Delay_dmdm[po] += f;
						Cscan[scanId].sum_lmn.d2Delay_dmdm[po] += d;
						Cscan[scanId].fsum_lmn.d2Delay_dmdm[po] += f;
						Csource[sourceId].sum_lmn.d2Delay_dmdm[po] += d;
						Csource[sourceId].fsum_lmn.d2Delay_dmdm[po] += f;
						Call[0].sumsqr_lmn.d2Delay_dmdm[po] += d2;
						Call[0].fsumsqr_lmn.d2Delay_dmdm[po] += f2;
						Cjob[jobId].sumsqr_lmn.d2Delay_dmdm[po] += d2;
						Cjob[jobId].fsumsqr_lmn.d2Delay_dmdm[po] += f2;
						Cantenna[antennaId].sumsqr_lmn.d2Delay_dmdm[po] += d2;
						Cantenna[antennaId].fsumsqr_lmn.d2Delay_dmdm[po] += f2;
						Cscan[scanId].sumsqr_lmn.d2Delay_dmdm[po] += d2;
						Cscan[scanId].fsumsqr_lmn.d2Delay_dmdm[po] += f2;
						Csource[sourceId].sumsqr_lmn.d2Delay_dmdm[po] += d2;
						Csource[sourceId].fsumsqr_lmn.d2Delay_dmdm[po] += f2;
						Call[0].count_lmn.d2Delay_dmdm[po] += c;
						Cjob[jobId].count_lmn.d2Delay_dmdm[po] += c;
						Cantenna[antennaId].count_lmn.d2Delay_dmdm[po] += c;
						Cscan[scanId].count_lmn.d2Delay_dmdm[po] += c;
						Csource[sourceId].count_lmn.d2Delay_dmdm[po] += c;
						/* d2Delay_dmdn */
						d0 = imLMN0->d2Delay_dmdn[po] * 1E-6;
						d1 = imLMN1->d2Delay_dmdn[po] * 1E-6;
						if((!isnan(d0)) && (!isnan(d1)))
						{
							d = d0-d1;
							f = d/(d0+d1)*2.0;
							c = 1.0;
						}
						else
						{
							if((!isnan(d0))||(!isnan(d1)))
							{
								d = 1E300;
								f = 1E200;
								c = 1.0;
							}
							else
							{
								d = 0.0;
								f = 0.0;
								c = 0.0;
							}
						}
						d2 = d*d;
						f2 = f*f;
						Call[0].sum_lmn.d2Delay_dmdn[po] += d;
						Call[0].fsum_lmn.d2Delay_dmdn[po] += f;
						Cjob[jobId].sum_lmn.d2Delay_dmdn[po] += d;
						Cjob[jobId].fsum_lmn.d2Delay_dmdn[po] += f;
						Cantenna[antennaId].sum_lmn.d2Delay_dmdn[po] += d;
						Cantenna[antennaId].fsum_lmn.d2Delay_dmdn[po] += f;
						Cscan[scanId].sum_lmn.d2Delay_dmdn[po] += d;
						Cscan[scanId].fsum_lmn.d2Delay_dmdn[po] += f;
						Csource[sourceId].sum_lmn.d2Delay_dmdn[po] += d;
						Csource[sourceId].fsum_lmn.d2Delay_dmdn[po] += f;
						Call[0].sumsqr_lmn.d2Delay_dmdn[po] += d2;
						Call[0].fsumsqr_lmn.d2Delay_dmdn[po] += f2;
						Cjob[jobId].sumsqr_lmn.d2Delay_dmdn[po] += d2;
						Cjob[jobId].fsumsqr_lmn.d2Delay_dmdn[po] += f2;
						Cantenna[antennaId].sumsqr_lmn.d2Delay_dmdn[po] += d2;
						Cantenna[antennaId].fsumsqr_lmn.d2Delay_dmdn[po] += f2;
						Cscan[scanId].sumsqr_lmn.d2Delay_dmdn[po] += d2;
						Cscan[scanId].fsumsqr_lmn.d2Delay_dmdn[po] += f2;
						Csource[sourceId].sumsqr_lmn.d2Delay_dmdn[po] += d2;
						Csource[sourceId].fsumsqr_lmn.d2Delay_dmdn[po] += f2;
						Call[0].count_lmn.d2Delay_dmdn[po] += c;
						Cjob[jobId].count_lmn.d2Delay_dmdn[po] += c;
						Cantenna[antennaId].count_lmn.d2Delay_dmdn[po] += c;
						Cscan[scanId].count_lmn.d2Delay_dmdn[po] += c;
						Csource[sourceId].count_lmn.d2Delay_dmdn[po] += c;
						/* d2Delay_dndn */
						d0 = imLMN0->d2Delay_dndn[po] * 1E-6;
						d1 = imLMN1->d2Delay_dndn[po] * 1E-6;
						if((!isnan(d0)) && (!isnan(d1)))
						{
							d = d0-d1;
							f = d/(d0+d1)*2.0;
							c = 1.0;
						}
						else
						{
							if((!isnan(d0))||(!isnan(d1)))
							{
								d = 1E300;
								f = 1E200;
								c = 1.0;
							}
							else
							{
								d = 0.0;
								f = 0.0;
								c = 0.0;
							}
						}
						d2 = d*d;
						f2 = f*f;
						Call[0].sum_lmn.d2Delay_dndn[po] += d;
						Call[0].fsum_lmn.d2Delay_dndn[po] += f;
						Cjob[jobId].sum_lmn.d2Delay_dndn[po] += d;
						Cjob[jobId].fsum_lmn.d2Delay_dndn[po] += f;
						Cantenna[antennaId].sum_lmn.d2Delay_dndn[po] += d;
						Cantenna[antennaId].fsum_lmn.d2Delay_dndn[po] += f;
						Cscan[scanId].sum_lmn.d2Delay_dndn[po] += d;
						Cscan[scanId].fsum_lmn.d2Delay_dndn[po] += f;
						Csource[sourceId].sum_lmn.d2Delay_dndn[po] += d;
						Csource[sourceId].fsum_lmn.d2Delay_dndn[po] += f;
						Call[0].sumsqr_lmn.d2Delay_dndn[po] += d2;
						Call[0].fsumsqr_lmn.d2Delay_dndn[po] += f2;
						Cjob[jobId].sumsqr_lmn.d2Delay_dndn[po] += d2;
						Cjob[jobId].fsumsqr_lmn.d2Delay_dndn[po] += f2;
						Cantenna[antennaId].sumsqr_lmn.d2Delay_dndn[po] += d2;
						Cantenna[antennaId].fsumsqr_lmn.d2Delay_dndn[po] += f2;
						Cscan[scanId].sumsqr_lmn.d2Delay_dndn[po] += d2;
						Cscan[scanId].fsumsqr_lmn.d2Delay_dndn[po] += f2;
						Csource[sourceId].sumsqr_lmn.d2Delay_dndn[po] += d2;
						Csource[sourceId].fsumsqr_lmn.d2Delay_dndn[po] += f2;
						Call[0].count_lmn.d2Delay_dndn[po] += c;
						Cjob[jobId].count_lmn.d2Delay_dndn[po] += c;
						Cantenna[antennaId].count_lmn.d2Delay_dndn[po] += c;
						Cscan[scanId].count_lmn.d2Delay_dndn[po] += c;
						Csource[sourceId].count_lmn.d2Delay_dndn[po] += c;
					}
					else if(((imLMN0)) || ((imLMN1)))
					{
						d = 1E300;
						f = 1E200;
						d2 = d*d;
						f2 = f*f;
						c = 1.0;
						/* dDelay_dl */
						Call[0].sum_lmn.dDelay_dl[po] += d;
						Call[0].fsum_lmn.dDelay_dl[po] += f;
						Cjob[jobId].sum_lmn.dDelay_dl[po] += d;
						Cjob[jobId].fsum_lmn.dDelay_dl[po] += f;
						Cantenna[antennaId].sum_lmn.dDelay_dl[po] += d;
						Cantenna[antennaId].fsum_lmn.dDelay_dl[po] += f;
						Cscan[scanId].sum_lmn.dDelay_dl[po] += d;
						Cscan[scanId].fsum_lmn.dDelay_dl[po] += f;
						Csource[sourceId].sum_lmn.dDelay_dl[po] += d;
						Csource[sourceId].fsum_lmn.dDelay_dl[po] += f;
						Call[0].sumsqr_lmn.dDelay_dl[po] += d2;
						Call[0].fsumsqr_lmn.dDelay_dl[po] += f2;
						Cjob[jobId].sumsqr_lmn.dDelay_dl[po] += d2;
						Cjob[jobId].fsumsqr_lmn.dDelay_dl[po] += f2;
						Cantenna[antennaId].sumsqr_lmn.dDelay_dl[po] += d2;
						Cantenna[antennaId].fsumsqr_lmn.dDelay_dl[po] += f2;
						Cscan[scanId].sumsqr_lmn.dDelay_dl[po] += d2;
						Cscan[scanId].fsumsqr_lmn.dDelay_dl[po] += f2;
						Csource[sourceId].sumsqr_lmn.dDelay_dl[po] += d2;
						Csource[sourceId].fsumsqr_lmn.dDelay_dl[po] += f2;
						Call[0].count_lmn.dDelay_dl[po] += c;
						Cjob[jobId].count_lmn.dDelay_dl[po] += c;
						Cantenna[antennaId].count_lmn.dDelay_dl[po] += c;
						Cscan[scanId].count_lmn.dDelay_dl[po] += c;
						Csource[sourceId].count_lmn.dDelay_dl[po] += c;
						/* dDelay_dm */
						Call[0].sum_lmn.dDelay_dm[po] += d;
						Call[0].fsum_lmn.dDelay_dm[po] += f;
						Cjob[jobId].sum_lmn.dDelay_dm[po] += d;
						Cjob[jobId].fsum_lmn.dDelay_dm[po] += f;
						Cantenna[antennaId].sum_lmn.dDelay_dm[po] += d;
						Cantenna[antennaId].fsum_lmn.dDelay_dm[po] += f;
						Cscan[scanId].sum_lmn.dDelay_dm[po] += d;
						Cscan[scanId].fsum_lmn.dDelay_dm[po] += f;
						Csource[sourceId].sum_lmn.dDelay_dm[po] += d;
						Csource[sourceId].fsum_lmn.dDelay_dm[po] += f;
						Call[0].sumsqr_lmn.dDelay_dm[po] += d2;
						Call[0].fsumsqr_lmn.dDelay_dm[po] += f2;
						Cjob[jobId].sumsqr_lmn.dDelay_dm[po] += d2;
						Cjob[jobId].fsumsqr_lmn.dDelay_dm[po] += f2;
						Cantenna[antennaId].sumsqr_lmn.dDelay_dm[po] += d2;
						Cantenna[antennaId].fsumsqr_lmn.dDelay_dm[po] += f2;
						Cscan[scanId].sumsqr_lmn.dDelay_dm[po] += d2;
						Cscan[scanId].fsumsqr_lmn.dDelay_dm[po] += f2;
						Csource[sourceId].sumsqr_lmn.dDelay_dm[po] += d2;
						Csource[sourceId].fsumsqr_lmn.dDelay_dm[po] += f2;
						Call[0].count_lmn.dDelay_dm[po] += c;
						Cjob[jobId].count_lmn.dDelay_dm[po] += c;
						Cantenna[antennaId].count_lmn.dDelay_dm[po] += c;
						Cscan[scanId].count_lmn.dDelay_dm[po] += c;
						Csource[sourceId].count_lmn.dDelay_dm[po] += c;
						/* dDelay_dn */
						Call[0].sum_lmn.dDelay_dn[po] += d;
						Call[0].fsum_lmn.dDelay_dn[po] += f;
						Cjob[jobId].sum_lmn.dDelay_dn[po] += d;
						Cjob[jobId].fsum_lmn.dDelay_dn[po] += f;
						Cantenna[antennaId].sum_lmn.dDelay_dn[po] += d;
						Cantenna[antennaId].fsum_lmn.dDelay_dn[po] += f;
						Cscan[scanId].sum_lmn.dDelay_dn[po] += d;
						Cscan[scanId].fsum_lmn.dDelay_dn[po] += f;
						Csource[sourceId].sum_lmn.dDelay_dn[po] += d;
						Csource[sourceId].fsum_lmn.dDelay_dn[po] += f;
						Call[0].sumsqr_lmn.dDelay_dn[po] += d2;
						Call[0].fsumsqr_lmn.dDelay_dn[po] += f2;
						Cjob[jobId].sumsqr_lmn.dDelay_dn[po] += d2;
						Cjob[jobId].fsumsqr_lmn.dDelay_dn[po] += f2;
						Cantenna[antennaId].sumsqr_lmn.dDelay_dn[po] += d2;
						Cantenna[antennaId].fsumsqr_lmn.dDelay_dn[po] += f2;
						Cscan[scanId].sumsqr_lmn.dDelay_dn[po] += d2;
						Cscan[scanId].fsumsqr_lmn.dDelay_dn[po] += f2;
						Csource[sourceId].sumsqr_lmn.dDelay_dn[po] += d2;
						Csource[sourceId].fsumsqr_lmn.dDelay_dn[po] += f2;
						Call[0].count_lmn.dDelay_dn[po] += c;
						Cjob[jobId].count_lmn.dDelay_dn[po] += c;
						Cantenna[antennaId].count_lmn.dDelay_dn[po] += c;
						Cscan[scanId].count_lmn.dDelay_dn[po] += c;
						Csource[sourceId].count_lmn.dDelay_dn[po] += c;
						/* d2Delay_dldl */
						Call[0].sum_lmn.d2Delay_dldl[po] += d;
						Call[0].fsum_lmn.d2Delay_dldl[po] += f;
						Cjob[jobId].sum_lmn.d2Delay_dldl[po] += d;
						Cjob[jobId].fsum_lmn.d2Delay_dldl[po] += f;
						Cantenna[antennaId].sum_lmn.d2Delay_dldl[po] += d;
						Cantenna[antennaId].fsum_lmn.d2Delay_dldl[po] += f;
						Cscan[scanId].sum_lmn.d2Delay_dldl[po] += d;
						Cscan[scanId].fsum_lmn.d2Delay_dldl[po] += f;
						Csource[sourceId].sum_lmn.d2Delay_dldl[po] += d;
						Csource[sourceId].fsum_lmn.d2Delay_dldl[po] += f;
						Call[0].sumsqr_lmn.d2Delay_dldl[po] += d2;
						Call[0].fsumsqr_lmn.d2Delay_dldl[po] += f2;
						Cjob[jobId].sumsqr_lmn.d2Delay_dldl[po] += d2;
						Cjob[jobId].fsumsqr_lmn.d2Delay_dldl[po] += f2;
						Cantenna[antennaId].sumsqr_lmn.d2Delay_dldl[po] += d2;
						Cantenna[antennaId].fsumsqr_lmn.d2Delay_dldl[po] += f2;
						Cscan[scanId].sumsqr_lmn.d2Delay_dldl[po] += d2;
						Cscan[scanId].fsumsqr_lmn.d2Delay_dldl[po] += f2;
						Csource[sourceId].sumsqr_lmn.d2Delay_dldl[po] += d2;
						Csource[sourceId].fsumsqr_lmn.d2Delay_dldl[po] += f2;
						Call[0].count_lmn.d2Delay_dldl[po] += c;
						Cjob[jobId].count_lmn.d2Delay_dldl[po] += c;
						Cantenna[antennaId].count_lmn.d2Delay_dldl[po] += c;
						Cscan[scanId].count_lmn.d2Delay_dldl[po] += c;
						Csource[sourceId].count_lmn.d2Delay_dldl[po] += c;
						/* d2Delay_dldm */
						Call[0].sum_lmn.d2Delay_dldm[po] += d;
						Call[0].fsum_lmn.d2Delay_dldm[po] += f;
						Cjob[jobId].sum_lmn.d2Delay_dldm[po] += d;
						Cjob[jobId].fsum_lmn.d2Delay_dldm[po] += f;
						Cantenna[antennaId].sum_lmn.d2Delay_dldm[po] += d;
						Cantenna[antennaId].fsum_lmn.d2Delay_dldm[po] += f;
						Cscan[scanId].sum_lmn.d2Delay_dldm[po] += d;
						Cscan[scanId].fsum_lmn.d2Delay_dldm[po] += f;
						Csource[sourceId].sum_lmn.d2Delay_dldm[po] += d;
						Csource[sourceId].fsum_lmn.d2Delay_dldm[po] += f;
						Call[0].sumsqr_lmn.d2Delay_dldm[po] += d2;
						Call[0].fsumsqr_lmn.d2Delay_dldm[po] += f2;
						Cjob[jobId].sumsqr_lmn.d2Delay_dldm[po] += d2;
						Cjob[jobId].fsumsqr_lmn.d2Delay_dldm[po] += f2;
						Cantenna[antennaId].sumsqr_lmn.d2Delay_dldm[po] += d2;
						Cantenna[antennaId].fsumsqr_lmn.d2Delay_dldm[po] += f2;
						Cscan[scanId].sumsqr_lmn.d2Delay_dldm[po] += d2;
						Cscan[scanId].fsumsqr_lmn.d2Delay_dldm[po] += f2;
						Csource[sourceId].sumsqr_lmn.d2Delay_dldm[po] += d2;
						Csource[sourceId].fsumsqr_lmn.d2Delay_dldm[po] += f2;
						Call[0].count_lmn.d2Delay_dldm[po] += c;
						Cjob[jobId].count_lmn.d2Delay_dldm[po] += c;
						Cantenna[antennaId].count_lmn.d2Delay_dldm[po] += c;
						Cscan[scanId].count_lmn.d2Delay_dldm[po] += c;
						Csource[sourceId].count_lmn.d2Delay_dldm[po] += c;
						/* d2Delay_dldn */
						Call[0].sum_lmn.d2Delay_dldn[po] += d;
						Call[0].fsum_lmn.d2Delay_dldn[po] += f;
						Cjob[jobId].sum_lmn.d2Delay_dldn[po] += d;
						Cjob[jobId].fsum_lmn.d2Delay_dldn[po] += f;
						Cantenna[antennaId].sum_lmn.d2Delay_dldn[po] += d;
						Cantenna[antennaId].fsum_lmn.d2Delay_dldn[po] += f;
						Cscan[scanId].sum_lmn.d2Delay_dldn[po] += d;
						Cscan[scanId].fsum_lmn.d2Delay_dldn[po] += f;
						Csource[sourceId].sum_lmn.d2Delay_dldn[po] += d;
						Csource[sourceId].fsum_lmn.d2Delay_dldn[po] += f;
						Call[0].sumsqr_lmn.d2Delay_dldn[po] += d2;
						Call[0].fsumsqr_lmn.d2Delay_dldn[po] += f2;
						Cjob[jobId].sumsqr_lmn.d2Delay_dldn[po] += d2;
						Cjob[jobId].fsumsqr_lmn.d2Delay_dldn[po] += f2;
						Cantenna[antennaId].sumsqr_lmn.d2Delay_dldn[po] += d2;
						Cantenna[antennaId].fsumsqr_lmn.d2Delay_dldn[po] += f2;
						Cscan[scanId].sumsqr_lmn.d2Delay_dldn[po] += d2;
						Cscan[scanId].fsumsqr_lmn.d2Delay_dldn[po] += f2;
						Csource[sourceId].sumsqr_lmn.d2Delay_dldn[po] += d2;
						Csource[sourceId].fsumsqr_lmn.d2Delay_dldn[po] += f2;
						Call[0].count_lmn.d2Delay_dldn[po] += c;
						Cjob[jobId].count_lmn.d2Delay_dldn[po] += c;
						Cantenna[antennaId].count_lmn.d2Delay_dldn[po] += c;
						Cscan[scanId].count_lmn.d2Delay_dldn[po] += c;
						Csource[sourceId].count_lmn.d2Delay_dldn[po] += c;
						/* d2Delay_dmdm */
						Call[0].sum_lmn.d2Delay_dmdm[po] += d;
						Call[0].fsum_lmn.d2Delay_dmdm[po] += f;
						Cjob[jobId].sum_lmn.d2Delay_dmdm[po] += d;
						Cjob[jobId].fsum_lmn.d2Delay_dmdm[po] += f;
						Cantenna[antennaId].sum_lmn.d2Delay_dmdm[po] += d;
						Cantenna[antennaId].fsum_lmn.d2Delay_dmdm[po] += f;
						Cscan[scanId].sum_lmn.d2Delay_dmdm[po] += d;
						Cscan[scanId].fsum_lmn.d2Delay_dmdm[po] += f;
						Csource[sourceId].sum_lmn.d2Delay_dmdm[po] += d;
						Csource[sourceId].fsum_lmn.d2Delay_dmdm[po] += f;
						Call[0].sumsqr_lmn.d2Delay_dmdm[po] += d2;
						Call[0].fsumsqr_lmn.d2Delay_dmdm[po] += f2;
						Cjob[jobId].sumsqr_lmn.d2Delay_dmdm[po] += d2;
						Cjob[jobId].fsumsqr_lmn.d2Delay_dmdm[po] += f2;
						Cantenna[antennaId].sumsqr_lmn.d2Delay_dmdm[po] += d2;
						Cantenna[antennaId].fsumsqr_lmn.d2Delay_dmdm[po] += f2;
						Cscan[scanId].sumsqr_lmn.d2Delay_dmdm[po] += d2;
						Cscan[scanId].fsumsqr_lmn.d2Delay_dmdm[po] += f2;
						Csource[sourceId].sumsqr_lmn.d2Delay_dmdm[po] += d2;
						Csource[sourceId].fsumsqr_lmn.d2Delay_dmdm[po] += f2;
						Call[0].count_lmn.d2Delay_dmdm[po] += c;
						Cjob[jobId].count_lmn.d2Delay_dmdm[po] += c;
						Cantenna[antennaId].count_lmn.d2Delay_dmdm[po] += c;
						Cscan[scanId].count_lmn.d2Delay_dmdm[po] += c;
						Csource[sourceId].count_lmn.d2Delay_dmdm[po] += c;
						/* d2Delay_dmdn */
						Call[0].sum_lmn.d2Delay_dmdn[po] += d;
						Call[0].fsum_lmn.d2Delay_dmdn[po] += f;
						Cjob[jobId].sum_lmn.d2Delay_dmdn[po] += d;
						Cjob[jobId].fsum_lmn.d2Delay_dmdn[po] += f;
						Cantenna[antennaId].sum_lmn.d2Delay_dmdn[po] += d;
						Cantenna[antennaId].fsum_lmn.d2Delay_dmdn[po] += f;
						Cscan[scanId].sum_lmn.d2Delay_dmdn[po] += d;
						Cscan[scanId].fsum_lmn.d2Delay_dmdn[po] += f;
						Csource[sourceId].sum_lmn.d2Delay_dmdn[po] += d;
						Csource[sourceId].fsum_lmn.d2Delay_dmdn[po] += f;
						Call[0].sumsqr_lmn.d2Delay_dmdn[po] += d2;
						Call[0].fsumsqr_lmn.d2Delay_dmdn[po] += f2;
						Cjob[jobId].sumsqr_lmn.d2Delay_dmdn[po] += d2;
						Cjob[jobId].fsumsqr_lmn.d2Delay_dmdn[po] += f2;
						Cantenna[antennaId].sumsqr_lmn.d2Delay_dmdn[po] += d2;
						Cantenna[antennaId].fsumsqr_lmn.d2Delay_dmdn[po] += f2;
						Cscan[scanId].sumsqr_lmn.d2Delay_dmdn[po] += d2;
						Cscan[scanId].fsumsqr_lmn.d2Delay_dmdn[po] += f2;
						Csource[sourceId].sumsqr_lmn.d2Delay_dmdn[po] += d2;
						Csource[sourceId].fsumsqr_lmn.d2Delay_dmdn[po] += f2;
						Call[0].count_lmn.d2Delay_dmdn[po] += c;
						Cjob[jobId].count_lmn.d2Delay_dmdn[po] += c;
						Cantenna[antennaId].count_lmn.d2Delay_dmdn[po] += c;
						Cscan[scanId].count_lmn.d2Delay_dmdn[po] += c;
						Csource[sourceId].count_lmn.d2Delay_dmdn[po] += c;
						/* d2Delay_dndn */
						Call[0].sum_lmn.d2Delay_dndn[po] += d;
						Call[0].fsum_lmn.d2Delay_dndn[po] += f;
						Cjob[jobId].sum_lmn.d2Delay_dndn[po] += d;
						Cjob[jobId].fsum_lmn.d2Delay_dndn[po] += f;
						Cantenna[antennaId].sum_lmn.d2Delay_dndn[po] += d;
						Cantenna[antennaId].fsum_lmn.d2Delay_dndn[po] += f;
						Cscan[scanId].sum_lmn.d2Delay_dndn[po] += d;
						Cscan[scanId].fsum_lmn.d2Delay_dndn[po] += f;
						Csource[sourceId].sum_lmn.d2Delay_dndn[po] += d;
						Csource[sourceId].fsum_lmn.d2Delay_dndn[po] += f;
						Call[0].sumsqr_lmn.d2Delay_dndn[po] += d2;
						Call[0].fsumsqr_lmn.d2Delay_dndn[po] += f2;
						Cjob[jobId].sumsqr_lmn.d2Delay_dndn[po] += d2;
						Cjob[jobId].fsumsqr_lmn.d2Delay_dndn[po] += f2;
						Cantenna[antennaId].sumsqr_lmn.d2Delay_dndn[po] += d2;
						Cantenna[antennaId].fsumsqr_lmn.d2Delay_dndn[po] += f2;
						Cscan[scanId].sumsqr_lmn.d2Delay_dndn[po] += d2;
						Cscan[scanId].fsumsqr_lmn.d2Delay_dndn[po] += f2;
						Csource[sourceId].sumsqr_lmn.d2Delay_dndn[po] += d2;
						Csource[sourceId].fsumsqr_lmn.d2Delay_dndn[po] += f2;
						Call[0].count_lmn.d2Delay_dndn[po] += c;
						Cjob[jobId].count_lmn.d2Delay_dndn[po] += c;
						Cantenna[antennaId].count_lmn.d2Delay_dndn[po] += c;
						Cscan[scanId].count_lmn.d2Delay_dndn[po] += c;
						Csource[sourceId].count_lmn.d2Delay_dndn[po] += c;
					}
					/*****************************************************/
					/* XYZ */
					if(((imXYZ0)) && ((imXYZ1)))
					{
						/* dDelay_dX */
						d0 = imXYZ0->dDelay_dX[po] * 1E-6;
						d1 = imXYZ1->dDelay_dX[po] * 1E-6;
						if((!isnan(d0)) && (!isnan(d1)))
						{
							d = d0-d1;
							f = d/(d0+d1)*2.0;
							c = 1.0;
						}
						else
						{
							if((!isnan(d0))||(!isnan(d1)))
							{
								d = 1E300;
								f = 1E200;
								c = 1.0;
							}
							else
							{
								d = 0.0;
								f = 0.0;
								c = 0.0;
							}
						}
						d2 = d*d;
						f2 = f*f;
						Call[0].sum_xyz.dDelay_dX[po] += d;
						Call[0].fsum_xyz.dDelay_dX[po] += f;
						Cjob[jobId].sum_xyz.dDelay_dX[po] += d;
						Cjob[jobId].fsum_xyz.dDelay_dX[po] += f;
						Cantenna[antennaId].sum_xyz.dDelay_dX[po] += d;
						Cantenna[antennaId].fsum_xyz.dDelay_dX[po] += f;
						Cscan[scanId].sum_xyz.dDelay_dX[po] += d;
						Cscan[scanId].fsum_xyz.dDelay_dX[po] += f;
						Csource[sourceId].sum_xyz.dDelay_dX[po] += d;
						Csource[sourceId].fsum_xyz.dDelay_dX[po] += f;
						Call[0].sumsqr_xyz.dDelay_dX[po] += d2;
						Call[0].fsumsqr_xyz.dDelay_dX[po] += f2;
						Cjob[jobId].sumsqr_xyz.dDelay_dX[po] += d2;
						Cjob[jobId].fsumsqr_xyz.dDelay_dX[po] += f2;
						Cantenna[antennaId].sumsqr_xyz.dDelay_dX[po] += d2;
						Cantenna[antennaId].fsumsqr_xyz.dDelay_dX[po] += f2;
						Cscan[scanId].sumsqr_xyz.dDelay_dX[po] += d2;
						Cscan[scanId].fsumsqr_xyz.dDelay_dX[po] += f2;
						Csource[sourceId].sumsqr_xyz.dDelay_dX[po] += d2;
						Csource[sourceId].fsumsqr_xyz.dDelay_dX[po] += f2;
						Call[0].count_xyz.dDelay_dX[po] += c;
						Cjob[jobId].count_xyz.dDelay_dX[po] += c;
						Cantenna[antennaId].count_xyz.dDelay_dX[po] += c;
						Cscan[scanId].count_xyz.dDelay_dX[po] += c;
						Csource[sourceId].count_xyz.dDelay_dX[po] += c;
						/* dDelay_dY */
						d0 = imXYZ0->dDelay_dY[po] * 1E-6;
						d1 = imXYZ1->dDelay_dY[po] * 1E-6;
						if((!isnan(d0)) && (!isnan(d1)))
						{
							d = d0-d1;
							f = d/(d0+d1)*2.0;
							c = 1.0;
						}
						else
						{
							if((!isnan(d0))||(!isnan(d1)))
							{
								d = 1E300;
								f = 1E200;
								c = 1.0;
							}
							else
							{
								d = 0.0;
								f = 0.0;
								c = 0.0;
							}
						}
						d2 = d*d;
						f2 = f*f;
						Call[0].sum_xyz.dDelay_dY[po] += d;
						Call[0].fsum_xyz.dDelay_dY[po] += f;
						Cjob[jobId].sum_xyz.dDelay_dY[po] += d;
						Cjob[jobId].fsum_xyz.dDelay_dY[po] += f;
						Cantenna[antennaId].sum_xyz.dDelay_dY[po] += d;
						Cantenna[antennaId].fsum_xyz.dDelay_dY[po] += f;
						Cscan[scanId].sum_xyz.dDelay_dY[po] += d;
						Cscan[scanId].fsum_xyz.dDelay_dY[po] += f;
						Csource[sourceId].sum_xyz.dDelay_dY[po] += d;
						Csource[sourceId].fsum_xyz.dDelay_dY[po] += f;
						Call[0].sumsqr_xyz.dDelay_dY[po] += d2;
						Call[0].fsumsqr_xyz.dDelay_dY[po] += f2;
						Cjob[jobId].sumsqr_xyz.dDelay_dY[po] += d2;
						Cjob[jobId].fsumsqr_xyz.dDelay_dY[po] += f2;
						Cantenna[antennaId].sumsqr_xyz.dDelay_dY[po] += d2;
						Cantenna[antennaId].fsumsqr_xyz.dDelay_dY[po] += f2;
						Cscan[scanId].sumsqr_xyz.dDelay_dY[po] += d2;
						Cscan[scanId].fsumsqr_xyz.dDelay_dY[po] += f2;
						Csource[sourceId].sumsqr_xyz.dDelay_dY[po] += d2;
						Csource[sourceId].fsumsqr_xyz.dDelay_dY[po] += f2;
						Call[0].count_xyz.dDelay_dY[po] += c;
						Cjob[jobId].count_xyz.dDelay_dY[po] += c;
						Cantenna[antennaId].count_xyz.dDelay_dY[po] += c;
						Cscan[scanId].count_xyz.dDelay_dY[po] += c;
						Csource[sourceId].count_xyz.dDelay_dY[po] += c;
						/* dDelay_dZ */
						d0 = imXYZ0->dDelay_dZ[po] * 1E-6;
						d1 = imXYZ1->dDelay_dZ[po] * 1E-6;
						if((!isnan(d0)) && (!isnan(d1)))
						{
							d = d0-d1;
							f = d/(d0+d1)*2.0;
							c = 1.0;
						}
						else
						{
							if((!isnan(d0))||(!isnan(d1)))
							{
								d = 1E300;
								f = 1E200;
								c = 1.0;
							}
							else
							{
								d = 0.0;
								f = 0.0;
								c = 0.0;
							}
						}
						d2 = d*d;
						f2 = f*f;
						Call[0].sum_xyz.dDelay_dZ[po] += d;
						Call[0].fsum_xyz.dDelay_dZ[po] += f;
						Cjob[jobId].sum_xyz.dDelay_dZ[po] += d;
						Cjob[jobId].fsum_xyz.dDelay_dZ[po] += f;
						Cantenna[antennaId].sum_xyz.dDelay_dZ[po] += d;
						Cantenna[antennaId].fsum_xyz.dDelay_dZ[po] += f;
						Cscan[scanId].sum_xyz.dDelay_dZ[po] += d;
						Cscan[scanId].fsum_xyz.dDelay_dZ[po] += f;
						Csource[sourceId].sum_xyz.dDelay_dZ[po] += d;
						Csource[sourceId].fsum_xyz.dDelay_dZ[po] += f;
						Call[0].sumsqr_xyz.dDelay_dZ[po] += d2;
						Call[0].fsumsqr_xyz.dDelay_dZ[po] += f2;
						Cjob[jobId].sumsqr_xyz.dDelay_dZ[po] += d2;
						Cjob[jobId].fsumsqr_xyz.dDelay_dZ[po] += f2;
						Cantenna[antennaId].sumsqr_xyz.dDelay_dZ[po] += d2;
						Cantenna[antennaId].fsumsqr_xyz.dDelay_dZ[po] += f2;
						Cscan[scanId].sumsqr_xyz.dDelay_dZ[po] += d2;
						Cscan[scanId].fsumsqr_xyz.dDelay_dZ[po] += f2;
						Csource[sourceId].sumsqr_xyz.dDelay_dZ[po] += d2;
						Csource[sourceId].fsumsqr_xyz.dDelay_dZ[po] += f2;
						Call[0].count_xyz.dDelay_dZ[po] += c;
						Cjob[jobId].count_xyz.dDelay_dZ[po] += c;
						Cantenna[antennaId].count_xyz.dDelay_dZ[po] += c;
						Cscan[scanId].count_xyz.dDelay_dZ[po] += c;
						Csource[sourceId].count_xyz.dDelay_dZ[po] += c;
						/* d2Delay_dXdX */
						d0 = imXYZ0->d2Delay_dXdX[po] * 1E-6;
						d1 = imXYZ1->d2Delay_dXdX[po] * 1E-6;
						if((!isnan(d0)) && (!isnan(d1)))
						{
							d = d0-d1;
							f = d/(d0+d1)*2.0;
							c = 1.0;
						}
						else
						{
							if((!isnan(d0))||(!isnan(d1)))
							{
								d = 1E300;
								f = 1E200;
								c = 1.0;
							}
							else
							{
								d = 0.0;
								f = 0.0;
								c = 0.0;
							}
						}
						d2 = d*d;
						f2 = f*f;
						Call[0].sum_xyz.d2Delay_dXdX[po] += d;
						Call[0].fsum_xyz.d2Delay_dXdX[po] += f;
						Cjob[jobId].sum_xyz.d2Delay_dXdX[po] += d;
						Cjob[jobId].fsum_xyz.d2Delay_dXdX[po] += f;
						Cantenna[antennaId].sum_xyz.d2Delay_dXdX[po] += d;
						Cantenna[antennaId].fsum_xyz.d2Delay_dXdX[po] += f;
						Cscan[scanId].sum_xyz.d2Delay_dXdX[po] += d;
						Cscan[scanId].fsum_xyz.d2Delay_dXdX[po] += f;
						Csource[sourceId].sum_xyz.d2Delay_dXdX[po] += d;
						Csource[sourceId].fsum_xyz.d2Delay_dXdX[po] += f;
						Call[0].sumsqr_xyz.d2Delay_dXdX[po] += d2;
						Call[0].fsumsqr_xyz.d2Delay_dXdX[po] += f2;
						Cjob[jobId].sumsqr_xyz.d2Delay_dXdX[po] += d2;
						Cjob[jobId].fsumsqr_xyz.d2Delay_dXdX[po] += f2;
						Cantenna[antennaId].sumsqr_xyz.d2Delay_dXdX[po] += d2;
						Cantenna[antennaId].fsumsqr_xyz.d2Delay_dXdX[po] += f2;
						Cscan[scanId].sumsqr_xyz.d2Delay_dXdX[po] += d2;
						Cscan[scanId].fsumsqr_xyz.d2Delay_dXdX[po] += f2;
						Csource[sourceId].sumsqr_xyz.d2Delay_dXdX[po] += d2;
						Csource[sourceId].fsumsqr_xyz.d2Delay_dXdX[po] += f2;
						Call[0].count_xyz.d2Delay_dXdX[po] += c;
						Cjob[jobId].count_xyz.d2Delay_dXdX[po] += c;
						Cantenna[antennaId].count_xyz.d2Delay_dXdX[po] += c;
						Cscan[scanId].count_xyz.d2Delay_dXdX[po] += c;
						Csource[sourceId].count_xyz.d2Delay_dXdX[po] += c;
						/* d2Delay_dXdY */
						d0 = imXYZ0->d2Delay_dXdY[po] * 1E-6;
						d1 = imXYZ1->d2Delay_dXdY[po] * 1E-6;
						if((!isnan(d0)) && (!isnan(d1)))
						{
							d = d0-d1;
							f = d/(d0+d1)*2.0;
							c = 1.0;
						}
						else
						{
							if((!isnan(d0))||(!isnan(d1)))
							{
								d = 1E300;
								f = 1E200;
								c = 1.0;
							}
							else
							{
								d = 0.0;
								f = 0.0;
								c = 0.0;
							}
						}
						d2 = d*d;
						f2 = f*f;
						Call[0].sum_xyz.d2Delay_dXdY[po] += d;
						Call[0].fsum_xyz.d2Delay_dXdY[po] += f;
						Cjob[jobId].sum_xyz.d2Delay_dXdY[po] += d;
						Cjob[jobId].fsum_xyz.d2Delay_dXdY[po] += f;
						Cantenna[antennaId].sum_xyz.d2Delay_dXdY[po] += d;
						Cantenna[antennaId].fsum_xyz.d2Delay_dXdY[po] += f;
						Cscan[scanId].sum_xyz.d2Delay_dXdY[po] += d;
						Cscan[scanId].fsum_xyz.d2Delay_dXdY[po] += f;
						Csource[sourceId].sum_xyz.d2Delay_dXdY[po] += d;
						Csource[sourceId].fsum_xyz.d2Delay_dXdY[po] += f;
						Call[0].sumsqr_xyz.d2Delay_dXdY[po] += d2;
						Call[0].fsumsqr_xyz.d2Delay_dXdY[po] += f2;
						Cjob[jobId].sumsqr_xyz.d2Delay_dXdY[po] += d2;
						Cjob[jobId].fsumsqr_xyz.d2Delay_dXdY[po] += f2;
						Cantenna[antennaId].sumsqr_xyz.d2Delay_dXdY[po] += d2;
						Cantenna[antennaId].fsumsqr_xyz.d2Delay_dXdY[po] += f2;
						Cscan[scanId].sumsqr_xyz.d2Delay_dXdY[po] += d2;
						Cscan[scanId].fsumsqr_xyz.d2Delay_dXdY[po] += f2;
						Csource[sourceId].sumsqr_xyz.d2Delay_dXdY[po] += d2;
						Csource[sourceId].fsumsqr_xyz.d2Delay_dXdY[po] += f2;
						Call[0].count_xyz.d2Delay_dXdY[po] += c;
						Cjob[jobId].count_xyz.d2Delay_dXdY[po] += c;
						Cantenna[antennaId].count_xyz.d2Delay_dXdY[po] += c;
						Cscan[scanId].count_xyz.d2Delay_dXdY[po] += c;
						Csource[sourceId].count_xyz.d2Delay_dXdY[po] += c;
						/* d2Delay_dXdZ */
						d0 = imXYZ0->d2Delay_dXdZ[po] * 1E-6;
						d1 = imXYZ1->d2Delay_dXdZ[po] * 1E-6;
						if((!isnan(d0)) && (!isnan(d1)))
						{
							d = d0-d1;
							f = d/(d0+d1)*2.0;
							c = 1.0;
						}
						else
						{
							if((!isnan(d0))||(!isnan(d1)))
							{
								d = 1E300;
								f = 1E200;
								c = 1.0;
							}
							else
							{
								d = 0.0;
								f = 0.0;
								c = 0.0;
							}
						}
						d2 = d*d;
						f2 = f*f;
						Call[0].sum_xyz.d2Delay_dXdZ[po] += d;
						Call[0].fsum_xyz.d2Delay_dXdZ[po] += f;
						Cjob[jobId].sum_xyz.d2Delay_dXdZ[po] += d;
						Cjob[jobId].fsum_xyz.d2Delay_dXdZ[po] += f;
						Cantenna[antennaId].sum_xyz.d2Delay_dXdZ[po] += d;
						Cantenna[antennaId].fsum_xyz.d2Delay_dXdZ[po] += f;
						Cscan[scanId].sum_xyz.d2Delay_dXdZ[po] += d;
						Cscan[scanId].fsum_xyz.d2Delay_dXdZ[po] += f;
						Csource[sourceId].sum_xyz.d2Delay_dXdZ[po] += d;
						Csource[sourceId].fsum_xyz.d2Delay_dXdZ[po] += f;
						Call[0].sumsqr_xyz.d2Delay_dXdZ[po] += d2;
						Call[0].fsumsqr_xyz.d2Delay_dXdZ[po] += f2;
						Cjob[jobId].sumsqr_xyz.d2Delay_dXdZ[po] += d2;
						Cjob[jobId].fsumsqr_xyz.d2Delay_dXdZ[po] += f2;
						Cantenna[antennaId].sumsqr_xyz.d2Delay_dXdZ[po] += d2;
						Cantenna[antennaId].fsumsqr_xyz.d2Delay_dXdZ[po] += f2;
						Cscan[scanId].sumsqr_xyz.d2Delay_dXdZ[po] += d2;
						Cscan[scanId].fsumsqr_xyz.d2Delay_dXdZ[po] += f2;
						Csource[sourceId].sumsqr_xyz.d2Delay_dXdZ[po] += d2;
						Csource[sourceId].fsumsqr_xyz.d2Delay_dXdZ[po] += f2;
						Call[0].count_xyz.d2Delay_dXdZ[po] += c;
						Cjob[jobId].count_xyz.d2Delay_dXdZ[po] += c;
						Cantenna[antennaId].count_xyz.d2Delay_dXdZ[po] += c;
						Cscan[scanId].count_xyz.d2Delay_dXdZ[po] += c;
						Csource[sourceId].count_xyz.d2Delay_dXdZ[po] += c;
						/* d2Delay_dYdY */
						d0 = imXYZ0->d2Delay_dYdY[po] * 1E-6;
						d1 = imXYZ1->d2Delay_dYdY[po] * 1E-6;
						if((!isnan(d0)) && (!isnan(d1)))
						{
							d = d0-d1;
							f = d/(d0+d1)*2.0;
							c = 1.0;
						}
						else
						{
							if((!isnan(d0))||(!isnan(d1)))
							{
								d = 1E300;
								f = 1E200;
								c = 1.0;
							}
							else
							{
								d = 0.0;
								f = 0.0;
								c = 0.0;
							}
						}
						d2 = d*d;
						f2 = f*f;
						Call[0].sum_xyz.d2Delay_dYdY[po] += d;
						Call[0].fsum_xyz.d2Delay_dYdY[po] += f;
						Cjob[jobId].sum_xyz.d2Delay_dYdY[po] += d;
						Cjob[jobId].fsum_xyz.d2Delay_dYdY[po] += f;
						Cantenna[antennaId].sum_xyz.d2Delay_dYdY[po] += d;
						Cantenna[antennaId].fsum_xyz.d2Delay_dYdY[po] += f;
						Cscan[scanId].sum_xyz.d2Delay_dYdY[po] += d;
						Cscan[scanId].fsum_xyz.d2Delay_dYdY[po] += f;
						Csource[sourceId].sum_xyz.d2Delay_dYdY[po] += d;
						Csource[sourceId].fsum_xyz.d2Delay_dYdY[po] += f;
						Call[0].sumsqr_xyz.d2Delay_dYdY[po] += d2;
						Call[0].fsumsqr_xyz.d2Delay_dYdY[po] += f2;
						Cjob[jobId].sumsqr_xyz.d2Delay_dYdY[po] += d2;
						Cjob[jobId].fsumsqr_xyz.d2Delay_dYdY[po] += f2;
						Cantenna[antennaId].sumsqr_xyz.d2Delay_dYdY[po] += d2;
						Cantenna[antennaId].fsumsqr_xyz.d2Delay_dYdY[po] += f2;
						Cscan[scanId].sumsqr_xyz.d2Delay_dYdY[po] += d2;
						Cscan[scanId].fsumsqr_xyz.d2Delay_dYdY[po] += f2;
						Csource[sourceId].sumsqr_xyz.d2Delay_dYdY[po] += d2;
						Csource[sourceId].fsumsqr_xyz.d2Delay_dYdY[po] += f2;
						Call[0].count_xyz.d2Delay_dYdY[po] += c;
						Cjob[jobId].count_xyz.d2Delay_dYdY[po] += c;
						Cantenna[antennaId].count_xyz.d2Delay_dYdY[po] += c;
						Cscan[scanId].count_xyz.d2Delay_dYdY[po] += c;
						Csource[sourceId].count_xyz.d2Delay_dYdY[po] += c;
						/* d2Delay_dYdZ */
						d0 = imXYZ0->d2Delay_dYdZ[po] * 1E-6;
						d1 = imXYZ1->d2Delay_dYdZ[po] * 1E-6;
						if((!isnan(d0)) && (!isnan(d1)))
						{
							d = d0-d1;
							f = d/(d0+d1)*2.0;
							c = 1.0;
						}
						else
						{
							if((!isnan(d0))||(!isnan(d1)))
							{
								d = 1E300;
								f = 1E200;
								c = 1.0;
							}
							else
							{
								d = 0.0;
								f = 0.0;
								c = 0.0;
							}
						}
						d2 = d*d;
						f2 = f*f;
						Call[0].sum_xyz.d2Delay_dYdZ[po] += d;
						Call[0].fsum_xyz.d2Delay_dYdZ[po] += f;
						Cjob[jobId].sum_xyz.d2Delay_dYdZ[po] += d;
						Cjob[jobId].fsum_xyz.d2Delay_dYdZ[po] += f;
						Cantenna[antennaId].sum_xyz.d2Delay_dYdZ[po] += d;
						Cantenna[antennaId].fsum_xyz.d2Delay_dYdZ[po] += f;
						Cscan[scanId].sum_xyz.d2Delay_dYdZ[po] += d;
						Cscan[scanId].fsum_xyz.d2Delay_dYdZ[po] += f;
						Csource[sourceId].sum_xyz.d2Delay_dYdZ[po] += d;
						Csource[sourceId].fsum_xyz.d2Delay_dYdZ[po] += f;
						Call[0].sumsqr_xyz.d2Delay_dYdZ[po] += d2;
						Call[0].fsumsqr_xyz.d2Delay_dYdZ[po] += f2;
						Cjob[jobId].sumsqr_xyz.d2Delay_dYdZ[po] += d2;
						Cjob[jobId].fsumsqr_xyz.d2Delay_dYdZ[po] += f2;
						Cantenna[antennaId].sumsqr_xyz.d2Delay_dYdZ[po] += d2;
						Cantenna[antennaId].fsumsqr_xyz.d2Delay_dYdZ[po] += f2;
						Cscan[scanId].sumsqr_xyz.d2Delay_dYdZ[po] += d2;
						Cscan[scanId].fsumsqr_xyz.d2Delay_dYdZ[po] += f2;
						Csource[sourceId].sumsqr_xyz.d2Delay_dYdZ[po] += d2;
						Csource[sourceId].fsumsqr_xyz.d2Delay_dYdZ[po] += f2;
						Call[0].count_xyz.d2Delay_dYdZ[po] += c;
						Cjob[jobId].count_xyz.d2Delay_dYdZ[po] += c;
						Cantenna[antennaId].count_xyz.d2Delay_dYdZ[po] += c;
						Cscan[scanId].count_xyz.d2Delay_dYdZ[po] += c;
						Csource[sourceId].count_xyz.d2Delay_dYdZ[po] += c;
						/* d2Delay_dZdZ */
						d0 = imXYZ0->d2Delay_dZdZ[po] * 1E-6;
						d1 = imXYZ1->d2Delay_dZdZ[po] * 1E-6;
						if((!isnan(d0)) && (!isnan(d1)))
						{
							d = d0-d1;
							f = d/(d0+d1)*2.0;
							c = 1.0;
						}
						else
						{
							if((!isnan(d0))||(!isnan(d1)))
							{
								d = 1E300;
								f = 1E200;
								c = 1.0;
							}
							else
							{
								d = 0.0;
								f = 0.0;
								c = 0.0;
							}
						}
						d2 = d*d;
						f2 = f*f;
						Call[0].sum_xyz.d2Delay_dZdZ[po] += d;
						Call[0].fsum_xyz.d2Delay_dZdZ[po] += f;
						Cjob[jobId].sum_xyz.d2Delay_dZdZ[po] += d;
						Cjob[jobId].fsum_xyz.d2Delay_dZdZ[po] += f;
						Cantenna[antennaId].sum_xyz.d2Delay_dZdZ[po] += d;
						Cantenna[antennaId].fsum_xyz.d2Delay_dZdZ[po] += f;
						Cscan[scanId].sum_xyz.d2Delay_dZdZ[po] += d;
						Cscan[scanId].fsum_xyz.d2Delay_dZdZ[po] += f;
						Csource[sourceId].sum_xyz.d2Delay_dZdZ[po] += d;
						Csource[sourceId].fsum_xyz.d2Delay_dZdZ[po] += f;
						Call[0].sumsqr_xyz.d2Delay_dZdZ[po] += d2;
						Call[0].fsumsqr_xyz.d2Delay_dZdZ[po] += f2;
						Cjob[jobId].sumsqr_xyz.d2Delay_dZdZ[po] += d2;
						Cjob[jobId].fsumsqr_xyz.d2Delay_dZdZ[po] += f2;
						Cantenna[antennaId].sumsqr_xyz.d2Delay_dZdZ[po] += d2;
						Cantenna[antennaId].fsumsqr_xyz.d2Delay_dZdZ[po] += f2;
						Cscan[scanId].sumsqr_xyz.d2Delay_dZdZ[po] += d2;
						Cscan[scanId].fsumsqr_xyz.d2Delay_dZdZ[po] += f2;
						Csource[sourceId].sumsqr_xyz.d2Delay_dZdZ[po] += d2;
						Csource[sourceId].fsumsqr_xyz.d2Delay_dZdZ[po] += f2;
						Call[0].count_xyz.d2Delay_dZdZ[po] += c;
						Cjob[jobId].count_xyz.d2Delay_dZdZ[po] += c;
						Cantenna[antennaId].count_xyz.d2Delay_dZdZ[po] += c;
						Cscan[scanId].count_xyz.d2Delay_dZdZ[po] += c;
						Csource[sourceId].count_xyz.d2Delay_dZdZ[po] += c;
					}
					else if(((imXYZ0)) || ((imXYZ1)))
					{
						d = 1E300;
						f = 1E200;
						d2 = d*d;
						f2 = f*f;
						c = 1.0;
						/* dDelay_dX */
						Call[0].sum_xyz.dDelay_dX[po] += d;
						Call[0].fsum_xyz.dDelay_dX[po] += f;
						Cjob[jobId].sum_xyz.dDelay_dX[po] += d;
						Cjob[jobId].fsum_xyz.dDelay_dX[po] += f;
						Cantenna[antennaId].sum_xyz.dDelay_dX[po] += d;
						Cantenna[antennaId].fsum_xyz.dDelay_dX[po] += f;
						Cscan[scanId].sum_xyz.dDelay_dX[po] += d;
						Cscan[scanId].fsum_xyz.dDelay_dX[po] += f;
						Csource[sourceId].sum_xyz.dDelay_dX[po] += d;
						Csource[sourceId].fsum_xyz.dDelay_dX[po] += f;
						Call[0].sumsqr_xyz.dDelay_dX[po] += d2;
						Call[0].fsumsqr_xyz.dDelay_dX[po] += f2;
						Cjob[jobId].sumsqr_xyz.dDelay_dX[po] += d2;
						Cjob[jobId].fsumsqr_xyz.dDelay_dX[po] += f2;
						Cantenna[antennaId].sumsqr_xyz.dDelay_dX[po] += d2;
						Cantenna[antennaId].fsumsqr_xyz.dDelay_dX[po] += f2;
						Cscan[scanId].sumsqr_xyz.dDelay_dX[po] += d2;
						Cscan[scanId].fsumsqr_xyz.dDelay_dX[po] += f2;
						Csource[sourceId].sumsqr_xyz.dDelay_dX[po] += d2;
						Csource[sourceId].fsumsqr_xyz.dDelay_dX[po] += f2;
						Call[0].count_xyz.dDelay_dX[po] += c;
						Cjob[jobId].count_xyz.dDelay_dX[po] += c;
						Cantenna[antennaId].count_xyz.dDelay_dX[po] += c;
						Cscan[scanId].count_xyz.dDelay_dX[po] += c;
						Csource[sourceId].count_xyz.dDelay_dX[po] += c;
						/* dDelay_dY */
						Call[0].sum_xyz.dDelay_dY[po] += d;
						Call[0].fsum_xyz.dDelay_dY[po] += f;
						Cjob[jobId].sum_xyz.dDelay_dY[po] += d;
						Cjob[jobId].fsum_xyz.dDelay_dY[po] += f;
						Cantenna[antennaId].sum_xyz.dDelay_dY[po] += d;
						Cantenna[antennaId].fsum_xyz.dDelay_dY[po] += f;
						Cscan[scanId].sum_xyz.dDelay_dY[po] += d;
						Cscan[scanId].fsum_xyz.dDelay_dY[po] += f;
						Csource[sourceId].sum_xyz.dDelay_dY[po] += d;
						Csource[sourceId].fsum_xyz.dDelay_dY[po] += f;
						Call[0].sumsqr_xyz.dDelay_dY[po] += d2;
						Call[0].fsumsqr_xyz.dDelay_dY[po] += f2;
						Cjob[jobId].sumsqr_xyz.dDelay_dY[po] += d2;
						Cjob[jobId].fsumsqr_xyz.dDelay_dY[po] += f2;
						Cantenna[antennaId].sumsqr_xyz.dDelay_dY[po] += d2;
						Cantenna[antennaId].fsumsqr_xyz.dDelay_dY[po] += f2;
						Cscan[scanId].sumsqr_xyz.dDelay_dY[po] += d2;
						Cscan[scanId].fsumsqr_xyz.dDelay_dY[po] += f2;
						Csource[sourceId].sumsqr_xyz.dDelay_dY[po] += d2;
						Csource[sourceId].fsumsqr_xyz.dDelay_dY[po] += f2;
						Call[0].count_xyz.dDelay_dY[po] += c;
						Cjob[jobId].count_xyz.dDelay_dY[po] += c;
						Cantenna[antennaId].count_xyz.dDelay_dY[po] += c;
						Cscan[scanId].count_xyz.dDelay_dY[po] += c;
						Csource[sourceId].count_xyz.dDelay_dY[po] += c;
						/* dDelay_dZ */
						Call[0].sum_xyz.dDelay_dZ[po] += d;
						Call[0].fsum_xyz.dDelay_dZ[po] += f;
						Cjob[jobId].sum_xyz.dDelay_dZ[po] += d;
						Cjob[jobId].fsum_xyz.dDelay_dZ[po] += f;
						Cantenna[antennaId].sum_xyz.dDelay_dZ[po] += d;
						Cantenna[antennaId].fsum_xyz.dDelay_dZ[po] += f;
						Cscan[scanId].sum_xyz.dDelay_dZ[po] += d;
						Cscan[scanId].fsum_xyz.dDelay_dZ[po] += f;
						Csource[sourceId].sum_xyz.dDelay_dZ[po] += d;
						Csource[sourceId].fsum_xyz.dDelay_dZ[po] += f;
						Call[0].sumsqr_xyz.dDelay_dZ[po] += d2;
						Call[0].fsumsqr_xyz.dDelay_dZ[po] += f2;
						Cjob[jobId].sumsqr_xyz.dDelay_dZ[po] += d2;
						Cjob[jobId].fsumsqr_xyz.dDelay_dZ[po] += f2;
						Cantenna[antennaId].sumsqr_xyz.dDelay_dZ[po] += d2;
						Cantenna[antennaId].fsumsqr_xyz.dDelay_dZ[po] += f2;
						Cscan[scanId].sumsqr_xyz.dDelay_dZ[po] += d2;
						Cscan[scanId].fsumsqr_xyz.dDelay_dZ[po] += f2;
						Csource[sourceId].sumsqr_xyz.dDelay_dZ[po] += d2;
						Csource[sourceId].fsumsqr_xyz.dDelay_dZ[po] += f2;
						Call[0].count_xyz.dDelay_dZ[po] += c;
						Cjob[jobId].count_xyz.dDelay_dZ[po] += c;
						Cantenna[antennaId].count_xyz.dDelay_dZ[po] += c;
						Cscan[scanId].count_xyz.dDelay_dZ[po] += c;
						Csource[sourceId].count_xyz.dDelay_dZ[po] += c;
						/* d2Delay_dXdX */
						Call[0].sum_xyz.d2Delay_dXdX[po] += d;
						Call[0].fsum_xyz.d2Delay_dXdX[po] += f;
						Cjob[jobId].sum_xyz.d2Delay_dXdX[po] += d;
						Cjob[jobId].fsum_xyz.d2Delay_dXdX[po] += f;
						Cantenna[antennaId].sum_xyz.d2Delay_dXdX[po] += d;
						Cantenna[antennaId].fsum_xyz.d2Delay_dXdX[po] += f;
						Cscan[scanId].sum_xyz.d2Delay_dXdX[po] += d;
						Cscan[scanId].fsum_xyz.d2Delay_dXdX[po] += f;
						Csource[sourceId].sum_xyz.d2Delay_dXdX[po] += d;
						Csource[sourceId].fsum_xyz.d2Delay_dXdX[po] += f;
						Call[0].sumsqr_xyz.d2Delay_dXdX[po] += d2;
						Call[0].fsumsqr_xyz.d2Delay_dXdX[po] += f2;
						Cjob[jobId].sumsqr_xyz.d2Delay_dXdX[po] += d2;
						Cjob[jobId].fsumsqr_xyz.d2Delay_dXdX[po] += f2;
						Cantenna[antennaId].sumsqr_xyz.d2Delay_dXdX[po] += d2;
						Cantenna[antennaId].fsumsqr_xyz.d2Delay_dXdX[po] += f2;
						Cscan[scanId].sumsqr_xyz.d2Delay_dXdX[po] += d2;
						Cscan[scanId].fsumsqr_xyz.d2Delay_dXdX[po] += f2;
						Csource[sourceId].sumsqr_xyz.d2Delay_dXdX[po] += d2;
						Csource[sourceId].fsumsqr_xyz.d2Delay_dXdX[po] += f2;
						Call[0].count_xyz.d2Delay_dXdX[po] += c;
						Cjob[jobId].count_xyz.d2Delay_dXdX[po] += c;
						Cantenna[antennaId].count_xyz.d2Delay_dXdX[po] += c;
						Cscan[scanId].count_xyz.d2Delay_dXdX[po] += c;
						Csource[sourceId].count_xyz.d2Delay_dXdX[po] += c;
						/* d2Delay_dXdY */
						Call[0].sum_xyz.d2Delay_dXdY[po] += d;
						Call[0].fsum_xyz.d2Delay_dXdY[po] += f;
						Cjob[jobId].sum_xyz.d2Delay_dXdY[po] += d;
						Cjob[jobId].fsum_xyz.d2Delay_dXdY[po] += f;
						Cantenna[antennaId].sum_xyz.d2Delay_dXdY[po] += d;
						Cantenna[antennaId].fsum_xyz.d2Delay_dXdY[po] += f;
						Cscan[scanId].sum_xyz.d2Delay_dXdY[po] += d;
						Cscan[scanId].fsum_xyz.d2Delay_dXdY[po] += f;
						Csource[sourceId].sum_xyz.d2Delay_dXdY[po] += d;
						Csource[sourceId].fsum_xyz.d2Delay_dXdY[po] += f;
						Call[0].sumsqr_xyz.d2Delay_dXdY[po] += d2;
						Call[0].fsumsqr_xyz.d2Delay_dXdY[po] += f2;
						Cjob[jobId].sumsqr_xyz.d2Delay_dXdY[po] += d2;
						Cjob[jobId].fsumsqr_xyz.d2Delay_dXdY[po] += f2;
						Cantenna[antennaId].sumsqr_xyz.d2Delay_dXdY[po] += d2;
						Cantenna[antennaId].fsumsqr_xyz.d2Delay_dXdY[po] += f2;
						Cscan[scanId].sumsqr_xyz.d2Delay_dXdY[po] += d2;
						Cscan[scanId].fsumsqr_xyz.d2Delay_dXdY[po] += f2;
						Csource[sourceId].sumsqr_xyz.d2Delay_dXdY[po] += d2;
						Csource[sourceId].fsumsqr_xyz.d2Delay_dXdY[po] += f2;
						Call[0].count_xyz.d2Delay_dXdY[po] += c;
						Cjob[jobId].count_xyz.d2Delay_dXdY[po] += c;
						Cantenna[antennaId].count_xyz.d2Delay_dXdY[po] += c;
						Cscan[scanId].count_xyz.d2Delay_dXdY[po] += c;
						Csource[sourceId].count_xyz.d2Delay_dXdY[po] += c;
						/* d2Delay_dXdZ */
						Call[0].sum_xyz.d2Delay_dXdZ[po] += d;
						Call[0].fsum_xyz.d2Delay_dXdZ[po] += f;
						Cjob[jobId].sum_xyz.d2Delay_dXdZ[po] += d;
						Cjob[jobId].fsum_xyz.d2Delay_dXdZ[po] += f;
						Cantenna[antennaId].sum_xyz.d2Delay_dXdZ[po] += d;
						Cantenna[antennaId].fsum_xyz.d2Delay_dXdZ[po] += f;
						Cscan[scanId].sum_xyz.d2Delay_dXdZ[po] += d;
						Cscan[scanId].fsum_xyz.d2Delay_dXdZ[po] += f;
						Csource[sourceId].sum_xyz.d2Delay_dXdZ[po] += d;
						Csource[sourceId].fsum_xyz.d2Delay_dXdZ[po] += f;
						Call[0].sumsqr_xyz.d2Delay_dXdZ[po] += d2;
						Call[0].fsumsqr_xyz.d2Delay_dXdZ[po] += f2;
						Cjob[jobId].sumsqr_xyz.d2Delay_dXdZ[po] += d2;
						Cjob[jobId].fsumsqr_xyz.d2Delay_dXdZ[po] += f2;
						Cantenna[antennaId].sumsqr_xyz.d2Delay_dXdZ[po] += d2;
						Cantenna[antennaId].fsumsqr_xyz.d2Delay_dXdZ[po] += f2;
						Cscan[scanId].sumsqr_xyz.d2Delay_dXdZ[po] += d2;
						Cscan[scanId].fsumsqr_xyz.d2Delay_dXdZ[po] += f2;
						Csource[sourceId].sumsqr_xyz.d2Delay_dXdZ[po] += d2;
						Csource[sourceId].fsumsqr_xyz.d2Delay_dXdZ[po] += f2;
						Call[0].count_xyz.d2Delay_dXdZ[po] += c;
						Cjob[jobId].count_xyz.d2Delay_dXdZ[po] += c;
						Cantenna[antennaId].count_xyz.d2Delay_dXdZ[po] += c;
						Cscan[scanId].count_xyz.d2Delay_dXdZ[po] += c;
						Csource[sourceId].count_xyz.d2Delay_dXdZ[po] += c;
						/* d2Delay_dYdY */
						Call[0].sum_xyz.d2Delay_dYdY[po] += d;
						Call[0].fsum_xyz.d2Delay_dYdY[po] += f;
						Cjob[jobId].sum_xyz.d2Delay_dYdY[po] += d;
						Cjob[jobId].fsum_xyz.d2Delay_dYdY[po] += f;
						Cantenna[antennaId].sum_xyz.d2Delay_dYdY[po] += d;
						Cantenna[antennaId].fsum_xyz.d2Delay_dYdY[po] += f;
						Cscan[scanId].sum_xyz.d2Delay_dYdY[po] += d;
						Cscan[scanId].fsum_xyz.d2Delay_dYdY[po] += f;
						Csource[sourceId].sum_xyz.d2Delay_dYdY[po] += d;
						Csource[sourceId].fsum_xyz.d2Delay_dYdY[po] += f;
						Call[0].sumsqr_xyz.d2Delay_dYdY[po] += d2;
						Call[0].fsumsqr_xyz.d2Delay_dYdY[po] += f2;
						Cjob[jobId].sumsqr_xyz.d2Delay_dYdY[po] += d2;
						Cjob[jobId].fsumsqr_xyz.d2Delay_dYdY[po] += f2;
						Cantenna[antennaId].sumsqr_xyz.d2Delay_dYdY[po] += d2;
						Cantenna[antennaId].fsumsqr_xyz.d2Delay_dYdY[po] += f2;
						Cscan[scanId].sumsqr_xyz.d2Delay_dYdY[po] += d2;
						Cscan[scanId].fsumsqr_xyz.d2Delay_dYdY[po] += f2;
						Csource[sourceId].sumsqr_xyz.d2Delay_dYdY[po] += d2;
						Csource[sourceId].fsumsqr_xyz.d2Delay_dYdY[po] += f2;
						Call[0].count_xyz.d2Delay_dYdY[po] += c;
						Cjob[jobId].count_xyz.d2Delay_dYdY[po] += c;
						Cantenna[antennaId].count_xyz.d2Delay_dYdY[po] += c;
						Cscan[scanId].count_xyz.d2Delay_dYdY[po] += c;
						Csource[sourceId].count_xyz.d2Delay_dYdY[po] += c;
						/* d2Delay_dYdZ */
						Call[0].sum_xyz.d2Delay_dYdZ[po] += d;
						Call[0].fsum_xyz.d2Delay_dYdZ[po] += f;
						Cjob[jobId].sum_xyz.d2Delay_dYdZ[po] += d;
						Cjob[jobId].fsum_xyz.d2Delay_dYdZ[po] += f;
						Cantenna[antennaId].sum_xyz.d2Delay_dYdZ[po] += d;
						Cantenna[antennaId].fsum_xyz.d2Delay_dYdZ[po] += f;
						Cscan[scanId].sum_xyz.d2Delay_dYdZ[po] += d;
						Cscan[scanId].fsum_xyz.d2Delay_dYdZ[po] += f;
						Csource[sourceId].sum_xyz.d2Delay_dYdZ[po] += d;
						Csource[sourceId].fsum_xyz.d2Delay_dYdZ[po] += f;
						Call[0].sumsqr_xyz.d2Delay_dYdZ[po] += d2;
						Call[0].fsumsqr_xyz.d2Delay_dYdZ[po] += f2;
						Cjob[jobId].sumsqr_xyz.d2Delay_dYdZ[po] += d2;
						Cjob[jobId].fsumsqr_xyz.d2Delay_dYdZ[po] += f2;
						Cantenna[antennaId].sumsqr_xyz.d2Delay_dYdZ[po] += d2;
						Cantenna[antennaId].fsumsqr_xyz.d2Delay_dYdZ[po] += f2;
						Cscan[scanId].sumsqr_xyz.d2Delay_dYdZ[po] += d2;
						Cscan[scanId].fsumsqr_xyz.d2Delay_dYdZ[po] += f2;
						Csource[sourceId].sumsqr_xyz.d2Delay_dYdZ[po] += d2;
						Csource[sourceId].fsumsqr_xyz.d2Delay_dYdZ[po] += f2;
						Call[0].count_xyz.d2Delay_dYdZ[po] += c;
						Cjob[jobId].count_xyz.d2Delay_dYdZ[po] += c;
						Cantenna[antennaId].count_xyz.d2Delay_dYdZ[po] += c;
						Cscan[scanId].count_xyz.d2Delay_dYdZ[po] += c;
						Csource[sourceId].count_xyz.d2Delay_dYdZ[po] += c;
						/* d2Delay_dZdZ */
						Call[0].sum_xyz.d2Delay_dZdZ[po] += d;
						Call[0].fsum_xyz.d2Delay_dZdZ[po] += f;
						Cjob[jobId].sum_xyz.d2Delay_dZdZ[po] += d;
						Cjob[jobId].fsum_xyz.d2Delay_dZdZ[po] += f;
						Cantenna[antennaId].sum_xyz.d2Delay_dZdZ[po] += d;
						Cantenna[antennaId].fsum_xyz.d2Delay_dZdZ[po] += f;
						Cscan[scanId].sum_xyz.d2Delay_dZdZ[po] += d;
						Cscan[scanId].fsum_xyz.d2Delay_dZdZ[po] += f;
						Csource[sourceId].sum_xyz.d2Delay_dZdZ[po] += d;
						Csource[sourceId].fsum_xyz.d2Delay_dZdZ[po] += f;
						Call[0].sumsqr_xyz.d2Delay_dZdZ[po] += d2;
						Call[0].fsumsqr_xyz.d2Delay_dZdZ[po] += f2;
						Cjob[jobId].sumsqr_xyz.d2Delay_dZdZ[po] += d2;
						Cjob[jobId].fsumsqr_xyz.d2Delay_dZdZ[po] += f2;
						Cantenna[antennaId].sumsqr_xyz.d2Delay_dZdZ[po] += d2;
						Cantenna[antennaId].fsumsqr_xyz.d2Delay_dZdZ[po] += f2;
						Cscan[scanId].sumsqr_xyz.d2Delay_dZdZ[po] += d2;
						Cscan[scanId].fsumsqr_xyz.d2Delay_dZdZ[po] += f2;
						Csource[sourceId].sumsqr_xyz.d2Delay_dZdZ[po] += d2;
						Csource[sourceId].fsumsqr_xyz.d2Delay_dZdZ[po] += f2;
						Call[0].count_xyz.d2Delay_dZdZ[po] += c;
						Cjob[jobId].count_xyz.d2Delay_dZdZ[po] += c;
						Cantenna[antennaId].count_xyz.d2Delay_dZdZ[po] += c;
						Cscan[scanId].count_xyz.d2Delay_dZdZ[po] += c;
						Csource[sourceId].count_xyz.d2Delay_dZdZ[po] += c;
					}
				} /* for po < imo->order */
			} /* for polyId < scan0->nPoly */
		} /* for k <= scan0-> nPhaseCentres*/
	} /* for antennaId < scan0->nAntenna */
	return count;
}




void compute_stats(double sum, double sumsqr, double count, double* mean, double* sigma)
{
	double m = 0.0;
	double s = -1.0;
	if(count >= 1.0)
	{
		m = sum / count;
		if(count >= 2.0)
		{
			s = sqrt( fabs(sumsqr - m * sum) / (count - 1.0) );
		}
	}
	*mean = m;
	*sigma = s;
	return;
}




void process_stats_single(const double* const sum, const double* const sumsqr, const double* const fsum, const double* const fsumsqr, const double* const count, const int* const total_count, const char* type_name, const int Id, const char* const name, const char* const var, const char* const units, const int verbose)
{
	if(verbose >= -1)
	{
		int i;
		printf(" %7s %4d %16s %14s %6s", type_name, Id, name, var, units);
		for(i=0; i < MAX_MODEL_ORDER+1; ++i)
		{
			if(verbose >= i-1)
			{
				if(count[i] > 0.0)
				{
					double mean, sigma;
					double fmean, fsigma;
					compute_stats(sum[i], sumsqr[i], count[i], &mean, &sigma);
					compute_stats(fsum[i], fsumsqr[i], count[i], &fmean, &fsigma);
					printf("    %9.2E+-%7.1E %9.2E+-%7.1E (%5.0f/%5d)", mean, sigma, fmean, fsigma, count[i], total_count[i]);
				}
				else
				{
					printf("    %9s+-%7s %9s+-%7s (%5.0f/%5d)", "", "", "", "", count[i], total_count[i]);
				}
			}
		}
		fputc('\n', stdout);
	}
	return;
}



void process_stats_compare_object_item(double d0, double d1, const char* const object, int Id, const char* const field, const char* const units, const int verbose)
{
	double m = (d0 + d1) * 0.5;
	double d = d0 - d1;
	double f = d / m;
	printf("    %10s %5d %10s %24.16E   %9.2E %9.2E\n", object, Id, field, m, d, f);
	return;
}


void process_stats_compare_object(const DifxInput* const D0, const DifxInput* const D1, enum CompareObjectEnum object, int Id, const int verbose)
{
	switch(object)
	{
	case COEscan:
		break;
	case COEsource:
		{
			const DifxSource* const S0 = D0->source+Id;
			const DifxSource* const S1 = D1->source+Id;
			process_stats_compare_object_item(S0->ra, S1->ra, "source", Id, "RA", "rad", verbose);
			process_stats_compare_object_item(S0->dec, S1->dec, "source", Id, "Dec", "rad", verbose);
		}
		break;
	case COEantenna:
		break;
	default:
		fprintf(stderr, "Error: unrecognized CompareObjectEnum value %d\n", (int)object);
		return;
	}
	return;
}






void process_stats(ComparisonStruct* C, const char* type_name, const int Id, const char* const name, const int verbose)
{
	if(verbose >= -1)
	{
		int i;
		fputs("############################################\n", stdout);
		printf("#%7s %4d %16s %14s %6s", type_name, Id, name, "var", "units");
		for(i=0; i < MAX_MODEL_ORDER+1; ++i)
		{
			if(verbose >= i-1)
			{
				printf("    %7s%02d+-%7s %7s%02d+-%7s (%5s/%5s)", "Mean", i, "StdDev", "FracM", i, "StdDev", "Count", "Total");
			}
		}
		fputc('\n', stdout);
		
		process_stats_single(C->sum.delay, C->sumsqr.delay, C->fsum.delay, C->fsumsqr.delay, C->count.delay, C->total_count, type_name, Id, name, "delay", "s", verbose);
		process_stats_single(C->sum.dry, C->sumsqr.dry, C->fsum.dry, C->fsumsqr.dry, C->count.dry, C->total_count, type_name, Id, name, "dry", "s", verbose);
		process_stats_single(C->sum.wet, C->sumsqr.wet, C->fsum.wet, C->fsumsqr.wet, C->count.wet, C->total_count, type_name, Id, name, "wet", "s", verbose);
		process_stats_single(C->sum.iono, C->sumsqr.iono, C->fsum.iono, C->fsumsqr.iono, C->count.iono, C->total_count, type_name, Id, name, "iono", "s", verbose);
		process_stats_single(C->sum.az, C->sumsqr.az, C->fsum.az, C->fsumsqr.az, C->count.az, C->total_count, type_name, Id, name, "az", "deg", verbose);
		process_stats_single(C->sum.elcorr, C->sumsqr.elcorr, C->fsum.elcorr, C->fsumsqr.elcorr, C->count.elcorr, C->total_count, type_name, Id, name, "elcorr", "deg", verbose);
		process_stats_single(C->sum.elgeom, C->sumsqr.elgeom, C->fsum.elgeom, C->fsumsqr.elgeom, C->count.elgeom, C->total_count, type_name, Id, name, "elgeom", "deg", verbose);
		process_stats_single(C->sum.parangle, C->sumsqr.parangle, C->fsum.parangle, C->fsumsqr.parangle, C->count.parangle, C->total_count, type_name, Id, name, "parangle", "deg", verbose);
		process_stats_single(C->sum.msa, C->sumsqr.msa, C->fsum.msa, C->fsumsqr.msa, C->count.msa, C->total_count, type_name, Id, name, "msa", "rad", verbose);
		process_stats_single(C->sum.sc_gs_delay, C->sumsqr.sc_gs_delay, C->fsum.sc_gs_delay, C->fsumsqr.sc_gs_delay, C->count.sc_gs_delay, C->total_count, type_name, Id, name, "sc_gs_delay", "s", verbose);
		process_stats_single(C->sum.gs_sc_delay, C->sumsqr.gs_sc_delay, C->fsum.gs_sc_delay, C->fsumsqr.gs_sc_delay, C->count.gs_sc_delay, C->total_count, type_name, Id, name, "gs_sc_delay", "s", verbose);
		process_stats_single(C->sum.gs_clock_delay, C->sumsqr.gs_clock_delay, C->fsum.gs_clock_delay, C->fsumsqr.gs_clock_delay, C->count.gs_clock_delay, C->total_count, type_name, Id, name, "gs_clock_delay", "s", verbose);
		process_stats_single(C->sum.u, C->sumsqr.u, C->fsum.u, C->fsumsqr.u, C->count.u, C->total_count, type_name, Id, name, "u", "m", verbose);
		process_stats_single(C->sum.v, C->sumsqr.v, C->fsum.v, C->fsumsqr.v, C->count.v, C->total_count, type_name, Id, name, "v", "m", verbose);
		process_stats_single(C->sum.w, C->sumsqr.w, C->fsum.w, C->fsumsqr.w, C->count.w, C->total_count, type_name, Id, name, "w", "m", verbose);

		process_stats_single(C->sum_lmn.dDelay_dl, C->sumsqr_lmn.dDelay_dl, C->fsum_lmn.dDelay_dl, C->fsumsqr_lmn.dDelay_dl, C->count_lmn.dDelay_dl, C->total_count, type_name, Id, name, "dDelay_dl", "s/rad", verbose);
		process_stats_single(C->sum_lmn.dDelay_dm, C->sumsqr_lmn.dDelay_dm, C->fsum_lmn.dDelay_dm, C->fsumsqr_lmn.dDelay_dm, C->count_lmn.dDelay_dm, C->total_count, type_name, Id, name, "dDelay_dm", "s/rad", verbose);
		process_stats_single(C->sum_lmn.dDelay_dn, C->sumsqr_lmn.dDelay_dn, C->fsum_lmn.dDelay_dn, C->fsumsqr_lmn.dDelay_dn, C->count_lmn.dDelay_dn, C->total_count, type_name, Id, name, "dDelay_dn", "s/rad", verbose);
		process_stats_single(C->sum_lmn.d2Delay_dldl, C->sumsqr_lmn.d2Delay_dldl, C->fsum_lmn.d2Delay_dldl, C->fsumsqr_lmn.d2Delay_dldl, C->count_lmn.d2Delay_dldl, C->total_count, type_name, Id, name, "d2Delay_dldl", "s/rad2", verbose);
		process_stats_single(C->sum_lmn.d2Delay_dldm, C->sumsqr_lmn.d2Delay_dldm, C->fsum_lmn.d2Delay_dldm, C->fsumsqr_lmn.d2Delay_dldm, C->count_lmn.d2Delay_dldm, C->total_count, type_name, Id, name, "d2Delay_dldm", "s/rad2", verbose);
		process_stats_single(C->sum_lmn.d2Delay_dldn, C->sumsqr_lmn.d2Delay_dldn, C->fsum_lmn.d2Delay_dldn, C->fsumsqr_lmn.d2Delay_dldn, C->count_lmn.d2Delay_dldn, C->total_count, type_name, Id, name, "d2Delay_dldn", "s/rad2", verbose);
		process_stats_single(C->sum_lmn.d2Delay_dmdm, C->sumsqr_lmn.d2Delay_dmdm, C->fsum_lmn.d2Delay_dmdm, C->fsumsqr_lmn.d2Delay_dmdm, C->count_lmn.d2Delay_dmdm, C->total_count, type_name, Id, name, "d2Delay_dmdm", "s/rad2", verbose);
		process_stats_single(C->sum_lmn.d2Delay_dmdn, C->sumsqr_lmn.d2Delay_dmdn, C->fsum_lmn.d2Delay_dmdn, C->fsumsqr_lmn.d2Delay_dmdn, C->count_lmn.d2Delay_dmdn, C->total_count, type_name, Id, name, "d2Delay_dmdn", "s/rad2", verbose);
		process_stats_single(C->sum_lmn.d2Delay_dndn, C->sumsqr_lmn.d2Delay_dndn, C->fsum_lmn.d2Delay_dndn, C->fsumsqr_lmn.d2Delay_dndn, C->count_lmn.d2Delay_dndn, C->total_count, type_name, Id, name, "d2Delay_dndn", "s/rad2", verbose);
		
		process_stats_single(C->sum_xyz.dDelay_dX, C->sumsqr_xyz.dDelay_dX, C->fsum_xyz.dDelay_dX, C->fsumsqr_xyz.dDelay_dX, C->count_xyz.dDelay_dX, C->total_count, type_name, Id, name, "dDelay_dX", "s/m", verbose);
		process_stats_single(C->sum_xyz.dDelay_dY, C->sumsqr_xyz.dDelay_dY, C->fsum_xyz.dDelay_dY, C->fsumsqr_xyz.dDelay_dY, C->count_xyz.dDelay_dY, C->total_count, type_name, Id, name, "dDelay_dY", "s/m", verbose);
		process_stats_single(C->sum_xyz.dDelay_dZ, C->sumsqr_xyz.dDelay_dZ, C->fsum_xyz.dDelay_dZ, C->fsumsqr_xyz.dDelay_dZ, C->count_xyz.dDelay_dZ, C->total_count, type_name, Id, name, "dDelay_dZ", "s/m", verbose);
		process_stats_single(C->sum_xyz.d2Delay_dXdX, C->sumsqr_xyz.d2Delay_dXdX, C->fsum_xyz.d2Delay_dXdX, C->fsumsqr_xyz.d2Delay_dXdX, C->count_xyz.d2Delay_dXdX, C->total_count, type_name, Id, name, "d2Delay_dXdX", "s/m2", verbose);
		process_stats_single(C->sum_xyz.d2Delay_dXdY, C->sumsqr_xyz.d2Delay_dXdY, C->fsum_xyz.d2Delay_dXdY, C->fsumsqr_xyz.d2Delay_dXdY, C->count_xyz.d2Delay_dXdY, C->total_count, type_name, Id, name, "d2Delay_dXdY", "s/m2", verbose);
		process_stats_single(C->sum_xyz.d2Delay_dXdZ, C->sumsqr_xyz.d2Delay_dXdZ, C->fsum_xyz.d2Delay_dXdZ, C->fsumsqr_xyz.d2Delay_dXdZ, C->count_xyz.d2Delay_dXdZ, C->total_count, type_name, Id, name, "d2Delay_dXdZ", "s/m2", verbose);
		process_stats_single(C->sum_xyz.d2Delay_dYdY, C->sumsqr_xyz.d2Delay_dYdY, C->fsum_xyz.d2Delay_dYdY, C->fsumsqr_xyz.d2Delay_dYdY, C->count_xyz.d2Delay_dYdY, C->total_count, type_name, Id, name, "d2Delay_dYdY", "s/m2", verbose);
		process_stats_single(C->sum_xyz.d2Delay_dYdZ, C->sumsqr_xyz.d2Delay_dYdZ, C->fsum_xyz.d2Delay_dYdZ, C->fsumsqr_xyz.d2Delay_dYdZ, C->count_xyz.d2Delay_dYdZ, C->total_count, type_name, Id, name, "d2Delay_dYdZ", "s/m2", verbose);
		process_stats_single(C->sum_xyz.d2Delay_dZdZ, C->sumsqr_xyz.d2Delay_dZdZ, C->fsum_xyz.d2Delay_dZdZ, C->fsumsqr_xyz.d2Delay_dZdZ, C->count_xyz.d2Delay_dZdZ, C->total_count, type_name, Id, name, "d2Delay_dZdZ", "s/m2", verbose);
	}
	return;
}












static int compareInputs(const DifxInput* const D0, const DifxInput* const D1, int verbose)
{
	ComparisonStruct* Call = NULL;
	ComparisonStruct* Cjob = NULL;
	ComparisonStruct* Cantenna = NULL;
	ComparisonStruct* Cscan = NULL;
	ComparisonStruct* Csource = NULL;

	int jobId;
	int antennaId;
	int scanId;
	int sourceId;

	int total_count = 0;
	char jobname[32];
	
	int ret;

	ret = sanity_check(D0, D1, verbose, &Call, &Cjob, &Cantenna, &Cscan, &Csource);
	if(ret < 0)
	{
		fprintf(stderr, "Error: received %d from sanity_check\n", ret);
		return -1;
	}

	for(scanId = 0; scanId < D0->nScan; ++scanId)
	{
		ret = process_scan(D0, D1, verbose, scanId, Call, Cjob, Cantenna, Cscan, Csource);
		if(ret < 0)
		{
			fprintf(stderr, "Error: received %d from sanity_check\n", ret);
			free(Call); Call = NULL;
			free(Cjob); Cjob = NULL;
			free(Cantenna); Cantenna = NULL;
			free(Cscan); Cscan = NULL;
			free(Csource); Csource = NULL;
			return -2;
		}
		total_count += ret;
	}

	if(verbose > 1)
	{
		printf("Found %d entries to compare\n", total_count);
	}

	fputs("#%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n", stdout);
	fputs("# SCAN %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n", stdout);
	fputs("#%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n", stdout);
	for(scanId=0; scanId < D0->nScan; ++scanId)
	{
		process_stats(Cscan+scanId, "scan", scanId, D0->scan[scanId].identifier, verbose-2);
	}

	fputs("#%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n", stdout);
	fputs("# SOURCE %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n", stdout);
	fputs("#%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n", stdout);
	for(sourceId=0; sourceId < D0->nSource; ++sourceId)
	{
		process_stats(Csource+sourceId, "source", sourceId, D0->source[sourceId].name, verbose-1);
		process_stats_compare_object(D0, D1, COEsource, sourceId, verbose);
	}

	fputs("#%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n", stdout);
	fputs("# ANTENNA %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n", stdout);
	fputs("#%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n", stdout);
	for(antennaId=0; antennaId < D0->nAntenna; ++antennaId)
	{
		process_stats(Cantenna+antennaId, "antenna", antennaId, D0->antenna[antennaId].name, verbose-1);
	}

	fputs("#%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n", stdout);
	fputs("# JOB %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n", stdout);
	fputs("#%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n", stdout);
	for(jobId=0; jobId < D0->nJob; ++jobId)
	{
		jobname[0] = 0;
		snprintf(jobname, 32, "%d.%d", D0->job[jobId].jobId, D0->job[jobId].subjobId);
		process_stats(Cjob+jobId, "job", jobId, jobname, verbose-1);
	}

	fputs("#%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n", stdout);
	fputs("# ALL %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n", stdout);
	fputs("#%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n", stdout);
	process_stats(Call, "all", 0, "All", verbose);

	
	

	free(Call); Call = NULL;
	free(Cjob); Cjob = NULL;
	free(Cantenna); Cantenna = NULL;
	free(Cscan); Cscan = NULL;
	free(Csource); Csource = NULL;

	
	
	return 0;
}










static DifxInput* getDifxInput(const char *prefix, const int verbose)
{
	DifxInput* D = NULL;
	FILE *in;
	char fn[DIFXIO_FILENAME_LENGTH];
	int v;

	v = snprintf(fn, DIFXIO_FILENAME_LENGTH, "%s.im", prefix);
	if(v >= DIFXIO_FILENAME_LENGTH)
	{
		fprintf(stderr, "Error: filename %s.im is too long (max %d chars)\n", prefix, DIFXIO_FILENAME_LENGTH-1);
	}
	in = fopen(fn, "r");
	if(!in)
	{
		fprintf(stderr, "File %s not found or cannot be opened.  Quitting.\n", fn);

		return NULL;
	}
	else
	{
		fclose(in);
	}

	if(verbose >= 3)
	{
		printf("%s loading DifxInput from '%s'\n", program, prefix);
	}
	D = loadDifxInput(prefix);

	if(D == 0)
	{
		fprintf(stderr, "Error: loadDifxInput(\"%s\") returned 0\n", prefix);

		return D;
	}

	D = updateDifxInput(D);
	if(D == 0)
	{
		fprintf(stderr, "Error: updateDifxInput(\"%s\") returned 0\n", prefix);

		return D;
	}

	if(verbose >= 3)
	{
		printDifxInput(D);
	}

	return D;
}







static int runfile(const char *prefix0, const char* prefix1, const int verbose)
{
	DifxInput* D0 = NULL;
	DifxInput* D1 = NULL;
	int v;

	if(verbose >= 3)
	{
		printf("using input files '%s' and '%s'\n", prefix0, prefix1);
	}

	if(verbose >= 3)
	{
		printf("Loading DifxInput from '%s'\n", prefix0);
	}
	D0 = getDifxInput(prefix0, verbose);
	if(D0 == NULL)
	{
		fprintf(stderr, "Could not load DifxInput from '%s'\n", prefix0);
		return -1;
	}
	if(verbose >= 3)
	{
		printf("Loading DifxInput from '%s'\n", prefix1);
	}
	D1 = getDifxInput(prefix1, verbose);
	if(D1 == NULL)
	{
		fprintf(stderr, "Could not load DifxInput from '%s'\n", prefix1);
		deleteDifxInput(D0); D0 = NULL;
		return -1;
	}

	if(verbose >= 3)
	{
		printf("Comparing DifxInputs\n");
	}
	v = compareInputs(D0, D1, verbose);
	if(v < 0)
	{
		fprintf(stderr, "Received code %d from compareInputs\n", v);
		deleteDifxInput(D0); D0 = NULL;
		deleteDifxInput(D1); D1 = NULL;
	}

	deleteDifxInput(D0); D0 = NULL;
	deleteDifxInput(D1); D1 = NULL;

	return 0;
}


int run(const CommandLineOptions *opts)
{
	int i;

	if(getenv("DIFX_GROUP_ID"))
	{
		umask(2);
	}

	if(opts == 0)
	{
		return EXIT_FAILURE;
	}
		

	for(i = 0; i < opts->nFile; ++i)
	{
		char* filename = opts->files[i];
		char* last_match = opts->files[i];
		char* this_match = NULL;
		/* Find the last directory separator */
		do
		{
			this_match = strstr(filename, "/");
			if((this_match))
			{
				filename = this_match+1;
			}
		} while((this_match));
		/* Check for .input */
		last_match = filename;
		do
		{
			this_match = strstr(last_match, ".input");
			if((this_match))
			{
				last_match = this_match+1;
			}
		} while((this_match));
		if(last_match != filename)
		{
			--last_match;
			if(strcmp(last_match, ".input") == 0)
			{
				*last_match = 0;
			}
		}
		/* Check for .calc */
		last_match = filename;
		do
		{
			this_match = strstr(last_match, ".calc");
			if((this_match))
			{
				last_match = this_match+1;
			}
		} while((this_match));
		if(last_match != filename)
		{
			--last_match;
			if(strcmp(last_match, ".calc") == 0)
			{
				*last_match = 0;
			}
		}
		/* Check for .im */
		last_match = filename;
		do
		{
			this_match = strstr(last_match, ".im");
			if((this_match))
			{
				last_match = this_match+1;
			}
		} while((this_match));
		if(last_match != filename)
		{
			--last_match;
			if(strcmp(last_match, ".im") == 0)
			{
				*last_match = 0;
			}
		}
		if(opts->verbose >= 2)
		{
			printf("%s processing file %d/%d = %s\n", program, i+1, opts->nFile, opts->files[i]);
		}
	}
	runfile(opts->files[0], opts->files[1], opts->verbose);

	return EXIT_SUCCESS;
}

int main(int argc, char **argv)
{
	int status;
	CommandLineOptions *opts;

	opts = newCommandLineOptions(argc, argv);

	status = run(opts);

	deleteCommandLineOptions(opts); opts = NULL;
	
	return status;
}
