1 | void magicweather(const char *fname, double beg=0, double end=100000)
|
---|
2 | {
|
---|
3 | fits file(fname);
|
---|
4 |
|
---|
5 | //file.PrintColumns();
|
---|
6 | //file.PrintKeys();
|
---|
7 |
|
---|
8 | Double_t time;
|
---|
9 | Float_t temp, hum, pres, dew, wind, gust;
|
---|
10 | file.SetPtrAddress("Time", &time);
|
---|
11 | file.SetPtrAddress("T", &temp);
|
---|
12 | file.SetPtrAddress("H", &hum);
|
---|
13 | file.SetPtrAddress("P", &pres);
|
---|
14 | file.SetPtrAddress("T_dew", &dew);
|
---|
15 | file.SetPtrAddress("v", &wind);
|
---|
16 | file.SetPtrAddress("v_max", &gust);
|
---|
17 |
|
---|
18 | UInt_t offset = file.GetUInt("MJDREF");
|
---|
19 | if (beg < 30000)
|
---|
20 | beg+=offset;
|
---|
21 | if (end < 30000)
|
---|
22 | end+=offset;
|
---|
23 |
|
---|
24 | int cnt = 0;
|
---|
25 | double avg_t = 0;
|
---|
26 | double rms_t = 0;
|
---|
27 | double avg_h = 0;
|
---|
28 | double rms_h = 0;
|
---|
29 | double avg_p = 0;
|
---|
30 | double rms_p = 0;
|
---|
31 | double avg_d = 0;
|
---|
32 | double rms_d = 0;
|
---|
33 | double avg_w = 0;
|
---|
34 | double rms_w = 0;
|
---|
35 | double avg_g = 0;
|
---|
36 | double rms_g = 0;
|
---|
37 |
|
---|
38 | double last_t = -1;
|
---|
39 | double last_h = -1;
|
---|
40 | double last_p = -1;
|
---|
41 | double last_d = -1;
|
---|
42 | double last_w = -1;
|
---|
43 | double last_g = -1;
|
---|
44 | double diff = -1;
|
---|
45 | double diff2 = -1;
|
---|
46 |
|
---|
47 | while (file.GetNextRow())
|
---|
48 | {
|
---|
49 | time += offset;
|
---|
50 |
|
---|
51 | if (time>end)
|
---|
52 | {
|
---|
53 | diff2 = time-end;
|
---|
54 | if (diff2<diff)
|
---|
55 | {
|
---|
56 | last_t = temp;
|
---|
57 | last_h = hum;
|
---|
58 | last_p = pres;
|
---|
59 | last_d = dew;
|
---|
60 | last_w = wind;
|
---|
61 | last_g = gust;
|
---|
62 | diff=diff2;
|
---|
63 | }
|
---|
64 | break;
|
---|
65 | }
|
---|
66 |
|
---|
67 | if (time<beg)
|
---|
68 | {
|
---|
69 | last_t = temp;
|
---|
70 | last_h = hum;
|
---|
71 | last_p = pres;
|
---|
72 | last_d = dew;
|
---|
73 | last_w = wind;
|
---|
74 | last_g = gust;
|
---|
75 | diff = beg-time;
|
---|
76 | continue;
|
---|
77 | }
|
---|
78 |
|
---|
79 | avg_t += temp;
|
---|
80 | rms_t += temp*temp;
|
---|
81 | avg_h += hum;
|
---|
82 | rms_h += hum*hum;
|
---|
83 | avg_p += pres;
|
---|
84 | rms_p += pres*pres;
|
---|
85 | avg_d += dew;
|
---|
86 | rms_d += dew*dew;
|
---|
87 | avg_w += wind;
|
---|
88 | rms_w += wind*wind;
|
---|
89 | avg_g += gust;
|
---|
90 | rms_g += gust*gust;
|
---|
91 | cnt ++;
|
---|
92 | }
|
---|
93 |
|
---|
94 | if (cnt==0)
|
---|
95 | {
|
---|
96 | //only give output if values within 45 sec before/after are available
|
---|
97 | // weather reports come every ~30 sec
|
---|
98 | if (diff<0 || diff>45./24/3600)
|
---|
99 | return;
|
---|
100 |
|
---|
101 | cout << "result " << last_t << " 0 " << last_h << " 0 "
|
---|
102 | << last_p << " 0 " << last_d << " 0 "
|
---|
103 | << last_w << " 0 " << last_g << " 0 " << endl;
|
---|
104 | return;
|
---|
105 | }
|
---|
106 |
|
---|
107 | avg_t /= cnt;
|
---|
108 | rms_t /= cnt;
|
---|
109 | avg_h /= cnt;
|
---|
110 | rms_h /= cnt;
|
---|
111 | avg_p /= cnt;
|
---|
112 | rms_p /= cnt;
|
---|
113 | avg_d /= cnt;
|
---|
114 | rms_d /= cnt;
|
---|
115 | avg_w /= cnt;
|
---|
116 | rms_w /= cnt;
|
---|
117 | avg_g /= cnt;
|
---|
118 | rms_g /= cnt;
|
---|
119 |
|
---|
120 | rms_t = sqrt(rms_t-avg_t*avg_t);
|
---|
121 | rms_h = sqrt(rms_h-avg_h*avg_h);
|
---|
122 | rms_p = sqrt(rms_p-avg_p*avg_p);
|
---|
123 | rms_d = sqrt(rms_d-avg_d*avg_d);
|
---|
124 | rms_w = sqrt(rms_w-avg_w*avg_w);
|
---|
125 | rms_g = sqrt(rms_g-avg_g*avg_g);
|
---|
126 |
|
---|
127 | cout << "result " << avg_t << " " << rms_t << " " << avg_h << " " << rms_h << " "
|
---|
128 | << avg_p << " " << rms_p << " " << avg_d << " " << rms_d << " "
|
---|
129 | << avg_w << " " << rms_w << " " << avg_g << " " << rms_g << " " << endl;
|
---|
130 | }
|
---|