61 #define ONE_HOUR (60 * 60)
71 double mars_freqs[] = { 30.0, 80.0, 115.0, 150.0, 200.0, 230.0, 260.0, 300.0,
72 330.0, 360.0, 425.0, 650.0, 800.0, 950.0, 1000.0
96 #define ZRO ((struct EPH_OBJECT *)0)
103 {
"illum",
"%.10f",
DOUBLE, &
ZRO->illum },
104 {
"dmajor",
"%.10f",
DOUBLE, &
ZRO->dmajor },
105 {
"dminor",
"%.10f",
DOUBLE, &
ZRO->dminor },
106 {
"sdist",
"%.10f",
DOUBLE, &
ZRO->sdist },
110 {
"sangle",
"%.10f",
DOUBLE, &
ZRO->sangle },
111 {
"t_src",
"%.10f",
DOUBLE, &
ZRO->tsrc },
114 {
"flux2",
"%.10f",
DOUBLE, &
ZRO->flux2 },
116 {
"csize",
"%.10f",
DOUBLE, &
ZRO->csize },
118 { NULL, NULL, 0, NULL }
122 static int eph_get_tok(edit)
128 bzero((
char *)&eph_tok,
sizeof(eph_tok));
130 token = strtok(edit,
",\n\t ");
131 while(token != (
char *)NULL)
133 sprintf(eph_tok[c++],
"%s", token);
134 token = strtok((
char *)NULL,
",\n\t ");
144 double hr,
min, sec, deg;
146 strcpy(obj->name, name);
148 hr = atof(eph_tok[2]);
149 min = atof(eph_tok[3]);
150 sec = atof(eph_tok[4]);
151 obj->ra = hr + min / 60.0 + sec / 3600.0;
153 deg = atof(eph_tok[5]);
154 min = atof(eph_tok[6]);
155 sec = atof(eph_tok[7]);
156 obj->dec = fabs(deg) + min / 60.0 + sec / 3600.0;
162 obj->illum = atof(eph_tok[8]);
163 obj->dmajor = atof(eph_tok[9]);
164 obj->sdist = atof(eph_tok[10]);
165 obj->rdot = atof(eph_tok[11]);
166 obj->dist = atof(eph_tok[12]);
167 obj->vel = atof(eph_tok[13]);
168 obj->sangle = atof(eph_tok[14]);
181 double eccent[] = { 1.0, 1.0, 0.9952, 0.93512, 0.892467, 0.97118, 0.97247, 1.0, 1.0, 1.0, 1.0 };
183 p = &ephem->planets[ephem->planet];
185 frac = (ephem->time.hour + (ephem->time.min / 60.0)) / 24.0;
189 p->
ra = p1->
ra + frac * (p2->
ra - p1->
ra);
210 char fname[256], *string, line[256], dstr[256];
214 bzero((
char *)&p1,
sizeof(p1));
215 bzero((
char *)&p2,
sizeof(p2));
219 if((fp = fopen(fname,
"r") ) <= (FILE *)0)
221 st_fail(
"Unable to open file %s", fname);
226 sprintf(dstr,
"%4d-%s-%02d", ephem->time.year, months[ephem->time.mon], ephem->time.day);
230 while((
string = fgets(line,
sizeof(line), fp)) != NULL)
244 n = eph_get_tok(line);
248 if(!
strcmp(eph_tok[0], dstr))
255 if((
string = fgets(line,
sizeof(line), fp)) != NULL)
257 n = eph_get_tok(line);
266 st_report(
"Mars Ephem line = %.2f", (
double)indx + ephem->planets[ephem->planet].frac);
278 st_report(
"Parsed %d tokens from %s", n, basename(fname));
282 st_fail(
"Date: %s, not found in %s", dstr, basename(fname));
302 rjt = a / (exp( a / t) -1.0);
310 double f, f1, tb1, f2, tb2;
312 double tb, xslope, yaxis;
314 xslope = (tb1-tb2) / (f1-f2);
315 yaxis = tb1 - xslope * f1;
316 tb = xslope * f + yaxis;
326 int i, n, len, indx=0;
328 char fname[256], *string, line[256], dstr[256];
337 st_report(
"Loading Planet Brightness Tables");
348 if((fp = fopen(fname,
"r") ) <= (FILE *)0)
350 st_fail(
"Unable to open file %s", fname);
362 st_fail(
"Unknown Planet index %d", i);
366 while((
string = fgets(line,
sizeof(line), fp)) != NULL)
373 n = eph_get_tok(line);
377 p->
freq = atof(eph_tok[0]);
378 p->
tb = atof(eph_tok[1]) * scale;
388 sprintf(fname,
"%s/share/Mars_Tb.dat",
pkg_home);
389 sprintf(dstr,
"%4d %02d %02d %02d", t->year, t->mon+1, t->day, t->hour);
391 st_report(
"Looking for Mars date of: %s", dstr);
395 if((fp = fopen(fname,
"r") ) <= (FILE *)0)
397 st_fail(
"Unable to open file %s", fname);
404 while((
string = fgets(line,
sizeof(line), fp)) != NULL)
413 if(!strncmp(line, dstr, len))
419 n = eph_get_tok(line);
439 st_fail(
"Got %d token in file %s", n, fname);
446 st_fail(
"Unable to locate %s, in %s", dstr, fname);
461 double diff,
min, t=0.0, slope;
464 double f1, f2, t1, t2, frac,
dy,
dx;
466 len = n /
sizeof(
struct TBRIGHT);
476 for(i=0;i<len;i++,p++)
478 diff = fabs(f - p->
freq);
493 st_report(
"Found Min freq @ indx %d; min = %f, freq = %f, tb = %f", indx, min, f1, t);
500 f2 = tb[indx+1].freq;
507 f1 = tb[indx-1].freq;
518 frac = (f - f1) * slope;
554 int tmb_color =
BLACK;
555 double diameter, alpha, taper;
556 double clight, frequenz, xlambda;
557 double radius, omega_source, fluss;
559 double hnuk, expterm, jnuplan, jnucmb;
564 double a0, a1, a2, a3;
565 double aa0, aa1, aa2, aa3;
613 alpha = taper * (1.18 / 12.0);
615 s->
theta_mb = alpha * (s->
lambda / diameter) * (180.0 / M_PI) * 3600.0;
630 st_report(
"Diameter: = %6.2fm", diameter);
635 st_report(
"Diameter: = %6.2fm", diameter);
651 if(tmb_color !=
BLACK)
668 strcpy(obj->
dbase,
"Fixed");
673 #warning Using Shirley
676 obj->
tsrc = 266.4 + (245.1 / (1.0 + (s->
f_sky*s->
f_sky / (64.7*64.7))));
677 strcpy(obj->
dbase,
"Shirley");
683 strcpy(obj->
dbase,
"ALMA");
698 strcpy(obj->
dbase,
"Ulich");
701 strcpy(obj->
dbase,
"ALMA");
719 if(s->
f_sky <= 227.0)
732 strcpy(obj->
dbase,
"Alma");
745 obj->
tsrc = (s->
f_sky - 90.0) * (149.0 - 140.0) / (90.0 - 227.0);
747 strcpy(obj->
dbase,
"Shirley");
754 frequenz = s->
f_sky * 1.e9;
755 xlambda = clight / frequenz;
756 xlambda = xlambda * 1.e4;
762 obj->
tsrc = a0 + a1 * log10(xlambda) + a2 * pow(log10(xlambda), 2.0) + a3 * pow(log10(xlambda), 3.0);
765 strcpy(obj->
dbase,
"ALMA");
773 frequenz = s->
f_sky * 1.e9;
774 xlambda = clight / frequenz;
775 xlambda = xlambda * 1.e4;
782 obj->
tsrc = aa0 + aa1 * log10(xlambda) + aa2 * pow(log10(xlambda), 2.0) + aa3 * pow(log10(xlambda), 3.0);
785 strcpy(obj->
dbase,
"ALMA");
791 frequenz = s->
f_sky * 1.e9;
792 xlambda = clight / frequenz;
802 radius = obj->
dmajor / 2.0;
803 omega_source = M_PI * pow(radius * M_PI / (180.0 * 3600.0), 2.0);
804 fluss = 2.0 *
boltzmann / (pow(xlambda/100.0, 2.0)) * obj->
trj * omega_source;
805 obj->
flux = fluss * 1.e26;
806 A = (M_PI * pow(diameter, 2.0) / 4.0);
817 * (1.0 / (exp(0.04801 * s->
f_sky / obj->
trj)-1.0)
818 - 1.0 / (exp(0.04801 * s->
f_sky / 2.7)-1.0));
821 y = 1.0 - exp(x * -1.0);
829 hnuk = (6.626e-27 * frequenz / 1.381e-16);
830 jnucmb = hnuk / (exp(6.626e-27 * frequenz / (1.381e-16 * 2.725)) - 1.0);
831 jnuplan = hnuk / (exp(6.626e-27 * frequenz / (1.381e-16 * obj->
tsrc)) - 1.0);
833 obj->
tmb = expterm * (jnuplan - jnucmb);
852 int i, saz, rptflag = 0, user_freq = 0, wcolor = 0;
853 double limit, ddate, dyr, dmon, dday;
854 char raStr[80], decStr[80], rptstr[256];
859 static int first = 1;
915 dmon = (
env->
date - dyr) * 100.0;
918 dday = (
env->
date - dyr) * 100.0;
942 st_report(
"Date NOT Set: Using 'now' for time");
959 if(ddate > 2012.01 && ddate < 2025.13)
963 dmon = (ddate - dyr) * 100.0;
966 dday = (ddate - dyr) * 100.0;
979 st_report(
"Using User Date: %.4f for time", ddate);
990 st_report(
"User Date: %.4f, NOT Valid: Using 'now' for time", ddate);
991 st_report(
"Valid User Date Range: 2012.0101 - 2025.1231");
1000 st_report(
"No Scan Loaded for getPlanet(); Using 'now' for time");
1130 st_print(
"\n [ Tbright: A = ALMA; S = Shirley; F = Fixed ]\n\n");
1131 st_print(
" Name RA Dec Vel Sun SAZ Dist Major Minor Tbright Freq FWHM Csize Tmb Flux Flux2\n");
1134 st_print(
"%8.8s %s %s %5.1f %5.1f %d %5.2f %5.2f\" %5.2f\" ",
1135 p->
name, raStr, decStr, p->
vel,
1139 st_print(
"%6.2f(%1.1s) %5.1f %5.1f\" %5.2f\" %6.2f %6.1f %6.1f\n",
1157 sprintf(rptstr,
"Auto Setting Expected Tmb for %s to %f",
env->
source, p->
tmb);
1177 double bfreq, efreq;
1189 st_warn(
"No Scan Loaded for doFlux(); Using 'now' for time");
1304 s->
f_sky = (double)f;
1346 st_report(
"Sending Flux Plot to XGraphic");
1361 double bfreq, efreq;
1365 st_fail(
"No Argument for showPlanetFlux()");
1383 st_fail(
"Usage: pflux planet_name [begin_freq end_freq]");
1437 char *string, line[256], ebuf[512], timeStr[256], *
site;
1441 st_warn(
"Must select freq and date first");
1457 st_report(
"Computing Planet Fluxes for Time/Date: %s %9.4f @ site: %s", timeStr,
env->
date, site);
1459 sprintf(ebuf,
"cd %s/astro; ./astro_planets %f %s %9.4f %s",
pkg_home,
env->
freq, timeStr,
env->
date, site);
1464 if( (fp = popen(ebuf,
"r") ) <= (FILE *)0 )
1466 st_fail(
"Unable to open %s", ebuf);
1473 while((
string = fgets(line,
sizeof(line), fp)) != NULL)
1495 st_report(
"Looking if arg(%s) is planet", name);
1500 if(strlen(p->
name) < 2)
1509 st_report(
"isPlanetVar(): Comparing %s to %s", name, p->
name);
1512 if(p->
name && !strncasecmp(p->
name, name, strlen(name)))
1535 st_report(
"Looking if arg(%s) is planet", name);
1540 if(strlen(p->
name) < 2)
1551 st_report(
"isPlanetVar(): Comparing %s to %s", name, p->
name);
1554 if(p->
name && !strncasecmp(p->
name, name, strlen(name)))
1579 for(pl=&planet_lookup[0];pl->
vname;pl++)
1583 offset = (long)pl->
offset + (
char *)p;
1589 sprintf(tbuf, pl->
fmt, (
char *)offset);
1590 st_print(
"PLANET: %s.%s = %s\n", p->name, val, tbuf);
1599 sprintf(tbuf, pl->
fmt, *((
double *)offset));
1600 st_print(
"PLANET: %s.%s = %s\n", p->name, val, tbuf);
1623 st_report(
"printPlanetVar(): Looking up planet variable: %s", name);
1630 if(!strncasecmp(p->
name, name, strlen(p->
name)))
1637 if(strlen(name) == strlen(p->
name))
1662 cp = strstr(name,
".");
struct LP_IMAGE_INFO * h0
double tsrcInterp(struct TBRIGHT *tb, double f, int n)
int dopFlux(int planet, int flag, double bfreq, double efreq)
double rjot(double t, double f)
struct TBRIGHT values[MAX_JUPITER_ENTRIES]
struct NEW_EPHEM new_ephem
int sock_write(struct SOCK *s, char *message, int l)
struct PARSE_STACK * args
#define MAX_JUPITER_ENTRIES
int parseLine(struct EPH_OBJECT *obj, char *name)
char * eph_source_names[]
int getMinute(int offset)
struct tm * breakTime(double burnT)
struct EPH_OBJECT planets[MAX_PLANETS]
double tb_lin(double f, double f1, double tb1, double f2, double tb2)
struct TBRIGHT uranus_tbright[MAX_URANUS_ENTRIES]
#define LAST_PLOT_FLUX_INFO
struct TBRIGHT jupiter_tbright[MAX_JUPITER_ENTRIES]
int printPlanetVar(char *name)
int sexagesimal(double dang, char *str, int prec)
struct TBRIGHT neptune_tbright[MAX_NEPTUNE_ENTRIES]
int isPlanetVar(char *name)
int computePlanetFlux(int planet, struct EPH_OBJECT *obj, struct EPH_TIME *t, struct EPH_STATE *s, int logit)
int findPlanetVal(char *name, double *dret)
#define MAX_VESTA_ENTRIES
struct TBRIGHT vesta_tbright[MAX_VESTA_ENTRIES]
struct EPH_OBJECT save_planet_values[MAX_PLANETS]
struct PLANET_LOOKUP planet_lookup[]
struct FLUX_INFO flux_info
int lookUpPlanetVal(struct EPH_OBJECT *p, char *val, int print)
struct TBRIGHT venus_tbright[MAX_VENUS_ENTRIES]
int loadPlantFluxTables(struct EPH_TIME *t)
int parseNewEphem(struct NEW_EPHEM *ephem)
struct TBRIGHT mars_tbright[MAX_MARS_ENTRIES]
#define MAX_URANUS_ENTRIES
#define MAX_VENUS_ENTRIES
#define MAX_NEPTUNE_ENTRIES
int eph_interp(struct NEW_EPHEM *ephem, struct EPH_OBJECT *p1, struct EPH_OBJECT *p2)