source: branches/FACT++_scripts_refactoring/CheckUnderflow.js@ 18224

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