source: trunk/FACT++/www/viewer/index.php@ 18490

Last change on this file since 18490 was 18398, checked in by tbretz, 9 years ago
Added a time property to ech $.event. A Date object with ms precision.
File size: 11.3 KB
Line 
1<?php
2
3if (!extension_loaded('v8js'))
4 die("V8Js missing");
5
6$path = array(
7 "cal" => "/daq/www/cal/",
8 "raw" => "/daq/raw/",
9 "mc" => "/daq/www/mc/",
10 );
11
12if (isset($_POST['editor1']) || isset($_POST['editor2']))
13{
14 $isOne = isset($_POST['editor1']);
15
16 $source = $isOne ? $_POST['editor1'] : $_POST['editor2'];
17 if (!isset($_POST['files']))
18 $name = $isOne ? "proc.js" : "main.js";
19 else
20 $name = $_POST['files'][0];
21
22 header($_SERVER["SERVER_PROTOCOL"] . " 200 OK");
23 header('Cache-Control: public'); // needed for i.e.
24 header('Content-Type: text/plain');
25 header('Content-Transfer-Encoding: Text');
26 header('Content-Disposition: attachment; filename="'.$name.'"');
27 print(str_replace("\r", "", $source));
28 return;
29}
30
31// This is a pretty weird hack because it does first convert
32// all data to ascii (json) to print it...
33if (isset($_POST['data']))
34{
35 header($_SERVER["SERVER_PROTOCOL"] . " 200 OK");
36 header('Cache-Control: public'); // needed for i.e.
37 header('Content-Type: text/plain');
38 header('Content-Transfer-Encoding: Text');
39 header('Content-Disposition: attachment; filename="'.$_POST['name'].'"');
40
41 $json = json_decode($_POST['data']);
42
43 $n = count($json[0]);
44 $cnt = count($json);
45
46 for ($i=0; $i<$n; $i++)
47 {
48 print($i." ".$json[0][$i]);
49
50 if ($cnt>1)
51 print(" ".$json[1][$i]);
52 if ($cnt>2)
53 print(" ".$json[2][$i]);
54 if ($cnt>3)
55 print(" ".$json[3][$i]);
56 print("\n");
57 }
58 return;
59}
60
61if (!isset($_POST['file']) || !isset($_POST['event']) || !isset($_POST['pixel']))
62{
63 /*
64 function getList($path)
65 {
66 $hasdir = false;
67
68 $list = array();
69 foreach (new DirectoryIterator($path) as $file)
70 {
71 if ($file->isDot())
72 continue;
73
74 $name = $file->getFilename();
75
76
77 if ($file->isDir())
78 {
79 $list[$name] = getList($path."/".$name);
80 $hasdir = true;
81 }
82
83 if ($file->isFile() && $file->isReadable())
84 {
85 if (substr($name, 12)!=".fits.fz")
86 continue;
87
88 array_push($list, substr($name, 9, 3));
89 }
90 }
91
92 if (!$hasdir)
93 sort($list);
94 return $list;
95 }
96 */
97
98 function getList(&$list, $path, $ext, $id, $sub = "")
99 {
100 $hasdir = false;
101
102 $dir = new DirectoryIterator($path."/".$sub);
103 foreach ($dir as $file)
104 {
105 if ($file->isDot())
106 continue;
107
108 $name = $file->getFilename();
109
110 if ($file->isDir())
111 getList($list, $path, $ext, $id, $sub."/".$name);
112
113 if (!$file->isFile() || !$file->isReadable())
114 continue;
115
116 if (substr($name, -strlen($ext))!=$ext)
117 continue;
118
119 $rc = substr($name, 0, 4)."/".substr($name, 4, 2)."/".substr($name, 6, 2)."-".substr($name, 9, 3);
120
121 if (!isset($list[$rc]))
122 $list[$rc] = 0;
123
124 $list[$rc] |= $id;
125 }
126 }
127
128 try
129 {
130 $list = array();
131 getList($list, $path['raw'], ".fits.fz", 1);
132 getList($list, $path['raw'], ".drs.fits", 2);
133 getList($list, $path['cal'], ".fits.fz", 4);
134 getList($list, $path['mc'], ".fits.fz", 8);
135 ksort($list);
136 }
137 catch (Exception $e)
138 {
139 return header('HTTP/1.0 400 '.$e->getMessage());
140 }
141
142 print(json_encode($list));
143 return;
144}
145
146$event = intval($_POST['event']);
147$pixel = intval($_POST['pixel']);
148
149function get($handle, $format, $count = 1)
150{
151 $size = 0;
152 switch ($format)
153 {
154 case 'd': $size = 8; break;
155 case 'L': $size = 4; break;
156 case 'S': $size = 2; break;
157 case 's': $size = 2; break;
158 }
159
160 if ($size==0)
161 return;
162
163 $binary = fread($handle, $size*$count);
164 $data = unpack($format.$count, $binary);
165
166 return $count==1 ? $data[1] : $data;
167}
168
169//ini_set("memory_limit", "64M");
170
171//define('E_FATAL', E_ERROR | E_USER_ERROR | E_PARSE | E_CORE_ERROR |
172// E_COMPILE_ERROR | E_RECOVERABLE_ERROR);
173
174$rc = array();
175$rc['startPhp'] = microtime(true);
176
177// ============================ Read data from file ==========================
178$file = $_POST['file'];
179
180$y = substr($file, 0, 4);
181$m = substr($file, 5, 2);
182$d = substr($file, 8, 2);
183$r = substr($file, 11, 3);
184
185$rootpath = isset($_POST['calibrated']) && !isset($_POST['drsfile']) ? $path['cal'] : $path['raw'];
186$extension = isset($_POST['drsfile']) ? ".drs.fits" : ".fits.fz";
187$filename = $rootpath.$y."/".$m."/".$d."/".$y.$m.$d."_".$r.$extension;
188
189if (isset($_POST['montecarlo']))
190{
191 $rootpath = $path['mc'];
192 $extension = ".fits.fz";
193 $filename = $rootpath.$y.$m.$d."_".$r.$extension;
194}
195
196if (!file_exists($filename))
197 return header("HTTP/1.0 400 File '".$file."' not found.");
198
199$command = "/home/fact/FACT++/getevent ".$filename." ".$event." 2> /dev/null";
200$file = popen($command, "r");
201if (!$file)
202 return header('HTTP/1.0 400 Could not open pipe.');
203
204$evt = array();
205$fil = array();
206$fil['isMC'] = isset($_POST['montecarlo']);
207$fil['isDRS'] = isset($_POST['drsfile']);
208$fil['isCalibrated'] = isset($_POST['calibrated']);
209
210$fil['runType'] = trim(fread($file, 80));
211if (feof($file))
212 return header('HTTP/1.0 400 Data not available.');
213
214$fil['runStart'] = get($file, "d");
215$fil['runEnd'] = get($file, "d");
216$fil['drsFile'] = get($file, "s");
217$fil['numEvents'] = get($file, "L");
218$fil['scale'] = get($file, "s");
219$evt['numRoi'] = get($file, "L");
220$evt['numPix'] = get($file, "L");
221$evt['eventNumber'] = get($file, "L");
222//$evt['triggerNumber'] = get($file, "L");
223$evt['triggerType'] = get($file, "S");
224$evt['unixTime'] = get($file, "L", 2);
225
226if (isset($_POST['source1']))
227{
228 // Read the data and copy it from an associative array to an Array
229 // (this is just nicer and seems more logical)
230 $binary = array();
231 for ($i=0; $i<$evt['numPix']; $i++)
232 $binary[$i] = fread($file, 2*$evt['numRoi']);
233 /*
234 $data = array();
235 for ($i=0; $i<$evt['numPix']; $i++)
236 {
237 $var = get($file, "s", $evt['numRoi']);
238 $data[$i] = array();
239 for ($j=0; $j<$evt['numRoi']; $j++)
240 $data[$i][$j] = $var[$j+1]*0.48828125; // dac -> mV
241 }*/
242}
243
244if (feof($file))
245 return header('HTTP/1.0 400 Data from file incomplete.');
246
247pclose($file);
248
249if ($fil['numEvents']==0)
250 return header('HTTP/1.0 400 Could not read event.');
251
252// =========================== Decode trigger type ===========================
253
254$typ = $evt['triggerType'];
255$evt['trigger'] = array();
256if ($typ!=0 && ($typ & 0x8703)==0)
257 array_push($evt['trigger'], "PHYS");
258if (($typ&0x0100)!=0)
259 array_push($evt['trigger'], "LPext");
260if (($typ&0x0200)!=0)
261 array_push($evt['trigger'], "LPint");
262if (($typ&0x0400)!=0)
263 array_push($evt['trigger'], "PED");
264if (($typ&0x8000)!=0)
265 array_push($evt['trigger'], "TIM");
266if (($typ&0x0001)!=0)
267 array_push($evt['trigger'], "EXT1");
268if (($typ&0x0002)!=0)
269 array_push($evt['trigger'], "EXT2");
270
271// =============================== Some data =================================
272
273//require_once("neighbors.php");
274
275//$rc['neighbors'] = $neighbors;
276$rc['event'] = $evt;
277$rc['file'] = $fil;
278$rc['event']['index'] = $event;
279$rc['event']['pixel'] = $pixel;
280//$rc['waveform'] = $data[$pixel];
281
282// Get execution times
283$now = microtime(true);
284
285if (isset($_POST['source1']))
286{
287 // =============================== Run Javascript ============================
288
289/*
290$JS = <<< EOT
291require("path/to/module1");
292EOT;
293
294$v8 = new V8Js();
295$v8->setModuleLoader(function($module) {
296 switch ($module) {
297 case 'path/to/module1':
298 return 'print(' . json_encode($module . PHP_EOL) . ');require("./module2");';
299
300 case 'path/to/module2':
301 return 'print(' . json_encode($module . PHP_EOL) . ');require("../../module3");';
302
303 default:
304 return 'print(' . json_encode($module . PHP_EOL) . ');';
305 }
306});
307*/
308
309 // V8Js global methods: exit, print, sleep, var_dump, require
310 //$v8 = new V8Js("$", array("data"=>"data"), extensions, flags, millisecond, bytes);
311 $v8 = new V8Js("$"/*, array("data"=>"data")*/);
312
313 //$v8 = new V8Js("$", array("data"=>"data"));
314
315 //V8Js::registerExtension("exit", "1");
316 //$v8 = new V8Js("$", array(), array("exit"));
317
318 //$v8->func = function($a) { echo "Closure with param $a\n"; };
319 //$v8->greeting = "From PHP with love!";
320
321 // This is much faster than the variables option in the constructor
322
323 $roi = $evt['numRoi'];
324
325 //$v8->data = $data;
326 //$v8->test = array();;
327 //$v8->data = array();
328 $v8->nroi = $evt['numRoi'];
329 $v8->npix = $evt['numPix'];
330 $v8->trigger = $evt['trigger'];
331 $v8->event = $evt;
332 $v8->file = $fil;
333// $v8->neighbors = $neighbors;
334 $v8->clone = function($data) { return $data; };
335 $v8->scale = $fil['scale']==0 ? 2000./4096. : 1./$fil['scale'];
336 $v8->unpack = function($i)
337 {
338 global $binary, $roi, $v8;
339 $u = unpack("s".$roi, $binary[$i]);
340 $arr = array();
341 for ($i=0; $i<$roi; $i++)
342 $arr[$i] = $u[$i+1]*$v8->scale;
343 return $arr;
344 };
345
346 // 10, 445, 91.75 MiB
347 // 376, 720, 91.75 MiB
348
349 $internal = file_get_contents("internal.js");
350
351 // Buffer output from javascript
352 ob_start();
353
354 $rc['timeJS'] = array();
355 $rc['startJs'] = microtime(true);
356
357 try
358 {
359 $v8->executeString($internal, 'internal.js');
360
361 // We unpack the data pixel by pixel and copy the array directly to the
362 // Javasscript array. This significantly decreases memory usage because
363 // we need only one of the super memory hungry php arrays of size ROI
364 // instead of 1440.
365 $JS = "$.event.time=new Date($.event.unixTime[1]*1000+$.event.unixTime[2]/1000); $.data = new Array($.event.numPix); for (var i=0; i<$.event.numPix; i++) $.data[i] = $.unpack(i);";
366 $v8->executeString($JS, 'internal');
367
368 $rc['timeJs'][0] = (microtime(true) - $rc['startJs']);
369
370 $JS = "'use strict'; function proc(pixel){\n".$_POST['source1']."\n};proc(".$pixel.");";
371 $rc['waveform'] = $v8->executeString($JS, 'proc');
372
373 $rc['timeJs'][1] = (microtime(true) - $rc['startJs']);
374
375 if (isset($_POST['source2']))
376 {
377 $JS = "'use strict'; (function main(){\n".$_POST['source2']."\n})();";
378 $rc['ret'] = $v8->executeString($JS, 'main');
379 }
380
381 // This is supposed to work, but it seems it does not...
382 //$v8->proc = $rc['ret']->proc;
383 //$rc['ret'] = $v8->executeString('PHP.proc();', 'proc');
384 }
385 catch (V8JsException $e)
386 {
387 $rc['err'] = array();
388 $rc['err']['message'] = $e->getMessage();
389 $rc['err']['file'] = $e->getJsFileName();
390 $rc['err']['sourceLine'] = $e->getJsSourceLine();
391 $rc['err']['lineNumber'] = $e->getJsLineNumber()-1;
392 $rc['err']['trace'] = $e->getJsTrace();
393 }
394
395 $rc['timeJs'][2] = (microtime(true) - $rc['startJs']);
396
397 // Copy output buffer and clean it
398 $rc['debug'] = ob_get_contents();
399 ob_end_clean();
400}
401
402$rc['memory'] = memory_get_peak_usage(true)/1024/1024;
403$rc['timePhp'] = (microtime(true) - $rc['startPhp']);
404
405//unset($rc['neighbors']);
406
407// Output result as JSON object
408print(json_encode($rc));
409?>
Note: See TracBrowser for help on using the repository browser.