Linuxpops  3.01.04
Spectral Anaysis Package for Single Dish Data
 All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
object.c
Go to the documentation of this file.
1 /*
2 Copyright 2021 Arizona Board of Regents on behalf of the University of Arizona.
3 
4 For commercial uses, to obtain a license to sell and or sublicense copies of
5 the Software please contact the University of Arizona at Tech Launch Arizona:
6 lewish@tla.arizona.edu.
7 
8 Permission is hereby granted, free of charge, to any person obtaining a copy
9 of this software and associated documentation files (the "Software"), to deal
10 in the Software without restriction for non-commercial use educational and
11 research purposes, including without limitation the rights to use, copy,
12 modify, merge, publish, distribute, and to permit persons to whom the Software
13 is furnished to do so, subject to the following conditions:
14 
15 The entire above copyright notice and this permission notice shall be included
16 in all copies or substantial portions of the Software.
17 
18 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
21 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
23 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
24 SOFTWARE.
25 
26 1. Additional Required Provisions
27 
28 1.1. Arbitration. The parties agree that if a dispute arises between them
29 concerning this Agreement, the parties may be required to submit the matter to
30 arbitration pursuant to Arizona law.
31 
32 1.2. Applicable Law and Venue. This Agreement shall be interpreted pursuant
33 to the laws of the State of Arizona. Any arbitration or litigation between the
34 Parties shall be conducted in Pima County, ARIZONA, and LICENSEE hereby
35 submits to venue and jurisdiction in Pima County, ARIZONA.
36 
37 1.3. Non-Discrimination. The Parties agree to be bound by state and federal
38 laws and regulations governing equal opportunity and non-discrimination and
39 immigration.
40 
41 1.4. Appropriation of Funds. The Parties recognize that performance by
42 ARIZONA may depend upon appropriation of funds by the State Legislature of
43 ARIZONA. If the Legislature fails to appropriate the necessary funds, or if
44 ARIZONA’S appropriation is reduced during the fiscal year, ARIZONA may cancel
45 this Agreement without further duty or obligation. ARIZONA will notify
46 LICENSEE as soon as reasonably possible after it knows of the loss of funds.
47 
48 1.5. Conflict of Interest. This Agreement is subject to the provisions of
49 A.R.S. 38-511 and other conflict of interest regulations. Within three years
50 of the EFFECTIVE DATE, ARIZONA may cancel this Agreement if any person
51 significantly involved in initiating, negotiating, drafting, securing, or
52 creating this Agreement for or on behalf of ARIZONA becomes an employee or
53 consultant in any capacity of LICENSEE with respect to the subject matter of
54 this Agreement.
55 
56  */
57 
58 
59 #include "extern.h"
60 
61 char *knownObjects[] = {
62  "Mercury",
63  "Venus",
64  "Mars",
65  "Jupiter",
66  "Saturn",
67  "Neptune",
68  "Uranus",
69  "3C84",
70  "3C273",
71  "3C279",
72  "3C345",
73  "3C454.3"
74 };
75 
76 #define MAX_KNOWN_OBJECTS 12
77 
79 
80 
81 /* Check that the object arrays has been initialized */
83 {
84  if(OGM->objects[0].used == 0)
85  {
87  }
88 
89  return(0);
90 }
91 
92 
94 {
95  int i;
96 
97  st_report("initObjectsArray(): Initializing Object Structures");
98 
99  for(i=0;i<MAX_OBJECTS;i++)
100  {
101  bzero((char *)&OGM->objects[i], sizeof(struct OBJECT));
102  }
103 
104  OGM->nobjIndx = 0;
105  OGM->nobsIndx = 0;
106 
107  for(i=0;i<MAX_KNOWN_OBJECTS;i++)
108  {
109  strcpy(OGM->objects[i].magic, "OBJECT_MAGIC");
110  OGM->objects[i].used = 1;
111  strcpy(OGM->objects[i].source, knownObjects[i]);
112  }
113 
114  return(0);
115 }
116 
117 
119 {
120  int i, j, first = 1;
121 
122  st_report("listAllObjects(): Listing All Set Objects");
123 
124  for(i=0;i<MAX_OBJECTS;i++)
125  {
126  if(OGM->objects[i].used)
127  {
128  if(first)
129  {
130  printf("NOBJ SOURCE\n\n");
131  first = 0;
132  }
133 
134  printf("%2d: %16.16s: \n", i, OGM->objects[i].source);
135 
136  for(j=0;j<MAX_MEASUREMENTS;j++)
137  {
138  if(OGM->objects[i].measurements[j].used)
139  {
140  printf("-----------> Meas: %2d, %2d Scans\n", j, OGM->objects[i].measurements[j].nscans);
141  }
142  }
143 
144  printf("\n");
145  }
146  }
147 
148  return(0);
149 }
150 
151 
152 int displayAllObservations(xmode, ymode, lines)
153 int xmode, ymode, lines;
154 {
155  int i, n;
156 
157  if(xgraphic)
158  {
159  st_report("displayAllObservations(): Displaying All Observations of Object %s", OGM->objects[OGM->nobjIndx].source);
160 
161  n = 0;
162 
163  for(i=0;i<MAX_MEASUREMENTS;i++)
164  {
165  if(OGM->objects[OGM->nobjIndx].measurements[i].nscans > 0)
166  {
167  n++;
168  }
169  }
170 
171  OGM->objects[OGM->nobjIndx].numMeas = n;
172  OGM->objects[OGM->nobjIndx].xmode = xmode;
173  OGM->objects[OGM->nobjIndx].ymode = ymode;
174  OGM->objects[OGM->nobjIndx].lines = lines;
180 
181  strcpy(OGM->objects[OGM->nobjIndx].magic, "OBJECT_MAGIC");
182 
183  sock_write(xgraphic, (char *)&OGM->objects[OGM->nobjIndx], sizeof(struct OBJECT));
184 
186  }
187  else
188  {
189  st_fail("displayAllObservations(): No graphics package to send struct to");
190  }
191 
192  return(0);
193 }
194 
195 
197 char *o;
198 {
199  int i;
200 
201  for(i=0;i<MAX_OBJECTS;i++)
202  {
203  if(!strncasecmp(OGM->objects[i].source, o, strlen(o)))
204  {
205  if(i < MAX_KNOWN_OBJECTS)
206  {
207  st_report("clearObsEntry(): Clearing Object %s", OGM->objects[i].source);
208 
209  bzero((char *)&OGM->objects[i], sizeof(struct OBJECT));
210 
211  strcpy(OGM->objects[i].magic, "OBJECT_MAGIC");
212  OGM->objects[i].used = 1;
213  strcpy(OGM->objects[i].source, knownObjects[i]);
214  }
215  else /* Clear out the entire object */
216  {
217  bzero((char *)&OGM->objects[i], sizeof(struct OBJECT));
218  st_report("clearObsEntry(): Clearing Complete Object %s", OGM->objects[i].source);
219  }
220 
221  return(0);
222  }
223  }
224 
225  st_fail("clearObsEntry(): Object %s, not found in Table");
226 
227  return(1);
228 }
229 
230 
232 struct ACCUM_RESULTS_SEND *ars;
233 {
234  int i;
235  char obj[64];
236 
237  strncpy(obj, ars->head[env->feed].object, 16);
238  obj[16] = '\0';
239 
240  st_report("findObject(): Searching for Object: %s", obj);
241 
242  strcmprs(obj);
243 
244  for(i=0;i<MAX_OBJECTS;i++)
245  {
246  if(strcasestr(OGM->objects[i].source, obj) || strcasestr(obj, OGM->objects[i].source))
247  {
248  st_report("findObject(): Using Object Index %d", i);
249 
250  return(i);
251  }
252  }
253 
254  /* Nothing found, so return the next available */
255  for(i=0;i<MAX_OBJECTS;i++)
256  {
257  if(!OGM->objects[i].used)
258  {
259  st_report("findObject(): Creating New Object Index %d", i);
260  OGM->objects[i].used = 1;
261 
262  return(i);
263  }
264  }
265 
266  return(0);
267 }
268 
269 
270 int findNextObs(ars, nobj)
271 struct ACCUM_RESULTS_SEND *ars;
272 int nobj;
273 {
274  int i=0;
275  struct MEASUREMENT *m;
276 
277  m = &OGM->objects[nobj].measurements[0];
278 
279  for(i=0;i<MAX_MEASUREMENTS;i++,m++)
280  {
281  /* If I find an unused one first; return that on */
282  if(!m->used)
283  {
284  st_report("findNextObs(): Creating New Observation Index %d", i);
285  return(i);
286  }
287  else /* OK, this on isn't used; check if it's the same scans */
288  {
289  if(fabs(m->bscan-ars->bscan) < 1.0 && fabs(m->escan-ars->escan) < 1.0)
290  {
291  st_report("findNextObs(): Using Previous Observation Index %d", i);
292  return(i);
293  }
294  }
295  }
296 
297  return(0);
298 }
299 
300 
302 struct ACCUM_RESULTS_SEND *ars;
303 {
304  st_report("saveObjectAccum(): Result saved to Local Copy");
305 
306  bcopy((char *)ars, (char *)&local_ars, sizeof(local_ars));
307 
308  return(0);
309 }
310 
311 
313 struct ACCUM_RESULTS_SEND *ars;
314 {
315  int i, nobj, nobs;
316  struct RESULT *r;
317  struct OBJECT *o;
318  struct MEASUREMENT *m;
319 
320  nobj = findObject (ars);
321  nobs = findNextObs(ars, nobj);
322 
323  OGM->nobjIndx = nobj;
324  OGM->nobsIndx = nobs;
325 
326  o = &OGM->objects[nobj];
327  m = &OGM->objects[nobj].measurements[nobs];
328 
329  m->bscan = ars->bscan;
330  m->escan = ars->escan;
331  m->nscans = ars->scanct;
332 
333  st_report("saveLocalObjectAccum(): Saving Expected Values for Feed: %d, %.3f, %.3f", env->feed, env->expectedtmb, env->expectedflux);
334 
335  if(env->feed == 4)
336  {
337  for(i=0;i<MAX_IFS;i++)
338  {
339  m->expectedTmb[ i] = env->expectedtmb;
340  m->expectedFlux[i] = env->expectedflux;
341  }
342  }
343  else
344  if(env->feed == 0 || env->feed == 2)
345  {
346  m->expectedTmb[ 0] = env->expectedtmb;
347  m->expectedFlux[0] = env->expectedflux;
348 
349  m->expectedTmb[ 2] = env->expectedtmb;
350  m->expectedFlux[2] = env->expectedflux;
351  }
352  else
353  if(env->feed == 1 || env->feed == 3)
354  {
355  m->expectedTmb[ 1] = env->expectedtmb;
356  m->expectedFlux[1] = env->expectedflux;
357 
358  m->expectedTmb[ 3] = env->expectedtmb;
359  m->expectedFlux[3] = env->expectedflux;
360  }
361 
362  m->averageEl = env->avgEl;
363 
364  r = &OGM->objects[nobj].measurements[nobs].results[0];
365  for(i=0;i<MAX_IFS;i++,r++)
366  {
367  if(ars->avgTaStar[i] > 0.0)
368  {
369  if(nobj >= MAX_KNOWN_OBJECTS)
370  {
371  strncpy(o->source, ars->head[i].object, 16);
372  o->source[16] = '\0';
373  strcmprs(o->source);
374  }
375 
376  o->used = 1;
377 
378  r->measuredTmb = ars->avgTaStar[i];
379  r->measuredTmbSigma = ars->taSigma[i];
380 
381  r->measuredTr = ars->avgTr[i];
382  r->measuredTrSigma = ars->trSigma[i];
383 
384  r->measuredFlux = ars->avgJanskys[i];
385  r->measuredFluxSigma = ars->jkSigma[i];
386 
387  if(m->expectedTmb[i] > 0.0)
388  {
389  r->beam_eff = ars->avgTr[i] / m->expectedTmb[i];
390  }
391 
392  if(m->expectedFlux[i] > 0.0)
393  {
394  r->app_eff = ars->avgJanskys[i] / m->expectedFlux[i];
395  }
396 
397  m->ut = ars->head[i].ut;
398  m->utdate = ars->head[i].utdate;
399  m->tsys = ars->head[i].stsys;
400  m->tcal = ars->head[i].tcal;
401  m->burn = ars->head[i].burn_time;
402 
403  m->used = 1;
404  }
405  }
406 
407  return(0);
408 }
409 
410 
411 /*
412  extern FILE *errPrint_fp;
413 
414  */
415 
417 {
418  int i, j, k, send2printer=0;
419  char fname[256], sysBuf[512];
420  struct OBJECT *o;
421  struct MEASUREMENT *m;
422  double rejs[4], beameff[4], besigma[4];
423  FILE *fp, *saveFp;
424 
425  /* The PRINT flag indicates if the user wants
426  to print out the results too;
427 
428  Hijack the library printing function to log the
429  output for the duration of this function */
430  if(isSet(PF_P_FLAG))
431  {
432  st_report("showObjectStatus(): Now with Printing");
433 
434  sprintf(fname, "/tmp/%s/object_print", session);
435 
436  if((fp = fopen(fname, "w") ) <= (FILE *)0)
437  {
438  st_fail("Unable to open %s", fname);
439  send2printer = 0;
440  }
441  else
442  {
443  saveFp = errPrint_fp;
444  errPrint_fp = fp;
445  send2printer = 1;
446  }
447  }
448 
449  st_report("showObjectStatus(): Current Object Entry Set to: %d", OGM->nobjIndx);
450  st_report("showObjectStatus(): Current Observations Entry Set to: %d", OGM->nobsIndx);
451 
452  o = &OGM->objects[OGM->nobjIndx];
453  m = &OGM->objects[OGM->nobjIndx].measurements[0];
454 
455  if(env->nbeff == 0) /* check for zero */
456  {
457  env->nbeff = 4;
458  }
459 
460  for(i=0;i<env->nbeff;i++)
461  {
462  rejs[i] = 1.0 / (1.0 + pow(10.0, -1.0 * env->rejections[i] / 10.0));
463  }
464 
465  if(o->used)
466  {
467  for(j=0;j<MAX_MEASUREMENTS;j++,m++)
468  {
469  if(m->used)
470  {
471  for(k=0;k<env->nbeff;k++)
472  {
473  beameff[k] = m->results[k].beam_eff * 100.0 * rejs[k];
474 
475  besigma[k] = m->results[k].measuredTrSigma * beameff[k] / m->results[k].measuredTr;
476 
477  if(gsl_isnan(besigma[k]))
478  {
479  besigma[k] = 0.0;
480  }
481  }
482 
483  st_report("Object %s", o->source);
484 
485  st_report("Set[%2d]: (%2d) Scans: (%.2f-%.2f); Date: %.4f, %.2f UT; El = %.1f",
486  j, m->nscans, m->bscan, m->escan, m->utdate, m->ut, m->averageEl);
487 
488  if(env->nbeff == 4)
489  {
490  st_report(" H-LSB H-USB V-LSB V-USB");
491  }
492  else
493  {
494  if(h0->head.sideband == 2.0)
495  {
496  st_report(" H-USB V-USB");
497  }
498  else
499  {
500  st_report(" H-USB V-USB");
501  }
502  }
503 
504  if(env->nbeff == 4)
505  {
506  st_report(" Rejections: %7.3f %7.3f %7.3f %7.3f",
507  env->rejections[0],
508  env->rejections[1],
509  env->rejections[2],
510  env->rejections[3]);
511  }
512  else
513  {
514  st_report(" Rejections: %7.3f %7.3f", env->rejections[0], env->rejections[1]);
515  }
516 
517  if(env->nbeff == 4)
518  {
519  st_report(" Rejs Coeff: %7.3f %7.3f %7.3f %7.3f",
520  rejs[0]*100.0,
521  rejs[1]*100.0,
522  rejs[2]*100.0,
523  rejs[3]*100.0);
524  }
525  else
526  {
527  st_report(" Rejs Coeff: %7.3f %7.3f", rejs[0]*100.0, rejs[1]*100.0);
528  }
529 
530  if(env->nbeff == 4)
531  {
532  st_report(" Tmb: %7.3f %7.3f %7.3f %7.3f",
533  m->results[0].measuredTr,
534  m->results[1].measuredTr,
535  m->results[2].measuredTr,
536  m->results[3].measuredTr);
537  }
538  else
539  {
540  st_report(" Tmb: %7.3f %7.3f", m->results[0].measuredTr, m->results[1].measuredTr);
541  }
542 
543  if(env->nbeff == 4)
544  {
545  st_report(" Expected Tmb: %7.3f %7.3f %7.3f %7.3f",
546  m->expectedTmb[0],
547  m->expectedTmb[1],
548  m->expectedTmb[2],
549  m->expectedTmb[3]);
550  }
551  else
552  {
553  st_report(" Expected Tmb: %7.3f %7.3f", m->expectedTmb[0], m->expectedTmb[1]);
554  }
555 
556  if(env->nbeff == 4)
557  {
558  st_report(" TmbSigma: %7.3f %7.3f %7.3f %7.3f",
559  m->results[0].measuredTrSigma,
560  m->results[1].measuredTrSigma,
561  m->results[2].measuredTrSigma,
562  m->results[3].measuredTrSigma);
563  }
564  else
565  {
566  st_report(" TmbSigma: %7.3f %7.3f", m->results[0].measuredTrSigma, m->results[1].measuredTrSigma);
567  }
568 
569  if(env->nbeff == 4)
570  {
571  st_report(" Beam Eff: %7.3f %7.3f %7.3f %7.3f",
572  beameff[0],
573  beameff[1],
574  beameff[2],
575  beameff[3]);
576  }
577  else
578  {
579  st_report(" Beam Eff: %7.3f %7.3f", beameff[0], beameff[1]);
580  }
581 
582  if(env->nbeff == 4)
583  {
584  st_report(" Beam Eff Sigma: %7.3f %7.3f %7.3f %7.3f",
585  besigma[0],
586  besigma[1],
587  besigma[2],
588  besigma[3]);
589  }
590  else
591  {
592  st_report(" Beam Eff Sigma: %7.3f %7.3f", besigma[0], besigma[1]);
593  }
594 
595  if(env->nbeff == 4)
596  {
597  st_report("------------------Ignore Below Here----------------------");
598  }
599  else
600  {
601  st_report("-------Ignore Below Here-----------");
602  }
603 
604  if(env->nbeff == 4)
605  {
606  st_report(" Flux: %7.2f %7.2f %7.2f %7.2f",
607  m->results[0].measuredFlux,
608  m->results[1].measuredFlux,
609  m->results[2].measuredFlux,
610  m->results[3].measuredFlux);
611  }
612  else
613  {
614  st_report(" Flux: %7.2f %7.2f", m->results[0].measuredFlux, m->results[1].measuredFlux);
615  }
616 
617  if(env->nbeff == 4)
618  {
619  st_report(" Expected Flux: %7.2f %7.2f %7.2f %7.2f",
620  m->expectedFlux[0],
621  m->expectedFlux[1],
622  m->expectedFlux[2],
623  m->expectedFlux[3]);
624  }
625  else
626  {
627  st_report(" Expected Flux: %7.2f %7.2f", m->expectedFlux[0], m->expectedFlux[1]);
628  }
629 
630  if(env->nbeff == 4)
631  {
632  st_report(" FluxSigma: %7.2f %7.2f %7.2f %7.2f",
636  m->results[3].measuredFluxSigma);
637  }
638  else
639  {
640  st_report(" FluxSigma: %7.2f %7.2f", m->results[0].measuredFluxSigma, m->results[1].measuredFluxSigma);
641  }
642 
643  if(env->nbeff == 4)
644  {
645  st_report(" Beam Eff: %7.2f %7.2f %7.2f %7.2f",
646  m->results[0].app_eff*100.0 * rejs[0],
647  m->results[1].app_eff*100.0 * rejs[1],
648  m->results[2].app_eff*100.0 * rejs[2],
649  m->results[3].app_eff*100.0 * rejs[3]);
650  }
651  else
652  {
653  st_report(" Beam Eff: %7.2f %7.2f", m->results[0].app_eff*100.0 * rejs[0], m->results[1].app_eff*100.0 * rejs[1]);
654  }
655 
656  st_report(" ");
657  }
658  }
659  }
660 
661  if(isSet(PF_P_FLAG) && send2printer)
662  {
663  fclose(fp);
664  errPrint_fp = saveFp;
665 
666  sprintf(sysBuf, "lpr -o landscape %s", fname);
667 
668  system(sysBuf);
669 
670  st_report("# Job sent to printer");
671  }
672 
673  return(0);
674 }
675 
676 
678 {
679  double t, f;
680 
681  if(args->ntokens < 2)
682  {
683  st_report("setExpected(): Usage: expected tmb [flux]");
684  st_report("setExpected(): Current Expected Tmb %.3f", env->expectedtmb);
685 
686  return(1);
687  }
688 
689  if(strlen(args->secondArg))
690  {
691  t = atof(args->secondArg);
692 
693  if(t > 0.0 && t < 1000.0)
694  {
695  env->expectedtmb = t;
696  st_report("setExpected(): Setting Expected Tmb to %.3f", env->expectedtmb);
697  }
698  else
699  {
700  st_fail("setExpected(): Expected Tmb %f, Out Of Range [0.0 - 1000.0]", t);
701  }
702  }
703 
704  if(strlen(args->thirdArg))
705  {
706  f = atof(args->thirdArg);
707 
708  if(f >= 0.0 && f < 100000.0)
709  {
710  env->expectedflux = f;
711  st_report("setExpected(): Setting Expected Flux to %.3f", env->expectedflux);
712  }
713  else
714  {
715  st_fail("setExpected(): Expected Flux %f, Out Of Range [0.0 - 100000.0]", f);
716  }
717  }
718 
719  return(0);
720 }
721 
722 
724 {
725  int xmode, ymode, lines;
726 
727  /* set to defaults */
728 
729  lines = OGM->objects[OGM->nobjIndx].lines;
730  xmode = OGM->objects[OGM->nobjIndx].xmode;
731  ymode = OGM->objects[OGM->nobjIndx].ymode;
732 
733  if(strlen(args->secondArg) > 0)
734  {
735  if(!strncmp(args->secondArg, "num", strlen(args->secondArg)))
736  {
737  xmode = MODE_NUM;
738  }
739  else
740  if(!strncmp(args->secondArg, "el", strlen(args->secondArg)))
741  {
742  xmode = MODE_EL;
743  }
744  else
745  {
746  xmode = MODE_NUM;
747  }
748  }
749 
750  if(strlen(args->thirdArg) > 0)
751  {
752  if(!strncmp(args->thirdArg, "flux", strlen(args->thirdArg)))
753  {
754  ymode = MODE_JANSKYS;
755  }
756  else
757  if(!strncmp(args->thirdArg, "janskys", strlen(args->thirdArg)))
758  {
759  ymode = MODE_JANSKYS;
760  }
761  else
762  if(!strncmp(args->thirdArg, "tmb", strlen(args->thirdArg)))
763  {
764  ymode = MODE_TMB;
765  }
766  else
767  if(!strncmp(args->thirdArg, "eff", strlen(args->thirdArg)))
768  {
769  ymode = MODE_EFF;
770  }
771  else
772  if(!strncmp(args->thirdArg, "app", strlen(args->thirdArg)))
773  {
774  ymode = MODE_APP;
775  }
776  else
777  {
778  ymode = MODE_JANSKYS;
779  }
780  }
781 
782  if(strlen(args->fourthArg) > 0)
783  {
784  if(!strncmp(args->fourthArg, "lines", strlen(args->fourthArg)))
785  {
786  lines = MODE_LINES;
787  }
788  else
789  if(!strncmp(args->fourthArg, "nolines", strlen(args->fourthArg)))
790  {
791  lines = MODE_NOLINES;
792  }
793  else
794  {
795  lines = MODE_LINES;
796  }
797  }
798 
799  displayAllObservations(xmode, ymode, lines);
800 
801  return(0);
802 }
803 
804 
805 int getLabelPos(msg)
806 char *msg;
807 {
808  if(xgraphic)
809  {
810  if(strlen(msg) > 3)
811  {
812  st_report(msg);
813  }
814 
815  sock_send(xgraphic, "ccur");
816 
818  {
819  st_report("getLabelPos(): X = %.2f Y = %.2f", last_mouse_x, last_mouse_y);
820  }
821  else
822  {
823  return(1);
824  }
825  }
826 
827  return(0);
828 }
829 
830 
831 /* Entry point for the Object command set */
832 /* Used for handling multiple observation sets on objects */
833 int doObject()
834 {
835  int n;
836  char obj[80];
837 
838  if(isSet(PF_I_FLAG))
839  {
841  return(0);
842  }
843 
844  if(isSet(PF_L_FLAG))
845  {
846  listAllObjects();
847  return(0);
848  }
849 
850  if(isSet(PF_M_FLAG))
851  {
852  objectDisplay(); /* Force a repaint first */
853 
854  getLabelPos("Click Mouse to Place Labels");
855 
858 
859  objectDisplay();
860 
861  return(0);
862  }
863 
864  if(isSet(PF_N_FLAG))
865  {
866  if(strlen(args->secondArg) > 0)
867  {
868  n = atoi(args->secondArg);
869 
870  if(n >-1 && n < MAX_OBJECTS)
871  {
872  OGM->nobjIndx = n;
873  st_report("object(): Setting Working Object Entry to %d", OGM->nobjIndx);
874  }
875  else
876  {
877  st_fail("object(): Working Object Entry: %d, Out Of Range [0 - %d]", n, MAX_OBJECTS);
878  }
879  }
880  else
881  {
882  st_fail("object(): Working Object Entry arg missing");
883 
884  return(1);
885  }
886 
887  return(0);
888  }
889 
890  if(isSet(PF_D_FLAG))
891  {
892  objectDisplay();
893 
894  return(0);
895  }
896 
897  if(isSet(PF_C_FLAG))
898  {
899  if(strlen(args->secondArg))
900  {
901  strcpy(obj, args->secondArg);
902  clearObsEntry(obj);
903 
904  env->xplotmin = 0.0;
905  env->xplotmax = 0.0;
906  env->yplotmin = 0.0;
907  env->yplotmax = 0.0;
908  }
909  else
910  {
911  st_fail("object(): Missing arg for 'object /c");
912  return(1);
913  }
914 
915  return(0);
916  }
917 
918  if(isSet(PF_R_FLAG))
919  {
921  return(0);
922  }
923 
924  if(isSet(PF_S_FLAG) == 1)
925  {
927 
928  return(0);
929  }
930 
931  if(isSet(PF_S_FLAG) == 2)
932  {
933  do_objectSort();
934  }
935 
936  objectDisplay();
937 
938  return(0);
939 }
940 
941 
943 {
944  int i, j, k, n, foundone = 0;
945  float *f, y;
946  double xd[MAX_CHANS], yd[MAX_CHANS], coeff[32], avg, n1;
947  struct OBJECT *o;
948 
949  st_report("do_objectGraceFit(): Entered");
950 
951  bzero((char *)xd, sizeof(xd));
952  bzero((char *)yd, sizeof(yd));
953  bzero((char *)coeff, sizeof(coeff));
954 
955  if(env->nfit == 0)
956  {
957  st_report("do_objectGraceFit(): Using nfit = %d", env->nfit);
958 
959  o = &OGM->objects[OGM->nobjIndx];
960  n = o->numMeas;
961 
962  for(j=0;j<MAX_IFS;j++)
963  {
964  if(o->measurements[0].results[j].measuredTmb)
965  {
966  avg = 0.0;
967 
968  for(i=0;i<n;i++)
969  {
970  switch(o->ymode)
971  {
972  case MODE_EFF: y = o->measurements[i].results[j].beam_eff; break;
973  case MODE_APP: y = o->measurements[i].results[j].app_eff; break;
974  case MODE_TMB: y = o->measurements[i].results[j].measuredTmb; break;
975  case MODE_JANSKYS: y = o->measurements[i].results[j].measuredFlux; break;
976  }
977 
978  avg += y;
979 
980  st_print("%d %2d %.2f %f\n", j, i, o->measurements[i].averageEl, y);
981  }
982 
983  avg /= (double)n;
984  st_report("do_objectGraceFit(): AVERAGE: %f", avg);
985 
986  f = &o->fitcurves[j][0];
987  for(i=0;i<n;i++,f++)
988  {
989  *f = avg;
990  }
991 
992  foundone++;
993  }
994  }
995 
996  if(foundone)
997  {
998  o->bplot = 1;
999  o->ncoeff = env->nfit;
1000 
1001  sock_write(xgraphic, (char *)&OGM->objects[OGM->nobjIndx], sizeof(struct OBJECT));
1002  }
1003  }
1004  else
1005  if(env->nfit > 0 && env->nfit < MAX_NFIT)
1006  {
1007  st_report("do_objectGraceFit(): Using nfit = %d", env->nfit);
1008 
1009  o = &OGM->objects[OGM->nobjIndx];
1010  n = o->numMeas;
1011 
1012  for(j=0;j<MAX_IFS;j++)
1013  {
1014  if(o->measurements[0].results[j].measuredTmb)
1015  {
1016  n1 = o->normalize[j];
1017 
1018  for(i=0;i<n;i++)
1019  {
1020  xd[i] = o->measurements[i].averageEl;
1021 
1022  switch(o->ymode)
1023  {
1024  case MODE_EFF: yd[i] = o->measurements[i].results[j].beam_eff; break;
1025  case MODE_APP: yd[i] = o->measurements[i].results[j].app_eff; break;
1026  case MODE_TMB: yd[i] = o->measurements[i].results[j].measuredTmb; break;
1027  case MODE_JANSKYS: yd[i] = o->measurements[i].results[j].measuredFlux; break;
1028  }
1029 
1030  if(n1 != 0.0)
1031  {
1032  yd[i] *= n1;
1033 
1034  o->fit_scaled = 1;
1035  }
1036  else
1037  {
1038  o->fit_scaled = 0;
1039  }
1040  }
1041 
1042  fitcurve(xd, yd, n, env->nfit, coeff);
1043 
1044  st_print("Linuxpops(C) >> # %s: ", mg_sideband[j]);
1045 
1046  for(k=0;k<env->nfit+1;k++)
1047  {
1048  st_print("a%d = %.4e ", k, coeff[k]);
1049 
1050  o->coeff[j][k] = coeff[k];
1051  }
1052 
1053  st_print("\n");
1054 
1055  f = &o->fitcurves[j][0];
1056  for(i=0;i<n;i++,f++)
1057  {
1058  *f = (float)leasev(coeff, env->nfit, o->measurements[i].averageEl);
1059  }
1060 
1061  foundone++;
1062  }
1063  }
1064 
1065  if(foundone)
1066  {
1067  o->bplot = 1;
1068  o->ncoeff = env->nfit;
1069 
1070  sock_write(xgraphic, (char *)&OGM->objects[OGM->nobjIndx], sizeof(struct OBJECT));
1071 
1072  if(isSet(PF_S_FLAG)) /* Save coeff to elgain terms?? */
1073  {
1074  st_report("Saving %d Elevation Gain Terms", env->nfit+1);
1075 
1076  env->elgain_term1 = 0.0; /* Zero old ones out first */
1077  env->elgain_term2 = 0.0;
1078  env->elgain_term2 = 0.0;
1079  env->elgain_term4 = 0.0;
1080  env->elgain_term5 = 0.0;
1081 
1082  for(k=0;k<env->nfit+1;k++)
1083  {
1084  switch(k)
1085  {
1086  case 0: env->elgain_term1 = (o->coeff[0][k] + o->coeff[1][k] + o->coeff[2][k] + o->coeff[3][k]) / (float)foundone; break;
1087  case 1: env->elgain_term2 = (o->coeff[0][k] + o->coeff[1][k] + o->coeff[2][k] + o->coeff[3][k]) / (float)foundone; break;
1088  case 2: env->elgain_term3 = (o->coeff[0][k] + o->coeff[1][k] + o->coeff[2][k] + o->coeff[3][k]) / (float)foundone; break;
1089  case 3: env->elgain_term4 = (o->coeff[0][k] + o->coeff[1][k] + o->coeff[2][k] + o->coeff[3][k]) / (float)foundone; break;
1090  case 4: env->elgain_term5 = (o->coeff[0][k] + o->coeff[1][k] + o->coeff[2][k] + o->coeff[3][k]) / (float)foundone; break;
1091  }
1092  }
1093  }
1094 
1095  }
1096  }
1097  else
1098  {
1099  st_fail("do_objectGraceFit(): Error: nfit out of range: %d, [0 - %d]", env->nfit, MAX_NFIT-1);
1100  return(1);
1101  }
1102 
1103 
1104  return(0);
1105 }
1106 
1107 
1108 
1109 int objectSort(p1, p2)
1110 struct MEASUREMENT *p1, *p2;
1111 {
1112  if(p1->averageEl > p2->averageEl)
1113  {
1114  return(1);
1115  }
1116  else
1117  if(p1->averageEl < p2->averageEl)
1118  {
1119  return(-1);
1120  }
1121 
1122  return(0);
1123 }
1124 
1125 
1127 {
1128  st_report("do_objectSort(): Sorting OBJECT structure");
1129 
1130  qsort(&OGM->objects[OGM->nobjIndx].measurements[0], OGM->objects[OGM->nobjIndx].numMeas, sizeof(struct MEASUREMENT), (__compar_fn_t)objectSort);
1131 
1132  return(0);
1133 }
double measuredTrSigma
Definition: object.h:33
struct SOCK * xgraphic
Definition: linuxpops.c:75
struct LP_IMAGE_INFO * h0
Definition: image.c:74
struct MEASUREMENT measurements[MAX_MEASUREMENTS]
Definition: object.h:102
char * mg_sideband[]
Definition: strings.c:78
int objectDisplay()
Definition: object.c:723
float fitcurves[MAX_IFS][MAX_MEASUREMENTS]
Definition: object.h:104
int sock_write(struct SOCK *s, char *message, int l)
char * strcmprs(char *str)
double yplotmax
Definition: env.h:286
int first
Definition: dbase.c:106
int checkObjArray()
Definition: object.c:82
struct PARSE_STACK * args
Definition: parse.h:196
double measuredFlux
Definition: object.h:35
int findObject(struct ACCUM_RESULTS_SEND *ars)
Definition: object.c:231
int numMeas
Definition: object.h:75
double rejections[MAX_BEAMS]
Definition: env.h:261
char source[32]
Definition: object.h:72
#define MODE_TMB
Definition: object.h:23
double last_mouse_x
Definition: env.c:82
#define MODE_LINES
Definition: object.h:20
#define MODE_EFF
Definition: object.h:24
double elgain_term1
Definition: env.h:216
char * knownObjects[]
Definition: object.c:61
double ut
Definition: object.h:47
double paperh
Definition: object.h:96
#define MAX_CHANS
Definition: defines.h:38
double averageEl
Definition: object.h:49
double paperw
Definition: object.h:95
double tsys
Definition: object.h:53
FILE * fp
Definition: linuxpops.c:70
double ylabel
Definition: object.h:93
int feed
Definition: env.h:55
#define MODE_NOLINES
Definition: object.h:19
int clearObsEntry(char *o)
Definition: object.c:196
double tcal
Definition: object.h:54
int setExpected()
Definition: object.c:677
int saveObjectAccum(struct ACCUM_RESULTS_SEND *ars)
Definition: object.c:301
Definition: object.h:70
Definition: object.h:28
#define MODE_NUM
Definition: object.h:16
double xmax
Definition: object.h:90
int fit_scaled
Definition: object.h:86
double xlabel
Definition: object.h:92
#define MODE_APP
Definition: object.h:25
int getResponse(int which)
Definition: linuxpops.c:2287
#define MAX_MEASUREMENTS
Definition: object.h:9
double sideband
Definition: header.h:143
int findNextObs(struct ACCUM_RESULTS_SEND *ars, int nobj)
Definition: object.c:270
double normalize[MAX_IFS]
Definition: object.h:98
double expectedtmb
Definition: env.h:188
int nscans
Definition: object.h:44
double measuredTr
Definition: object.h:32
struct RESULT results[MAX_IFS]
Definition: object.h:62
int initObjectsArray()
Definition: object.c:93
int doObject()
Definition: object.c:833
struct ENVIRONMENT * env
Definition: linuxpops.c:71
int nfit
Definition: env.h:81
int listAllObjects()
Definition: object.c:118
double escan
Definition: object.h:57
#define MAX_OBJECTS
Definition: object.h:13
char * thirdArg
Definition: parse.h:182
int isSet(int flag)
Definition: parse.c:646
struct HEADER head
Definition: image.h:104
#define MODE_JANSKYS
Definition: object.h:22
int displayAllObservations(int xmode, int ymode, int lines)
Definition: object.c:152
int saveLocalObjectAccum(struct ACCUM_RESULTS_SEND *ars)
Definition: object.c:312
double last_mouse_y
Definition: env.c:84
int sock_send(struct SOCK *s, char *message)
int fitcurve(double *x, double *y, int n, int ideg, double *coeff)
Definition: grace_fit.c:239
#define WAIT_FOR_MOUSE
Definition: global.h:32
#define MODE_EL
Definition: object.h:17
int ncoeff
Definition: object.h:84
double bscan
Definition: object.h:56
#define MAX_NFIT
Definition: accum.h:6
double measuredTmbSigma
Definition: object.h:30
struct OBJECT objects[MAX_OBJECTS]
Definition: object.h:112
double paperh
Definition: env.h:257
double elgain_term5
Definition: env.h:220
double leasev(double *c, int degree, double x)
Definition: grace_fit.c:210
int used
Definition: object.h:45
int do_objectSort()
Definition: object.c:1126
void st_fail()
int nbeff
Definition: env.h:78
double measuredTmb
Definition: object.h:29
int bplot
Definition: object.h:83
int objectSort(struct MEASUREMENT *p1, struct MEASUREMENT *p2)
Definition: object.c:1109
char magic[16]
Definition: object.h:71
int getLabelPos(char *msg)
Definition: object.c:805
double xplotmin
Definition: env.h:282
int plotwin
Definition: object.h:81
#define LAST_PLOT_CONT_OBJECT
Definition: defines.h:163
int lines
Definition: object.h:80
char session[80]
Definition: strings.c:67
struct OBJECT_GLOBAL_MEMORY * OGM
Definition: object.h:115
double xplotmax
Definition: env.h:283
int plotwin
Definition: env.h:129
double paperw
Definition: env.h:256
double burn
Definition: object.h:51
void st_report()
double expectedflux
Definition: env.h:187
int last_plot
Definition: env.c:93
double app_eff
Definition: object.h:39
struct ACCUM_RESULTS_SEND ars
Definition: xgraphic.c:96
int showObjectStatus()
Definition: object.c:416
struct ACCUM_RESULTS_SEND local_ars
Definition: object.c:78
char * fourthArg
Definition: parse.h:183
double elgain_term3
Definition: env.h:218
int used
Definition: object.h:74
double coeff[MAX_IFS][MAX_NFIT]
Definition: object.h:100
double avg
Definition: beam.h:5
double elgain_term2
Definition: env.h:217
double yplotmin
Definition: env.h:285
char * secondArg
Definition: parse.h:181
void st_print()
#define m(i)
int ntokens
Definition: parse.h:173
int ymode
Definition: object.h:78
#define MAX_KNOWN_OBJECTS
Definition: object.c:76
double utdate
Definition: object.h:48
double expectedFlux[MAX_IFS]
Definition: object.h:60
#define MAX_IFS
Definition: accum.h:5
double expectedTmb[MAX_IFS]
Definition: object.h:59
double beam_eff
Definition: object.h:38
int xmode
Definition: object.h:77
int do_objectGraceFit()
Definition: object.c:942
double xmin
Definition: object.h:89
double avgEl
Definition: env.h:167
double elgain_term4
Definition: env.h:219
FILE * errPrint_fp
Definition: linuxpops.c:70
double measuredFluxSigma
Definition: object.h:36