Index: /trunk/FACT++/src/biasctrl.cc
===================================================================
--- /trunk/FACT++/src/biasctrl.cc	(revision 16964)
+++ /trunk/FACT++/src/biasctrl.cc	(revision 16965)
@@ -85,6 +85,8 @@
     vector<float> fBreakdownVoltage;      // Breakdown voltage of GAPDs
     vector<float> fOvervoltage;           // Requested overvoltage of GAPDs
-    vector<float> fChannelCalibration;    // Bias crate channel offset
     vector<float> fChannelOffset;         // User defined channel offset
+
+    vector<float> fCalibrationOffset;     // Bias crate channel offset
+    vector<float> fCalibrationSlope;      // Bias crate channel slope
 
     float fVoltageMaxAbs;  // Maximum voltage
@@ -840,6 +842,7 @@
         fBreakdownVoltage(kNumChannels, 0),
         fOvervoltage(kNumChannels),
-        fChannelCalibration(kNumChannels),
         fChannelOffset(kNumChannels),
+        fCalibrationOffset(kNumChannels),
+        fCalibrationSlope(kNumChannels, 90./4096),
         fVoltageMaxAbs(75),
         fVoltageMaxRel(2),
@@ -942,14 +945,15 @@
     uint16_t ConvertVoltToDac(uint16_t ch, double volt)
     {
-        volt += fChannelCalibration[ch];
+        volt -= fCalibrationOffset[ch];
+        volt /= fCalibrationSlope[ch];
         if (volt<0)
             volt = 0;
 
-        return volt*4096/90;
+        return nearbyint(volt);
     }
 
     double ConvertDacToVolt(uint16_t ch, uint16_t dac)
     {
-        return dac*90./4096 - fChannelCalibration[ch];
+        return dac*fCalibrationSlope[ch] + fCalibrationOffset[ch];
     }
 
@@ -1110,5 +1114,5 @@
     }
 
-    bool SetReferences(const vector<float> &volt, const vector<float> &offset)
+    bool SetReferences(const vector<float> &volt, const vector<float> &offset, const vector<float> &slope)
     {
         if (volt.size()!=kNumChannels)
@@ -1122,11 +1126,19 @@
         {
             ostringstream out;
-            out << "SetReferences - Given vector has " << volt.size() << " elements - expected " << kNumChannels << endl;
+            out << "SetReferences - Given vector has " << offset.size() << " elements - expected " << kNumChannels << endl;
             Error(out);
             return false;
         }
-
-        fBreakdownVoltage   = volt;
-        fChannelCalibration = offset;
+        if (slope.size()!=kNumChannels)
+        {
+            ostringstream out;
+            out << "SetReferences - Given vector has " << slope.size() << " elements - expected " << kNumChannels << endl;
+            Error(out);
+            return false;
+        }
+
+        fBreakdownVoltage  = volt;
+        fCalibrationOffset = offset;
+        fCalibrationSlope  = slope;
         fOvervoltage.assign(kNumChannels, 0);
 
@@ -1528,5 +1540,6 @@
         volt.insert(volt.end(), fBreakdownVoltage.begin(),   fBreakdownVoltage.end());
         volt.insert(volt.end(), fOvervoltage.begin(),        fOvervoltage.end());
-        volt.insert(volt.end(), fChannelCalibration.begin(), fChannelCalibration.end());
+        volt.insert(volt.end(), fCalibrationOffset.begin(),  fCalibrationOffset.end());
+        volt.insert(volt.end(), fCalibrationSlope.begin(),   fCalibrationSlope.end());
         fDimGapd.Update(volt);
     }
@@ -1542,8 +1555,9 @@
         fDimVolt("BIAS_CONTROL/VOLTAGE", "F:416",
                  "|Uout[V]:Output voltage"),
-        fDimGapd("BIAS_CONTROL/NOMINAL", "F:416;F:416;F:416",
+        fDimGapd("BIAS_CONTROL/NOMINAL", "F:416;F:416;F:416;F:416",
                  "|Ubr[V]:Nominal breakdown voltage at 25deg C"
                  "|Uov[V]:Nominal overvoltage"
-                 "|Uoff[V]:Bias crate channel offsets")
+                 "|Uoff[V]:Bias crate channel calibration offsets"
+                 "|Uslope[V/dac]:Bias crate channel calibration slope")
     {
     }
@@ -2140,5 +2154,5 @@
         }
 
-        if (!fBias.SetReferences(map.Vgapd(), map.Voffset()))
+        if (!fBias.SetReferences(map.Vgapd(), map.Voffset(), map.Vslope()))
         {
             T::Error("Setting reference voltages failed.");
