Daily_QC
edit_stations.c
Go to the documentation of this file.
1 #include "prototypes_new.h"
2 
4 Widget textk[5];
5 Widget cons_dialog;
6 int isave;
8 void time_series();
9 void read_text();
12 extern int func[];
13 
14 void edit_stations(int win_x,int win_y,unsigned int win_button)
15 
16 {
17 extern float reverse_filter_value;
18 extern int elevation_filter_value;
19 extern int dcmode;
20 extern int tcmode;
21 extern float filter_value;
22 extern struct ts ts[20];
23 extern int tsmax;
24 extern Widget edit_dialog;
25 extern int isom;
26 extern int gage_char[2];
27 extern int method;
28 extern int qflag[10];
29 extern struct pdata pdata[10];
30 extern unsigned long cmap[16];
31 extern Widget drawing_area;
32 extern struct station station[3000];
33 extern int max_stations;
34 extern Font font[10];
35 extern int npoint[2],zoom;
36 extern struct display_set display_set[4];
37 extern Display *display;
38 extern GC gc;
39 extern int mmap[16];
40 extern void kill_widget();
41 extern struct dval dval;
42 extern int dflag[10];
44 void change_custom_file();
47 void cancel_edit();
48 void set_snotel();
49 extern int pcpn_day,pcpn_time;
50 extern int pcpn_time_step;
51 Widget rowcol,rowcol3,pbutton,rowcol1,sep;
52 float conv=.0174;
53 int MY=10;
54 Arg args[10];
55 Cardinal argcount;
56 int i;
57 double testdist,maxdist;
58 int x,y;
59 XmString t;
60 Dimension width,height;
61 signed long XSIZE,YSIZE;
62 float xrat,yrat,mult;
63 int xmin,xmax,ymin,ymax,display_flag,xcen,ycen,h;
64 long lint1,lint2;
65 float dmult,lat,lon;
66 char *st[10],buf[100],muf[10];
67 long r,s;
68 int time_pos,naflag,m;
69 XmString help_string;
70 void graph_file();
71 
72 if(pcpn_time_step==0)
73  time_pos=pcpn_time;
74 
75 else
76  time_pos=4;
77 
78 XSetFont(display,gc,font[3]);
79 
80 /* need to set flag to plot */
81 
82 /* need to set resource in widget also */
83 
84 XSetFunction(display,gc,GXcopy);
85 
86 XtSetArg(args[0],XtNwidth,&width);
87 XtSetArg(args[1],XtNheight,&height);
88 XtGetValues(drawing_area,args,2);
89 
90 XSIZE=(long)width*10L;
91 YSIZE=(long)height*10L;
92 
93 xrat=(float)XSIZE/(float)12800;
94 yrat=(float)YSIZE/(float)9600;
95 
96 if(xrat < yrat)
97  mult=xrat;
98 
99 else
100  mult=yrat;
101 
102 display_flag=0;
103 h=0;
104 
105 dmult=display_set[display_flag].dmult[h];
106 xmin= display_set[display_flag].xmin[h];
107 xmax= display_set[display_flag].xmax[h];
108 ymin= display_set[display_flag].ymin[h];
109 ymax= display_set[display_flag].ymax[h];
110 xcen= display_set[display_flag].xcen[h];
111 ycen= display_set[display_flag].ycen[h];
112 
113 lint1=(long)npoint[0]*(long)MY;
114 lint2=(long)npoint[1]*(long)MY;
115 
116 x=win_x;
117 y=win_y;
118 
119 if(zoom==1) {
120 
121  win_x=x*MY/mult;
122  win_y=y*MY/mult;
123 
124  }
125 
126 else {
127 
128 
129  win_x=((x*MY-xcen)/zoom + lint1)/mult;
130  win_y=((y*MY-ycen)/zoom + lint2)/mult;
131 
132  }
133 
134 
135 if(zoom==1) {
136 
137  x=(win_x*mult)/MY;
138  y=(win_y*mult)/MY;
139 
140  }
141 
142 else {
143 
144  x=(((win_x*mult)-lint1)*zoom+xcen)/MY;
145  y=(((win_y*mult)-lint2)*zoom+ycen)/MY;
146 
147  }
148 
149 isave=-1;
150 maxdist=9999;
151 
152 for(i=0;i<max_stations;i++){
153 
154  if((pdata[pcpn_day].stn[i].frain[time_pos].data > reverse_filter_value) &&
155  (pdata[pcpn_day].stn[i].frain[time_pos].data < 20.00))
156  continue;
157 
158 
159  if(station[i].elev > 0 && station[i].elev < elevation_filter_value)
160  continue;
161 
162 
163 
164  if(pdata[pcpn_day].stn[i].frain[time_pos].data < 0)
165  continue;
166 
167  if(pdata[pcpn_day].stn[i].frain[time_pos].data < filter_value)
168  continue;
169 
170  lat=station[i].lat;
171  lon=station[i].lon;
172 
173  if(tcmode==0 && pdata[pcpn_day].stn[i].tcons==-1)
174  continue;
175 
176  if(tcmode==1 && pdata[pcpn_day].stn[i].tcons==1)
177  continue;
178 
179  if(dcmode==0 && pdata[pcpn_day].stn[i].scons[time_pos]==-1)
180  continue;
181 
182  if(dcmode==1 && pdata[pcpn_day].stn[i].scons[time_pos]==1)
183  continue;
184 
185  if(station[i].tip==0 && gage_char[0]==-1)
186  continue;
187 
188  if(station[i].tip==1 && gage_char[1]==-1)
189  continue;
190 
191 
192  for(m=0;m<tsmax;m++) {
193 
194  if(strncmp(&station[i].parm[3],ts[m].abr,2)==0 && dflag[m+1] == 1)
195  break;
196 
197  }
198 
199 
200  if(m==tsmax)
201  continue;
202 
203 
204  for(m=0;m<9;m++) {
205 
206  if(m==pdata[pcpn_day].stn[i].frain[time_pos].qual &&
207  qflag[m]==1)
208  break;
209 
210  }
211 
212  if(m==9)
213  continue;
214 
215  r=dval.a * cos(lat*conv)/(1+sin(lat*conv))
216  * cos((lon-dval.lo-90)*conv) + dval.xo +.5;
217 
218  s=dval.a * cos(lat*conv)/(1+sin(lat*conv))
219  * sin((lon-dval.lo-90)*conv) + dval.yo + .5;
220 
221  testdist= pow((double)(win_x-r),2) + pow((double)(win_y-s),2);
222  testdist= pow(testdist,.5);
223 
224  if(testdist < maxdist) {
225 
226  isave=i;
227  maxdist=testdist;
228 
229  }
230 
231  }
232 
233 if(isave==-1)
234  return;
235 
236 reset_value=0;
237 
239 
241 
242 if(initial_qual==6) {
243 
245  "You cannot quality control a time distributed station");
246 
247  return;
248 
249  }
250 
251 help_string=XmStringCreateLocalized("graph");
252 
253 argcount=0;
254 XtSetArg(args[argcount],XmNdeleteResponse,XmDO_NOTHING);argcount++;
255 XtSetArg(args[argcount],XmNautoUnmanage,False);argcount++;
256 XtSetArg(args[argcount],XmNwidth, 300);argcount++;
257 XtSetArg(args[argcount],XmNheight,500);argcount++;
258 XtSetArg(args[argcount],XmNbackground,mmap[1]);argcount++;
259 XtSetArg(args[argcount],XmNforeground,mmap[0]);argcount++;
260 
261 XtSetArg(args[argcount],XmNhelpLabelString,help_string);argcount++;
262 edit_dialog=XmCreateMessageDialog(drawing_area,"Edit Stations",args,argcount);
263 
264 XtAddCallback(edit_dialog,XmNokCallback,change_custom_file,(XtPointer)isave);
265 
266 XtAddCallback(edit_dialog,XmNhelpCallback,graph_file,(XtPointer)isave);
267 
268 XtAddCallback(edit_dialog,XmNcancelCallback,cancel_edit,NULL);
269 
270 argcount=0;
271 XtSetArg(args[argcount],XmNbackground,mmap[1]);argcount++;
272 XtSetArg(args[argcount],XmNforeground,mmap[0]);argcount++;
273 XtSetArg(args[argcount],XmNorientation,XmVERTICAL);argcount++;
274 rowcol=XmCreateRowColumn(edit_dialog,"Edit Stations",args,argcount);
275 
276 strcpy(buf,station[isave].hb5);
277 strcat(buf," ");
278 strcat(buf,station[isave].parm);
279 t=XmStringCreateLocalized(buf);
280 argcount=0;
281 XtSetArg(args[argcount],XmNbackground,mmap[1]);argcount++;
282 XtSetArg(args[argcount],XmNforeground,mmap[0]);argcount++;
283 XtSetArg(args[argcount],XmNlabelString,t);argcount++;
284 pbutton=XmCreateLabel(rowcol,"Label",args,argcount);
285 XtManageChild(pbutton);
286 XmStringFree(t);
287 
288 strcpy(buf,station[isave].name);
289 t=XmStringCreateLocalized(buf);
290 argcount=0;
291 XtSetArg(args[argcount],XmNbackground,mmap[1]);argcount++;
292 XtSetArg(args[argcount],XmNforeground,mmap[0]);argcount++;
293 XtSetArg(args[argcount],XmNlabelString,t);argcount++;
294 pbutton=XmCreateLabel(rowcol,"Label",args,argcount);
295 XtManageChild(pbutton);
296 XmStringFree(t);
297 
298 sprintf(buf,"%d",station[isave].elev);
299 strcat(buf," ft ");
300 if(station[isave].tip==0)
301  strcat(buf,"tipping");
302 
303 else
304  strcat(buf,"weighing");
305 
306 t=XmStringCreateLocalized(buf);
307 argcount=0;
308 XtSetArg(args[argcount],XmNbackground,mmap[1]);argcount++;
309 XtSetArg(args[argcount],XmNforeground,mmap[0]);argcount++;
310 XtSetArg(args[argcount],XmNlabelString,t);argcount++;
311 pbutton=XmCreateLabel(rowcol,"Label",args,argcount);
312 XtManageChild(pbutton);
313 XmStringFree(t);
314 
315 if(method==2 && station[isave].isoh[isom] > 0) {
316 
317  sprintf(buf,"monthly normal %5.2f in.",station[isave].isoh[isom]);
318  t=XmStringCreateLocalized(buf);
319  argcount=0;
320  XtSetArg(args[argcount],XmNbackground,mmap[1]);argcount++;
321  XtSetArg(args[argcount],XmNforeground,mmap[0]);argcount++;
322  XtSetArg(args[argcount],XmNlabelString,t);argcount++;
323  pbutton=XmCreateLabel(rowcol,"Label",args,argcount);
324  XtManageChild(pbutton);
325  XmStringFree(t);
326 
327  }
328 
329 if(pdata[pcpn_day].stn[isave].frain[time_pos].data >= 0) {
330 
331  sprintf(buf,"estimate %5.2f in. dev %5.2f",
332  pdata[pcpn_day].stn[isave].frain[time_pos].estimate,
333  pdata[pcpn_day].stn[isave].frain[time_pos].stddev);
334 
335  t=XmStringCreateLocalized(buf);
336  argcount=0;
337  XtSetArg(args[argcount],XmNbackground,mmap[1]);argcount++;
338  XtSetArg(args[argcount],XmNforeground,mmap[0]);argcount++;
339  XtSetArg(args[argcount],XmNlabelString,t);argcount++;
340  pbutton=XmCreateLabel(rowcol,"Label",args,argcount);
341  XtManageChild(pbutton);
342  XmStringFree(t);
343 
344  }
345 
346 if(station[isave].tip==0 && time_pos != 4 &&
347  pdata[pcpn_day].stn[isave].frzlvl[time_pos] > -99 ) {
348 
349  sprintf(buf,"Freezing level %dft",
350  pdata[pcpn_day].stn[isave].frzlvl[time_pos]);
351 
352  t=XmStringCreateLocalized(buf);
353  argcount=0;
354  XtSetArg(args[argcount],XmNbackground,mmap[1]);argcount++;
355  XtSetArg(args[argcount],XmNforeground,mmap[0]);argcount++;
356  XtSetArg(args[argcount],XmNlabelString,t);argcount++;
357  pbutton=XmCreateLabel(rowcol,"Label",args,argcount);
358  XtManageChild(pbutton);
359  XmStringFree(t);
360 
361  }
362 
363 if(pdata[pcpn_day].stn[isave].snoflag[time_pos] > 0 ) {
364 
365  sprintf(buf,"SNOTEL error is ");
366 
367  if(pdata[pcpn_day].stn[isave].snoflag[time_pos]==1)
368  strcat(buf," SNOTEL >> PCPN");
369 
370  if(pdata[pcpn_day].stn[isave].snoflag[time_pos]==2)
371  strcat(buf," CONTINUATION");
372 
373  if(pdata[pcpn_day].stn[isave].snoflag[time_pos]==3)
374  strcat(buf," PCPN RESET");
375 
376  if(pdata[pcpn_day].stn[isave].snoflag[time_pos]==4)
377  strcat(buf," PCPN >> SNOTEL");
378 
379  t=XmStringCreateLocalized(buf);
380  argcount=0;
381  XtSetArg(args[argcount],XmNbackground,mmap[1]);argcount++;
382  XtSetArg(args[argcount],XmNforeground,mmap[0]);argcount++;
383  XtSetArg(args[argcount],XmNlabelString,t);argcount++;
384  pbutton=XmCreateLabel(rowcol,"Label",args,argcount);
385  XtManageChild(pbutton);
386  XmStringFree(t);
387 
388  }
389 
390 snotelwidget=NULL;
391 
392 if(pdata[pcpn_day].stn[isave].srain[time_pos].data > -98 ) {
393 
394  sprintf(buf,"Snow water change is %5.2f in.",pdata[pcpn_day].stn[isave].srain[time_pos].data);
395 
396  t=XmStringCreateLocalized(buf);
397  argcount=0;
398  XtSetArg(args[argcount],XmNbackground,mmap[1]);argcount++;
399  XtSetArg(args[argcount],XmNforeground,mmap[0]);argcount++;
400  XtSetArg(args[argcount],XmNlabelString,t);argcount++;
401  pbutton=XmCreateLabel(rowcol,"Label",args,argcount);
402  XtManageChild(pbutton);
403  XmStringFree(t);
404 
405  if(time_pos==4 && pdata[pcpn_day].stn[isave].srain[time_pos].data >=0 ) {
406 
407  argcount=0;
408  XtSetArg(args[argcount],XmNbackground,mmap[1]);argcount++;
409  XtSetArg(args[argcount],XmNforeground,mmap[0]);argcount++;
410  XtSetArg(args[argcount],XmNselectColor,cmap[4]);argcount++;
411 
412  if(pdata[pcpn_day].stn[isave].sflag[time_pos]==1)
413  XtSetArg(args[argcount],XmNset,True);
414 
415  else
416  XtSetArg(args[argcount],XmNset,False);
417 
418  argcount++;
419 
420  snotelwidget=XmCreateToggleButton(rowcol,"Use SWD for PPD",args,argcount);
421 
422  /*XtAddCallback(pbutton,XmNvalueChangedCallback,set_snotel,
423  (XtPointer)isave); */
424 
425  XtManageChild(snotelwidget);
426 
427  }
428 
429  }
430 
431 if(pdata[pcpn_day].stn[isave].frain[time_pos].data < 0)
432  strcpy(muf,"M");
433 else
434  sprintf(muf,"%5.2f",pdata[pcpn_day].stn[isave].frain[time_pos].data);
435 
436 argcount=0;
437 XtSetArg(args[argcount],XmNvalue,muf);argcount++;
438 XtSetArg(args[argcount],XmNbackground,mmap[1]);argcount++;
439 XtSetArg(args[argcount],XmNforeground,mmap[0]);argcount++;
440 textz=XmCreateTextField(rowcol,"Point QPF",args,argcount);
441 XtManageChild(textz);
442 
443 if(initial_qual != 5 && initial_qual != 4) {
444 
445 t=XmStringCreateLocalized("Station quality");
446 
447 argcount=0;
448 XtSetArg(args[argcount],XmNbackground,mmap[1]);argcount++;
449 XtSetArg(args[argcount],XmNforeground,mmap[0]);argcount++;
450 XtSetArg(args[argcount],XmNlabelString,t);argcount++;
451 pbutton=XmCreateLabel(rowcol,"Label",args,argcount);
452 XtManageChild(pbutton);
453 XmStringFree(t);
454 
455 }
456 
457 if(initial_qual < 0 || pdata[pcpn_day].stn[isave].frain[time_pos].data < 0)
458  naflag=1;
459 
460 else
461  naflag=0;
462 
463 
464 argcount=0;
465 XtSetArg(args[argcount],XmNbackground,mmap[1]);argcount++;
466 XtSetArg(args[argcount],XmNforeground,mmap[0]);argcount++;
467 XtSetArg(args[argcount],XmNpacking,XmPACK_COLUMN); argcount++;
468 XtSetArg(args[argcount],XmNnumColumns,2);argcount++;
469 XtSetArg(args[argcount],XmNorientation,XmVERTICAL);argcount++;
470 rowcol1=XmCreateRadioBox(rowcol,"Edit Stations",args,argcount);
471 
472 if(initial_qual==2) {
473 
474  st[0]="Manual";
475  st[1]="Reset to Original";
476 
477  for(i=0;i<2;i++) {
478 
479  argcount=0;
480  XtSetArg(args[argcount],XmNbackground,mmap[1]);argcount++;
481  XtSetArg(args[argcount],XmNforeground,mmap[0]);argcount++;
482  XtSetArg(args[argcount],XmNselectColor,cmap[4]);argcount++;
483 
484  if(i==0)
485  XtSetArg(args[argcount],XmNset,True);
486 
487  else
488  XtSetArg(args[argcount],XmNset,False);
489 
490  argcount++;
491 
492  pbutton=XmCreateToggleButton(rowcol1,st[i],args,argcount);
493  XtAddCallback(pbutton,XmNvalueChangedCallback,reset_station_quality,
494  (XtPointer)i);
495 
496  XtManageChild(pbutton);
497 
498 
499  }
500 
501 
502 }
503 
504 
505 else if(initial_qual != 5 && initial_qual != 4) {
506 
507 st[0]="Verified";
508 st[1]="Screened (Force)";
509 st[2]="Questionable";
510 st[3]="Bad";
511 
512 
513 for(i=0;i<4;i++) {
514 
515  argcount=0;
516  XtSetArg(args[argcount],XmNbackground,mmap[1]);argcount++;
517  XtSetArg(args[argcount],XmNforeground,mmap[0]);argcount++;
518  XtSetArg(args[argcount],XmNselectColor,cmap[4]);argcount++;
519 
520  if(func[i]==initial_qual && naflag != 1)
521  XtSetArg(args[argcount],XmNset,True);
522 
523  else
524  XtSetArg(args[argcount],XmNset,False);
525 
526  argcount++;
527 
528  pbutton=XmCreateToggleButton(rowcol1,st[i],args,argcount);
529  XtAddCallback(pbutton,XmNvalueChangedCallback,change_station_quality,
530  (XtPointer)(i));
531  XtManageChild(pbutton);
532 
533  if(naflag==1)
534  XtSetSensitive(pbutton,False);
535 
536  }
537 
538 }
539 
540 if(station[isave].xadd==-1 && station[isave].yadd==-1)
541  initial_pos=0;
542 
543 else if(station[isave].xadd==0 && station[isave].yadd==-1)
544  initial_pos=2;
545 
546 else if(station[isave].xadd==-1 && station[isave].yadd==0)
547  initial_pos=1;
548 
549 else if(station[isave].xadd==0 && station[isave].yadd==0)
550  initial_pos=3;
551 if(initial_qual != 5 && initial_qual != 4) {
552 
553 sep=XmCreateSeparator(rowcol,"swp",NULL,0);
554 
555 XtManageChild(sep);
556 
557 }
558 
559 t=XmStringCreateLocalized("Station Location");
560 argcount=0;
561 XtSetArg(args[argcount],XmNbackground,mmap[1]);argcount++;
562 XtSetArg(args[argcount],XmNforeground,mmap[0]);argcount++;
563 XtSetArg(args[argcount],XmNlabelString,t);argcount++;
564 pbutton=XmCreateLabel(rowcol,"Label",args,argcount);
565 XtManageChild(pbutton);
566 XmStringFree(t);
567 
568 argcount=0;
569 XtSetArg(args[argcount],XmNbackground,mmap[1]);argcount++;
570 XtSetArg(args[argcount],XmNforeground,mmap[0]);argcount++;
571 XtSetArg(args[argcount],XmNpacking,XmPACK_COLUMN); argcount++;
572 XtSetArg(args[argcount],XmNnumColumns,2);argcount++;
573 XtSetArg(args[argcount],XmNorientation,XmVERTICAL);argcount++;
574 rowcol3=XmCreateRadioBox(rowcol,"Edit Stations",args,argcount);
575 
576 st[0]="upper left";
577 st[1]="lower left";
578 st[2]="upper right";
579 st[3]="lower right";
580 
581 for(i=0;i<4;i++) {
582 
583  argcount=0;
584  XtSetArg(args[argcount],XmNbackground,mmap[1]);argcount++;
585  XtSetArg(args[argcount],XmNforeground,mmap[0]);argcount++;
586  XtSetArg(args[argcount],XmNselectColor,cmap[4]);argcount++;
587 
588  if(i==initial_pos)
589  XtSetArg(args[argcount],XmNset,True);
590 
591  else
592  XtSetArg(args[argcount],XmNset,False);
593 
594  argcount++;
595 
596  pbutton=XmCreateToggleButton(rowcol3,st[i],args,argcount);
597  XtAddCallback(pbutton,XmNvalueChangedCallback,change_station_location,
598  (XtPointer)(i));
599  XtManageChild(pbutton);
600 
601  }
602 
603 XtManageChild(rowcol1);
604 XtManageChild(rowcol3);
605 XtManageChild(rowcol);
606 XtManageChild(edit_dialog);
607 
608 }
609 void change_station_location(Widget w,XtPointer data,XtPointer call_data)
610 
611 {
612 
613 extern struct station station[3000];
614 
615 if((int)data==0) {
616 
617  station[isave].xadd=-1;
618  station[isave].yadd=-1;
619 
620  }
621 
622 else if((int)data==2) {
623 
624  station[isave].xadd=0;
625  station[isave].yadd=-1;
626 
627  }
628 
629 else if((int)data==1) {
630 
631  station[isave].xadd=-1;
632  station[isave].yadd=0;
633 
634  }
635 
636 else if((int)data==3) {
637 
638  station[isave].xadd=0;
639  station[isave].yadd=0;
640 
641  }
642 
643 return;
644 
645 }
646 
647 
648 void change_custom_file(Widget w,XtPointer data, XtPointer call_data)
649 
650 {
651 
652 extern Widget rowcol1;
653 extern int map_flag;
654 extern int grids_flag;
655 extern int points_flag;
656 extern int pcp_flag;
657 extern Widget drawing_area;
658 extern Widget edit_dialog;
659 extern Widget diswidget[6];
660 extern struct pdata pdata[10];
661 extern int pcpn_time;
662 extern int pcpn_time_step;
663 extern int pcpn_day;
664 extern Display *display;
665 extern Window window;
666 extern Widget top_level;
667 extern Cursor watch_cursor;
668 extern char station_list_custom_file[100];
669 extern char *timefile[];
670 int i;
671 extern int max_stations;
672 extern struct station station[3000];
673 FILE *fp;
674 Cardinal argcount;
675 Arg args[10];
676 int time_pos;
677 char *p;
678 float val,fdif;
679 char *cstr;
680 int k;
681 extern int pcp_in_use[500];
682 Boolean bval;
683 float rtotal;
684 int m;
685 Widget rowcol;
686 XmString t;
687 extern int mmap[16];
688 Widget pbutton;
689 char muf[50];
690 extern Widget rpbutton;
691 extern int tcmode;
692 
693 if(pcpn_time_step==0)
694  time_pos=pcpn_time;
695 
696 else
697  time_pos=4;
698 
699 XDefineCursor(display,window,watch_cursor);
700 XmUpdateDisplay(top_level);
701 
702 fp=fopen(station_list_custom_file,"w");
703 
704 for(i=0;i<max_stations;i++)
705  fprintf(fp,"%s %s %d %d\n",station[i].hb5,station[i].parm,
706  station[i].xadd,station[i].yadd);
707 
708 fclose(fp);
709 
710 if(snotelwidget != NULL) {
711 
712 XtSetArg(args[0],XmNset,&bval);
713 XtGetValues(snotelwidget,args,1);
714 
715 }
716 
717 /*snotel path */
718 
719 if(snotelwidget != NULL &&
720  ((bval==True && pdata[pcpn_day].stn[isave].sflag[4]==-1) ||
721  (bval==False && pdata[pcpn_day].stn[isave].sflag[4]==1))) {
722 
723 
725  -pdata[pcpn_day].stn[isave].sflag[4];
726 
727  if(pdata[pcpn_day].stn[isave].sflag[4]==1) {
728 
731 
732  pdata[pcpn_day].stn[isave].frain[4].qual=8;
733 
734  }
735 
736  else {
737 
740 
741  pdata[pcpn_day].stn[isave].frain[4].qual=8;
742 
743  }
744 
745  }
746 
747 
748 else {
749 
750 
751  /* other path */
752 
753  argcount=0;
754  XtSetArg(args[argcount],XmNvalue,&cstr);argcount++;
755  XtGetValues(textz,args,argcount);
756 
757  val=atof(cstr);
758  p=strchr(cstr,'M');
759  XtFree(cstr);
760 
761  /* use manually entered data */
762 
763  /* need to ensure consistency in 6 and 24 hour data??? */
764 
765  fdif=fabs(val-pdata[pcpn_day].stn[isave].frain[time_pos].data);
766 
767  if(fdif > .005 && p == NULL && reset_value==0) {
768 
769  pdata[pcpn_day].stn[isave].frain[time_pos].data=val;
770  pdata[pcpn_day].stn[isave].frain[time_pos].qual=2;
771  pdata[pcpn_day].stn[isave].sflag[time_pos]=-1;
772 
773  for(m=0;m<5;m++) {
774 
775  if(pdata[pcpn_day].stn[isave].frain[m].data >=0 && m != time_pos)
776  pdata[pcpn_day].stn[isave].frain[m].qual=2;
777 
778 
779  }
780 
781  }
782 
783  if(pdata[pcpn_day].stn[isave].frain[time_pos].qual==2 ||
784  tcmode==1) {
785 
786  rtotal=0;
787  for(m=0;m<4;m++)
788  if(pdata[pcpn_day].stn[isave].frain[m].data >= 0)
789  rtotal=rtotal+pdata[pcpn_day].stn[isave].frain[m].data;
790 
791  if(fabs(rtotal-pdata[pcpn_day].stn[isave].frain[4].data) > .005) {
792 
793  /* build dialog to fix */
794 
795  t=XmStringCreateLocalized("Inconsistent data");
796  argcount=0;
797  XtSetArg(args[argcount],XmNdeleteResponse,XmDO_NOTHING);argcount++;
798  XtSetArg(args[argcount],XmNautoUnmanage,False);argcount++;
799  XtSetArg(args[argcount],XmNwidth, 300);argcount++;
800  XtSetArg(args[argcount],XmNheight,300);argcount++;
801  XtSetArg(args[argcount],XmNbackground,mmap[1]);argcount++;
802  XtSetArg(args[argcount],XmNforeground,mmap[0]);argcount++;
803  XtSetArg(args[argcount],XmNdialogStyle,
804  XmDIALOG_FULL_APPLICATION_MODAL);argcount++;
805 
806  XtSetArg(args[argcount],XmNmessageString,t);argcount++;
807  cons_dialog=XmCreateMessageDialog(drawing_area,"Cons Stations",args,argcount);
808  XmStringFree(t);
809 
810  XtAddCallback(cons_dialog,XmNokCallback,read_text,(XtPointer)isave);
811  XtUnmanageChild(XmMessageBoxGetChild(cons_dialog,XmDIALOG_CANCEL_BUTTON));
812  XtUnmanageChild(XmMessageBoxGetChild(cons_dialog,XmDIALOG_HELP_BUTTON));
813  XtUnmanageChild(XmMessageBoxGetChild(cons_dialog,XmDIALOG_SEPARATOR));
814  argcount=0;
815  XtSetArg(args[argcount],XmNbackground,mmap[1]);argcount++;
816  XtSetArg(args[argcount],XmNforeground,mmap[0]);argcount++;
817  XtSetArg(args[argcount],XmNorientation,XmHORIZONTAL);argcount++;
818  XtSetArg(args[argcount],XmNpacking,XmPACK_TIGHT); argcount++;
819  XtSetArg(args[argcount],XmNnumColumns,2);argcount++;
820  rowcol=XmCreateRowColumn(cons_dialog,"Edit Stations",args,argcount);
821 
822  for(m=0;m<5;m++) {
823 
824  argcount=0;
825 
826  t=XmStringCreateLocalized(timefile[m]);
827  XtSetArg(args[argcount],XmNlabelString,t);argcount++;
828  pbutton=XmCreateLabel(rowcol,"Label",args,argcount);
829  XtManageChild(pbutton);
830  XmStringFree(t);
831 
832  if(pdata[pcpn_day].stn[isave].frain[m].data < 0)
833  strcpy(muf,"M");
834  else
835  sprintf(muf,"%5.2f",pdata[pcpn_day].stn[isave].frain[m].data);
836 
837  XtSetArg(args[argcount],XmNvalue,muf);argcount++;
838 
839  textk[m]=XmCreateTextField(rowcol,"Point QPF",args,argcount);
840  XtManageChild(textk[m]);
841 
842  }
843 
844 
845  XtManageChild(rowcol);
846  XtManageChild(cons_dialog);
847  return;
848  }
849 
850 
851  }
852 
853  else {
854 
855 
856  pdata[pcpn_day].stn[isave].frain[time_pos].qual=new_qual;
857 
858  /* 24 hour data set bad/good then 6 hourly bad/good also */
859 
860  if(new_qual==1 &&
861  time_pos==4 && pdata[pcpn_day].stn[isave].sflag[time_pos]==1) {
862 
863  pdata[pcpn_day].stn[isave].frain[time_pos].data=
864  pdata[pcpn_day].stn[isave].rain[time_pos].data;
865 
866  pdata[pcpn_day].stn[isave].sflag[time_pos]=-1;
867 
868  }
869 
870  if(time_pos==4 && ( new_qual==1 || new_qual==0 || new_qual==8)) {
871 
872  for(k=0;k<4;k++) {
873 
874  /* if(pdata[pcpn_day].stn[isave].frain[k].qual!=1) */
876 
877  }
878 
879 
880  }
881 
882  /* 6 hour data set bad set 24 hour bad too */
883 
884  if(time_pos != 4 && new_qual==1 &&
885  pdata[pcpn_day].stn[isave].frain[4].qual != 5 &&
886  pdata[pcpn_day].stn[isave].frain[4].qual != 4 &&
887  pdata[pcpn_day].stn[isave].frain[4].data >= 0) {
888 
889 printf("conditions met\n");
890 
892  }
893 
894 }
895 
896 }
897 
898 printf("new_qual %d station qual %d\n",new_qual,pdata[pcpn_day].stn[isave].frain[4].qual);
899 
900 for(k=0;k<5;k++) {
901 
902  if(k < 4)
903  time_pos=pcpn_day*4 +k;
904 
905  else
906  time_pos=40+pcpn_day;
907 
908  pcp_in_use[time_pos]=-1;
909 
910 
911  if(pdata[pcpn_day].used[k]!=0)
912  pdata[pcpn_day].used[k]=2;
913  }
914 
915 for(k=1;k<5;k++)
916  XtSetSensitive(diswidget[k],False);
917 
918 if(pcpn_time_step==0)
919  time_pos=pcp_flag;
920 
921 else
922  time_pos=40+pcpn_day;
923 
924 if(points_flag==1 && pcp_in_use[time_pos]==-1)
925  k=0;
926 
927 else if(points_flag==1 && grids_flag==-1 && map_flag==-1)
928  k=0;
929 
930 else if(points_flag==-1 && grids_flag==1 && map_flag==-1)
931  k=1;
932 
933 else if(points_flag==-1 && grids_flag==-1 && map_flag==1)
934  k=2;
935 
936 else if(points_flag==1 && grids_flag==1 && map_flag==-1)
937  k=3;
938 
939 else if(points_flag==1 && grids_flag==-1 && map_flag==1)
940  k=4;
941 
942 else if(points_flag==-1 && grids_flag==-1 && map_flag==-1)
943  k=5;
944 
945 XtSetArg(args[0],XmNmenuHistory,diswidget[k]);
946 XtSetValues(rowcol1,args,1);
947 
948 XtSetSensitive(rpbutton,True);
949 
951 
953 
955 
957 
959 
961 
962 XtDestroyWidget(edit_dialog);
963 
964 edit_dialog=NULL;
965 
966 write_screen();
967 
968 return;
969 
970 }
971 
972 static int hmflag=0;
973 
974 void change_station_quality(Widget w,XtPointer data, XtPointer call_data)
975 
976 {
977 
978 
979 extern int pcpn_day;
980 extern struct pdata pdata[10];
981 extern int pcpn_time;
982 extern int pcpn_time_step;
983 extern struct station station[3000];
984 int time_pos;
985 int k;
986 Arg args[10];
987 
988 hmflag++;
989 if(hmflag==1)
990  return;
991 
992 hmflag=0;
993 
994 if(pcpn_time_step==0)
995  time_pos=pcpn_time;
996 
997 else
998  time_pos=4;
999 
1000 
1001 new_qual=func[(int)data];
1002 
1003 
1004 
1005 }
1006 
1007 
1008 void graph_file(Widget w,XtPointer data, XtPointer call_data)
1009 
1010 {
1011 extern char scratch_file[100];
1012 extern struct station station[3000];
1013 char pc[10];
1014 time_t ctime;
1015 struct tm *gm;
1016 int isave;
1017 extern struct pdata pdata[10];
1018 isave=(int)data;
1019 strcpy(pc,station[isave].parm);
1020 
1021 pc[3]='R';
1022 if(pc[4]!='Z') {
1023 
1024  pc[1]='C';
1025  pc[2]='I';
1026 
1027  }
1028 
1029 else
1030  pc[2]='D';
1031 
1032 ctime=pdata[0].data_time;
1033 
1034 gm=gmtime(&ctime);
1035 
1036 display_data(station[isave].hb5,pc,gm->tm_mon+1,gm->tm_mday,gm->tm_year+1900,12,15,scratch_file);
1037 
1038 
1039 }
1040 
1042 
1043 {
1044 
1045 extern Widget edit_dialog;
1046 
1047 XtDestroyWidget(edit_dialog);
1048 
1049 edit_dialog=NULL;
1050 
1051 }
1052 
1053 void reset_station_quality(Widget w,XtPointer data, XtPointer call_data)
1054 
1055 {
1056 
1057 extern int pcpn_day;
1058 extern struct pdata pdata[10];
1059 extern int pcpn_time;
1060 extern int pcpn_time_step;
1061 int time_pos;
1062 int k;
1063 
1064 if(pcpn_time_step==0)
1065  time_pos=pcpn_time;
1066 
1067 else
1068  time_pos=4;
1069 
1070 if((int)data==1) {
1071 
1072 
1073  for(k=0;k<5;k++) {
1074 
1077 
1080 
1081  }
1082 
1083  reset_value=1;
1084  new_qual=pdata[pcpn_day].stn[isave].rain[time_pos].qual;
1085 
1086  }
1087 
1088 else
1089  reset_value=0;
1090 
1091 
1092 }
1093 
1094 
1095 
1096 void read_text(Widget w,XtPointer data, XtPointer call_data)
1097 
1098 {
1099 
1100 extern Widget rowcol1;
1101 extern int map_flag;
1102 extern int grids_flag;
1103 extern int points_flag;
1104 extern int pcp_flag;
1105 int k;
1106 char *cstr;
1107 int argcount;
1108 Arg args[10];
1109 extern struct pdata pdata[10];
1110 extern int pcp_flag;
1111 extern int pcpn_day;
1112 extern int pcpn_time_step;
1113 extern int pcp_in_use[500];
1114 extern Widget diswidget[6];
1115 extern Widget edit_dialog;
1116 float val;
1117 char *p;
1118 int time_pos;
1119 float fdif;
1120 extern Widget rpbutton;
1121 
1122 for(k=0;k<5;k++) {
1123 
1124  argcount=0;
1125  XtSetArg(args[argcount],XmNvalue,&cstr);argcount++;
1126  XtGetValues(textk[k],args,argcount);
1127 
1128  val=atof(cstr);
1129  p=strchr(cstr,'M');
1130  XtFree(cstr);
1131 
1132  fdif=fabs(val-pdata[pcpn_day].stn[isave].frain[k].data);
1133 
1134  if(p!=NULL)
1135  pdata[pcpn_day].stn[isave].frain[k].data=-1;
1136 
1137  else if(fdif > .005 && p == NULL) {
1138 
1139  pdata[pcpn_day].stn[isave].frain[k].data=val;
1140  pdata[pcpn_day].stn[isave].frain[k].qual=2;
1141  pdata[pcpn_day].stn[isave].sflag[k]=-1;
1142 
1143 
1144  }
1145 
1146  }
1147 
1148 for(k=0;k<5;k++) {
1149 
1150  if(k < 4)
1151  time_pos=pcpn_day*4 +k;
1152 
1153  else
1154  time_pos=40+pcpn_day;
1155 
1156  pcp_in_use[time_pos]=-1;
1157 
1158 
1159  if(pdata[pcpn_day].used[k]!=0)
1160  pdata[pcpn_day].used[k]=2;
1161  }
1162 
1163 
1164 for(k=1;k<5;k++)
1165  XtSetSensitive(diswidget[k],False);
1166 
1167 if(pcpn_time_step==0)
1168  time_pos=pcp_flag;
1169 
1170 else
1171  time_pos=40+pcpn_day;
1172 
1173 if(points_flag==1 && pcp_in_use[time_pos]==-1)
1174  k=0;
1175 
1176 else if(points_flag==1 && grids_flag==-1 && map_flag==-1)
1177  k=0;
1178 
1179 else if(points_flag==-1 && grids_flag==1 && map_flag==-1)
1180  k=1;
1181 
1182 else if(points_flag==-1 && grids_flag==-1 && map_flag==1)
1183  k=2;
1184 
1185 else if(points_flag==1 && grids_flag==1 && map_flag==-1)
1186  k=3;
1187 
1188 else if(points_flag==1 && grids_flag==-1 && map_flag==1)
1189  k=4;
1190 
1191 else if(points_flag==-1 && grids_flag==-1 && map_flag==-1)
1192  k=5;
1193 
1194 XtSetArg(args[0],XmNmenuHistory,diswidget[k]);
1195 XtSetValues(rowcol1,args,1);
1196 
1197 XtSetSensitive(rpbutton,True);
1198 
1200 
1202 
1204 
1206 
1208 
1210 
1211 XtDestroyWidget(edit_dialog);
1212 
1213 XtDestroyWidget(cons_dialog);
1214 
1215 edit_dialog=NULL;
1216 
1217 write_screen();
1218 
1219 return;
1220 
1221 }
int max_stations
Definition: daily_qc.c:199
void restore_bad_values(int iday)
Definition: bad_values.c:242
void update_bad_values(int iday)
Definition: bad_values.c:186
void quality_control_stations(int j)
Definition: bu.c:4
char s
Definition: build_list.c:122
char t
Definition: build_list.c:122
void check_consistency(int j)
int points_flag
Definition: daily_qc.c:283
float stddev
Definition: daily_qc.c:273
void berror(Widget widget, char *string)
Definition: daily_qc.c:6411
int tcmode
Definition: daily_qc.c:29
int pcpn_time
Definition: daily_qc.c:248
Widget rowcol1
Definition: daily_qc.c:53
float reverse_filter_value
Definition: daily_qc.c:121
int pcpn_time_step
Definition: daily_qc.c:238
unsigned long mmap[16]
Definition: daily_qc.c:226
void kill_widget(Widget widget, XtPointer client_data, XtPointer call_data)
Definition: daily_qc.c:6473
int pcp_in_use[500]
Definition: daily_qc.c:243
int dcmode
Definition: daily_qc.c:33
Widget diswidget[6]
Definition: daily_qc.c:218
int elevation_filter_value
Definition: daily_qc.c:120
Widget top_level
Definition: daily_qc.c:214
void write_screen()
Definition: daily_qc.c:1623
int dflag[10]
Definition: daily_qc.c:293
int pcpn_day
Definition: daily_qc.c:248
GC gc
Definition: daily_qc.c:224
int pcp_flag
Definition: daily_qc.c:246
char scratch_file[1000]
Definition: daily_qc.c:137
char station_list_custom_file[1000]
Definition: daily_qc.c:173
Display * display
Definition: daily_qc.c:228
Font font[10]
Definition: daily_qc.c:231
int map_flag
Definition: daily_qc.c:283
unsigned long cmap[16]
Definition: daily_qc.c:226
float filter_value
Definition: daily_qc.c:119
int qflag[10]
Definition: daily_qc.c:293
int gage_char[2]
Definition: daily_qc.c:161
int zoom
Definition: daily_qc.c:289
char * timefile[]
Definition: daily_qc.c:144
int tsmax
Definition: daily_qc.c:87
Widget rpbutton
Definition: daily_qc.c:52
Window window
Definition: daily_qc.c:229
Widget drawing_area
Definition: daily_qc.c:214
int npoint[2]
Definition: daily_qc.c:289
int isom
Definition: daily_qc.c:141
Widget edit_dialog
Definition: daily_qc.c:100
int method
Definition: daily_qc.c:254
int grids_flag
Definition: daily_qc.c:283
Cursor watch_cursor
Definition: daily_qc.c:220
int display_flag
Definition: daily_qc.c:268
void display_data(char *hb5, char *pc, int dmonth, int dday, int dyear, int dhour, int ddays)
Definition: display_data.c:32
char qual[10]
Definition: display_data.c:29
Widget cons_dialog
Definition: edit_stations.c:5
int initial_qual
Definition: edit_stations.c:11
void read_text()
int new_qual
Definition: edit_stations.c:10
void time_series()
void change_station_quality(Widget w, XtPointer data, XtPointer call_data)
static int hmflag
int isave
Definition: edit_stations.c:6
int initial_pos
Definition: edit_stations.c:11
void reset_station_quality(Widget w, XtPointer data, XtPointer call_data)
void graph_file(Widget w, XtPointer data, XtPointer call_data)
Widget textk[5]
Definition: edit_stations.c:4
void cancel_edit()
void edit_stations(int win_x, int win_y, unsigned int win_button)
Definition: edit_stations.c:14
void change_custom_file(Widget w, XtPointer data, XtPointer call_data)
int func[]
Definition: daily_qc.c:159
void change_station_location(Widget w, XtPointer data, XtPointer call_data)
Widget snotelwidget
Definition: edit_stations.c:3
int reset_value
Definition: edit_stations.c:7
Widget textz
Definition: edit_stations.c:3
void estimate_daily_stations(int j)
void estimate_partial_stations(int j)
float frzlvl[50][50]
printf("pcp %d\n", pcp_in_use[103])
float dmult[4]
Definition: misc.h:540
long xmin[4]
Definition: misc.h:534
long xmax[4]
Definition: misc.h:536
long ymax[4]
Definition: misc.h:537
long ymin[4]
Definition: misc.h:535
long ycen[4]
Definition: misc.h:539
long xcen[4]
Definition: misc.h:538
Definition: misc.h:397
double lo
Definition: misc.h:402
double a
Definition: misc.h:399
double yo
Definition: misc.h:401
double xo
Definition: misc.h:400
Definition: misc.h:465
Definition: misc.h:216
time_t data_time
Definition: misc.h:218
int used[5]
Definition: misc.h:219
struct stn stn[1500]
Definition: misc.h:222
float data
Definition: misc.h:193
short int qual
Definition: misc.h:194
Definition: misc.h:232
float lat
Definition: misc.h:239
float lon
Definition: misc.h:240
char parm[10]
Definition: misc.h:237
int yadd
Definition: misc.h:246
char hb5[10]
Definition: misc.h:235
int xadd
Definition: misc.h:245
Definition: misc.h:200
struct rain rain[5]
Definition: misc.h:202
struct rain frain[5]
Definition: misc.h:203
short int * sflag
Definition: misc_new.h:385
struct rain * srain
Definition: misc_new.h:386
Definition: misc_new.h:35