int main(int argc, char *argv[]) { int nPixels_tot, nColumns, nRows; int nPixels_psf, nRows_psf, nColumns_psf; int nParamsTot; int status; double *psfPixels; double *paramsVect; ModelObject *theModel; vector<string> functionList; vector<double> parameterList; vector<int> functionBlockIndices; commandOptions options; configOptions userConfigOptions; // timing-related stuff struct timeval timer_start, timer_end; double microsecs, time_elapsed; /* Process command line and parse config file: */ options.outputImageName = DEFAULT_OUTPUT_FILENAME; options.noImageName = true; options.noRefImage = true; options.subsamplingFlag = true; options.noImageDimensions = true; options.referenceImageName = ""; options.psfImagePresent = false; options.psfFileName = ""; options.nColumns = 0; options.nRows = 0; options.noConfigFile = true; options.configFileName = ""; options.noModel = true; options.noParamLimits = true; options.magZeroPoint = NO_MAGNITUDES; options.printImages = false; options.nIterations = 1; options.debugLevel = 0; ProcessInput(argc, argv, &options); /* Read configuration file */ if (! FileExists(options.configFileName.c_str())) { fprintf(stderr, "\n*** ERROR: Unable to find configuration file \"%s\"!\n\n", options.configFileName.c_str()); return -1; } status = ReadConfigFile(options.configFileName, true, functionList, parameterList, functionBlockIndices, userConfigOptions); if (status != 0) { fprintf(stderr, "\n*** ERROR: Failure reading configuration file \"%s\"!\n\n", options.configFileName.c_str()); return -1; } if ((options.noRefImage) and (options.noImageDimensions)) { fprintf(stderr, "\n*** ERROR: Insufficient image dimensions (or no reference image) supplied!\n\n"); return -1; } /* Get image size from reference image, if necessary */ if (options.noImageDimensions) { status = GetImageSize(options.referenceImageName, &nColumns, &nRows); if (status != 0) { fprintf(stderr, "\n*** ERROR: Failure determining size of image file \"%s\"!\n\n", options.referenceImageName.c_str()); exit(-1); } // Reminder: nColumns = n_pixels_per_row // Reminder: nRows = n_pixels_per_column printf("Reference image read: naxis1 [# rows] = %d, naxis2 [# columns] = %d\n", nRows, nColumns); } else { nColumns = options.nColumns; nRows = options.nRows; } nPixels_tot = nColumns * nRows; /* Read in PSF image, if supplied */ if (options.psfImagePresent) { printf("Reading PSF image (\"%s\") ...\n", options.psfFileName.c_str()); psfPixels = ReadImageAsVector(options.psfFileName, &nColumns_psf, &nRows_psf); if (psfPixels == NULL) { fprintf(stderr, "\n*** ERROR: Unable to read PSF image file \"%s\"!\n\n", options.psfFileName.c_str()); exit(-1); } nPixels_psf = nColumns_psf * nRows_psf; printf("naxis1 [# pixels/row] = %d, naxis2 [# pixels/col] = %d; nPixels_tot = %d\n", nColumns_psf, nRows_psf, nPixels_psf); } else printf("* No PSF image supplied -- no image convolution will be done!\n"); if (! options.subsamplingFlag) printf("* Pixel subsampling has been turned OFF.\n"); /* Set up the model object */ theModel = new ModelObject(); theModel->SetDebugLevel(options.debugLevel); /* Add functions to the model object; also tells model object where function sets start */ status = AddFunctions(theModel, functionList, functionBlockIndices, options.subsamplingFlag); if (status < 0) { fprintf(stderr, "*** ERROR: Failure in AddFunctions!\n\n"); exit(-1); } // Add PSF image vector, if present (needs to be added prior to image data, so that // ModelObject can figure out proper internal model-image size if (options.psfImagePresent) { status = theModel->AddPSFVector(nPixels_psf, nColumns_psf, nRows_psf, psfPixels); if (status < 0) { fprintf(stderr, "*** ERROR: Failure in ModelObject::AddPSFVector!\n\n"); exit(-1); } } /* Define the size of the requested model image */ theModel->SetupModelImage(nColumns, nRows); theModel->PrintDescription(); // Set up parameter vector(s), now that we know how many total parameters // there will be nParamsTot = theModel->GetNParams(); printf("%d total parameters\n", nParamsTot); if (nParamsTot != (int)parameterList.size()) { fprintf(stderr, "*** ERROR: number of input parameters (%d) does not equal", (int)parameterList.size()); fprintf(stderr, " required number of parameters for specified functions (%d)!\n\n", nParamsTot); exit(-1); } /* Copy parameters into C array and generate the model image */ paramsVect = (double *) calloc(nParamsTot, sizeof(double)); for (int i = 0; i < nParamsTot; i++) paramsVect[i] = parameterList[i]; // Generate the image (including convolution, if requested), repeatedly gettimeofday(&timer_start, NULL); for (int ii = 0; ii < options.nIterations; ii++) theModel->CreateModelImage(paramsVect); gettimeofday(&timer_end, NULL); microsecs = timer_end.tv_usec - timer_start.tv_usec; time_elapsed = timer_end.tv_sec - timer_start.tv_sec + microsecs/1e6; printf("\nELAPSED TIME FOR %d ITERATIONS: %.6f sec\n", options.nIterations, time_elapsed); printf("Mean time per iteration = %.7f\n", time_elapsed/options.nIterations); /* Save model image: */ printf("\nSaving output model image (\"%s\") ...\n", options.outputImageName.c_str()); vector<string> commentStrings; SaveVectorAsImage(theModel->GetModelImageVector(), options.outputImageName, nColumns, nRows, commentStrings); printf("Done!\n\n"); // Free up memory if (options.psfImagePresent) free(psfPixels); free(paramsVect); delete theModel; return 0; }