Index: trunk/FACT++/gui/FactGui.h
===================================================================
--- trunk/FACT++/gui/FactGui.h	(revision 12064)
+++ trunk/FACT++/gui/FactGui.h	(revision 12065)
@@ -29,4 +29,5 @@
 #include "TSystem.h"
 #include "TGraph.h"
+#include "TGraphErrors.h"
 #include "TH2.h"
 #include "TBox.h"
@@ -1574,4 +1575,9 @@
         fEventCanv3->SetData(arr3);
         fEventCanv4->SetData(arr4);
+
+        fEventCanv1->updateCamera();
+        fEventCanv2->updateCamera();
+        fEventCanv3->updateCamera();
+        fEventCanv4->updateCamera();
     }
 
@@ -1947,5 +1953,5 @@
         fGraphFtmRate.SetPoint(fGraphFtmRate.GetN(), now, sdata.fTriggerRate);
 
-        if (t1-t0>60)
+        if (t1-t0>300)
         {
             h->GetXaxis()->SetTimeFormat("%Hh%M'");
@@ -1983,4 +1989,5 @@
 
         fRatesCanv->SetData(dat);
+        fRatesCanv->updateCamera();
     }
 
@@ -2466,4 +2473,37 @@
     // ========================== Feedback ==================================
 
+#ifdef HAVE_ROOT
+    TGraphErrors fGraphFeedbackDev;
+    TGraphErrors fGraphFeedbackCmd;
+
+    void UpdateFeedback(TQtWidget &rwidget, const Time &time, TGraphErrors &graph, double avg, double rms)
+    {
+        TCanvas *c = rwidget.GetCanvas();
+
+        TH1 *h = (TH1*)c->FindObject("TimeFrame");
+
+        while (graph.GetN()>500)
+            graph.RemovePoint(0);
+
+        const double now = time.RootTime();
+
+        while (graph.GetN()>0 && now-graph.GetX()[0]>3600)
+            graph.RemovePoint(0);
+
+        const int n = graph.GetN();
+
+        const double xmin = n>0 ? graph.GetX()[0] : now;
+
+        h->SetBins(n+1, xmin-1, now+1);
+        graph.SetPoint(n, now, avg);
+        graph.SetPointError(n, 0, rms);
+
+        h->GetXaxis()->SetTimeFormat(now-xmin>300 ? "%Hh%M'" : "%M'%S\"");
+
+        c->Modified();
+        c->Update();
+    }
+#endif
+
     void handleFeedbackDeviation(const DimData &d)
     {
@@ -2474,5 +2514,11 @@
 
         valarray<float> dev(1440);
-        valarray<float> ref(1440);
+        valarray<float> cmd(1440);
+
+        double avgdev = 0;
+        double avgcmd = 0;
+
+        double rmsdev = 0;
+        double rmscmd = 0;
 
         for (int i=0; i<1440; i++)
@@ -2480,13 +2526,30 @@
             const PixelMapEntry &entry = fPixelMap.index(i);
 
-            dev[i] = ptr[entry.hv()];
-            ref[i] = ptr[entry.hv()+416];
-        }
+            dev[i] = 1000*ptr[entry.hv()];
+            cmd[i] = 1000*ptr[entry.hv()+416];
+
+            avgdev += dev[i];
+            avgcmd += cmd[i];
+
+            rmsdev += dev[i]*dev[i];
+            rmscmd += cmd[i]*cmd[i];
+        }
+
+        avgdev /= 1440;
+        avgcmd /= 1440;
+
+        rmsdev = sqrt(rmsdev/1440 - avgdev*avgdev);
+        rmscmd = sqrt(rmscmd/1440 - avgcmd*avgcmd);
 
         fFeedbackDevCam->SetData(dev);
-        fFeedbackRefCam->SetData(ref);
+        fFeedbackCmdCam->SetData(cmd);
 
         fFeedbackDevCam->updateCamera();
-        fFeedbackRefCam->updateCamera();
+        fFeedbackCmdCam->updateCamera();
+
+#ifdef HAVE_ROOT
+        UpdateFeedback(*fFeedbackDev, d.time, fGraphFeedbackDev, avgdev, rmsdev);
+        UpdateFeedback(*fFeedbackCmd, d.time, fGraphFeedbackCmd, avgcmd, rmscmd);
+#endif
     }
 
@@ -3545,5 +3608,5 @@
         fDimFadRuns            ("FAD_CONTROL/RUNS",               (void*)NULL, 0, this),
         fDimFadEvents          ("FAD_CONTROL/EVENTS",             (void*)NULL, 0, this),
-        fDimFadRawData         ("FAD_CONTROL/RAW_DATA",           (void*)NULL, 0, this),
+        fDimFadRawData         ("FAD_CONTROL/RAWX_DATA",           (void*)NULL, 0, this),
         fDimFadEventData       ("FAD_CONTROL/EVENT_DATA",         (void*)NULL, 0, this),
         fDimFadConnections     ("FAD_CONTROL/CONNECTIONS",        (void*)NULL, 0, this),
@@ -3731,4 +3794,60 @@
 #ifdef HAVE_ROOT
 
+        fGraphFeedbackDev.SetLineColor(kBlue);
+        fGraphFeedbackDev.SetMarkerColor(kBlue);
+        fGraphFeedbackDev.SetMarkerStyle(kFullDotMedium);
+
+        fGraphFeedbackCmd.SetLineColor(kBlue);
+        fGraphFeedbackCmd.SetMarkerColor(kBlue);
+        fGraphFeedbackCmd.SetMarkerStyle(kFullDotMedium);
+
+        // Evolution of control deviation
+        // Evolution of command values (bias voltage change)
+        fGraphFeedbackDev.SetName("ControlDev");
+        fGraphFeedbackCmd.SetName("CommandVal");
+
+        TCanvas *c = fFeedbackDev->GetCanvas();
+        c->SetBorderMode(0);
+        c->SetFrameBorderMode(0);
+        c->SetFillColor(kWhite);
+        c->SetRightMargin(0.03);
+        c->SetTopMargin(0.03);
+        c->SetGrid();
+        c->cd();
+
+	TH1 *hf = DrawTimeFrame("Control deviation [mV]   ");
+        hf->GetXaxis()->SetLabelSize(0.07);
+        hf->GetYaxis()->SetLabelSize(0.07);
+        hf->GetYaxis()->SetTitleSize(0.08);
+        hf->GetYaxis()->SetTitleOffset(0.55);
+        hf->GetXaxis()->SetTitle("");
+        hf->GetYaxis()->SetRangeUser(-99, 99);
+
+        fGraphFeedbackDev.Draw("LP");
+
+        c = fFeedbackCmd->GetCanvas();
+        c->SetBorderMode(0);
+        c->SetFrameBorderMode(0);
+        c->SetFillColor(kWhite);
+        c->SetRightMargin(0.03);
+        c->SetTopMargin(0.03);
+        c->SetGrid();
+        c->cd();
+
+        hf = DrawTimeFrame("Command delta value [mV]   ");
+        hf->GetXaxis()->SetLabelSize(0.07);
+        hf->GetYaxis()->SetLabelSize(0.07);
+        hf->GetYaxis()->SetTitleSize(0.08);
+        hf->GetYaxis()->SetTitleOffset(0.55);
+        hf->GetXaxis()->SetTitle("");
+        hf->GetYaxis()->SetRangeUser(-99*5, 99*5);
+
+        fGraphFeedbackCmd.Draw("LP");
+
+        // --------------------------------------------------------------------------
+
+        fGraphFtmRate.SetMarkerStyle(kFullDotSmall);
+        fGraphFtmRate.Draw("LP");
+
         fGraphFtmRate.SetLineColor(kBlue);
         fGraphFtmRate.SetMarkerColor(kBlue);
@@ -3781,5 +3900,5 @@
         // --------------------------------------------------------------------------
 
-        TCanvas *c = fFtmRateCanv->GetCanvas();
+        c = fFtmRateCanv->GetCanvas();
         //c->SetBit(TCanvas::kNoContextMenu);
         c->SetBorderMode(0);
@@ -3791,9 +3910,19 @@
         c->cd();
 
-	TH1 *hf = DrawTimeFrame("Trigger rate [Hz]");
+	hf = DrawTimeFrame("Trigger rate [Hz]");
         hf->GetYaxis()->SetRangeUser(0, 1010);
 
         fGraphFtmRate.SetMarkerStyle(kFullDotSmall);
         fGraphFtmRate.Draw("LP");
+
+        // --------------------------------------------------------------------------
+
+        fFeedbackDevCam->SetMin(fFeedbackDevMin->value()*0.001);
+        fFeedbackDevCam->SetMax(fFeedbackDevMax->value()*0.001);
+        fFeedbackDevCam->updateCamera();
+
+        fFeedbackCmdCam->SetMin(fFeedbackCmdMin->value()*0.001);
+        fFeedbackCmdCam->SetMax(fFeedbackCmdMax->value()*0.001);
+        fFeedbackCmdCam->updateCamera();
 
         // --------------------------------------------------------------------------
@@ -3851,8 +3980,8 @@
 
         fFeedbackDevCam->setTitle("Control deviation (Pulser amplitude voltage)");
-        fFeedbackRefCam->setTitle("Applied voltage change (BIAS voltage)");
-
-        fFeedbackDevCam->setUnits("V");
-        fFeedbackRefCam->setUnits("V");
+        fFeedbackCmdCam->setTitle("Applied voltage change (BIAS voltage)");
+
+        fFeedbackDevCam->setUnits("mV");
+        fFeedbackCmdCam->setUnits("mV");
 
         // --------------------------------------------------------------------------
