Index: trunk/FACT++/src/biasctrl.cc
===================================================================
--- trunk/FACT++/src/biasctrl.cc	(revision 12654)
+++ trunk/FACT++/src/biasctrl.cc	(revision 12663)
@@ -42,5 +42,5 @@
     bool fIsVerbose;
 
-    vector<uint16_t> fVoltCmd;     // Current command voltage in DAC units (12bit = 90V)
+    vector<uint16_t> fDacCmd;     // Current command voltage in DAC units (12bit = 90V)
 
     vector<bool>     fPresent;
@@ -49,5 +49,5 @@
     int64_t fSendCounter;
 
-    int16_t fGlobalVoltCmd;      // Command value to be reached
+    int16_t fGlobalDacCmd;      // Command value to be reached
 //    uint16_t fExpertVoltRef;      // Command value to be reached
 
@@ -65,12 +65,12 @@
 
 protected:
-    vector<uint16_t> fVolt;        // Current voltage in DAC units (12bit = 90V)
-    vector<uint16_t> fVoltRef;     // Current reference voltage in DAC units (12bit = 90V)
-    vector<uint16_t> fVoltGapd;    // Nominal G-APD voltages at 25deg C
+    vector<uint16_t> fDac;        // Current voltage in DAC units (12bit = 90V)
+    vector<uint16_t> fDacRef;     // Current reference voltage in DAC units (12bit = 90V)
+    vector<uint16_t> fDacGapd;    // Nominal G-APD voltages at 25deg C
 
     vector<int16_t>  fCurrent;     // Current in ADC units (12bit = 5mA)
 
-    uint16_t fVoltMaxAbs;
-    uint16_t fVoltMaxRel;
+    uint16_t fDacMaxAbs;
+    uint16_t fDacMaxRel;
 
     virtual void UpdateA()
@@ -105,13 +105,13 @@
             return false;
         }
-        if (dac>fVoltMaxAbs)
-        {
-            str << "DAC value " << dac << " exceeds allowed absolute maximum of " << fVoltMaxAbs;
+        if (dac>fDacMaxAbs)
+        {
+            str << "DAC value " << dac << " exceeds allowed absolute maximum of " << fDacMaxAbs;
             Error(str);
             return false;
         }
-        if (dac>fVoltGapd[ch]+fVoltMaxRel)
-        {
-            str << "DAC value " << dac << " exceeds allowed channel maximum of " << fVoltGapd[ch] << " + " << fVoltMaxRel;
+        if (dac>fDacGapd[ch]+fDacMaxRel)
+        {
+            str << "DAC value " << dac << " exceeds allowed channel maximum of " << fDacGapd[ch] << " + " << fDacMaxRel;
             Error(str);
             return false;
@@ -251,7 +251,7 @@
             {
                 for (int i=0; i<kNumChannels; i++)
-                    fVolt[i] = fGlobalVoltCmd;
-
-                fGlobalVoltCmd = -1;
+                    fDac[i] = fGlobalDacCmd;
+
+                fGlobalDacCmd = -1;
 
                 return true;
@@ -293,5 +293,5 @@
 
         if (cmd==kCmdChannelSet)
-            fVolt[id] = fVoltCmd[id];
+            fDac[id] = fDacCmd[id];
 
         return true;
@@ -584,7 +584,7 @@
         if (fWrapCounter<0)
         {
-            fVolt.assign(   kNumChannels, 0);
-            fVoltRef.assign(kNumChannels, 0);
-            fVoltCmd.assign(kNumChannels, 0);
+            fDac.assign(   kNumChannels, 0);
+            fDacRef.assign(kNumChannels, 0);
+            fDacCmd.assign(kNumChannels, 0);
         }
 
@@ -592,5 +592,5 @@
         fSendCounter    = -1;
         fWrapCounter    = -1;
-        fGlobalVoltCmd  = -1;
+        fGlobalDacCmd   = -1;
         fIsInitializing = true;
         fIsRamping      = false;
@@ -658,5 +658,5 @@
             data.insert(data.end(), cmd.begin(), cmd.end());
 
-            fVoltCmd[ch] = dac[ch];
+            fDacCmd[ch] = dac[ch];
         }
 
@@ -673,11 +673,11 @@
     uint16_t RampOneStep(uint16_t ch)
     {
-        if (fVoltRef[ch]>fVolt[ch])
-            return fVolt[ch]+fRampStep>fVoltRef[ch] ? fVoltRef[ch] : fVolt[ch]+fRampStep;
-
-        if (fVoltRef[ch]<fVolt[ch])
-            return fVolt[ch]-fRampStep<fVoltRef[ch] ? fVoltRef[ch] : fVolt[ch]-fRampStep;
-
-        return fVolt[ch];
+        if (fDacRef[ch]>fDac[ch])
+            return fDac[ch]+fRampStep>fDacRef[ch] ? fDacRef[ch] : fDac[ch]+fRampStep;
+
+        if (fDacRef[ch]<fDac[ch])
+            return fDac[ch]-fRampStep<fDacRef[ch] ? fDacRef[ch] : fDac[ch]-fRampStep;
+
+        return fDac[ch];
     }
 
@@ -701,5 +701,5 @@
         {
             dac[ch] = RampOneStep(ch);
-            if (dac[ch]!=fVolt[ch] && fPresent[ch/kNumChannelsPerBoard])
+            if (dac[ch]!=fDac[ch] && fPresent[ch/kNumChannelsPerBoard])
                 identical = false;
         }
@@ -769,6 +769,5 @@
         fBufferUpdate(3*kNumChannels),
         fIsVerbose(false),
-        fVoltCmd(kNumChannels),
-        //fRefCurrent(kNumChannels),
+        fDacCmd(kNumChannels),
         fPresent(kNumBoards),
         fWrapCounter(-1),
@@ -780,7 +779,7 @@
         fWaitingForAnswer(-1),
         fCounter(8),
-        fVolt(kNumChannels),
-        fVoltRef(kNumChannels),
-        fVoltGapd(kNumChannels),
+        fDac(kNumChannels),
+        fDacRef(kNumChannels),
+        fDacGapd(kNumChannels),
         fCurrent(kNumChannels)
     {
@@ -807,5 +806,5 @@
 
         for (int ch=0; ch<kNumChannels; ch++)
-            dac[ch] = fCurrent[ch]<0 ? 0 : fVolt[ch];
+            dac[ch] = fCurrent[ch]<0 ? 0 : fDac[ch];
 
         SetAllChannels(dac, true);
@@ -848,5 +847,5 @@
             return false;
 
-        fVoltRef[ch] = dac;
+        fDacRef[ch] = dac;
 
         if (!fIsRamping)
@@ -904,16 +903,16 @@
         for (size_t ch=0; ch<kNumChannels; ch++)
         {
-            if (fVoltRef[ch]+dac[ch]>kMaxDac)
+            if (fDacRef[ch]+dac[ch]>kMaxDac)
             {
                 ostringstream msg;
-                msg << "AddDac - New voltage reference " << fVoltRef[ch] << "+" << dac[ch] << " out of range [0," << kMaxDac << " for channel " << ch << ".";
+                msg << "AddDac - New voltage reference " << fDacRef[ch] << "+" << dac[ch] << " out of range [0," << kMaxDac << " for channel " << ch << ".";
                 Error(msg);
                 return false;
             }
 
-            if (fVoltRef[ch]+dac[ch]<0)
-                fVoltRef[ch] = 0;
+            if (fDacRef[ch]+dac[ch]<0)
+                fDacRef[ch] = 0;
             else
-                fVoltRef[ch] += dac[ch];
+                fDacRef[ch] += dac[ch];
         }
 
@@ -966,5 +965,5 @@
                 return false;
 
-            fVoltRef[ch] = dac[ch];
+            fDacRef[ch] = dac[ch];
         }
 
@@ -1020,8 +1019,8 @@
 
         for (size_t ch=0; ch<kNumChannels; ch++)
-            if (fVoltGapd[ch]+dac>kMaxDac)
+            if (fDacGapd[ch]+dac>kMaxDac)
             {
                 ostringstream msg;
-                msg << "SetGapdVoltage - New voltage reference " << fVoltGapd[ch] << "+" << dac << " out of range [0," << kMaxDac << " for channel " << ch << ".";
+                msg << "SetGapdVoltage - New voltage reference " << fDacGapd[ch] << "+" << dac << " out of range [0," << kMaxDac << " for channel " << ch << ".";
                 Error(msg);
                 return false;
@@ -1029,5 +1028,5 @@
 
         for (size_t ch=0; ch<kNumChannels; ch++)
-            fVoltRef[ch] = fVoltGapd[ch]+dac<0 ? 0 : fVoltGapd[ch]+dac;
+            fDacRef[ch] = fDacGapd[ch]+dac<0 ? 0 : fDacGapd[ch]+dac;
 
         if (!fIsRamping)
@@ -1039,8 +1038,8 @@
     bool SetGapdReferenceCh(uint16_t ch)
     {
-        if (!CheckChDac("SetGapdReferenceCh", fVoltGapd[ch], ch))
-            return false;
-
-        fVoltRef[ch] = fVoltGapd[ch];
+        if (!CheckChDac("SetGapdReferenceCh", fDacGapd[ch], ch))
+            return false;
+
+        fDacRef[ch] = fDacGapd[ch];
 
         if (!fIsRamping)
@@ -1054,5 +1053,5 @@
     {
         for (size_t ch=0; ch<kNumChannels; ch++)
-            fVoltRef[ch] = 0;
+            fDacRef[ch] = 0;
 
         if (!fIsRamping)
@@ -1071,5 +1070,5 @@
 
         for (size_t i=0; i<kNumChannels; i++)
-            fVoltGapd[i] = volt[i]*4096/90;
+            fDacGapd[i] = volt[i]*4096/90;
 
         UpdateVgapd();
@@ -1150,5 +1149,5 @@
             return false;
 
-        fVoltCmd[ch] = dac;
+        fDacCmd[ch] = dac;
 
         ostringstream msg;
@@ -1182,5 +1181,5 @@
             return false;
 
-        if (fGlobalVoltCmd>=0)
+        if (fGlobalDacCmd>=0)
         {
             Error("ExpertGlobalSetDac - Still waiting for previous answer to 'GlobalSet'");
@@ -1188,5 +1187,5 @@
         }
 
-        fGlobalVoltCmd = dac;
+        fGlobalDacCmd = dac;
 
         ostringstream msg;
@@ -1271,7 +1270,7 @@
             const int id = c+kNumChannelsPerBoard*b;
             Out() << " ";
-            Out() << (fVolt[id]==fVoltRef[id]?kGreen:kRed);
-            Out() << setw(5) << fVolt[id]*90/4096. << '/';
-            Out() << setw(5) << fVoltRef[id]*90/4096.;
+            Out() << (fDac[id]==fDacRef[id]?kGreen:kRed);
+            Out() << setw(5) << fDac[id]*90/4096. << '/';
+            Out() << setw(5) << fDacRef[id]*90/4096.;
         }
         Out() << endl;
@@ -1307,5 +1306,5 @@
         {
             const int id = c+kNumChannelsPerBoard*b;
-            Out() << " " << setw(5) << fVoltGapd[id]*90/4096.;
+            Out() << " " << setw(5) << fDacGapd[id]*90/4096.;
         }
         Out() << endl;
@@ -1352,28 +1351,28 @@
     void SetVoltMaxAbs(float max)
     {
-        fVoltMaxAbs = max*4096/90;
-        if (fVoltMaxAbs>4095)
-            fVoltMaxAbs = 4095;
+        fDacMaxAbs = max*4096/90;
+        if (fDacMaxAbs>4095)
+            fDacMaxAbs = 4095;
         if (max<0)
-            fVoltMaxAbs = 0;
+            fDacMaxAbs = 0;
     }
 
     void SetVoltMaxRel(float max)
     {
-        fVoltMaxRel = max*4096/90;
-        if (fVoltMaxRel>4095)
-            fVoltMaxRel = 4095;
+        fDacMaxRel = max*4096/90;
+        if (fDacMaxRel>4095)
+            fDacMaxRel = 4095;
         if (max<0)
-            fVoltMaxRel = 0;
+            fDacMaxRel = 0;
     }
 
     uint16_t GetVoltMaxAbs() const
     {
-        return fVoltMaxAbs * 90./4096;
+        return fDacMaxAbs * 90./4096;
     }
 
     uint16_t GetVoltMaxRel() const
     {
-        return fVoltMaxRel * 90./4096;
+        return fDacMaxRel * 90./4096;
     }
 
@@ -1427,5 +1426,5 @@
         bool isoff = true;
         for (int ch=0; ch<kNumChannels; ch++)
-            if (fPresent[ch/kNumChannelsPerBoard] && fVolt[ch]!=0)
+            if (fPresent[ch/kNumChannelsPerBoard] && fDac[ch]!=0)
                 isoff = false;
         if (isoff)
@@ -1433,5 +1432,5 @@
 
         for (int ch=0; ch<kNumChannels; ch++)
-            if (fPresent[ch/kNumChannelsPerBoard] && fVolt[ch]!=fVoltRef[ch])
+            if (fPresent[ch/kNumChannelsPerBoard] && fDac[ch]!=fDacRef[ch])
                 return BIAS::kNotReferenced;
 
@@ -1460,6 +1459,6 @@
     {
         vector<uint16_t> vec;
-        vec.insert(vec.end(), fVolt.begin(),    fVolt.end());
-        vec.insert(vec.end(), fVoltRef.begin(), fVoltRef.end());
+        vec.insert(vec.end(), fDac.begin(),    fDac.end());
+        vec.insert(vec.end(), fDacRef.begin(), fDacRef.end());
         fDimVoltage.Update(vec);
     }
@@ -1467,5 +1466,5 @@
     void UpdateVgapd()
     {
-        fDimGapd.Update(fVoltGapd);
+        fDimGapd.Update(fDacGapd);
     }
 
@@ -2059,14 +2058,29 @@
 
         BiasMap map;
-        if (!map.Read(conf.Get<string>("bias-map-file")))
-        {
-            T::Error("Reading reference voltages from "+conf.Get<string>("bias-map-file")+" failed.");
+
+        if (!conf.Has("bias-map-file") && !conf.Has("bias-database"))
+        {
+            T::Error("Neither bias-map-file not bias-dtabase specified.");
             return 5;
         }
 
+        try
+        {
+            if (conf.Has("bias-map-file"))
+                map.Read(conf.Get<string>("bias-map-file"));
+
+            if (conf.Has("bias-database"))
+                map.Retrieve(conf.Get<string>("bias-database"));
+        }
+        catch (const runtime_error &e)
+        {
+            T::Error("Getting reference voltages failed: "+string(e.what()));
+            return 7;
+        }
+
         if (!fBias.SetNewGapdVoltage(map.Vgapd()))
         {
             T::Error("Setting reference voltages failed.");
-            return 6;
+            return 8;
         }
 
@@ -2103,4 +2117,5 @@
         ("volt-max-rel",    var<float>(2.5),     "Relative upper limit for the voltage w.r.t. the G-APD reference voltage (in Volts)")
         ("bias-map-file",   var<string>("GAPDmap.txt"), "File with nominal and offset voltages for each channel.")
+        ("bias-database",   var<string>(""),      "")
         ;
 
