Index: trunk/FACT++/www/viewer/index.js
===================================================================
--- trunk/FACT++/www/viewer/index.js	(revision 17800)
+++ trunk/FACT++/www/viewer/index.js	(revision 17805)
@@ -464,6 +464,12 @@
     canv.dataAbs = new Array(1440);
     for (var i=0; i<1440; i++)
-        if (data[i]!==undefined && data[i]!==null)
-            canv.dataAbs[i] = data[i];
+    {
+        var val = data[map[i]];
+        if (val!==undefined && val!==null)
+            canv.dataAbs[i] = val;
+    }
+
+    canv.hillas = Hillas(canv.dataAbs);
+    debug(JSON.stringify(canv.hillas));
 
     canv.min = Math.min.apply(Math, canv.dataAbs.filter(function(e){return !isNaN(e)}));
@@ -472,6 +478,9 @@
     canv.dataRel = new Array(1440);
     for (var i=0; i<1440; i++)
-        if (data[i]!==undefined && data[i]!==null)
-            canv.dataRel[i] = (data[i]-canv.min)/canv.max;
+    {
+        val = data[map[i]];
+        if (val!==undefined && val!==null)
+            canv.dataRel[i] = (val-canv.min)/canv.max;
+    }
 
     if (document.getElementById("cameraminon"+n).checked)
@@ -773,5 +782,5 @@
 }
 
-function onMarker()
+function refreshCameras()
 {
     drawFullCam("camera1");
@@ -1328,5 +1337,7 @@
 
     for (var i=0; i<1440; i++)
-        drawHex(ctx, coord[i][0], coord[i][1], data[map[i]], min, max);
+        drawHex(ctx, coord[i][0], coord[i][1], data[i], min, max);
+
+    // =================== Draw Pixel marker ====================
 
     if (document.getElementById('marker').checked)
@@ -1345,9 +1356,38 @@
     }
 
+    // ======================= Draw Ellipse ======================
+
+    var h = canv.hillas;
+    if (h && document.getElementById('image').checked)
+    {
+        ctx.save();
+
+        ctx.translate(h.mean[0], h.mean[1]);
+        ctx.rotate(h.phi);
+
+        ctx.save();
+        ctx.scale(h.axis[0], h.axis[1]);
+        ctx.beginPath();
+        ctx.arc(0, 0, 1, 0, 2*Math.PI);
+        ctx.restore();
+
+        ctx.lineWidth = 0.15;
+        ctx.strokeStyle = "#444";
+        ctx.stroke();
+
+        ctx.strokeStyle = "#888";
+        ctx.beginPath();
+        ctx.moveTo(0, -h.disp);
+        ctx.lineTo(0,  h.disp);
+        ctx.stroke();
+
+        ctx.restore();
+    }
+
     ctx.restore();
 
     // ======================= Draw Legend ======================
 
-    var pval = parseFloat(canv.dataAbs[map[pixel]]).toFixed(1);
+    var pval = parseFloat(canv.dataAbs[pixel]).toFixed(1);
     var lmin = parseFloat(canv.min).toFixed(1);
     var lmax = parseFloat(canv.max).toFixed(1);
@@ -1382,2 +1422,92 @@
     ctx.strokeText(lmin, 5+mw, 5);
 }
+
+// ===================================================================
+
+function Hillas(data)
+{
+    var mx = 0;
+    var my = 0;
+    var sz = 0;
+
+    var cnt = 0;
+    for (var i=0; i<1440; i++)
+    {
+        if (data[i]===undefined)
+            continue;
+
+        sz += data[i];
+        mx += data[i] * coord[i][0];
+        my += data[i] * coord[i][1];
+
+        cnt++;
+    }
+
+    if (sz==0)
+        return;
+
+    mx /= sz;
+    my /= sz;
+
+    if (cnt<3)
+        return;
+
+    var xx=0;
+    var xy=0;
+    var yy=0;
+
+    for (var i=0; i<1440; i++)
+    {
+        if (data[i]===undefined)
+            continue;
+
+        var dx = coord[i][0] - mx;
+        var dy = coord[i][1] - my;
+
+        xx += data[i] * dx*dx;
+        xy += data[i] * dx*dy;
+        yy += data[i] * dy*dy;
+    }
+
+    var d0    = yy - xx;
+    var d1    = xy*2;
+    var d2    = Math.sqrt(d0*d0 + d1*d1) + d0;
+
+    var tand  = d2==0 ? 0 : d2 / d1;
+    var tand2 = tand*tand;
+
+    var s2    = tand2+1;
+    var s     = Math.sqrt(s2);
+
+    var phi = 0;
+    var cos = 0;
+    var sin = 1;
+
+    var axis1 = yy;
+    var axis2 = xx;
+    var ratio = xx/yy;
+
+    if (d1!=0 || d2==0)
+    {
+        phi = Math.atan(tand)-Math.PI/2;
+        cos = 1.0 /s;
+        sin = tand/s;
+
+        axis1 = (tand2*yy + d2 + xx)/s2;
+        axis2 = (tand2*xx - d2 + yy)/s2;
+        ratio = (tand2*xx - d2 + yy)/(tand2*yy + d2 + xx);
+    }
+
+    var length = axis1<0 ? 0 : Math.sqrt(axis1/sz);
+    var width  = axis2<0 ? 0 : Math.sqrt(axis2/sz);
+
+    return {
+        "mean":  [ mx, my ],
+        "axis":  [ width, length ],
+        "phi":   phi,
+        "delta": [ cos, sin ],
+        "sumw":  sz,
+        "count": cnt,
+        "disp":  1.42/0.1111*(1-Math.sqrt(ratio)),
+    };
+}
