Index: trunk/FACT++/src/DataCalib.cc
===================================================================
--- trunk/FACT++/src/DataCalib.cc	(revision 14021)
+++ trunk/FACT++/src/DataCalib.cc	(revision 14022)
@@ -211,82 +211,55 @@
 }
 
-void ReverseCopy(const void *src, void *dest)
-{
-    reverse_copy(reinterpret_cast<const char*>(src),
-                 reinterpret_cast<const char*>(src)+sizeof(float),
-                 reinterpret_cast<char*>(dest));
-}
-
 void DataCalib::WriteFits()
 {
-#ifdef HAVE_FITS
-    FitsFile file(fMsg);
+    // EXCEPTION HANDLEING!
+    const string filename = FormFileName("drs.fits");
+
+    ofits file(filename.c_str());
 
     const uint16_t roi = fData.fRoi;
     const uint16_t ntm = fData.fNumTm;
 
-    file.AddColumn('I', "RunNumberBaseline");
-    file.AddColumn('I', "RunNumberGain");
-    file.AddColumn('I', "RunNumberTriggerOffset");
-    file.AddColumn('F', "BaselineMean",        1024*1440, "mV");
-    file.AddColumn('F', "BaselineRms",         1024*1440, "mV");
-    file.AddColumn('F', "GainMean",            1024*1440, "mV");
-    file.AddColumn('F', "GainRms",             1024*1440, "mV");
-    file.AddColumn('F', "TriggerOffsetMean",    roi*1440, "mV");
-    file.AddColumn('F', "TriggerOffsetRms",     roi*1440, "mV");
-    file.AddColumn('F', "TriggerOffsetTMMean",  roi*ntm,  "mV");
-    file.AddColumn('F', "TriggerOffsetTMRms",   roi*ntm,  "mV");
-
-    const string filename = FormFileName("drs.fits");
-
-    if (!file.OpenFile(filename))
-        return;
-
-    if (!file.OpenTable("DrsCalibration"))
-        return;
-
-    if (!file.WriteDefaultKeys("fadctrl"))
-        return;
-
-    if (!file.WriteKeyNT("STEP",     fData.fStep, "") ||
-        !file.WriteKeyNT("ADCRANGE", 2000,             "Dynamic range of the ADC in mV") ||
-        !file.WriteKeyNT("DACRANGE", 2500,             "Dynamic range of the DAC in mV") ||
-        !file.WriteKeyNT("ADC",      12,               "Resolution of ADC in bits")      ||
-        !file.WriteKeyNT("DAC",      16,               "Resolution of DAC in bits")      ||
-//        !file.WriteKeyNT("DAC_A",    fData.fDAC[0],    "Level of DAC 0 in DAC counts")   ||
-//        !file.WriteKeyNT("DAC_B",    fData.fDAC[1],    "Leval of DAC 1-3 in DAC counts") ||
-//        !file.WriteKeyNT("DAC_C",    fData.fDAC[4],    "Leval of DAC 4-7 in DAC counts") ||
-        !file.WriteKeyNT("NBOFFSET", fData.fNumOffset,       "Number of entries for offset calibration") ||
-        !file.WriteKeyNT("NBGAIN",   fData.fNumGain/1953125, "Number of entries for gain calibration")   ||
-        !file.WriteKeyNT("NBTRGOFF", fData.fNumTrgOff,       "Number of entries for trigger offset calibration") ||
-        !file.WriteKeyNT("NPIX",     1440,             "Number of channels in the camera") ||
-        !file.WriteKeyNT("NTM",      ntm,              "Number of time marker channels") ||
-        !file.WriteKeyNT("NROI",     roi,              "Region of interest")
-       )
-        return;
-
-    vector<char> buf(fStats.size()*sizeof(float));
-
-    char *src  = reinterpret_cast<char*>(fStats.data());
-    char *end  = reinterpret_cast<char*>(fStats.data()+fStats.size());
-    char *dest = buf.data();
-
-    while (src<end)
-    {
-        reverse_copy(src, src+sizeof(float), dest);
-        src  += sizeof(float);
-        dest += sizeof(float);
-    }
-
-    if (!file.AddRow())
-        return;
-
-    if (!file.WriteData(buf.data()+sizeof(float), (1440*1024*4 + 1440*roi*2 + ntm*roi*2 + 3)*sizeof(float)))
-        return;
+    file.AddColumnInt("RunNumberBaseline");
+    file.AddColumnInt("RunNumberGain");
+    file.AddColumnInt("RunNumberTriggerOffset");
+
+    file.AddColumnFloat(1024*1440, "BaselineMean",        "mV");
+    file.AddColumnFloat(1024*1440, "BaselineRms",         "mV");
+    file.AddColumnFloat(1024*1440, "GainMean",            "mV");
+    file.AddColumnFloat(1024*1440, "GainRms",             "mV");
+    file.AddColumnFloat( roi*1440, "TriggerOffsetMean",   "mV");
+    file.AddColumnFloat( roi*1440, "TriggerOffsetRms",    "mV");
+    file.AddColumnFloat( roi*ntm,  "TriggerOffsetTMMean", "mV");
+    file.AddColumnFloat( roi*ntm,  "TriggerOffsetTMRms",  "mV");
+
+    DataWriteFits2::WriteDefaultKeys(file);
+
+    file.SetInt("STEP",     fData.fStep, "");
+
+    file.SetInt("ADCRANGE", 2000, "Dynamic range of the ADC in mV");
+    file.SetInt("DACRANGE", 2500, "Dynamic range of the DAC in mV");
+    file.SetInt("ADC",      12,   "Resolution of ADC in bits");
+    file.SetInt("DAC",      16,   "Resolution of DAC in bits");
+    file.SetInt("NPIX",     1440, "Number of channels in the camera");
+    file.SetInt("NTM",      ntm,  "Number of time marker channels");
+    file.SetInt("NROI",     roi,  "Region of interest");
+
+    file.SetInt("NBOFFSET", fData.fNumOffset,       "Number of entries for offset calibration");
+    file.SetInt("NBGAIN",   fData.fNumGain/1953125, "Number of entries for gain calibration");
+    file.SetInt("NBTRGOFF", fData.fNumTrgOff,       "Number of entries for trigger offset calibration");
+
+    // file.WriteKeyNT("DAC_A",    fData.fDAC[0],    "Level of DAC 0 in DAC counts")   ||
+    // file.WriteKeyNT("DAC_B",    fData.fDAC[1],    "Leval of DAC 1-3 in DAC counts") ||
+    // file.WriteKeyNT("DAC_C",    fData.fDAC[4],    "Leval of DAC 4-7 in DAC counts") ||
+
+    file.WriteTableHeader("DrsCalibration");
+
+    const int n = (1440*1024*4 + 1440*roi*2 + ntm*roi*2 + 3)*sizeof(float);
+    file.WriteRow(fStats.data()+1, n);
 
     ostringstream str;
     str << "Wrote DRS calibration data (step=" << fData.fStep << ", roi=" << roi << ") to '" << filename << "'";
     Info(str.str());
-#endif
 }
 
