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

Last change on this file since 15373 was 15161, checked in by tbretz, 12 years ago
Request 15 seconds of data for the underflow check. As soon as the requested event has arrived the run is stopped again anyway.
File size: 6.3 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) { sum+=val; sq+=val*val; if (val>max) max=val; if (val<min) min=val; if (func && func(val)) 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
30include('scripts/CheckStates.js');
31
32var table =
33[
34 [ "MCP", [ "Idle" ] ],
35 [ "AGILENT_CONTROL", [ "VoltageOn" ] ],
36 [ "FTM_CONTROL", [ "Idle" ] ],
37 [ "FAD_CONTROL", [ "Connected", "WritingData" ] ],
38 [ "BIAS_CONTROL", [ "Disconnected", "VoltageOff" ] ],
39 [ "DATA_LOGGER", [ "WaitForRun", "NightlyFileOpen", "Logging" ] ],
40];
41
42console.out("Checking states.");
43if (!checkStates(table))
44{
45 throw new Error("Something unexpected has happened. One of the servers",
46 "is in a state in which it should not be. Please,",
47 "try to find out what happened...");
48}
49
50// ===================================================================
51
52include('scripts/Hist1D.js');
53include('scripts/Hist2D.js');
54
55console.out("Checking power on time");
56
57var service_drs = new Subscription("FAD_CONTROL/DRS_RUNS");
58
59var runs = service_drs.get(5000, false);
60//if (!runs)
61// throw new Error("Could not connect to FAD_CONTROL/DRS_RUNS");
62
63var power = dim.state("AGILENT_CONTROL").time;
64var now = new Date();
65
66var diff = (now-runs.time)/3600000;
67
68console.out(" * Now: "+now);
69console.out(" * Last power cycle: "+power);
70console.out(" * Last DRS calib set: "+(runs.data?runs.time:"none"));
71
72
73if (1)//diff>8 && now.getHours()>16 || runs.time<power)
74{
75 console.out("Checking send.");
76 checkSend(["FAD_CONTROL", "MCP", "RATE_CONTROL"]);
77 console.out("Checking send: done");
78
79 //console.out("Most probablay the camera has not been checked for underflows yet.");
80
81 var service_event = new Subscription("FAD_CONTROL/EVENT_DATA");
82
83 dim.send("FAD_CONTROL/START_DRS_CALIBRATION");
84 dim.send("FAD_CONTROL/SET_FILE_FORMAT", 0);
85
86 // This needs a better solution! The problem is that the
87 // event builder might still be writing a file (WritingData),
88 // but even if the file is closed (CLOSE_OPEN_FILES) the
89 // thread sending data (EVENT_DATA) might still be processing
90 // events. Thus there is no real guarantee that we do not receive
91 // data of the previous run after we have started a new one.
92 if (dim.state("FAD_CONTROL").name=="WritingData")
93 {
94 dim.send("FAD_CONTROL/CLOSE_OPEN_FILES");
95 dim.wait("FAD_CONTROL", "Connected", 3000);
96 }
97 v8.sleep(1000); // Let 'timeout' in SendRawData pass
98
99 var event_counter = service_event.get(10000, false).counter;
100
101 console.out("Starting drs-gain");
102 dim.send("MCP/START", 15, -1, "drs-gain");
103
104 console.out("Waiting for new event");
105
106 var d = new Date();
107 v8.timeout(10000, function() { if (service_event.get(0, false).counter>event_counter) return true; });
108 //while (service_event.get(0, false).counter<=event_counter)
109 // v8.sleep();
110
111 console.out("Event received: "+(new Date()-d)+"ms");
112
113 dim.send("MCP/STOP");
114
115 var event = service_event.get(0, false);
116 service_event.close();
117
118 console.out("Run stopped.");
119
120 dim.send("RATE_CONTROL/STOP"); // GlobalThresholdSet -> Connected
121 dim.wait("MCP", "Idle", 3000);
122
123 var nn = runs.data && runs.data.length>0 && runs.obj['roi']>0 ? runs.obj['run'].reduce(Func.max) : -1;
124 if (nn>0)
125 {
126 console.out("Trying to restore last DRS calibration #"+nn+" ["+runs.time+"]");
127
128 var night = new Date(runs.time-1000*60*60*12);
129 var yy = night.getUTCFullYear();
130 var mm = night.getUTCMonth()+1;
131 var dd = night.getUTCDate();
132
133 var filefmt = "/loc_data/raw/%d/%02d/%02d/%4d%02d%02d_%03d.drs.fits";
134
135 // FIXME: Timeout
136 var drs_counter = service_drs.get(0, false).counter;
137 dim.send("FAD_CONTROL/LOAD_DRS_CALIBRATION", filefmt.$(yy, mm, dd, yy, mm, dd, nn));
138
139 var now = new Date();
140 v8.timeout(3000, function() { if (service_drs.get(0, false).counter>drs_counter) return true; });
141 //while (drs_counter == service_drs.get(0, false).counter)
142 // v8.sleep();
143 console.out("Last DRS calibration restored ["+(new Date()-now)/1000+"s]");
144 }
145
146 var hist = Hist2D(16, -2048.5, 2048.5, 11, -10, 100);
147
148 var data = event.obj;
149
150 for (var i=0; i<1440; i++)
151 hist.fill(data.avg[i], isNaN(data.rms[i])?-1:data.rms[i]);
152
153 hist.print();
154
155 var stat0 = Func.stat(data.avg, function(val) { if (val<0) console.out(" VAL="+val); return val<0; });
156 var stat1 = Func.stat(data.rms);
157
158 console.out("Avg[min]=%.1f".$(stat0.min));
159 console.out("Avg[avg]=%.1f +- %.1f".$(stat0.avg, stat0.rms));
160 console.out("Avg[max]=%.1f".$(+stat0.max));
161 console.out("Avg[cnt]="+stat0.count);
162 console.out("");
163 console.out("Rms[min]=%.1f".$(stat1.min));
164 console.out("Rms[avg]=%.1f +- %.1f".$(stat1.avg, stat1.rms));
165 console.out("Rms[max]=%.1f".$(stat1.max));
166 console.out(("%78s\n".$("")).replace(/ /g, "="));
167
168 // OK UNDERFLOW
169 // ------------------------------------------------------
170 // Avg[min]=722.0 Avg[min]=-380.0
171 // Avg[avg]=815.9 +- 45.9 Avg[avg]= 808.0 +- 102.0
172 // Avg[max]=930.5 Avg[max]= 931.1
173 // Avg[cnt]=0 Avg[cnt]= 9
174
175 // Rms[min]=14.0 Rms[min]=13.9
176 // Rms[avg]=16.5 +- 1.6 Rms[avg]=18.8 +- 26.8
177 // Rms[max]=44.0 Rms[max]=382.1
178
179 if (stat0.count>0)
180 {
181 if (stat0.count>8)
182 throw new Error("Underflow condition detected in about "+parseInt(stat0.count/9+.5)+" DRS.");
183
184 log.warn("There is probably an underflow condition in one DRS... please check manually.");
185 }
186}
187
188service_drs.close();
Note: See TracBrowser for help on using the repository browser.