Index: /trunk/FACT++/gui/FactGui.h
===================================================================
--- /trunk/FACT++/gui/FactGui.h	(revision 11925)
+++ /trunk/FACT++/gui/FactGui.h	(revision 11926)
@@ -2479,11 +2479,12 @@
     void handleBiasVolt(const DimData &d)
     {
-        if (!CheckSize(d, 416*sizeof(int16_t)))
+        if (!CheckSize(d, 2*416*sizeof(int16_t)))
             return;
 
         const int16_t *ptr = d.ptr<int16_t>();
 
-        fVecBiasVolt.assign(ptr, ptr+416);
-
+        fVecBiasVolt.assign(ptr, ptr+2*416);
+
+        on_fBiasDispRefVolt_stateChanged();
         UpdateBiasValues();
     }
@@ -2508,8 +2509,9 @@
             dat[i] = abs(ptr[entry.hv()])*5000./4096;
 
-            fBiasCam->SetEnable(i, uint16_t(ptr[entry.hv()])!=0x8000);
-        }
-
-        fBiasCam->SetData(dat);
+            fBiasCamA->SetEnable(i, uint16_t(ptr[entry.hv()])!=0x8000);
+            fBiasCamA->highlightPixel(i, ptr[entry.hv()]<0);
+        }
+
+        fBiasCamA->SetData(dat);
 
         UpdateBiasValues();
@@ -3278,5 +3280,11 @@
         {
             fBiasVoltDac->setValue(fVecBiasVolt[ihw]);
-            fBiasVolt->setValue(fVecBiasVolt[ihw]*90./4096);
+            //fBiasVolt->setValue(fVecBiasVolt[ihw]*90./4096);
+
+            fBiasVoltCur->setValue(fVecBiasVolt[ihw]*90./4096);
+            fBiasVoltRef->setValue(fVecBiasVolt[ihw+416]*90./4096);
+
+            SetLedColor(fBiasNominalLed,
+                        fVecBiasCurrent[ihw]==fVecBiasVolt[ihw+416]?kLedGreen:kLedRed, Time());
         }
 
@@ -3301,4 +3309,23 @@
     }
 
+    void BiasHvChannelChanged()
+    {
+        if (fInChooseBiasHv)
+            return;
+
+        const int b  = fBiasHvBoard->value();
+        const int ch = fBiasHvChannel->value();
+
+        // FIXME: Mark corresponding patch in camera
+        const PixelMapEntry &entry = fPixelMap.hv(b, ch);
+        fBiasCamV->SetWhite(entry.index);
+        fBiasCamA->SetWhite(entry.index);
+        fBiasCamV->updateGL();
+        fBiasCamA->updateGL();
+
+        UpdateBiasCam(entry);
+        UpdateBiasValues();
+    }
+
     void UpdateBiasHv(const PixelMapEntry &entry)
     {
@@ -3309,20 +3336,4 @@
 
         fInChooseBiasHv = false;
-    }
-
-    void BiasHvChannelChanged()
-    {
-        if (fInChooseBiasHv)
-            return;
-
-        const int b  = fBiasHvBoard->value();
-        const int ch = fBiasHvChannel->value();
-
-        const PixelMapEntry &entry = fPixelMap.hv(b, ch);
-        fBiasCam->SetWhite(entry.index);
-        fBiasCam->updateGL();
-        // FIXME: mark patch in camera
-        UpdateBiasCam(entry);
-        UpdateBiasValues();
     }
 
@@ -3337,8 +3348,11 @@
         const int pixel = fBiasCamPixel->value();
 
+        // FIXME: Display corresponding patches
         const PixelMapEntry &entry = fPixelMap.cbpx(crate, board, patch, pixel);
-        fBiasCam->SetWhite(entry.index);
-        fBiasCam->updateGL();
-        // FIXME: mark patch in camera
+        fBiasCamV->SetWhite(entry.index);
+        fBiasCamA->SetWhite(entry.index);
+        fBiasCamV->updateGL();
+        fBiasCamA->updateGL();
+
         UpdateBiasHv(entry);
         UpdateBiasValues();
@@ -3352,4 +3366,36 @@
         UpdateBiasCam(entry);
         UpdateBiasValues();
+    }
+
+    void on_fBiasDispRefVolt_stateChanged(int = 0)
+    {
+        // FIXME: Display patches for which ref==cur
+
+        valarray<double> dat(0., 1440);
+
+        int offset = 0;
+        if (!fBiasDispRefVolt->isChecked())
+            fBiasCamV->setTitle("Applied BIAS voltage");
+        else
+        {
+            fBiasCamV->setTitle("Reference BIAS voltage");
+            offset = 416;
+        }
+
+        if (fVecBiasVolt.size()>0)
+        {
+            for (int i=0; i<1440; i++)
+            {
+                const PixelMapEntry &entry = fPixelMap.index(i);
+                dat[i] = fVecBiasVolt[entry.hv()+offset]*90./4096;
+
+                // FIXME: Highglight HV patch instead!
+                fBiasCamV->highlightPixel(i, fVecBiasVolt[entry.hv()]==fVecBiasVolt[entry.hv()+416]);
+            }
+
+            fBiasCamV->SetData(dat);
+        }
+
+        fBiasCamV->updateGL();
     }
 
@@ -3746,7 +3792,11 @@
         // --------------------------------------------------------------------------
 
-        fBiasCam->SetMin(fBiasMin->value());
-        fBiasCam->SetMax(fBiasMax->value());
-        fBiasCam->updateGL();
+        fBiasCamV->SetMin(fBiasVoltMin->value());
+        fBiasCamV->SetMax(fBiasVoltMax->value());
+        fBiasCamV->updateGL();
+
+        fBiasCamA->SetMin(fBiasCurrentMin->value());
+        fBiasCamA->SetMax(fBiasCurrentMax->value());
+        fBiasCamA->updateGL();
 
         // --------------------------------------------------------------------------
@@ -3775,6 +3825,9 @@
         fRatesCanv->setUnits("Hz");
 
-        fBiasCam->setTitle("BIAS current");
-        fBiasCam->setUnits("uA");
+        fBiasCamA->setTitle("BIAS current");
+        fBiasCamA->setUnits("uA");
+
+        fBiasCamV->setTitle("Applied BIAS voltage");
+        fBiasCamV->setUnits("V");
 
         fEventCanv1->setTitle("Average (all slices)");
@@ -3818,5 +3871,7 @@
         connect(fRatesCanv, SIGNAL(signalCurrentPixel(int)),
                 this, SLOT(slot_ChoosePixelThreshold(int)));
-        connect(fBiasCam, SIGNAL(signalCurrentPixel(int)),
+        connect(fBiasCamV, SIGNAL(signalCurrentPixel(int)),
+                this, SLOT(slot_ChooseBiasChannel(int)));
+        connect(fBiasCamA, SIGNAL(signalCurrentPixel(int)),
                 this, SLOT(slot_ChooseBiasChannel(int)));
         connect(fFtmRateCanv, SIGNAL(     RootEventProcessed(TObject*, unsigned int, TCanvas*)),
