source: trunk/FACT++/scripts/CheckUnderflow.js

Last change on this file was 20098, checked in by tbretz, 4 years ago
Thread can not be killed anymore - new way to stop.
File size: 7.7 KB
Line 
1'use strict';
2
3var Func = function() { };
4Func.sum = function(a, b) { return a+b; }
5Func.sq = function(a, b) { return Math.sqrt(a*a + b*b); }
6Func.min = function(a, b) { return Math.min(a, b); }
7Func.max = function(a, b) { return Math.max(a, b); }
8Func.avg = function(arr) { return arr.reduce(Func.Sum, 0)/arr.length; }
9Func.stat = function(arr, func)
10{
11 if (arr.length==0)
12 return undefined;
13
14 var sum = 0;
15 var sq = 0;
16 var cnt = 0;
17 var min = arr[0];
18 var max = arr[0];
19 arr.forEach(function(val, idx) { sum+=val; sq+=val*val; if (val>max) max=val; if (val<min) min=val; if (func && func(val, idx)) cnt++ });
20 sum /= arr.length;
21 sq /= arr.length;
22
23 return { avg:sum, rms:Math.sqrt(sq-sum*sum), min:min, max:max, count:cnt };
24}
25
26// ===================================================================
27
28console.out(("\n%78s".$("")).replace(/ /g, "="));
29
30if (dim.state("FTM_CONTROL").name=="TriggerOn")
31{
32 dim.send("FTM_CONTROL/STOP_TRIGGER");
33 dim.wait("FTM_CONTROL", "Valid");
34}
35
36
37include('scripts/CheckStates.js');
38
39var table =
40[
41 [ "MCP", [ "Idle" ] ],
42 [ "AGILENT_CONTROL_24V", [ "VoltageOn" ] ],
43 [ "AGILENT_CONTROL_50V", [ "VoltageOn" ] ],
44// [ "AGILENT_CONTROL_80V", [ "VoltageOn" ] ],
45 [ "AGILENT_CONTROL_80V", [ "VoltageOn", "Disconnected" ] ], //hack to allow for data taking while agilent not available
46 [ "FTM_CONTROL", [ "Valid" ] ],
47 [ "FAD_CONTROL", [ "Connected", "RunInProgress" ] ],
48 [ "BIAS_CONTROL", [ "Disconnected", "VoltageOff" ] ],
49 [ "DATA_LOGGER", [ "WaitForRun", "NightlyFileOpen", "Logging" ] ],
50];
51
52console.out("Checking states.");
53if (!checkStates(table))
54{
55 throw new Error("Something unexpected has happened. One of the servers",
56 "is in a state in which it should not be. Please,",
57 "try to find out what happened...");
58}
59
60// ===================================================================
61
62include('scripts/Hist1D.js');
63include('scripts/Hist2D.js');
64
65console.out("Checking power on time");
66
67var service_drs = new Subscription("FAD_CONTROL/DRS_RUNS");
68
69var runs = service_drs.get(5000, false);
70//if (!runs)
71// throw new Error("Could not connect to FAD_CONTROL/DRS_RUNS");
72
73var power = dim.state("AGILENT_CONTROL_50V").time;
74var now = new Date();
75
76var diff = (now-runs.time)/3600000;
77
78console.out(" * Now: "+now);
79console.out(" * Last power cycle: "+power);
80console.out(" * Last DRS calib set: "+(runs.data?runs.time:"none"));
81
82
83if (1)//diff>8 && now.getHours()>16 || runs.time<power)
84{
85 console.out("Checking send.");
86 checkSend(["FAD_CONTROL", "MCP", "RATE_CONTROL"]);
87 console.out("Checking send: done");
88
89 //console.out("Most probablay the camera has not been checked for underflows yet.");
90
91 var service_event = new Subscription("FAD_CONTROL/EVENT_DATA");
92
93 dim.send("FAD_CONTROL/START_DRS_CALIBRATION");
94 dim.send("FAD_CONTROL/SET_FILE_FORMAT", 0);
95
96 var sub_runs = new Subscription("FAD_CONTROL/RUNS");
97 var sruns = sub_runs.get(5000, false);
98
99 if (dim.state("FAD_CONTROL").name=="RunInProgress" || sruns.qos==1)
100 {
101 dim.send("FAD_CONTROL/CLOSE_OPEN_FILES");
102 dim.wait("FAD_CONTROL", "Connected", 3000);
103
104 console.out("Waiting for open files to be closed...");
105 v8.timeout(60000, function() { if (sub_runs.get(0, false).qos==0) return true; });
106
107 // Although the file should be closed now, the processing might still be on-going
108 // and delayed events might be received. The only fix for that issue is to
109 // add the run number to the data we are waiting for
110 v8.sleep(5000);
111 }
112
113 sub_runs.close();
114
115 console.out("Starting drs-gain... waiting for new event");
116
117 var sub_startrun = new Subscription("FAD_CONTROL/START_RUN");
118 var sub_incomplete = new Subscription("FAD_CONTROL/INCOMPLETE");
119 var sub_connections = new Subscription("FAD_CONTROL/CONNECTIONS");
120 sub_connections.get(5000);
121 sub_startrun.get(5000);
122
123 include('scripts/takeRun.js');
124
125 while (1)
126 {
127 var endloop=false;
128 var event_counter = service_event.get(10000, false).counter;
129
130 var stop = function ()
131 {
132 while(!endloop)
133 {
134 if (dim.state("MCP").name=="TakingData" && service_event.get(0, false).counter>event_counter)
135 {
136 dim.send("MCP/STOP");
137 console.out("Sent MCP/STOP.");
138 return;
139 }
140 v8.sleep(100);
141 }
142 }
143
144 var thread = new Thread(250, stop);
145
146 var rc = takeRun("drs-gain");
147
148 endloop=true;
149
150 if (rc)
151 break;
152 }
153
154 console.out("Event received.");
155
156 sub_incomplete.close();
157 sub_connections.close();
158 sub_startrun.close();
159
160
161 // FIXME: Restore DRS calibration in case of failure!!
162 // FAD Re-connect in case of failure?
163 // MCP/RESET in case of failure?
164 // Proper error reporting!
165
166 var event = service_event.get(3000);//, false);
167 service_event.close();
168
169 console.out("Run stopped.");
170
171 dim.send("RATE_CONTROL/STOP"); // GlobalThresholdSet -> Connected
172 dim.wait("MCP", "Idle", 3000);
173
174 var nn = runs.data && runs.data.length>0 && runs.obj['roi']>0 ? runs.obj['run'].reduce(Func.max) : -1;
175 if (nn>0)
176 {
177 var night = runs.obj['night'];
178
179 var yy = night/10000;
180 var mm = (night/100)%100;
181 var dd = night%100;
182
183 var filefmt = "/loc_data/raw/%d/%02d/%02d/%8d_%03d.drs.fits";
184
185 dim.log("Trying to restore last DRS calibration #"+nn+" ["+runs.time+"; "+night+"]");
186
187 // FIXME: Timeout
188 var drs_counter = service_drs.get(0, false).counter;
189 dim.send("FAD_CONTROL/LOAD_DRS_CALIBRATION", filefmt.$(yy, mm, dd, night, nn));
190
191 try
192 {
193 var now = new Date();
194 v8.timeout(3000, function() { if (service_drs.get(0, false).counter>drs_counter) return true; });
195 dim.log("Last DRS calibration restored ["+(new Date()-now)/1000+"s]");
196 }
197 catch (e)
198 {
199 console.warn("Restoring last DRS calibration failed.");
200 }
201 }
202
203 var hist = Hist2D(16, -2048.5, 2048.5, 11, -10, 100);
204
205 var data = event.obj;
206
207 for (var i=0; i<1440; i++)
208 hist.fill(data.avg[i], isNaN(data.rms[i])?-1:data.rms[i]);
209
210 hist.print();
211
212 var stat0 = Func.stat(data.avg, function(val, idx) { if (val<600) console.out(" PIX[hw="+idx+"]="+val); return val<600; });
213 var stat1 = Func.stat(data.rms);
214
215 console.out("Avg[min]=%.1f".$(stat0.min));
216 console.out("Avg[avg]=%.1f +- %.1f".$(stat0.avg, stat0.rms));
217 console.out("Avg[max]=%.1f".$(+stat0.max));
218 console.out("Avg[cnt]="+stat0.count);
219 console.out("");
220 console.out("Rms[min]=%.1f".$(stat1.min));
221 console.out("Rms[avg]=%.1f +- %.1f".$(stat1.avg, stat1.rms));
222 console.out("Rms[max]=%.1f".$(stat1.max));
223 console.out(("%78s\n".$("")).replace(/ /g, "="));
224
225 // OK UNDERFLOW
226 // ------------------------------------------------------
227 // Avg[min]=722.0 Avg[min]=-380.0
228 // Avg[avg]=815.9 +- 45.9 Avg[avg]= 808.0 +- 102.0
229 // Avg[max]=930.5 Avg[max]= 931.1
230 // Avg[cnt]=0 Avg[cnt]= 9
231
232 // Rms[min]=14.0 Rms[min]=13.9
233 // Rms[avg]=16.5 +- 1.6 Rms[avg]=18.8 +- 26.8
234 // Rms[max]=44.0 Rms[max]=382.1
235
236 if (stat0.count>0)
237 {
238 if (stat0.count>8)
239 throw new Error("Underflow condition detected in about "+parseInt(stat0.count/9+.5)+" DRS.");
240
241 console.warn("There is probably an underflow condition in one DRS... please check manually.");
242 }
243}
244
245service_drs.close();
Note: See TracBrowser for help on using the repository browser.