Index: /trunk/Mars/mcalib/MCalibrateDrsTimes.cc
===================================================================
--- /trunk/Mars/mcalib/MCalibrateDrsTimes.cc	(revision 14895)
+++ /trunk/Mars/mcalib/MCalibrateDrsTimes.cc	(revision 14895)
@@ -0,0 +1,197 @@
+/* ======================================================================== *\
+!
+! *
+! * This file is part of MARS, the MAGIC Analysis and Reconstruction
+! * Software. It is distributed to you in the hope that it can be a useful
+! * and timesaving tool in analysing Data of imaging Cerenkov telescopes.
+! * It is distributed WITHOUT ANY WARRANTY.
+! *
+! * Permission to use, copy, modify and distribute this software and its
+! * documentation for any purpose is hereby granted without fee,
+! * provided that the above copyright notice appear in all copies and
+! * that both that copyright notice and this permission notice appear
+! * in supporting documentation. It is provided "as is" without express
+! * or implied warranty.
+! *
+!
+!
+!   Author(s): Markus Gaug  04/2004 <mailto:markus@ifae.es>
+!
+!   Copyright: MAGIC Software Development, 2000-2006
+!
+!
+\* ======================================================================== */
+
+//////////////////////////////////////////////////////////////////////////////
+//
+//   MCalibrateDrsTimes
+//
+//   This task takes the extracted arrival times from MArrivalTimeCam for each  
+//   pixel and applies the offset calibrated in MCalibrationRelTimeCam 
+//   The calibrated arrival time and its error gets stored in MSignalCam. 
+//
+//   Input Containers:
+//    MArrivalTimeCam 
+//    MCalibrationRelTimeCam
+//
+//   Output Containers:
+//    MSignalCam
+//
+//////////////////////////////////////////////////////////////////////////////
+#include "MCalibrateDrsTimes.h"
+
+#include "MLog.h"
+#include "MLogManip.h"
+
+#include "MParList.h"
+
+#include "MGeomCam.h"
+
+#include "MCalibrationRelTimeCam.h"
+#include "MCalibrationRelTimePix.h"
+
+#include "MArrivalTimeCam.h"
+#include "MArrivalTimePix.h"
+
+#include "MBadPixelsCam.h"
+#include "MBadPixelsPix.h"
+
+#include "MSignalCam.h"
+#include "MSignalPix.h"
+
+#include "MRawRunHeader.h"
+#include "MRawEvtData.h"
+#include "MHDrsCalib.h"
+
+ClassImp(MCalibrateDrsTimes);
+
+using namespace std;
+// --------------------------------------------------------------------------
+//
+// Default constructor. 
+//
+MCalibrateDrsTimes::MCalibrateDrsTimes(const char *name, const char *title) 
+    : fRunHeader(NULL), fCalib(NULL), fBadPixels(NULL), fSignals(NULL),
+    fArrivalTime(NULL), fArrivalTimeU(NULL), fNameArrivalTime("MArrivalTimeCam"),
+    fNameCalibrated("MSignalCam"), fNameUncalibrated(""), fIsTimeMarker(kFALSE)
+{
+    fName  = name  ? name  : "MCalibrateDrsTimes";
+    fTitle = title ? title : "Task to calculate the calibrated arrival times of photons in one event";
+}
+
+// --------------------------------------------------------------------------
+//
+// The PreProcess searches for the following input containers:
+//  - MGeomCam
+//  - MCalibrationRelTimesCam
+//  - MArrivalTimeCam
+//  - MBadPixelsCam
+//
+Int_t MCalibrateDrsTimes::PreProcess(MParList *pList)
+{
+    fSignals = (MArrivalTimeCam*)pList->FindObject(AddSerialNumber(fNameArrivalTime), "MArrivalTimeCam");
+    if (!fSignals)
+    {
+        *fLog << err << AddSerialNumber("MArrivalTimeCam") << " not found ... aborting" << endl;
+        return kFALSE;
+    }
+
+    fRaw = (MRawEvtData*)pList->FindObject(AddSerialNumber("MRawEvtData"));
+    if (!fRaw)
+    {
+        *fLog << err << AddSerialNumber("MRawEvtData") << " not found ... aborting" << endl;
+        return kFALSE;
+    }
+
+    fBadPixels = (MBadPixelsCam*)pList->FindObject(AddSerialNumber("MBadPixelsCam"));
+    if (!fBadPixels)
+        *fLog << warn << AddSerialNumber("MBadPixelsCam") << " not found ... ignoring." << endl;
+
+    fCalib = (MDrsCalibrationTime*)pList->FindObject("MDrsCalibrationTime");
+    if (!fCalib)
+        *fLog << warn << "MDrsCalibrationTime not found... no calibratuon will be applied." << endl;
+
+    fArrivalTime = (MSignalCam*)pList->FindCreateObj(AddSerialNumber("MSignalCam"), fNameCalibrated);
+    if (!fArrivalTime)
+        return kFALSE;
+
+    if (!fNameUncalibrated.IsNull())
+    {
+        fArrivalTimeU = (MSignalCam*)pList->FindCreateObj("MSignalCam", fNameUncalibrated);
+        if (!fArrivalTimeU)
+            return kFALSE;
+    }
+
+    return kTRUE;
+}
+
+Bool_t MCalibrateDrsTimes::ReInit(MParList *pList)
+{
+    fRunHeader = (MRawRunHeader*)pList->FindObject(AddSerialNumber("MRawRunHeader"));
+    if (!fRunHeader)
+    {
+        *fLog << err << AddSerialNumber("MRawRunHeader") << " not found ... aborting." << endl;
+        return kFALSE;
+    }
+
+    fFreq = fRunHeader->GetFreqSampling();
+
+    return kTRUE;
+}
+
+// --------------------------------------------------------------------------
+//
+// Apply the calibration factors to the extracted signal according to the 
+// selected calibration method
+//
+Int_t MCalibrateDrsTimes::Process()
+{
+    const UInt_t npix = fSignals->GetSize();
+
+    const UShort_t *idx = fRaw->GetPixelIds();
+    const int16_t  *start = reinterpret_cast<int16_t*>(fRaw->GetStartCells());
+
+    for (UInt_t hw=(fIsTimeMarker?8:0); hw<npix; hw+=(fIsTimeMarker?9:1))
+    //for (UInt_t hw=8; hw<npix; hw+=9)
+    {
+        const UInt_t sw = idx[hw];
+
+        if (start[hw]<0)
+        {
+            if (fBadPixels)
+                (*fBadPixels)[sw].SetUnsuitable(MBadPixelsPix::kUnsuitableEvt);
+            continue;
+        }
+
+        if (fBadPixels && !fIsTimeMarker && (*fBadPixels)[sw].IsUnsuitable(MBadPixelsPix::kUnsuitableRun))
+            continue;
+
+        const Float_t signal = (*fSignals)[sw].GetArrivalTime();
+        const Float_t offset = fCalib ? fCalib->GetOffset(hw, start[hw], signal) : 0;
+        const Float_t delay  = fCalib ? fCalib->GetDelay(sw) : 0;
+
+        //if (fIsTimeMarker)
+        //    offset = fCalib ? fCalib->GetDelay(hw, start[hw], signal) : 0;
+
+        // convert from slices to ns
+        const Float_t utime = 1000*(signal       )/fFreq-delay; // [ns]
+        const Float_t time  = 1000*(signal-offset)/fFreq-delay; // [ns]
+
+        /*
+        (*fArrivalTime)[sw].SetArrivalTime(time);
+        if (fArrivalTimeU)
+            (*fArrivalTimeU)[sw].SetArrivalTime(utime);
+            */
+
+        for (UInt_t j=hw-(fIsTimeMarker?8:0); j<=hw; j++)
+        {
+            (*fArrivalTime)[idx[j]].SetArrivalTime(time);
+            if (fArrivalTimeU)
+                (*fArrivalTimeU)[idx[j]].SetArrivalTime(utime);
+        }
+    }
+
+    fArrivalTime->SetReadyToSave();
+
+    return kTRUE;
+}
Index: /trunk/Mars/mcalib/MCalibrateDrsTimes.h
===================================================================
--- /trunk/Mars/mcalib/MCalibrateDrsTimes.h	(revision 14895)
+++ /trunk/Mars/mcalib/MCalibrateDrsTimes.h	(revision 14895)
@@ -0,0 +1,52 @@
+#ifndef MARS_MCalibrateDrsTimes
+#define MARS_MCalibrateDrsTimes
+
+#ifndef MARS_MTask
+#include "MTask.h"
+#endif
+
+class MGeomCam;
+class MBadPixelsCam;
+class MDrsCalibrationTime;
+class MArrivalTimeCam;
+class MRawRunHeader;
+class MRawEvtData;
+class MSignalCam;
+
+class MCalibrateDrsTimes : public MTask
+{
+private:
+    MRawRunHeader       *fRunHeader;
+    MRawEvtData         *fRaw;
+    MDrsCalibrationTime *fCalib; // Calibration rel. time constants
+    MBadPixelsCam       *fBadPixels;    // Bad Pixels information
+    MArrivalTimeCam     *fSignals;      // Extracted Arrival Time
+    MSignalCam          *fArrivalTime;  // Calibrated arrival times
+    MSignalCam          *fArrivalTimeU; // Uncalibrated arrival times
+
+    UShort_t fFreq;                        //! [MHz] Sampling Frequency
+
+    TString fNameArrivalTime;
+    TString fNameCalibrated;
+    TString fNameUncalibrated;
+
+    Bool_t fIsTimeMarker;
+
+    Int_t  PreProcess(MParList *pList);
+    Bool_t ReInit(MParList *pList);
+    Int_t  Process();
+
+public:
+    MCalibrateDrsTimes(const char *name=NULL, const char *title=NULL);
+
+    void SetNameArrivalTime(const char *name) { fNameArrivalTime = name; }
+    void SetNameCalibrated(const char *name) { fNameCalibrated = name; }
+    void SetNameUncalibrated(const char *name) { fNameUncalibrated = name; }
+
+    void SetTimeMarker(Bool_t tm=kTRUE) { fIsTimeMarker = tm; }
+
+    ClassDef(MCalibrateDrsTimes, 0)   // Task to calculate calibrated relative arrival times
+};
+ 
+
+#endif
