/* Library finalizer function */ static void __attribute__((destructor)) interpose_fini(void) { /* Look for descriptors not explicitly closed */ for(int i=0; i<max_descriptors; i++) { trace_close(i); } read_exe(); read_status(); read_stat(); read_io(); tprintf("stop: %lf\n", get_time()); /* Close trace file */ tclose(); }
int proc_rule(struct htx_data *phtx_info, struct ruleinfo *prule_info, char *wbuf, char *rbuf, struct blk_num_typ *pblk_num) { int dlen, loop, rc; char msg[220], path[100]; unsigned short seed[3]; rc = 0; init_seed(seed); /* initialize seed for random number generator */ dlen = prule_info->num_blks * BLK_SIZE; /* initialize length of data */ /*-------------------------------*/ /* initialize the write buffer */ /*-------------------------------*/ if ( (prule_info->pattern_id[0] != '#') && (prule_info->pattern_id[0] != 0) ) { path[0] ='\0'; if ( (int) htx_strlen((char *) htx_strcpy(path, getenv("HTXPATTERNS"))) == 0 ) htx_strcpy(path, "../pattern/"); /* default ONLY */ htx_strcat (path, prule_info->pattern_id); rc = hxfpat(path, wbuf, dlen); if ( rc == 1 ) { sprintf(msg, "cannot open pattern file - %s\n", path); hxfmsg(phtx_info, 0, SYSERR, msg); return(1); } if ( rc == 2 ) { sprintf(msg, "cannot read pattern file - %s\n", path); hxfmsg(phtx_info, 0, SYSERR, msg); return(1); } } else if ( prule_info->pattern_id[0] == '#' ) bldbuf((unsigned short*)wbuf, dlen, prule_info->pattern_id, pblk_num); pblk_num->in_rule = 0; /* initialize block number within current rule */ rc = 0; tape_error_code = 0; for ( loop = 1; loop <= prule_info->num_oper; loop++ ) { if ( strcmp(prule_info->oper, "R") == 0 ) { rc = read_tape(phtx_info, prule_info, loop, pblk_num, rbuf); } else if ( strcmp(prule_info->oper, "W") == 0 ) { rc = write_tape(phtx_info, prule_info, loop, pblk_num, wbuf); } else if ( strcmp(prule_info->oper, "RC") == 0 ) { rc = read_tape(phtx_info, prule_info, loop, pblk_num, rbuf); if ( rc >= 0 ) rc = cmpbuf(phtx_info, prule_info, loop, pblk_num, wbuf, rbuf); } else if ( strcmp(prule_info->oper, "RW") == 0 ) { rc = rewind_tape(phtx_info, prule_info, loop, pblk_num); } else if ( strcmp(prule_info->oper, "WEOF") == 0 ) { rc = weof_tape(phtx_info, prule_info, loop, pblk_num); } else if ( strcmp(prule_info->oper, "SF") == 0 ) { rc = search_file(phtx_info, prule_info, loop, pblk_num); } else if ( strcmp(prule_info->oper, "SR") == 0 ) { rc = search_rec(phtx_info, prule_info, loop, pblk_num); } else if ( strcmp(prule_info->oper, "D") == 0 ) { rc = diag_tape(phtx_info, prule_info, loop, pblk_num); } else if ( strcmp(prule_info->oper, "E") == 0 ) { rc = erase_tape(phtx_info, prule_info, loop, pblk_num); } else if ( strcmp(prule_info->oper, "S") == 0 ) { rc = do_sleep(phtx_info, prule_info, loop, pblk_num); } else if ( strcmp(prule_info->oper, "CO") == 0 ) { rc = close_open(phtx_info, prule_info, loop, pblk_num); } else if ( strcmp(prule_info->oper, "C") == 0 ) { rc = tclose(phtx_info, prule_info, loop, pblk_num); } else if ( strcmp(prule_info->oper, "O") == 0 ) { rc = topen(phtx_info, prule_info, loop, pblk_num); } else if ( strcmp(prule_info->oper, "WEOT") == 0 ) { rc = write_eot(phtx_info, prule_info,loop, pblk_num, wbuf); } else if ( strcmp(prule_info->oper, "RCEOT") == 0 ) { rc = read_eot(phtx_info, prule_info, loop,pblk_num, wbuf, rbuf); } else if ( strcmp(prule_info->oper, "REOT") == 0 ) { rc = read_teot(phtx_info, prule_info, loop, pblk_num, wbuf, rbuf); } else if ( strcmp(prule_info->oper, "RS") == 0 ) { rc = prt_req_sense(phtx_info, prule_info, loop, pblk_num); } #ifndef __HTX_LINUX__ else if ( strcmp(prule_info->oper, "ML") == 0 ) { rc = medium_load(phtx_info, prule_info, loop, pblk_num); } else if ( strcmp(prule_info->oper, "MUL") == 0 ) { rc = medium_unload(phtx_info, prule_info, loop, pblk_num); } else if ( strcmp(prule_info->oper, "RES") == 0 ) { rc = read_status(phtx_info, prule_info, loop, pblk_num); } else if ( strcmp(prule_info->oper, "IE") == 0 ) { rc = init_element(phtx_info, prule_info, loop, pblk_num); } else if ( strcmp(prule_info->oper, "RP") == 0 ) { rc = read_posit(phtx_info, prule_info, loop, pblk_num); } else if ( strcmp(prule_info->oper, "LB") == 0 ) { rc = loc_block(phtx_info, prule_info, loop, pblk_num); } else if ( strcmp(prule_info->oper, "ASF") == 0 ) { rc = asearch_file(phtx_info, prule_info, loop, pblk_num); } else if ( strcmp(prule_info->oper, "ASR") == 0 ) { rc = asearch_rec(phtx_info, prule_info, loop, pblk_num); } else if ( strcmp(prule_info->oper, "ADUL") == 0 ) { rc = write_unload(phtx_info, prule_info, loop, pblk_num, wbuf); } else if ( strcmp(prule_info->oper, "TWIE") == 0 ) { rc = twin_tape(phtx_info, prule_info, loop, pblk_num); } else if ( strcmp(prule_info->oper, "TWPE") == 0 ) { rc = twps_tape(phtx_info, prule_info, loop, pblk_num); } else if ( strcmp(prule_info->oper, "TWRE") == 0 ) { rc = twrd_stat(phtx_info, prule_info, loop, pblk_num); } else if ( strcmp(prule_info->oper, "TWMM") == 0 ) { rc = twmv_tape(phtx_info, prule_info, loop, pblk_num); } else if ( strcmp(prule_info->oper, "TWUL") == 0 ) { rc = unload_write(phtx_info, prule_info, loop, pblk_num, wbuf); } else if ( strcmp(prule_info->oper, "WUL") == 0 ) { rc = tape_unload(phtx_info, prule_info, loop, pblk_num, wbuf); } else if ( strcmp(prule_info->oper, "CDRE") == 0 ) { rc = cdrd_stat(phtx_info, prule_info, loop, pblk_num); } else if ( strcmp(prule_info->oper, "CDMM") == 0 ) { rc = cdmv_tape(phtx_info, prule_info, loop, pblk_num); } else if ( strcmp(prule_info->oper, "HUNL") == 0 ) { rc = himove(phtx_info, prule_info, loop, pblk_num); } else if ( strcmp(prule_info->oper, "HINI") == 0 ) { rc = hiinit(phtx_info, prule_info, loop, pblk_num); } else if ( strcmp(prule_info->oper, "HREL") == 0 ) { rc = hielem(phtx_info, prule_info, loop, pblk_num); } else if ( strcmp(prule_info->oper, "HWUN") == 0 ) { rc = hidal_unload(phtx_info, prule_info, loop, pblk_num, wbuf); } else if ( strcmp(prule_info->oper, "DBUG") == 0 ) { rc = set_dbug(phtx_info, prule_info, pblk_num); } #endif else if ( strcmp(prule_info->oper, "XCMD") == 0 ) { rc = do_cmd(phtx_info, prule_info, pblk_num); } else { ; } hxfupdate(UPDATE, phtx_info); if ( phtx_info->run_type[0] == 'O' ) { info_msg(phtx_info, prule_info, loop, pblk_num, msg); hxfmsg(phtx_info, 0, INFO, msg); } if ( rc != 0 ) break; } return(rc); }
int main(int argc, char **argv) { int i, j, k, ncol, nimages; int haveHdr, itmp, istat, mAddCntr; int nparents, parent, parent_prev; int naxis1s, naxis2s; char line [MAXSTR]; char mproj [MAXSTR]; char survey [MAXSTR]; char band [MAXSTR]; char hdrFile [MAXSTR]; char mosaicCentLon [MAXSTR]; char mosaicCentLat [MAXSTR]; char mosaicWidth [MAXSTR]; char mosaicHeight [MAXSTR]; char mosaicCdelt [MAXSTR]; char workdir [MAXSTR]; char urlbase [MAXSTR]; char workurlbase [MAXSTR]; char timestr [MAXSTR]; char cmd [MAXSTR]; char status [MAXSTR]; char msg [MAXSTR]; char fname [MAXSTR]; char fitname [MAXSTR]; char plusname [MAXSTR]; char minusname [MAXSTR]; char jobid [MAXSTR]; char fileList [MAXSTR]; char parentList [MAXSTR]; char sortedParent [MAXSTR]; char *fileid; char *parentid; clock_t timeval; double width; double height; double cdelt; double crval1, crval2; double crpix1, crpix2; int ifname, iurl, icntr1, icntr2, iplusname, iminusname, iscale; int cntr, cntr1, cntr2, id, level; int shrinkFactor, shrinkFactorX, shrinkFactorY; double x, y, z; double xc, yc, zc; double xpos, ypos, dtr; double dist, maxRadius; double lonc, latc; FILE *fp; FILE *fdag; FILE *ffit; FILE *fcache; FILE *furl; FILE *ffile; FILE *fparent; char dv_version [MAXSTR]; int maxtbl = 1000; char key[MAXSTR]; char val[MAXSTR]; struct stat type; HT_table_t *depends; char *path = getenv("MONTAGE_HOME"); /* Various time value variables */ char buffer[256]; int yr, mo, day, hr, min, sec, pid; time_t curtime; struct tm *loctime; char idstr[256]; dtr = atan(1.0)/45.; strcpy(dv_version, "1.0"); HT_set_debug(0); /* Generate a unique ID based on data/time/pid */ curtime = time (NULL); loctime = localtime (&curtime); strftime(buffer, 256, "%Y", loctime); yr = atoi(buffer); strftime(buffer, 256, "%m", loctime); mo = atoi(buffer); strftime(buffer, 256, "%d", loctime); day = atoi(buffer); strftime(buffer, 256, "%H", loctime); hr = atoi(buffer); strftime(buffer, 256, "%M", loctime); min = atoi(buffer); strftime(buffer, 256, "%S", loctime); sec = atoi(buffer); pid = (int)getpid(); sprintf(idstr, "%04d%02d%02d_%02d%02d%02d_%d", yr, mo, day, hr, min, sec, pid); /* Set up the dependency hash table */ depends = HT_create_table(maxtbl); timeval = time(0); strcpy(timestr, ctime((const time_t *)(&timeval))); for(i=0; i<strlen(timestr); ++i) if(timestr[i] == '\n') timestr[i] = '\0'; if(debug) { fdebug = fopen("debug.txt", "w+"); if(fdebug == (FILE *)NULL) { printf("[struct stat=\"ERROR\", msg=\"Error opening debug file\"]\n"); exit(0); } fprintf(fdebug, "DEBUGGING mDAG:\n\n"); fflush(fdebug); if(debug > 1) svc_debug(fdebug); } /* Get the location/size information */ haveHdr = 0; if(argc < 11) { printf("[struct stat=\"ERROR\", msg=\"Usage: %s survey band centerlon centerlat width height cdelt workdir workurlbase urlbase | %s -h survey band hdrfile workdir workurlbase urlbase (object/location string must be a single argument)\"]\n", argv[0], argv[0]); exit(0); } strcpy(survey, argv[1]); strcpy(band, argv[2]); strcpy(mosaicCentLon, argv[3]); strcpy(mosaicCentLat, argv[4]); strcpy(mosaicWidth, argv[5]); strcpy(mosaicHeight, argv[6]); strcpy(mosaicCdelt, argv[7]); strcpy(workdir, argv[8]); strcpy(workurlbase, argv[9]); strcpy(urlbase, argv[10]); crval1 = atof(mosaicCentLon); crval2 = atof(mosaicCentLat); width = fabs(atof(mosaicWidth)); height = fabs(atof(mosaicHeight)); cdelt = fabs(atof(mosaicCdelt)); naxis1 = (int)(width / cdelt) + 0.5; naxis2 = (int)(height / cdelt) + 0.5; crpix1 = (naxis1+1.)/2.; crpix2 = (naxis2+1.)/2.; istat = stat(workdir, &type); if(istat < 0) printError("work directory doesn't exist"); strcpy(mproj, "mProject"); /********************************************************/ /* we have the size/center, we need to build the header */ /********************************************************/ /*******************************/ /* Create header template file */ /*******************************/ sprintf(hdrFile, "%s/region.hdr", workdir); fp = fopen(hdrFile, "w+"); if(fp == (FILE *)NULL) { printf("[struct stat=\"ERROR\", msg=\"Error opening header template file\"]\n"); exit(0); } fprintf(fp, "SIMPLE = T\n" ); fprintf(fp, "BITPIX = -64\n" ); fprintf(fp, "NAXIS = 2\n" ); fprintf(fp, "NAXIS1 = %d\n", naxis1 ); fprintf(fp, "NAXIS2 = %d\n", naxis2 ); fprintf(fp, "CTYPE1 = '%s'\n", "GLON-CAR" ); fprintf(fp, "CTYPE2 = '%s'\n", "GLAT-CAR" ); fprintf(fp, "CRVAL1 = %11.6f\n", crval1 ); fprintf(fp, "CRVAL2 = %11.6f\n", crval2 ); fprintf(fp, "CRPIX1 = %11.6f\n", crpix1 ); fprintf(fp, "CRPIX2 = %11.6f\n", crpix2 ); fprintf(fp, "CDELT1 = %.9f\n", -cdelt ); fprintf(fp, "CDELT2 = %.9f\n", cdelt ); fprintf(fp, "CROTA2 = %11.6f\n", 0.0 ); fprintf(fp, "EQUINOX = %d\n", 2000 ); if(strcasecmp(survey, "2MASS") == 0) { if(strcasecmp(band, "J") == 0) fprintf(fp, "MAGZP = %11.6f\n", 20.9044); else if(strcasecmp(band, "H") == 0) fprintf(fp, "MAGZP = %11.6f\n", 20.4871); else if(strcasecmp(band, "K") == 0) fprintf(fp, "MAGZP = %11.6f\n", 19.9757); } fprintf(fp, "END\n" ); fclose(fp); /***********************************/ /* Create big header template file */ /***********************************/ sprintf(hdrFile, "%s/big_region.hdr", workdir); fp = fopen(hdrFile, "w+"); if(fp == (FILE *)NULL) { printf("[struct stat=\"ERROR\", msg=\"Error opening big header template file\"]\n"); exit(0); } fprintf(fp, "SIMPLE = T\n" ); fprintf(fp, "BITPIX = -64\n" ); fprintf(fp, "NAXIS = 2\n" ); fprintf(fp, "NAXIS1 = %d\n", naxis1+3000 ); fprintf(fp, "NAXIS2 = %d\n", naxis2+3000 ); fprintf(fp, "CTYPE1 = '%s'\n", "GLON-CAR" ); fprintf(fp, "CTYPE2 = '%s'\n", "GLAT-CAR" ); fprintf(fp, "CRVAL1 = %11.6f\n", crval1 ); fprintf(fp, "CRVAL2 = %11.6f\n", crval2 ); fprintf(fp, "CRPIX1 = %11.6f\n", crpix1+1500 ); fprintf(fp, "CRPIX2 = %11.6f\n", crpix2+1500 ); fprintf(fp, "CDELT1 = %.9f\n", -cdelt ); fprintf(fp, "CDELT2 = %.9f\n", cdelt ); fprintf(fp, "CROTA2 = %11.6f\n", 0.0 ); fprintf(fp, "EQUINOX = %d\n", 2000 ); if(strcasecmp(survey, "2MASS") == 0) { if(strcasecmp(band, "J") == 0) fprintf(fp, "MAGZP = %11.6f\n", 20.9044); else if(strcasecmp(band, "H") == 0) fprintf(fp, "MAGZP = %11.6f\n", 20.4871); else if(strcasecmp(band, "K") == 0) fprintf(fp, "MAGZP = %11.6f\n", 19.9757); } fprintf(fp, "END\n" ); fclose(fp); /************************************************/ /* Get list of raw input images for this region */ /************************************************/ /* this is how mExec is implemented */ double scaleWidth = width * 1.42; double scaleHeight = height * 1.42; if(path) sprintf(cmd, "%s/bin/mArchiveList %s %s \"%s %s gal\" %.2f %.2f %s/images.tbl", path, survey, band, mosaicCentLon, mosaicCentLat, scaleWidth, scaleHeight, workdir); else sprintf(cmd, "mArchiveList %s %s \"%s %s gal\" %.2f %.2f %s/images.tbl", survey, band, mosaicCentLon, mosaicCentLat, scaleWidth, scaleHeight, workdir); if(debug) { fprintf(fdebug, "[%s]\n", cmd); fflush(fdebug); } svc_run(cmd); strcpy( status, svc_value( "stat" )); if (strcmp( status, "ERROR") == 0) { strcpy( msg, svc_value( "msg" )); printError(msg); } if (strcmp(status, "ABORT") == 0) { strcpy( msg, svc_value( "msg" )); printError(msg); } nimages = atof(svc_value("count")); if (nimages == 0) { sprintf( msg, "%s has no data covering this area", survey); printError(msg); } /*****************************************/ /* Get the image lists the DAG will need */ /*****************************************/ if(path) sprintf(cmd, "%s/bin/mDAGTbls %s/images.tbl %s/big_region.hdr %s/rimages.tbl %s/pimages.tbl %s/cimages.tbl", path, workdir, workdir, workdir, workdir, workdir); else sprintf(cmd, "mDAGTbls %s/images.tbl %s/big_region.hdr %s/rimages.tbl %s/pimages.tbl %s/cimages.tbl", workdir, workdir, workdir, workdir, workdir); if(debug) { fprintf(fdebug, "[%s]\n", cmd); fflush(fdebug); } svc_run(cmd); strcpy( status, svc_value( "stat" )); if (strcmp( status, "ERROR") == 0) { strcpy( msg, svc_value( "msg" )); printError(msg); } /******************************************/ /* Get the overlap list the DAG will need */ /******************************************/ if(path) sprintf(cmd, "%s/bin/mOverlaps %s/rimages.tbl %s/diffs.tbl", path, workdir, workdir); else sprintf(cmd, " mOverlaps %s/rimages.tbl %s/diffs.tbl", workdir, workdir); if(debug) { fprintf(fdebug, "[%s]\n", cmd); fflush(fdebug); } svc_run(cmd); strcpy( status, svc_value( "stat" )); if (strcmp( status, "ERROR") == 0) { strcpy( msg, svc_value( "msg" )); printError(msg); } /****************************************************/ /* Determine shrink factor for presentation image. */ /****************************************************/ shrinkFactorX = (int)(naxis1 / 1024. + 1.); shrinkFactorY = (int)(naxis2 / 1024. + 1.); shrinkFactor = shrinkFactorX; if(shrinkFactor < shrinkFactorY) shrinkFactor = shrinkFactorY; if(debug) { fprintf(fdebug, "\n"); fprintf(fdebug, "shrinkFactorX = %d\n", shrinkFactorX); fprintf(fdebug, "shrinkFactorY = %d\n", shrinkFactorY); fprintf(fdebug, "shrinkFactor = %d\n", shrinkFactor); fprintf(fdebug, "\n"); fflush(fdebug); } /***********************************************/ /* Now we can generate the DAG XML file itself */ /* First the XML header */ /***********************************************/ if(debug) { fprintf(fdebug, "Generating DAG file header ...\n"); fflush(fdebug); } sprintf(cmd, "%s/dag.xml", workdir); fdag = fopen(cmd, "w+"); sprintf(cmd, "%s/cache.list", workdir); fcache = fopen(cmd, "w+"); sprintf(cmd, "%s/url.list", workdir); furl = fopen(cmd, "w+"); fprintf(fdag, "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"); fprintf(fdag, "<!-- Generated: %s -->\n", timestr); fprintf(fdag, "<!-- Generated by: Montage DAG service -->\n\n"); fprintf(fdag, "<adag xmlns=\"http://pegasus.isi.edu/schema/DAX\"\n"); fprintf(fdag, " xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n"); fprintf(fdag, " xsi:schemaLocation=\"http://pegasus.isi.edu/schema/DAX http://pegasus.isi.edu/schema/dax-2.1.xsd\"\n"); fprintf(fdag, " version=\"2.1\" count=\"1\" index=\"0\" name=\"montage\">\n\n"); fflush(fdag); fprintf(fdag, " <!-- Survey: %-30s -->\n", survey); fprintf(fdag, " <!-- Band: %-30s -->\n", band); fprintf(fdag, " <!-- Center Longitude: %-30s -->\n", mosaicCentLon); fprintf(fdag, " <!-- Center Latitude: %-30s -->\n", mosaicCentLat); if(haveHdr) fprintf(fdag, " <!-- (WCS is in input header file) -->\n"); else { fprintf(fdag, " <!-- Width: %-30s -->\n", mosaicWidth); fprintf(fdag, " <!-- Height: %-30s -->\n", mosaicHeight); } fprintf(fdag, "\n\n"); fflush(fdag); /******************************************/ /* compose the url lfn cache list */ /******************************************/ sprintf(cmd, "%s/images.tbl", workdir); ncol = topen(cmd); ifname = tcol("file"); iurl = tcol("URL"); if(ifname < 0) printError("'Raw' image list does not have column 'file'"); if(iurl < 0) printError("'Raw' image list does not have column 'url'"); while(1) { istat = tread(); if(istat < 0) break; fprintf(furl, "%s %s pool=\"ipac_cluster\"\n", tval(ifname), tval(iurl)); } tclose(); fclose(furl); /******************************************/ /* DAG: "filename" lines for input images */ /******************************************/ if(debug) { fprintf(fdebug, "Generating DAG file filename list ...\n"); fflush(fdebug); } fprintf(fdag, " <!-- Part 1: Files Used -->\n\n"); sprintf(cmd, "%s/rimages.tbl", workdir); ncol = topen(cmd); ifname = tcol("file"); if(ifname < 0) printError("'Raw' image list does not have column 'file'"); while(1) { istat = tread(); if(istat < 0) break; fprintf(fdag, " <filename file=\"%s\" link=\"input\"/>\n", tval(ifname)); } fprintf(fdag, "\n"); fflush(fdag); tclose(); /**********************************************/ /* DAG: "filename" lines for projected images */ /* including area files */ /**********************************************/ sprintf(cmd, "%s/pimages.tbl", workdir); ncol = topen(cmd); ifname = tcol("file"); if(ifname < 0) printError("'Projected' image list does not have column 'file'"); while(1) { istat = tread(); if(istat < 0) break; fprintf(fdag, " <filename file=\"%s\" link=\"inout\"/>\n", tval(ifname)); strcpy(fname, tval(ifname)); fname[strlen(fname)-5] = '\0'; strcat(fname, "_area.fits"); fprintf(fdag, " <filename file=\"%s\" link=\"inout\"/>\n", fname); } fprintf(fdag, "\n"); fflush(fdag); tclose(); /***********************************************/ /* DAG: "filename" lines for difference images */ /* and fit output files (plus one more file */ /* with a list of these fits) */ /***********************************************/ sprintf(cmd, "%s/diffs.tbl", workdir); ncol = topen(cmd); ifname = tcol("diff"); icntr1 = tcol("cntr1"); icntr2 = tcol("cntr2"); if(ifname < 0) printError("'Diff' image list does not have column 'diff'"); sprintf(cmd, "%s/statfile.tbl", workdir); ffit = fopen(cmd, "w+"); sprintf(fmt, "|%%7s|%%7s|%%22s|\n"); sprintf(dfmt, " %%7d %%7d %%22s \n"); fprintf(ffit, fmt, "cntr1", "cntr2", "stat"); fprintf(ffit, fmt, "int", "int", "char"); while(1) { istat = tread(); if(istat < 0) break; cntr1 = atoi(tval(icntr1)); cntr2 = atoi(tval(icntr2)); fprintf(fdag, " <filename file=\"%s\" link=\"output\"/>\n", tval(ifname)); strcpy(fname, tval(ifname)); fname[strlen(fname)-5] = '\0'; sprintf(fitname, "fit%s.txt", fname+4); fprintf(fdag, " <filename file=\"%s\" link=\"inout\"/>\n\n", fitname); fprintf(ffit, dfmt, cntr1, cntr2, fitname); } fflush(fdag); tclose(); fclose(ffit); fprintf(fdag, " <filename file=\"statfile_%s.tbl\" link=\"input\"/>\n", idstr); fprintf(fdag, " <filename file=\"fits.tbl\" link=\"inout\"/>\n"); fprintf(fdag, "\n"); fflush(fdag); fprintf(fcache, "statfile_%s.tbl %s/%s/statfile.tbl pool=\"ipac_cluster\"\n", idstr, workurlbase, workdir); /***********************************************/ /* DAG: "filename" lines for corrections table */ /* and the corrected image files (including */ /* area files) */ /***********************************************/ fprintf(fdag, " <filename file=\"corrections.tbl\" link=\"inout\"/>\n"); fprintf(fdag, "\n"); fflush(fdag); sprintf(cmd, "%s/cimages.tbl", workdir); ncol = topen(cmd); ifname = tcol("file"); if(ifname < 0) printError("'Corrected' image list does not have column 'file'"); while(1) { istat = tread(); if(istat < 0) break; fprintf(fdag, " <filename file=\"%s\" link=\"inout\"/>\n", tval(ifname)); strcpy(fname, tval(ifname)); fname[strlen(fname)-5] = '\0'; strcat(fname, "_area.fits"); fprintf(fdag, " <filename file=\"%s\" link=\"inout\"/>\n", fname); } fprintf(fdag, "\n"); fflush(fdag); tclose(); /***********************************************/ /* DAG: "filename" lines for template files, */ /* subset image files, output files, and */ /* shrunken output files. */ /***********************************************/ fprintf(fdag, " <filename file=\"newcimages.tbl\" link=\"inout\"/>\n"); fprintf(fdag, "\n"); fflush(fdag); fprintf(fdag, " <filename file=\"big_region_%s.hdr\" link=\"input\"/>\n", idstr); fprintf(fdag, " <filename file=\"region_%s.hdr\" link=\"input\"/>\n", idstr); fprintf(fdag, " <filename file=\"pimages_%s.tbl\" link=\"input\"/>\n", idstr); fprintf(fdag, " <filename file=\"cimages_%s.tbl\" link=\"input\"/>\n", idstr); fprintf(fdag, " <filename file=\"dag_%s.xml\" link=\"inout\"/>\n", idstr); fprintf(fdag, " <filename file=\"images_%s.tbl\" link=\"inout\"/>\n", idstr); fprintf(fdag, "\n"); fprintf(fdag, " <filename file=\"shrunken_%s.hdr\" link=\"inout\"/>\n", idstr); fprintf(fdag, " <filename file=\"shrunken_%s.fits\" link=\"inout\"/>\n", idstr); fprintf(fdag, " <filename file=\"shrunken_%s.jpg\" link=\"output\"/>\n", idstr); fprintf(fdag, "\n\n"); fflush(fdag); fprintf(fcache, "big_region_%s.hdr %s/%s/big_region.hdr pool=\"ipac_cluster\"\n", idstr, workurlbase, workdir); fprintf(fcache, "region_%s.hdr %s/%s/region.hdr pool=\"ipac_cluster\"\n", idstr, workurlbase, workdir); fprintf(fcache, "pimages_%s.tbl %s/%s/pimages.tbl pool=\"ipac_cluster\"\n", idstr, workurlbase, workdir); fprintf(fcache, "cimages_%s.tbl %s/%s/cimages.tbl pool=\"ipac_cluster\"\n", idstr, workurlbase, workdir); fflush(fcache); /* to be saved in user's storage space */ fprintf(fcache, "dag_%s.xml %s/%s/dag.xml pool=\"ipac_cluster\"\n", idstr, workurlbase, workdir); fprintf(fcache, "images_%s.tbl %s/%s/images.tbl pool=\"ipac_cluster\"\n", idstr, workurlbase, workdir); /**************************************************/ /* DAG: "job" lines for mProject/mProjectPP jobs. */ /**************************************************/ if(debug) { fprintf(fdebug, "Generating DAG file job list ...\n"); fflush(fdebug); } id = 0; level = 9; fprintf(fdag, " <!-- Part 2: Definition of Jobs -->\n\n"); cntr = 0; sprintf(cmd, "%s/rimages.tbl", workdir); ncol = topen(cmd); ifname = tcol("file"); iscale = tcol("scale"); if(ifname < 0) printError("'Raw' image list does not have column 'file'"); while(1) { istat = tread(); if(istat < 0) break; ++id; ++cntr; strcpy(fname, tval(ifname)); fname[strlen(fname) - 5] = '\0'; fprintf(fdag," <job id=\"ID%06d\" name=\"%s\" version=\"3.0\" level=\"%d\" dv-name=\"mProject%d\" dv-version=\"1.0\">\n", id, mproj, level, cntr); if(iscale >= 0) fprintf(fdag," <argument>\n -X\n -x %s\n <filename file=\"%s.fits\"/>\n <filename file=\"p%s.fits\"/>\n <filename file=\"big_region_%s.hdr\"/>\n </argument>\n\n", tval(iscale), fname, fname, idstr); else fprintf(fdag," <argument>\n -X\n <filename file=\"%s.fits\"/>\n <filename file=\"p%s.fits\"/>\n <filename file=\"big_region_%s.hdr\"/>\n </argument>\n\n", fname, fname, idstr); fprintf(fdag," <uses file=\"%s.fits\" link=\"input\" transfer=\"true\"/>\n", fname); sprintf(key, "ID%06d", id); sprintf(val, "%s.fits", fname); HT_add_entry(depends, key, val); fprintf(fcache,"%s.fits %s/%s.fits pool=\"ipac_cluster\"\n",fname,urlbase,fname); fprintf(fdag," <uses file=\"p%s.fits\" link=\"output\" register=\"false\" transfer=\"false\"/>\n", fname); sprintf(key, "p%s.fits", fname); sprintf(val, "ID%06d", id); HT_add_entry(depends, key, val); fprintf(fdag," <uses file=\"p%s_area.fits\" link=\"output\" register=\"false\" transfer=\"false\"/>\n", fname); fprintf(fdag," <uses file=\"big_region_%s.hdr\" link=\"input\" transfer=\"true\"/>\n", idstr); sprintf(key, "ID%06d", id); sprintf(val, "big_region.hdr"); HT_add_entry(depends, key, val); fprintf(fdag," </job>\n\n\n"); } tclose(); fflush(fcache); fclose(fcache); /***************************************/ /* DAG: "job" lines for mDiffFit jobs. */ /***************************************/ cntr = 0; sprintf(cmd, "%s/diffs.tbl", workdir); ncol = topen(cmd); icntr1 = tcol("cntr1"); icntr2 = tcol("cntr2"); iplusname = tcol("plus"); iminusname = tcol("minus"); --level; while(1) { istat = tread(); if(istat < 0) break; ++id; ++cntr; cntr1 = atoi(tval(icntr1)); cntr2 = atoi(tval(icntr2)); strcpy(plusname, tval(iplusname)); strcpy(minusname, tval(iminusname)); plusname [strlen(plusname) - 5] = '\0'; minusname[strlen(minusname) - 5] = '\0'; fname[strlen(fname) - 5] = '\0'; fprintf(fdag, " <job id=\"ID%06d\" name=\"mDiffFit\" version=\"3.0\" level=\"%d\" dv-name=\"mDiffFit%d\" dv-version=\"1.0\">\n", id, level, cntr); fprintf(fdag, " <argument>\n -s <filename file=\"fit.%06d.%06d.txt\"/>\n <filename file=\"p%s.fits\"/>\n <filename file=\"p%s.fits\"/>\n <filename file=\"diff.%06d.%06d.fits\"/>\n <filename file=\"big_region_%s.hdr\"/>\n </argument>\n\n", cntr1, cntr2, plusname, minusname, cntr1, cntr2, idstr); fprintf(fdag, " <uses file=\"mDiff\" link=\"input\" transfer=\"true\" type=\"executable\"/>\n"); fprintf(fdag, " <uses file=\"mFitplane\" link=\"input\" transfer=\"true\" type=\"executable\"/>\n"); fprintf(fdag, " <uses file=\"fit.%06d.%06d.txt\" link=\"output\" register=\"false\" transfer=\"false\"/>\n", cntr1, cntr2); sprintf(key, "fit.%06d.%06d.txt", cntr1, cntr2); sprintf(val, "ID%06d", id); HT_add_entry(depends, key, val); fprintf(fdag, " <uses file=\"p%s.fits\" link=\"input\" transfer=\"true\"/>\n", plusname); sprintf(key, "ID%06d", id); sprintf(val, "p%s.fits", plusname); HT_add_entry(depends, key, val); fprintf(fdag, " <uses file=\"p%s_area.fits\" link=\"input\" transfer=\"true\"/>\n", plusname); fprintf(fdag, " <uses file=\"p%s.fits\" link=\"input\" transfer=\"true\"/>\n", minusname); sprintf(key, "ID%06d", id); sprintf(val, "p%s.fits", minusname); HT_add_entry(depends, key, val); fprintf(fdag, " <uses file=\"p%s_area.fits\" link=\"input\" transfer=\"true\"/>\n", minusname); fprintf(fdag, " <uses file=\"diff.%06d.%06d.fits\" link=\"output\" register=\"false\" transfer=\"false\" optional=\"true\"/>\n", cntr1, cntr2); sprintf(key, "diff.%06d.%06d.fits", cntr1, cntr2); sprintf(val, "ID%06d", id); HT_add_entry(depends, key, val); fprintf(fdag, " <uses file=\"big_region_%s.hdr\" link=\"input\" transfer=\"true\"/>\n", idstr); sprintf(key, "ID%06d", id); sprintf(val, "big_region.hdr"); HT_add_entry(depends, key, val); fprintf(fdag, " </job>\n\n\n"); } tclose(); /****************************************/ /* DAG: "job" line for mConcatFit jobs. */ /****************************************/ ++id; --level; fprintf(fdag, " <job id=\"ID%06d\" name=\"mConcatFit\" version=\"3.0\" level=\"%d\" dv-name=\"mConcatFit1\" dv-version=\"1.0\">\n", id, level); fprintf(fdag, " <argument>\n <filename file=\"statfile_%s.tbl\"/>\n <filename file=\"fits.tbl\"/>\n .\n </argument>\n\n", idstr); fprintf(fdag, " <uses file=\"statfile_%s.tbl\" link=\"input\" transfer=\"true\"/>\n", idstr); sprintf(key, "ID%06d", id); sprintf(val, "statfile.tbl"); HT_add_entry(depends, key, val); fprintf(fdag, " <uses file=\"fits.tbl\" link=\"output\" register=\"false\" transfer=\"false\"/>\n"); sprintf(key, "fits.tbl"); sprintf(val, "ID%06d", id); HT_add_entry(depends, key, val); sprintf(cmd, "%s/diffs.tbl", workdir); ncol = topen(cmd); icntr1 = tcol("cntr1"); icntr2 = tcol("cntr2"); while(1) { istat = tread(); if(istat < 0) break; cntr1 = atoi(tval(icntr1)); cntr2 = atoi(tval(icntr2)); fprintf(fdag, " <uses file=\"fit.%06d.%06d.txt\" link=\"input\" transfer=\"true\"/>\n", cntr1, cntr2); sprintf(key, "ID%06d", id); sprintf(val, "fit.%06d.%06d.txt", cntr1, cntr2); HT_add_entry(depends, key, val); } tclose(); fprintf(fdag, " </job>\n\n\n"); /*************************************/ /* DAG: "job" line for mBgModel job. */ /*************************************/ ++id; --level; fprintf(fdag, " <job id=\"ID%06d\" name=\"mBgModel\" version=\"3.0\" level=\"%d\" dv-name=\"mBgModel1\" dv-version=\"1.0\">\n", id, level); fprintf(fdag, " <argument>\n -l\n -i 100000\n <filename file=\"pimages_%s.tbl\"/>\n <filename file=\"fits.tbl\"/>\n <filename file=\"corrections.tbl\"/>\n </argument>\n\n", idstr); fprintf(fdag, " <uses file=\"pimages_%s.tbl\" link=\"input\" transfer=\"true\"/>\n", idstr); sprintf(key, "ID%06d", id); sprintf(val, "pimages.tbl"); HT_add_entry(depends, key, val); fprintf(fdag, " <uses file=\"fits.tbl\" link=\"input\" transfer=\"true\"/>\n"); sprintf(key, "ID%06d", id); sprintf(val, "fits.tbl"); HT_add_entry(depends, key, val); fprintf(fdag, " <uses file=\"corrections.tbl\" link=\"output\" register=\"false\" transfer=\"false\"/>\n"); sprintf(key, "corrections.tbl"); sprintf(val, "ID%06d", id); HT_add_entry(depends, key, val); fprintf(fdag, " </job>\n\n\n"); /*****************************************/ /* DAG: "job" line for mBackground jobs. */ /*****************************************/ --level; cntr = 0; sprintf(cmd, "%s/rimages.tbl", workdir); ncol = topen(cmd); ifname = tcol("file"); if(ifname < 0) printError("'Raw' image list does not have column 'file'"); while(1) { istat = tread(); if(istat < 0) break; strcpy(fname, tval(ifname)); fname[strlen(fname) - 5] = '\0'; ++id; ++cntr; fprintf(fdag, " <job id=\"ID%06d\" name=\"mBackground\" version=\"3.0\" level=\"%d\" dv-name=\"mBackground%d\" dv-version=\"1.0\">\n", id, level, cntr); fprintf(fdag, " <argument>\n -t\n <filename file=\"p%s.fits\"/>\n <filename file=\"c%s.fits\"/>\n <filename file=\"pimages_%s.tbl\"/>\n <filename file=\"corrections.tbl\"/>\n </argument>\n\n", fname, fname, idstr); fprintf(fdag, " <uses file=\"p%s.fits\" link=\"input\" transfer=\"true\"/>\n", fname); sprintf(key, "ID%06d", id); sprintf(val, "p%s.fits", fname); HT_add_entry(depends, key, val); fprintf(fdag, " <uses file=\"p%s_area.fits\" link=\"input\" transfer=\"true\"/>\n", fname); fprintf(fdag, " <uses file=\"pimages_%s.tbl\" link=\"input\" transfer=\"true\"/>\n", idstr); sprintf(key, "ID%06d", id); sprintf(val, "pimages.tbl"); HT_add_entry(depends, key, val); fprintf(fdag, " <uses file=\"corrections.tbl\" link=\"input\" transfer=\"true\"/>\n"); sprintf(key, "ID%06d", id); sprintf(val, "corrections.tbl"); HT_add_entry(depends, key, val); fprintf(fdag, " <uses file=\"c%s.fits\" link=\"output\" register=\"false\" transfer=\"false\"/>\n", fname); sprintf(key, "c%s.fits", fname); sprintf(val, "ID%06d", id); HT_add_entry(depends, key, val); fprintf(fdag, " <uses file=\"c%s_area.fits\" link=\"output\" register=\"false\" transfer=\"false\"/>\n", fname); fprintf(fdag, " </job>\n\n\n"); } fflush(fdag); /**********************************************/ /* DAG: "job" lines for tile mImgtbl jobs. */ /* We have to regenerate the cimages table(s) */ /* because the pixel offsets and sizes need */ /* to be exactly right and the original is */ /* only an approximation. */ /**********************************************/ --level; cntr = 0; ++id; ++cntr; fprintf(fdag, " <job id=\"ID%06d\" name=\"mImgtbl\" version=\"3.0\" level=\"%d\" dv-name=\"mImgtbl%d\" dv-version=\"1.0\">\n", id, level, cntr); fprintf(fdag, " <argument>\n .\n -t <filename file=\"cimages_%s.tbl\"/>\n <filename file=\"newcimages.tbl\"/>\n </argument>\n\n", idstr); fprintf(fdag, " <uses file=\"cimages_%s.tbl\" link=\"input\" transfer=\"true\"/>\n", idstr); sprintf(key, "ID%06d", id); sprintf(val, "cimages.tbl"); HT_add_entry(depends, key, val); fprintf(fdag, " <uses file=\"newcimages.tbl\" link=\"output\" register=\"false\" transfer=\"false\"/>\n"); sprintf(key, "newcimages.tbl"); sprintf(val, "ID%06d", id); HT_add_entry(depends, key, val); sprintf(cmd, "%s/cimages.tbl", workdir); ncol = topen(cmd); ifname = tcol("file"); if(ifname < 0) printError("'Corrected' image list does not have column 'file'"); while(1) { istat = tread(); if(istat < 0) break; strcpy(fname, tval(ifname)); fname[strlen(fname) - 5] = '\0'; fprintf(fdag, " <uses file=\"%s.fits\" link=\"input\" transfer=\"true\"/>\n", fname); sprintf(key, "ID%06d", id); sprintf(val, "%s.fits", fname); HT_add_entry(depends, key, val); } tclose(); fprintf(fdag, " </job>\n\n\n"); fflush(fdag); /*******************************************/ /* DAG: "job" lines for tile mAdd jobs. */ /*******************************************/ --level; cntr = 0; ++id; ++cntr; fprintf(fdag, " <job id=\"ID%06d\" name=\"mAdd\" version=\"3.0\" level=\"%d\" dv-name=\"mAdd%d\" dv-version=\"1.0\">\n", id, level, cntr); fprintf(fdag, " <argument>\n -e\n <filename file=\"newcimages.tbl\"/>\n <filename file=\"region_%s.hdr\"/>\n <filename file=\"mosaic_%s.fits\"/>\n </argument>\n\n", idstr, idstr); fprintf(fdag, " <uses file=\"newcimages.tbl\" link=\"input\" transfer=\"true\"/>\n"); sprintf(key, "ID%06d", id); sprintf(val, "newcimages.tbl"); HT_add_entry(depends, key, val); fprintf(fdag, " <uses file=\"region_%s.hdr\" link=\"input\" transfer=\"true\"/>\n", idstr); sprintf(key, "ID%06d", id); sprintf(val, "region.hdr"); HT_add_entry(depends, key, val); fprintf(fdag, " <uses file=\"mosaic_%s.fits\" link=\"output\" register=\"true\" transfer=\"true\"/>\n", idstr); sprintf(key, "mosaic.fits"); sprintf(val, "ID%06d", id); HT_add_entry(depends, key, val); fprintf(fdag, " <uses file=\"mosaic_%s_area.fits\" link=\"output\" register=\"true\" transfer=\"true\"/>\n", idstr); sprintf(cmd, "%s/cimages.tbl", workdir); ncol = topen(cmd); ifname = tcol("file"); if(ifname < 0) printError("'Corrected' image list does not have column 'file'"); while(1) { istat = tread(); if(istat < 0) break; strcpy(fname, tval(ifname)); fname[strlen(fname) - 5] = '\0'; fprintf(fdag, " <uses file=\"%s.fits\" link=\"input\" transfer=\"true\"/>\n", fname); fprintf(fdag, " <uses file=\"%s_area.fits\" link=\"input\" transfer=\"true\"/>\n", fname); sprintf(key, "ID%06d", id); sprintf(val, "%s.fits", fname); HT_add_entry(depends, key, val); } fprintf(fdag, " </job>\n\n\n"); fflush(fdag); mAddCntr = cntr; /*******************************************/ /* DAG: "job" lines for tile mShrink jobs. */ /*******************************************/ --level; cntr = 0; ++id; ++cntr; fprintf(fdag, " <job id=\"ID%06d\" name=\"mShrink\" version=\"3.0\" level=\"%d\" dv-name=\"mShrink%d\" dv-version=\"1.0\">\n", id, level, cntr); fprintf(fdag, " <argument>\n <filename file=\"mosaic_%s.fits\"/>\n <filename file=\"shrunken_%s.fits\"/>\n %d\n </argument>\n\n", idstr, idstr, shrinkFactor); fprintf(fdag, " <uses file=\"mosaic_%s.fits\" link=\"input\" transfer=\"true\"/>\n", idstr); sprintf(key, "ID%06d", id); sprintf(val, "mosaic.fits"); HT_add_entry(depends, key, val); fprintf(fdag, " <uses file=\"shrunken_%s.fits\" link=\"output\" register=\"true\" transfer=\"true\"/>\n", idstr); sprintf(key, "shrunken.fits"); sprintf(val, "ID%06d", id); HT_add_entry(depends, key, val); fprintf(fdag, " </job>\n\n\n"); fflush(fdag); /****************************/ /* DAG: Make the final JPEG */ /****************************/ ++id; --level; fprintf(fdag, " <job id=\"ID%06d\" name=\"mJPEG\" version=\"3.0\" level=\"%d\" dv-name=\"mJPEG1\" dv-version=\"1.0\">\n", id, level); fprintf(fdag, " <argument>\n -ct 1\n -gray <filename file=\"shrunken_%s.fits\"/>\n min max gaussianlog\n -out <filename file=\"shrunken_%s.jpg\"/>\n </argument>\n\n", idstr, idstr); fprintf(fdag, " <uses file=\"shrunken_%s.fits\" link=\"input\" transfer=\"true\"/>\n", idstr); sprintf(key, "ID%06d", id); sprintf(val, "shrunken.fits"); HT_add_entry(depends, key, val); fprintf(fdag, " <uses file=\"shrunken_%s.jpg\" link=\"output\" register=\"true\" transfer=\"true\"/>\n", idstr); sprintf(key, "shrunken.jpg"); sprintf(val, "ID%06d", id); HT_add_entry(depends, key, val); fprintf(fdag, " <uses file=\"dag_%s.xml\" link=\"input\" transfer=\"true\"/>\n", idstr); fprintf(fdag, " <uses file=\"dag_%s.xml\" link=\"output\" register=\"false\" transfer=\"true\"/>\n", idstr); sprintf(key, "dag.xml"); sprintf(val, "ID%06d", id); HT_add_entry(depends, key, val); fprintf(fdag, " <uses file=\"images_%s.tbl\" link=\"input\" transfer=\"true\"/>\n", idstr); fprintf(fdag, " <uses file=\"images_%s.tbl\" link=\"output\" register=\"false\" transfer=\"true\"/>\n", idstr); sprintf(key, "images.tbl"); sprintf(val, "ID%06d", id); HT_add_entry(depends, key, val); fprintf(fdag, " </job>\n\n\n\n"); fflush(fdag); /*******************************************/ /* DAG: Flow control dependencies. */ /* First, mDiffs depend on mProjects */ /*******************************************/ if(debug) { fprintf(fdebug, "Generating DAG file parent/child info ...\n"); fflush(fdebug); } fprintf(fdag, " <!-- Part 3: Control-Flow Dependencies -->\n\n"); sprintf(fileList, "%s/files.lis", workdir); sprintf(parentList, "%s/parents.lis", workdir); sprintf(sortedParent, "%s/sortedParents.lis", workdir); for(i=1; i<=id; ++i) { sprintf(jobid, "ID%06d", i); fileid = HT_lookup_key(depends, jobid); ffile = fopen(fileList, "w+"); if(ffile == (FILE *)NULL) { printf("[struct stat=\"ERROR\", msg=\"Error opening working file list for write\"]\n"); exit(0); } while(fileid != (char *)NULL) { fprintf(ffile, "%s\n", fileid); fflush(ffile); fileid = HT_next_entry(depends); } fclose(ffile); ffile = fopen(fileList, "r"); if(ffile == (FILE *)NULL) { printf("[struct stat=\"ERROR\", msg=\"Error opening working file list for read\"]\n"); exit(0); } fparent = fopen(parentList, "w+"); if(fparent == (FILE *)NULL) { printf("[struct stat=\"ERROR\", msg=\"Error opening parent list\"]\n"); exit(0); } nparents = 0; fprintf(fparent, "| parent |\n"); while(1) { if(fgets(line, MAXSTR, ffile) == (char *)NULL) break; if(line[strlen(line)-1] == '\n') line[strlen(line)-1] = '\0'; parentid = HT_lookup_key(depends, line); while(parentid != (char *)NULL) { parent = atoi(parentid+2); fprintf(fparent, " %12d\n", parent); fflush(fparent); ++nparents; parentid = HT_next_entry(depends); } } fclose(ffile); fclose(fparent); unlink(fileList); if(nparents > 0) { if(path) sprintf(cmd, "%s/bin/mTblSort %s parent %s", path, parentList, sortedParent); else sprintf(cmd, "mTblSort %s parent %s", parentList, sortedParent); svc_run(cmd); strcpy( status, svc_value( "stat" )); if (strcmp( status, "ERROR") == 0) { strcpy( msg, svc_value( "msg" )); printError(msg); } unlink(parentList); fparent = fopen(sortedParent, "r"); if(fparent == (FILE *)NULL) { printf("[struct stat=\"ERROR\", msg=\"Error opening sorted parent list\"]\n"); exit(0); } fgets(line, MAXSTR, fparent); fprintf(fdag, " <child ref=\"%s\">\n", jobid); for(j=0; j<nparents; ++j) { if(fgets(line, MAXSTR, fparent) == (char *)NULL) break; parent_prev = parent; parent = atoi(line); if(j > 0 && parent == parent_prev) continue; fprintf(fdag, " <parent ref=\"ID%06d\"/>\n", parent); } fprintf(fdag, " </child>\n\n"); fflush(fdag); fclose(fparent); } unlink(sortedParent); } fprintf(fdag, "</adag>\n"); fflush(fdag); fclose(fdag); if(debug) { fprintf(fdebug, "done.\n"); fflush(fdebug); } printf("[struct stat=\"OK\", id=\"%s\"]\n", idstr); exit(0); }
int main(int argc, char **argv) { int debug, noAreas, i; int tableDriven, haveStatus; int icntr, ifname, cntr; int ncols, index, istat; int ia, ib, ic, id; double A, B, C; char input_file [MAXSTR]; char output_file[MAXSTR]; char tblfile [MAXSTR]; char corrfile [MAXSTR]; char file [MAXSTR]; char *end; struct mBackgroundReturn *returnStruct; FILE *montage_status; /***************************************/ /* Process the command-line parameters */ /***************************************/ debug = 0; tableDriven = 0; noAreas = 0; haveStatus = 0; montage_status = stdout; for(i=0; i<argc; ++i) { if(strcmp(argv[i], "-s") == 0) { haveStatus = 1; if(i+1 >= argc) { printf("[struct stat=\"ERROR\", msg=\"No status file name given\"]\n"); exit(1); } if((montage_status = fopen(argv[i+1], "w+")) == (FILE *)NULL) { printf ("[struct stat=\"ERROR\", msg=\"Cannot open status file: %s\"]\n", argv[i+1]); exit(1); } ++i; } else if(strcmp(argv[i], "-n") == 0) noAreas = 1; else if(strcmp(argv[i], "-t") == 0) tableDriven = 1; else if(strcmp(argv[i], "-d") == 0) { if(i+1 >= argc) { printf("[struct stat=\"ERROR\", msg=\"No debug level given\"]\n"); exit(1); } debug = strtol(argv[i+1], &end, 0); if(end - argv[i+1] < strlen(argv[i+1])) { printf("[struct stat=\"ERROR\", msg=\"Debug level string is invalid: '%s'\"]\n", argv[i+1]); exit(1); } if(debug < 0) { printf("[struct stat=\"ERROR\", msg=\"Debug level value cannot be negative\"]\n"); exit(1); } ++i; } } if(haveStatus) { argv += 2; argc -= 2;; } if(debug) { argv += 2; argc -= 2;; } if(noAreas) { ++argv; --argc; } if(tableDriven) { ++argv; --argc; } if (argc < 5) { printf ("[struct stat=\"ERROR\", msg=\"Usage: mBackground [-d level] [-n(o-areas)] [-s statusfile] in.fits out.fits A B C | mBackground [-t(able-mode)] [-d level] [-n(o-areas)] [-s statusfile] in.fits out.fits images.tbl corrfile.tbl\"]\n"); exit(1); } strcpy(input_file, argv[1]); if(input_file[0] == '-') { printf ("[struct stat=\"ERROR\", msg=\"Invalid input file '%s'\"]\n", input_file); exit(1); } strcpy(output_file, argv[2]); if(output_file[0] == '-') { printf ("[struct stat=\"ERROR\", msg=\"Invalid output file '%s'\"]\n", output_file); exit(1); } A = 0.; B = 0.; C = 0.; if(!tableDriven) { if (argc != 6) { printf ("[struct stat=\"ERROR\", msg=\"Usage: mBackground [-d level] [-n(o-areas)] [-s statusfile] in.fits out.fits A B C | mBackground [-t](able-mode) [-d level] [-n(o-areas)] [-s statusfile] in.fits out.fits images.tbl corrfile.tbl\"]\n"); exit(1); } A = strtod(argv[3], &end); if(end < argv[3] + strlen(argv[3])) { printf ("[struct stat=\"ERROR\", msg=\"A coefficient string is not a number\"]\n"); exit(1); } B = strtod(argv[4], &end); if(end < argv[4] + strlen(argv[4])) { printf ("[struct stat=\"ERROR\", msg=\"B coefficient string is not a number\"]\n"); exit(1); } C = strtod(argv[5], &end); if(end < argv[5] + strlen(argv[5])) { printf ("[struct stat=\"ERROR\", msg=\"C coefficient string is not a number\"]\n"); exit(1); } } else { /* Look up the file cntr in the images.tbl file */ /* and then the correction coefficients in the */ /* corrections table generated by mBgModel */ if (argc != 5) { printf ("[struct stat=\"ERROR\", msg=\"Usage: mBackground [-d level] [-n(o-areas)] [-s statusfile] in.fits out.fits A B C | mBackground [-t](able-mode) [-d level] [-n(o-areas)] [-s statusfile] in.fits out.fits images.tbl corrfile.tbl\"]\n"); exit(1); } strcpy(tblfile, argv[3]); strcpy(corrfile, argv[4]); /* Open the image list table file */ ncols = topen(tblfile); if(ncols <= 0) { fprintf(montage_status, "[struct stat=\"ERROR\", msg=\"Invalid image metadata file: %s\"]\n", tblfile); exit(1); } icntr = tcol( "cntr"); ifname = tcol( "fname"); if(ifname < 0) ifname = tcol( "file"); if(icntr < 0 || ifname < 0) { fprintf(montage_status, "[struct stat=\"ERROR\", msg=\"Image table needs columns cntr and fname\"]\n"); exit(1); } /* Read the records and find the cntr for our file name */ index = 0; while(1) { istat = tread(); if(istat < 0) { fprintf(montage_status, "[struct stat=\"ERROR\", msg=\"Hit end of image table without finding file name\"]\n"); exit(1); } cntr = atoi(tval(icntr)); strcpy(file, tval(ifname)); if(strcmp(file, input_file) == 0) break; } tclose(); ncols = topen(corrfile); icntr = tcol( "id"); ia = tcol( "a"); ib = tcol( "b"); ic = tcol( "c"); if(icntr < 0 || ia < 0 || ib < 0 || ic < 0) { fprintf(montage_status, "[struct stat=\"ERROR\", msg=\"Need columns: id,a,b,c in corrections file\"]\n"); exit(1); } /* Read the records and find the correction coefficients */ while(1) { istat = tread(); if(istat < 0) { A = 0.; B = 0.; C = 0.; break; } id = atoi(tval(icntr)); if(id != cntr) continue; A = atof(tval(ia)); B = atof(tval(ib)); C = atof(tval(ic)); break; } tclose(); } returnStruct = mBackground(input_file, output_file, A, B, C, noAreas, debug); if(returnStruct->status == 1) { fprintf(montage_status, "[struct stat=\"ERROR\", msg=\"%s\"]\n", returnStruct->msg); exit(1); } else { fprintf(montage_status, "[struct stat=\"OK\", %s]\n", returnStruct->msg); exit(0); } }