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

Last change on this file since 14971 was 14970, checked in by tbretz, 12 years ago
Make sure that if the fadctrl was newly started there is no crash because the service with the drs runs is empty.
File size: 5.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) { 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 console.out("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 exit();
49}
50
51// ===================================================================
52
53include('scripts/Hist1D.js');
54include('scripts/Hist2D.js');
55
56console.out("Checking power on time");
57
58var service_drs = new Subscription("FAD_CONTROL/DRS_RUNS");
59
60var runs = service_drs.get(5000, false);
61if (!runs)
62 throw new Error("Could not connect to FAD_CONTROL/DRS_RUNS");
63/*
64runs = {
65 "name" : "FAD_CONTROL/DRS_RUNS",
66 "format" : "I:1;I:3",
67 "qos" : 0,
68 "size" : 16,
69 "counter" : 0,
70 "time" : new Date("2012-11-20T05:23:52.804Z"),
71 "data" : [300,[148,149,154]]
72 };
73*/
74
75// Wait for agilent to be online with state information
76// FIXME: timeout
77while (!dim.state("AGILENT_CONTROL"))
78 v8.sleep();
79
80var power = dim.state("AGILENT_CONTROL").time;
81var now = new Date();
82
83var diff = (now-runs.time)/3600000;
84
85console.out(" * Now: "+now);
86console.out(" * Last power cycle: "+power);
87console.out(" * Last DRS calib set: "+runs.time);
88//console.out(JSON.stringify(dim.state("AGILENT_CONTROL")));
89
90
91if (1)//diff>8 && now.getHours()>16 || runs.time<power)
92{
93 //console.out("Most probablay the camera has not been checked for underflows yet.");
94
95 // Wait for dim.send to be ready
96 // FIXME: timeout
97 while (!dim.send("FAD_CONTROL"))
98 v8.sleep();
99
100 // FAD_CONTROL/RAW_DATA:
101 // roi,roi_tm,num_fad,num_ftm,type,num_boards,error,
102 // dummy,time,time_board,start_pix,start_tm,adc
103
104 // FAD_CONTROL/EVENT_DATA
105 // avg,rms,max,pos
106
107 var service_event = new Subscription("FAD_CONTROL/EVENT_DATA");
108 var event = service_event.get(5000, false);
109 //if (!event)
110 // throw new Error("Could not connect to FAD_CONTROL/EVENT_DATA");
111
112 var event_counter = event.counter;
113
114 dim.send("FAD_CONTROL/START_DRS_CALIBRATION");
115 dim.send("FAD_CONTROL/SET_FILE_FORMAT", 0);
116
117 console.out("Starting drs-gain");
118 dim.send("MCP/START", -1, 3, "drs-gain");
119
120 // FIXME: add a timeout here (10s)
121 console.out("Waiting for new event");
122 var d = new Date();
123 while (event_counter == service_event.get(0, false).counter)
124 v8.sleep();
125
126 console.out("Event received: "+(new Date()-d)+"ms");
127
128 console.out("Stop run");
129 dim.send("MCP/STOP");
130 while (!dim.send("RATE_CONTROL"))
131 {
132 v8.sleep(800);
133 console.out("waiting for RATE_CONTROL to send the necessary format information");
134 }
135 dim.send("RATE_CONTROL/STOP"); // GlobalThresholdSet -> Connected
136 dim.wait("MCP", "Idle", 3000);
137
138 var nn = runs.data && runs.data[0]>0 ? runs.data[1].reduce(Func.max) : -1;
139 if (nn>0)
140 {
141 console.out("Trying to restore last DRS calibration #"+nn+" ["+runs.time+"]");
142
143 var night = new Date(runs.time-1000*60*60*12);
144 var yy = night.getUTCFullYear();
145 var mm = night.getUTCMonth()+1;
146 var dd = night.getUTCDate();
147
148 var filefmt = "/loc_data/raw/%d/%02d/%02d/%4d%02d%02d_%03d.drs.fits";
149
150 // FIXME: Timeout
151 var drs_counter = service_drs.get(0, false);
152 dim.send("FAD_CONTROL/LOAD_DRS_CALIBRATION", filefmt.$(yy, mm, dd, yy, mm, dd, nn));
153 while (drs_counter == service_drs.get(0, false).counter)
154 v8.sleep();
155 }
156
157 //console.out(JSON.stringify(service_drs.get(0, false)));
158
159 event = service_event.get(0, false);
160
161 service_event.close();
162
163 var hist = Hist2D(16, -2048.5, 2048.5, 11, -10, 100);
164
165 for (var i=0; i<1440; i++)
166 hist.fill(event.data[0][i], isNaN(event.data[1][i])?-1:event.data[1][i]);
167
168 //console.out(("%78s".$("")).replace(/ /g, "-"));
169 hist.print();
170 //console.out(("%78s".$("")).replace(/ /g, "-"));
171
172 // Could also be <512
173 var stat0 = Func.stat(event.data[0], function(val) { if (val<0) console.out(" VAL="+val); return val<0; });
174 var stat1 = Func.stat(event.data[1]);
175
176 console.out("Avg[min]=%.1f".$(stat0.min));
177 console.out("Avg[avg]=%.1f +- %.1f".$(stat0.avg, stat0.rms));
178 console.out("Avg[max]=%.1f".$(+stat0.max));
179 console.out("Avg[cnt]="+stat0.count);
180 console.out("");
181 console.out("Rms[min]=%.1f".$(stat1.min));
182 console.out("Rms[avg]=%.1f +- %.1f".$(stat1.avg, stat1.rms));
183 console.out("Rms[max]=%.1f".$(stat1.max));
184 console.out(("%78s\n".$("")).replace(/ /g, "="));
185}
186
187service_drs.close();
Note: See TracBrowser for help on using the repository browser.