Index: /trunk/Mars/fact/tools/produce_drs_time_fits_file.C
===================================================================
--- /trunk/Mars/fact/tools/produce_drs_time_fits_file.C	(revision 18315)
+++ /trunk/Mars/fact/tools/produce_drs_time_fits_file.C	(revision 18315)
@@ -0,0 +1,165 @@
+// The FACT collaboration
+// Dominik Neise and Sebastian Mueller October 2014
+// A callisto like CERN-Root script to process the FACT DRS 
+// (Domino-Ring-Sampler) time calibration files. 
+//
+// The basic script is taken from the October 2014 analysis framework running on
+// La Palma, maintained by Daniela Dorner and Thomas Bretz. There it was called
+// "callisto_drs_time.C"
+
+// Dominik and Sebastian:
+// Our first approach was to use the MWriteFitsFile class but we have not been 
+// able to use it.
+
+// MWriteFitsFile fitsfile(outfile, 
+//                 MWriteFitsFile::kSingleFile, 
+//                 "RECREATE", 
+//                 "fitsfile", 
+//                 "atitle");
+// fitsfile.SetBytesPerSample("Data", 2);
+// fitsfile.AddContainer("MDrsCalibrationTime","DANDELION");
+
+#include "MLogManip.h"
+
+int produce_drs_time_fits_file(
+    const char *drs_time_file,  //* path to raw drs-time-calib-file
+    const char *drs_file,       //* path to drs.fits(.gz) file
+    const char *outfile         //* output path like yyyymmdd_rrr.drs.time.fits 
+){
+    gLog.Separator("produce_drs_time_fits_file");
+    gLog << all;
+    gLog << "DRS Timing " << drs_time_file << '\n';
+    gLog << "DRS 1024   " << drs_file << '\n';
+    gLog << endl;
+
+    MParList plist0;
+
+    MTaskList tlist0;
+    plist0.AddToList(&tlist0);
+
+    MDrsCalibration drscalib1024;
+    if (!drscalib1024.ReadFits(drs_file)){
+        gLog << "Error while opening drs amplitude calibration file:" 
+            << drs_file << "Aborting" << endl;
+        return 52; // DN: Why 52 I don't know.
+    }
+    plist0.AddToList(&drscalib1024);
+    
+    MDrsCalibrationTime timecam;
+    plist0.AddToList(&timecam);
+
+    MEvtLoop loop0("DetermineTimeCal");
+    loop0.SetParList(&plist0);
+
+    factfits drstimeRawFile(drs_time_file);
+    const int NumberOfChips = drstimeRawFile.GetInt("NPIX")/9;  // --> 160 
+    const int NumberOfCells = drstimeRawFile.GetInt("NROI");    // --> 1024
+    drstimeRawFile.close();
+
+    MRawFitsRead read0(drs_time_file);
+    tlist0.AddToList(&read0);
+    MGeomApply apply0;
+    tlist0.AddToList(&apply0);
+    MDrsCalibApply drsapply0;
+    tlist0.AddToList(&drsapply0);
+    MContinue cont0("MRawEvtHeader.GetTriggerID!=33792", "SelectTim");
+    tlist0.AddToList(&cont0);
+    MFillH fill0("MHDrsCalibrationTime");
+    fill0.SetNameTab("DeltaT");
+    tlist0.AddToList(&fill0);
+
+    if (!loop0.Eventloop(0)){
+        gLog << "Error performing the loop over the drs-time-run:" 
+            << drs_time_file << "Aborting" << endl;   
+        return 8; // DN: why 8 I don't know.
+    }
+
+    ofits drstimeFile(outfile);
+    drstimeFile.SetDefaultKeys();
+    drstimeFile.AddColumnDouble(  
+        NumberOfChips*NumberOfCells,
+        "SamplingTimeDeviation", "nominal slices",
+        "see following COMMENT."
+    );
+    drstimeFile.SetInt("NCHIPS", NumberOfChips, "number of drs chips");
+    drstimeFile.SetInt("NCELLS", NumberOfCells, "number of cells of each chip");
+    drstimeFile.AddComment(
+"The SamplingTimeDeviation specifies the deviation of the actual ");
+    drstimeFile.AddComment(
+"sampling time of a certain cell, from its nominal sampling time.");
+    drstimeFile.AddComment(
+"It is measured in nominal slices.");
+    drstimeFile.AddComment(
+"In order to convert the sample index into the actual sampling time");
+    drstimeFile.AddComment(
+"just do: ");
+    drstimeFile.AddComment(
+"     cell_index + td(cell_index) - td(stop_cell_index)");
+    drstimeFile.AddComment(
+"where td(i) refers to the SamplingTimeDeviation of cell i of the ");
+    drstimeFile.AddComment(
+"current DRS4 chip.");
+    drstimeFile.AddComment(
+"This gives you the actual sampling time of the cell measured in ");
+    drstimeFile.AddComment(
+"nominal slices [nsl] with respect to the stop cells sampling time.");
+    drstimeFile.AddComment(
+"Convert it to ns, simply by multiplication ");
+    drstimeFile.AddComment(
+"with 0.5 ns/nsl.");
+    drstimeFile.AddComment(
+"");
+
+    drstimeFile.AddComment(
+"In FACT it became common practice to measure un-time-calibrated ");
+    drstimeFile.AddComment(
+" DRS4 data in 'time slices' or simply 'samples', while ");
+    drstimeFile.AddComment(
+" time-calibrated DRS4 data usually measured in ns. Since the method,");
+    drstimeFile.AddComment(
+" that is emplyed to measure the DRS4 time calibration constants has ");
+    drstimeFile.AddComment(
+" no possibility to assert the actual length of a slice is really half");
+    drstimeFile.AddComment(
+" a nanosecond, this practice is not advisable.");
+    drstimeFile.AddComment(
+" I propose instead to call un-time-calibrated data 'samples',");
+    drstimeFile.AddComment(
+" since this is what they are. If one wants to stress the fact,");
+    drstimeFile.AddComment(
+" that no drs time calibration has been applied one should refer to ");
+    drstimeFile.AddComment(
+"'uncalibrated slices'. Since it *should* be common practice to apply");
+    drstimeFile.AddComment(
+" the drs4 time calibration in all cases, I also propose to use the");
+    drstimeFile.AddComment(
+" short term of 'slices' or 'sl'. If one wants to stress, that the");
+    drstimeFile.AddComment(
+" drs4 time calibration has actually been applied to the data,");
+    drstimeFile.AddComment(
+" the term 'calibrated slices' or 'nominal slices' or short 'nsl'.");
+
+    drstimeFile.WriteTableHeader("DRS_CELL_TIMES");
+
+    // By drs_sampling_time_deviations we refer to the deviations (measured in nominal slices) of
+    // the actual sampling time compared to the nominal sampling time of every cell of every chip.
+    double *drs_sampling_time_deviations = new double[ NumberOfChips * NumberOfCells ];
+    for (int chip = 0; chip < NumberOfChips; chip++){
+        for (int cell = 0; cell < NumberOfCells; cell++){
+            // Dominik and Sebastian:
+            // We ended with using DrsCalibrateTime.Sum() in order to retrieve 
+            // the contents DrsCalibrateTime.fStat.
+            // First we wanted to access the member fStat of class DrsCalibrateTime
+            // which is declared public but it did not work out of the box.
+            // drs_sampling_time_deviations[chip*NumberOfCells+cell] = 
+            // timecam.fStat[chip*NumberOfCells+cell].first;
+            drs_sampling_time_deviations[ chip * NumberOfCells + cell ] = 
+                timecam.Sum( chip * NumberOfCells + cell );
+        }
+    }
+
+    drstimeFile.WriteRow(drs_sampling_time_deviations, sizeof(double) * NumberOfChips * NumberOfCells);
+    drstimeFile.close();
+
+    return 0;
+}
