![]() ![]() |
![]() |
File: [Development] / JSOC / proj / dsdsmigr / apps / ingest_dsds_to_drms.c
(download)
Revision: 1.18, Thu Jan 15 23:00:19 2015 UTC (8 years, 8 months ago) by mbobra Branch: MAIN CVS Tags: Ver_LATEST, Ver_9-5, Ver_9-41, Ver_9-4, Ver_9-3, Ver_9-2, Ver_9-1, Ver_9-0, Ver_8-8, Ver_8-7, Ver_8-12, Ver_8-11, Ver_8-10, HEAD Changes since 1.17: +3 -3 lines I am changing drms_type_short to drms_type_double on line 543. My guess is that this will cause the ingest module to fail when reading the limb figure data. However, without this change, I cannot ingest regular observable data. Thus, this change is necessary. The limb figure data should be properly accomodated with a flag (my subsequent task after this commit). |
/* MODULE NAME: ingest_dsds_to_drms.c */ /* * CREATED BY : P. SCHERRER * MODIFIED BY: M. BOBRA * MODIFIED TO: -- include updated scale corrections calculation using mdi.scale_corrections drms series as an input * -- populate ephemeris keywords * -- populate calibration and roll table keywords * -- check for input data availability for a general file * * USE: * INPUT PARAMETERS: IN = <SUMS directory> * MAP = <mapfile> * SCALE_CORRECTIONS = <drms series with scale corrections file> * * OUTPUT PARAMETERS: OUT = <drms series> * * FLAGS: M = * v = * z = * p = * * EXAMPLE: * ingest_dsds_to_drms in=/SUM17/D231103541/D18885727/S00000 out=su_mbobra.test_vwv map=fd_test.map SCALE_CORRECTIONS=mdi.scale_corrections */ #include "jsoc_main.h" #include "drms_types.h" #include "dsdsmigr.h" #include "printk.h" #include <time.h> #include <math.h> #include "limbfuncs.c" char *module_name = "opendsrecs"; #define kNOT_SPEC "Not Specified" #define DIE(msg) return(fprintf(stderr,"%s",msg),1) #define DIE_status(msg) return(fprintf(stderr,"%s, status of death=%d\n",msg,status),1) #define FDSCALE_DEFAULT (1.97784) #define CANT_OPEN_FILE (730) #define BEYOND_TABLE_RANGE (1) #define EPHEMERIS_GAP (2) #define TRUNCATED_FIT (3) ModuleArgs_t module_args[] = { {ARG_STRING, "in", kNOT_SPEC, "Input data series."}, {ARG_STRING, "out", kNOT_SPEC, "Output data series."}, {ARG_STRING, "map", kNOT_SPEC, "Name conversion list."}, {ARG_STRING, "SCALE_CORRECTIONS", kNOT_SPEC, "scale correction recordset (1 record)"}, {ARG_FLAG, "M", "0", "SkipMissingFiles - no records if DATAFILE is blank."}, {ARG_FLAG, "v", "0", "verbose - more diagnostics"}, {ARG_FLAG, "z", "0", "Use DPC_SMPL of '60 second' only"}, {ARG_FLAG, "p", "0", "Indicate polarization state in POLSTATE keyword"}, {ARG_FLAG, "s", "0", "skip check for existence of input datafile, use for series with no segments"}, {ARG_FLAG, "l", "0", "use this with the limb figure data ONLY"}, {ARG_END} }; double soho_obs_dist (TIME t) { return 1.0; } static int fgetline (char *line, FILE *tbl) { /* * A local utility for reading correction (or other) tables with the * convention of one \n line delimited line per information record, * comments with # as first character, and continuations flagged by * \ at the end of the line */ int c, b, cloc, len = 0; while ((c = fgetc (tbl)) != EOF) { if (c == '\n') { line[len++] = 0; if (line[0] == '#') line[len = 0] = 0; else if (b != '\\') return len; else { line[len=cloc] = ' '; line[++len] = 0; } } else { if (c != ' ' && c != '\t') { b = c; cloc = len; } line[len++] = c; } } return 0; } int MDI_plate_scale_adjustment (char *filepath, double *fdscl, TIME t, int *focus, int *qual, double obs_dist) { static struct plist { int qual; int focus; TIME t0; TIME t1; TIME tmid; double a0; double a1; double a2; double a3; int status; } *fitp; FILE *tbl; TIME t0, t1, t2, tmid; double a0, a1, a2, a3, rsun_adj; static int allocd = 32, file_read = 0; int status = 0; static int nct; int c, fields, m, n; char line[4096], tstr0[128], tstr1[128], tstr2[128]; if (!file_read) { // if (!(tbl = fopen ("/home/soi/CM/tables/calib/geom/scale_corrections", "r"))) { if (!(tbl = fopen (filepath, "r"))) { *fdscl = FDSCALE_DEFAULT; *qual = 0; *focus = 0; return CANT_OPEN_FILE; } fitp = (struct plist *)malloc (allocd * sizeof (struct plist)); nct = 0; /* * Reads a file in the format of multiple lines of the form * Qual Focus T1 T2 T0 a0 a1 a2 a3 * e.g. * 2 1 1995.12.21 1997.11.03 1997.02.09_14:31 1.005 -0.005 5.7e-12 -1.4e-19 * and returns a set of n parameter sets */ while (fgetline (line, tbl)) { fields = sscanf (line, "%d %d %s %s %s %lg %lg %lg %lg", qual, focus, tstr1, tstr2, tstr0, &a0, &a1, &a2, &a3); if (fields < 4) continue; /* ignore lines without start & stop times */ fitp[nct].qual = *qual; fitp[nct].focus = *focus; fitp[nct].status = (fields < 9) ? TRUNCATED_FIT : 0; fitp[nct].t0 = sscan_time (tstr1); fitp[nct].t1 = sscan_time (tstr2); fitp[nct].tmid = (fields > 4) ? sscan_time (tstr0) : 0.0; fitp[nct].a0 = (fields > 5) ? a0 : 1.0; fitp[nct].a1 = (fields > 6) ? a1 : 0.0; fitp[nct].a2 = (fields > 7) ? a2 : 0.0; fitp[nct].a3 = (fields > 8) ? a3 : 0.0; if (++nct >= allocd) { allocd += 32; fitp = (struct plist *)realloc (fitp, allocd * sizeof (struct plist)); } } fclose (tbl); file_read = 1; } if (obs_dist == 0.0) obs_dist = soho_obs_dist (t); if (obs_dist == 0.0) status = EPHEMERIS_GAP; n = 0; while (n < nct) { if (t >= fitp[n].t0 && t <= fitp[n].t1) break; n++; } if (n >= nct) { *fdscl = FDSCALE_DEFAULT; *qual = 0; *focus = 0; return BEYOND_TABLE_RANGE; } t -= fitp[n].tmid; rsun_adj = fitp[n].a0; rsun_adj += obs_dist * (fitp[n].a1 + t * (fitp[n].a2 + t * fitp[n].a3)); /* *fdscl *= FDSCALE_DEFAULT; WRONG: FDSCALE_DEFAULT is based on nominal rsun0 and corrected rsun is rsun0 * rsun_adj */ *fdscl = FDSCALE_DEFAULT / rsun_adj; *qual = fitp[n].qual; *focus = fitp[n].focus; if (!status) { status = fitp[n].status; } return status; } // #include <sys/time.h> TIME time_now() { TIME now; TIME UNIX_epoch = -220924792.000; /* 1970.01.01_00:00:00_UTC */ struct timeval tp; gettimeofday(&tp, NULL); now = (double)tp.tv_sec + (double)tp.tv_usec/1.0e6; return(now + UNIX_epoch); } /* Name check code. This code uses an external table to drive the mapping of dsds keywords into drms keywords. It should contain a row for each keyword in the target drms series. Each row should contain 3 fields, drms_name, dsds_name, action. The action will be a string which matches the action table. The action table converts the string to an integer. Sample file lines like: cadence CADENCE copy date DATE copy Lines begging with "#" are comments and will be ignored. Blank lines are not allowed. */ typedef struct NameListLookup_struct { char *drms_name; char *dsds_name; int action; struct NameListLookup_struct *next; } NameListLookup_t; typedef enum { ACT_NOP, ACT_COPY, ACT_ANGLE, ACT_CENTER, ACT_TIME, ACT_AU, ACT_RESCALE, ACT_NOT_FOUND } Action_t; Action_t actions[] = { ACT_NOP, ACT_COPY, ACT_ANGLE, ACT_CENTER, ACT_TIME, ACT_AU, ACT_RESCALE, ACT_NOT_FOUND }; char *action_names[] = { "nop", "copy", "pangle", "center", "time", "au", "scale", "done" }; int keyNameCheck(char *name, char **fromname) { static int first_call = 1; static NameListLookup_t *actionlist; NameListLookup_t *this; if (first_call) { char *actionlistname; FILE *flist; char drms_name[100], dsds_name[100], action_name[100]; char line[1024]; // int action; NameListLookup_t *last; first_call = 0; actionlistname = strdup(cmdparams_get_str(&cmdparams, "map", NULL)); if (strcmp(actionlistname, kNOT_SPEC) == 0) { fprintf(stderr, "Name mapping list must be specified\n"); exit(1); } flist = fopen(actionlistname, "r"); if (!flist) { fprintf(stderr, "Name mapping file not found\n"); exit(1); } last = actionlist = (NameListLookup_t *)malloc(sizeof(struct NameListLookup_struct)); last->next = NULL; while (fgets(line, 1024, flist)) { if (line[0] == '#') continue; else if (sscanf(line,"%s %s %s\n", drms_name, dsds_name, action_name)==3) { int iname; this = last; last = this->next = (NameListLookup_t *)malloc(sizeof(struct NameListLookup_struct)); last->next = NULL; this->drms_name = strdup(drms_name); this->dsds_name = strdup(dsds_name); this->action = ACT_NOT_FOUND; for (iname=0; actions[iname] != ACT_NOT_FOUND; iname++) if (strcmp(action_name, action_names[iname]) == 0) { this->action = actions[iname]; break; } } else fprintf(stderr, "Name map read error on line containing %s, ignoring this line\n",line); } } /* lookup name and return action */ for (this=actionlist; this->next; this = this->next) { if (strcmp(this->drms_name, name) == 0) { *fromname = this->dsds_name; return(this->action); } } *fromname = name; return(ACT_NOT_FOUND); } int DoIt(void) { int errbufstat=setvbuf(stderr, NULL, _IONBF, BUFSIZ); int outbufstat=setvbuf(stdout, NULL, _IONBF, BUFSIZ); int status = DRMS_SUCCESS; int SkipMissingFiles; int verbose; int qualnodata=0x80000000; int nRecs, iRec; int qualstat, dpcflag, polflag, skipflag, limbflag; double val; char *val1 = NULL; # define AU_m (149597870691.0) char *inRecQuery, *outRecQuery; DRMS_RecordSet_t *inRecSet, *outRecSet; unsigned int quality; inRecQuery = strdup(cmdparams_get_str(&cmdparams, "in", NULL)); outRecQuery = strdup(cmdparams_get_str(&cmdparams, "out", NULL)); SkipMissingFiles = cmdparams_get_int(&cmdparams, "M", NULL) != 0; verbose = cmdparams_get_int(&cmdparams, "v", NULL) != 0; char scfilepath[DRMS_MAXPATHLEN]; char infilepath[DRMS_MAXPATHLEN]; DRMS_RecordSet_t *screcset = NULL; dpcflag = params_isflagset(&cmdparams, "z"); polflag = params_isflagset(&cmdparams, "p"); // printf("dpcflag=%d\n",dpcflag); skipflag = params_isflagset(&cmdparams, "s"); limbflag = params_isflagset(&cmdparams, "l"); if (strcmp(inRecQuery, kNOT_SPEC) == 0 || strcmp(outRecQuery, kNOT_SPEC) == 0) DIE("Both the in and out dataseries must be specified.\n"); inRecSet = drms_open_records(drms_env, inRecQuery, &status); if (!inRecSet) DIE_status("Input dataseries not found\n"); if ((nRecs = inRecSet->n) == 0) DIE("No input records found\n"); if (verbose) printf("%d input records found\n", nRecs); char *screcquery = (char *)cmdparams_get_str(&cmdparams, "SCALE_CORRECTIONS", NULL); if (strcmp(screcquery, kNOT_SPEC) != 0) { screcset = drms_open_records(drms_env, screcquery, &status); if (status != DRMS_SUCCESS || screcset == NULL) { fprintf(stderr, "ERROR: problem reading scale corrections recordset: query = %s, status = %d\n", screcquery, status); return 1; } if (screcset->n != 1) { fprintf(stderr, "ERROR: scale corrections recordset contains more than one record: query = %s, nrecs = %d\n", screcquery, screcset->n); return 1; } DRMS_Segment_t *scseg = drms_segment_lookupnum(screcset->records[0], 0); drms_segment_filename(scseg,scfilepath); printf("scale corrections filepath = %s\n", scfilepath); } for (iRec=0; iRec<nRecs; iRec++) { char *DataFile; char timebuf[1024]; float UNIX_epoch = -220924792.000; /* 1970.01.01_00:00:00_UTC */ float now,cropmin,cropmax; float result; //double result; int Record_OK = 1; DRMS_Record_t *inRec, *outRec; DRMS_Keyword_t *outKey; DRMS_Segment_t *inSeg, *outSeg; HIterator_t *outKey_last = NULL; // DRMS_Link_t *outLink; /* create output series rec prototype */ inRec = inRecSet->records[iRec]; outRecSet = drms_create_records(drms_env, 1, outRecQuery, DRMS_PERMANENT, &status); if (!outRecSet || outRecSet->n != 1) DIE_status("Output dataseries not found or can't create records\n"); outRec = outRecSet->records[0]; val = drms_getkey_time(inRec, "T_OBS",&status); val1= drms_getkey_string(inRec,"DPC_SMPL",&status); /* Check the polarisation status of the data. If the data has the string "_Vm_", then it is circularly polarized*/ if (polflag && time_is_invalid(val) == 0 ) { char *val2 = drms_getkey_string(inRec,"DATAFILE",&status); char *val2test = strstr(val2,"_Vm_"); if (val2test == NULL) drms_setkey_string(outRec,"POLSTATE","LP"); else drms_setkey_string(outRec,"POLSTATE","CP"); if (val2) { free(val2); val2 = NULL; } } // set cvs commit version into keyword HEADER char *cvsinfo = strdup("$Header: /home/cvsuser/cvsroot/JSOC/proj/dsdsmigr/apps/ingest_dsds_to_drms.c,v 1.18 2015/01/15 23:00:19 mbobra Exp $"); status = drms_setkey_string(outRec, "HEADER", cvsinfo); if (cvsinfo) { free(cvsinfo); cvsinfo = NULL; } if (skipflag) goto skip; /* assume only one segment */ DataFile = drms_getkey_string(inRec,"DATAFILE",&status); if (status && verbose)fprintf(stderr,"*** Segment Read DATAFILE status=%d\n",status); char filepath[DRMS_MAXPATHLEN]; inSeg = drms_segment_lookupnum(inRec, 0); if (inSeg) drms_segment_filename(inSeg, filepath); else filepath[0] = '\0'; if (verbose) printf("incoming filepath = %s\n", filepath); if (dpcflag) { if (*DataFile && access(filepath, R_OK | F_OK) == 0 && time_is_invalid(val) == 0 && strcmp(val1,"60 second") == 0) { outSeg = drms_segment_lookupnum(outRec, 0); if (inSeg && outSeg) { if (limbflag) { status = embed_limbpixels(filepath,outRec,&cropmin,&cropmax); drms_setkey_double(outRec, "CROPMIN", cropmin); drms_setkey_double(outRec, "CROPMAX", cropmax); if (status != 0) DIE("Problem in function embed_limbpixels. \n"); } else { DRMS_Array_t *data; /* read the data ad doubles so allow rescaling on output */ data = drms_segment_read(inSeg, DRMS_TYPE_DOUBLE, &status); if (!data) { fprintf(stderr, "Bad data record %lld, status=%d\n",inRec->recnum, status); DIE_status("giveup\n"); } /* use the zero and offset values in the JSD for the new record segment */ data->bscale = outSeg->bscale; data->bzero = outSeg->bzero; drms_segment_write(outSeg, data, 0); drms_free_array(data); } Record_OK = 1; quality = drms_getkey_int(inRec, "QUALITY", &qualstat); quality = quality & (~qualnodata); drms_setkey_int(outRec,"QUALITY",quality); } else DIE("Bad data segment lookup, in or out\n"); } else { /* record is missing, copy t_rec and soho ephemeris keywords anyway*/ drms_copykey(outRec, inRec, "T_REC"); drms_copykey(outRec, inRec, "OBS_VW"); drms_copykey(outRec, inRec, "OBS_VR"); drms_copykey(outRec, inRec, "OBS_VN"); sprint_time(timebuf, (double)time(NULL) + UNIX_epoch, "ISO", 0); drms_setkey_string(outRec, "DATE", timebuf); val = drms_getkey_double(inRec, "OBS_DIST", &status); drms_setkey_double(outRec, "DSUN_OBS", val*AU_m); val = drms_getkey_double(inRec, "OBS_B0", &status); drms_setkey_double(outRec, "CRLT_OBS", val); val = drms_getkey_double(inRec, "OBS_CR", &status); drms_setkey_double(outRec, "CAR_ROT", val); val = drms_getkey_double(inRec, "OBS_R0", &status); drms_setkey_double(outRec, "RSUN_OBS", val); val = drms_getkey_double(inRec, "OBS_L0", &status); drms_setkey_double(outRec, "CRLN_OBS", val); drms_setkey_int(outRec, "QUALITY", 0X80000000); val = drms_getkey_int(inRec, "DPC", &status); drms_setkey_int(outRec, "DPC", val); if (drms_keyword_lookup(outRec, "DATAVALS", 0)) drms_setkey_int(outRec, "DATAVALS", 0); if (SkipMissingFiles) { Record_OK = 0; if (verbose) { char *strtodel = drms_getkey_string(outRec,"T_REC",NULL); if (strtodel) { fprintf(stderr,"DSDS Record %d has no datafile, T_REC=%s, set missing.\n", iRec, strtodel); free(strtodel); strtodel = NULL; } } } else Record_OK = 1; drms_close_records(outRecSet,(Record_OK ? DRMS_INSERT_RECORD : DRMS_FREE_RECORD)); if (DataFile) { free(DataFile); DataFile = NULL; } continue; } if (DataFile) { free(DataFile); DataFile = NULL; } if (val1) { free(val1); val1 = NULL; } } else { if (*DataFile && access(filepath, R_OK | F_OK) == 0 && time_is_invalid(val) == 0) { outSeg = drms_segment_lookupnum(outRec, 0); if (inSeg && outSeg) { if (limbflag) { status = embed_limbpixels(filepath,outRec,&cropmin,&cropmax); drms_setkey_double(outRec, "CROPMIN", cropmin); drms_setkey_double(outRec, "CROPMAX", cropmax); if (status != 0) DIE("Problem in function embed_limbpixels. \n"); } else { DRMS_Array_t *data; /* read the data ad doubles so allow rescaling on output */ data = drms_segment_read(inSeg, DRMS_TYPE_DOUBLE, &status); //data = drms_segment_read(inSeg, DRMS_TYPE_SHORT, &status); if (!data) { fprintf(stderr, "Bad data record %lld, status=%d\n",inRec->recnum, status); DIE_status("giveup\n"); } /* use the zero and offset values in the JSD for the new record segment */ data->bscale = outSeg->bscale; data->bzero = outSeg->bzero; //printf("cropmin from outside the function =%d\n",cropmin); drms_segment_write(outSeg, data, 0); drms_free_array(data); } Record_OK = 1; quality = drms_getkey_int(inRec, "QUALITY", &qualstat); quality = quality & (~qualnodata); drms_setkey_int(outRec,"QUALITY",quality); } else DIE("Bad data segment lookup, in or out\n"); } else { /* record is missing, copy t_rec and soho ephemeris keywords anyway*/ drms_copykey(outRec, inRec, "T_REC"); drms_copykey(outRec, inRec, "OBS_VW"); drms_copykey(outRec, inRec, "OBS_VR"); drms_copykey(outRec, inRec, "OBS_VN"); sprint_time(timebuf, (double)time(NULL) + UNIX_epoch, "ISO", 0); drms_setkey_string(outRec, "DATE", timebuf); val = drms_getkey_double(inRec, "OBS_DIST", &status); drms_setkey_double(outRec, "DSUN_OBS", val*AU_m); val = drms_getkey_double(inRec, "OBS_B0", &status); drms_setkey_double(outRec, "CRLT_OBS", val); val = drms_getkey_double(inRec, "OBS_CR", &status); drms_setkey_double(outRec, "CAR_ROT", val); val = drms_getkey_double(inRec, "OBS_R0", &status); drms_setkey_double(outRec, "RSUN_OBS", val); val = drms_getkey_double(inRec, "OBS_L0", &status); drms_setkey_double(outRec, "CRLN_OBS", val); drms_setkey_int(outRec, "QUALITY", 0X80000000); val = drms_getkey_int(inRec, "DPC", &status); drms_setkey_int(outRec, "DPC", val); if (drms_keyword_lookup(outRec, "DATAVALS", 0)) drms_setkey_int(outRec, "DATAVALS", 0); if (SkipMissingFiles) { Record_OK = 0; if (verbose) { char *strtodel = drms_getkey_string(outRec,"T_REC",NULL); if (strtodel) { fprintf(stderr,"DSDS Record %d has no datafile, T_REC=%s, set missing.\n", iRec, strtodel); free(strtodel); strtodel = NULL; } } } else Record_OK = 1; drms_close_records(outRecSet,(Record_OK ? DRMS_INSERT_RECORD : DRMS_FREE_RECORD)); if (DataFile) { free(DataFile); DataFile = NULL; } continue; } if (DataFile) { free(DataFile); DataFile = NULL; } } skip: /* loop through all target keywords */ outKey_last = NULL; while (outKey = drms_record_nextkey(outRec, &outKey_last, 1)) { char *wantKey, *keyName = outKey->info->name; int action = keyNameCheck(keyName, &wantKey); if (!drms_keyword_inclass(outKey, kDRMS_KeyClass_Explicit) || outKey->info->recscope == 1) continue; // skip implicit and constant keywords. switch (action) { case ACT_NOP: break; case ACT_COPY: { DRMS_Value_t inValue = {DRMS_TYPE_STRING, '\0'}; inValue = drms_getkey_p(inRec, wantKey, &status); if (status == DRMS_ERROR_UNKNOWNKEYWORD) break; if (status && verbose)fprintf(stderr,"*** ACT_COPY drms_getkey_p %s status=%d\n",wantKey,status); drms_setkey_p(outRec, keyName, &inValue); if ((inValue.type == DRMS_TYPE_STRING) && inValue.value.string_val) free(inValue.value.string_val); inValue.value.string_val = NULL; break; } case ACT_ANGLE: { /* on CROTA2 set CROTA2, SAT_ROT, INST_ROT */ double pangle, sat_rot; pangle = drms_getkey_double(inRec, "SOLAR_P", &status); if (status && verbose)fprintf(stderr,"*** ACT_ANGLE drms_getkey_double SOLAR_P status=%d, pangle=%f\n",status,pangle); sat_rot = -pangle; drms_setkey_double(outRec, "CROTA2", sat_rot); drms_setkey_double(outRec, "SAT_ROT", sat_rot); drms_setkey_double(outRec, "INST_ROT", 0.0); break; } case ACT_RESCALE: { /* on X_SCALE, Y_SCALE, MAGNIFY, FD_SCALE set CDELT1, CDELT2 */ double X_SCALE, Y_SCALE, fdscl, MAGNIFY, rsunobs; int qual, focus; double obs_dist; TIME t_obs; drms_setkey_string(outRec, "BLD_VERS", jsoc_version); obs_dist = drms_getkey_double(inRec, "OBS_DIST", &status); X_SCALE = drms_getkey_double(inRec, "X_SCALE", &status); if (status && verbose)fprintf(stderr,"*** ACT_RESCALE drms_getkey_double X_SCALE status=%d, x0=%f\n",status,X_SCALE); Y_SCALE = drms_getkey_double(inRec, "Y_SCALE", &status); if (status && verbose)fprintf(stderr,"*** ACT_RESCALE drms_getkey_double Y_SCALE status=%d, x0=%f\n",status,Y_SCALE); MAGNIFY = drms_getkey_double(inRec, "MAGNIFY", &status); if (status && verbose)fprintf(stderr,"*** ACT_RESCALE drms_getkey_double MAGNIFY status=%d, x0=%f\n",status,MAGNIFY); /* it is critical that the status of the t_obs is what is fed into the two subsequent if statements */ t_obs = drms_getkey_time(inRec, "T_OBS", &status); sprint_time(timebuf, t_obs, "ISO",0); //printf("t_obs=%s\n",timebuf); if (status && verbose)fprintf(stderr,"*** ACT_RESCALE drms_getkey_time t_obs status=%d, x0=%f\n",status,t_obs); //printf("qual=%d,focus=%d,obs_dist=%f,fdscl=%f,X_SCALE=%f,MAGNIFY=%f\n",qual,focus,obs_dist,fdscl,X_SCALE,MAGNIFY); if ( status == DRMS_SUCCESS) { status = MDI_plate_scale_adjustment(scfilepath, &fdscl, t_obs, &focus, &qual, obs_dist); if (status != 0) { fprintf(stderr,"status of plate scale adjustment=%d\n",status); fprintf(stderr,"incoming filepath with error = %s\n", infilepath); return status; } } drms_setkey_double(outRec, "CDELT1", X_SCALE*(fdscl/MAGNIFY)); drms_setkey_double(outRec, "CDELT2", Y_SCALE*(fdscl/MAGNIFY)); rsunobs=drms_getkey_double(inRec,"OBS_R0",&status); result=(rsunobs)/(X_SCALE*(fdscl/MAGNIFY)); status=drms_setkey_float(outRec, "R_SUN", result); //printf("result=%f,status=%d,qual=%d,focus=%d,obs_dist=%f,fdscl=%f,rsunobs=%f,X_SCALE=%f,MAGNIFY=%f\n",result,status,qual,focus,obs_dist,fdscl,rsunobs,X_SCALE,MAGNIFY); } case ACT_CENTER: { /* on CRPIX1 set CRPIX1, CRPIX2, CRVAL1, CRVAL2 */ double x0, y0; x0 = drms_getkey_double(inRec, "X0", &status); if (status && verbose)fprintf(stderr,"*** ACT_CENTER drms_getkey_double X0 status=%d, x0=%f\n",status,x0); y0 = drms_getkey_double(inRec, "Y0", &status); if (status && verbose)fprintf(stderr,"*** ACT_CENTER drms_getkey_double Y0 status=%d, y0=%f\n",status,y0); drms_setkey_double(outRec, "CRPIX1", x0+1.0); drms_setkey_double(outRec, "CRPIX2", y0+1.0); drms_setkey_double(outRec, "CRVAL1", 0.0); drms_setkey_double(outRec, "CRVAL2", 0.0); break; } case ACT_TIME: { /* on T_OBS set T_OBS, DATE-OBS, EXPTIME, CADENCE, TIME, MJD */ char timebuf[1024]; TIME MJD_epoch = -3727641600.000; /* 1858.11.17_00:00:00_UT */ TIME UNIX_epoch = -220924792.000; /* 1970.01.01_00:00:00_UTC */ TIME t_obs, t_rec, date__obs, mjd, now; double t_step; double exptime, mjd_day, mjd_time; t_rec = drms_getkey_time(inRec, "T_REC", &status); if (status && verbose)fprintf(stderr,"*** ACT_TIME drms_getkey_time T_REC status=%d, t_rec=%f\n",status,t_rec); t_step = drms_getkey_double(outRec, "T_REC_step", &status); /* note from outRec */ if (status && verbose)fprintf(stderr,"*** ACT_TIME drms_getkey_double T_REC_step status=%d, t_step=%f\n",status,t_step); // exptime = t_step; /* note - for lev1.5 */ exptime = drms_getkey_double(inRec, "INTERVAL", &status); t_obs = drms_getkey_time(inRec, "T_OBS", &status); if (status && verbose)fprintf(stderr,"*** ACT_TIME drms_getkey_time T_OBS status=%d, t_obs=%f\n",status,t_obs); if (status == DRMS_ERROR_UNKNOWNKEYWORD) // T_OBS is not present, skip this record. date__obs = t_obs - exptime/2.0; mjd = date__obs - MJD_epoch; /* sign error corrected by tplarson 2008.05.29 */ mjd_day = floor(mjd / 86400.0); mjd_time = mjd - 86400.0 * mjd_day; now = (double)time(NULL) + UNIX_epoch; drms_setkey_time(outRec, "T_REC", t_rec); drms_setkey_time(outRec, "T_OBS", t_obs); drms_setkey_double(outRec, "EXPTIME", exptime); drms_setkey_double(outRec, "CADENCE", t_step); drms_setkey_double(outRec, "MJD", mjd_day); drms_setkey_double(outRec, "TIME", mjd_time); // allow either string or time types for DATE and DATE_OBS if (drms_keyword_type(drms_keyword_lookup(outRec, "DATE__OBS", 1)) == DRMS_TYPE_STRING) { sprint_time(timebuf, date__obs, "ISO", 0); drms_setkey_string(outRec, "DATE__OBS", timebuf); } else { date__obs = t_obs - exptime/2.0; drms_setkey_time(outRec, "DATE__OBS", date__obs);} if (drms_keyword_type(drms_keyword_lookup(outRec, "DATE", 1)) == DRMS_TYPE_STRING) { sprint_time(timebuf, now, "ISO", 0); drms_setkey_string(outRec, "DATE", timebuf); } else drms_setkey_time(outRec, "DATE", now); break; } case ACT_AU: { # define AU_m (149597870691.0) //#define AU_m (1.49597892e11) bad double au; au = drms_getkey_double(inRec, "OBS_DIST", &status); if (status && verbose)fprintf(stderr,"*** ACT_AU drms_getkey_double OBS_DIST status=%d,au=%f\n",status,au); if (status != DRMS_ERROR_UNKNOWNKEYWORD) drms_setkey_double(outRec, "DSUN_OBS", au * AU_m); break; } case ACT_NOT_FOUND: default: /* name not in table, just take same name from input series */ { DRMS_Value_t inValue = {DRMS_TYPE_STRING, '\0'}; DRMS_Keyword_t *outKey = drms_keyword_lookup(outRec, keyName, 0); if (drms_keyword_isconstant(outKey)) break; inValue = drms_getkey_p(inRec, keyName, &status); if (status == DRMS_ERROR_UNKNOWNKEYWORD) break; if (status && verbose)fprintf(stderr,"*** DEFAULT drms_getkey_p %s status=%d\n",keyName, status); drms_setkey_p(outRec, keyName, &inValue); if ((inValue.type == DRMS_TYPE_STRING) && inValue.value.string_val) free(inValue.value.string_val); inValue.value.string_val = NULL; break; } } } if (outKey_last) { hiter_destroy(&outKey_last); } drms_setkey_time(outRec, "DATE", time_now()); /* populate the ROLL_TBL keyword */ char *rollrecstring; char *rolltbls=drms_getkey_string(inRec, "ROLL_TBL", &status); if ( status == DRMS_SUCCESS) { if (!strcmp("", rolltbls)) rollrecstring=""; if (!strcmp("not used", rolltbls)) rollrecstring="not used"; if (!strcmp("/CM/tables/ephemeris/mdi_roll.smooth", rolltbls)) rollrecstring="mdi.roll_table"; if (!strcmp("/CM/tables/ephemeris/mdi_roll.ascii", rolltbls)) rollrecstring="mdi.roll_table_ascii"; drms_setkey_string(outRec, "ROLL_TBL", rollrecstring); } if (rolltbls) { free(rolltbls); rolltbls = NULL; } /* populate the CALTBLS keyword */ char *calrecstring; char *caltbls=drms_getkey_string(inRec, "CALTBLS", &status); if ( status == DRMS_SUCCESS) { if (!strcmp("", caltbls)) calrecstring=""; if (!strcmp("/home/soi/CM/tables/calib/flat/fd/vers_0/", caltbls)) calrecstring="mdi.caltables_intensity[fd_vers_0]"; if (!strcmp("/home/soi/CM/tables/calib/flat/fd/vers_1/", caltbls)) calrecstring="mdi.caltables_intensity[fd_vers_1]"; if (!strcmp("/home/soi/CM/tables/calib/flat/hr/", caltbls)) calrecstring="mdi.caltables_intensity[hr_vers_1]"; if (!strcmp("/home/soi/CM/tables/calib/flat/hr/vers_0/", caltbls)) calrecstring="mdi.caltables_intensity[hr_vers_0]"; if (!strcmp("/home/soi/CM/tables/calib/obflat/vers_0/", caltbls)) calrecstring="mdi.caltables_intensity[obflat_vers_0]"; if (!strcmp("/home/soi/CM/tables/calib/obflat/vers_1/", caltbls)) calrecstring="mdi.caltables_intensity[obflat_vers_1]"; if (!strcmp("/home/soi/CM/tables/calib/obflat/vers_2/", caltbls)) calrecstring="mdi.caltables_intensity[obflat_vers_2]"; if (!strcmp("/home/soi/CM/tables/calib/dop/fd/tune_0/", caltbls)) calrecstring="mdi.caltables_doppler[fd_tune_0]"; if (!strcmp("/home/soi/CM/tables/calib/dop/fd/tune_1/", caltbls)) calrecstring="mdi.caltables_doppler[fd_tune_1]"; if (!strcmp("/home/soi/CM/tables/calib/dop/fd/tune_2/", caltbls)) calrecstring="mdi.caltables_doppler[fd_tune_2]"; if (!strcmp("/home/soi/CM/tables/calib/dop/fd/tune_4/", caltbls)) calrecstring="mdi.caltables_doppler[fd_tune_4]"; if (!strcmp("/home/soi/CM/tables/calib/dop/fd/tune_5/", caltbls)) calrecstring="mdi.caltables_doppler[fd_tune_5]"; if (!strcmp("/home/soi/CM/tables/calib/dop/fd/tune_6/", caltbls)) calrecstring="mdi.caltables_doppler[fd_tune_6]"; if (!strcmp("/home/soi/CM/tables/calib/dop/fd_spec/tune_0/", caltbls)) calrecstring="mdi.caltables_doppler[fd_spec_tune_0]"; if (!strcmp("/home/soi/CM/tables/calib/dop/hr/tune_1/", caltbls)) calrecstring="mdi.caltables_doppler[hr_tune_1]"; if (!strcmp("/home/soi/CM/tables/calib/dop/hr/tune_2/", caltbls)) calrecstring="mdi.caltables_doppler[hr_tune_2]"; if (!strcmp("/home/soi/CM/tables/calib/dop/hr/tune_3/", caltbls)) calrecstring="mdi.caltables_doppler[hr_tune_3]"; if (!strcmp("/home/soi/CM/tables/calib/dop/hr/tune_4/", caltbls)) calrecstring="mdi.caltables_doppler[hr_tune_4]"; if (!strcmp("/home/soi/CM/tables/calib/dop/hr/tune_5/", caltbls)) calrecstring="mdi.caltables_doppler[hr_tune_5]"; if (!strcmp("/home/soi/CM/tables/calib/dop/hr/tune_6/", caltbls)) calrecstring="mdi.caltables_doppler[hr_tune_6]"; if (!strcmp("/home/soi/CM/tables/calib/dop/hr_spec/tune_0/", caltbls)) calrecstring="mdi.caltables_doppler[hr_spec_tune_0]"; if (!strcmp("/home/soi/CM/tables/calib/dop/orig/tune_1/", caltbls)) calrecstring="mdi.caltables_doppler_orig[orig_tune_1]"; if (!strcmp("/home/soi/CM/tables/calib/dop/orig/tune_2/", caltbls)) calrecstring="mdi.caltables_doppler_orig[orig_tune_2]"; if (!strcmp("/home/soi/CM/tables/calib/dop/orig/tune_4/", caltbls)) calrecstring="mdi.caltables_doppler_orig[orig_tune_4]"; if (!strcmp("/home/soi/CM/tables/calib/dop/orig/tune_5/", caltbls)) calrecstring="mdi.caltables_doppler_orig[orig_tune_5]"; if (!strcmp("/home/soi/CM/tables/calib/dop/orig/tune_6/", caltbls)) calrecstring="mdi.caltables_doppler_orig[orig_tune_6]"; if (!strcmp("NONE", caltbls)) calrecstring="NONE"; drms_setkey_string(outRec, "CALTBLS", calrecstring); if (caltbls) { free(caltbls); caltbls = NULL; } } /* loop through all target links */ //while ( (outLink=(DRMS_Keyword_t *)hiter_getnext(&link_list)) ) //{ ///* assume no links - do nothing here now. */ //} drms_close_records(outRecSet,(Record_OK ? DRMS_INSERT_RECORD : DRMS_FREE_RECORD)); } /* Close no-longer needed record set. * -ART */ drms_close_records(screcset, DRMS_FREE_RECORD); drms_close_records(inRecSet,DRMS_FREE_RECORD); return(DRMS_SUCCESS); }
Karen Tian |
Powered by ViewCVS 0.9.4 |