Index: /trunk/MagicSoft/Mars/Changelog
===================================================================
--- /trunk/MagicSoft/Mars/Changelog	(revision 3736)
+++ /trunk/MagicSoft/Mars/Changelog	(revision 3737)
@@ -57,4 +57,7 @@
      - included calibration of rel.Times, to be chosen with a flag 
        RelTimeCalibration()
+     - signal extractor and arrival time extractor can be chosen by 
+       flags as well (see Class description)
+
 
    * mbadpixels/MBadPixelsCam.cc
Index: /trunk/MagicSoft/Mars/mjobs/MJCalibration.cc
===================================================================
--- /trunk/MagicSoft/Mars/mjobs/MJCalibration.cc	(revision 3736)
+++ /trunk/MagicSoft/Mars/mjobs/MJCalibration.cc	(revision 3737)
@@ -38,4 +38,10 @@
 //End_Html
 //
+// Different signal extractors can be chosen via the command SetExtractorLevel(UInt_t i)
+// Up to now, the following extractors are available:
+// i=1: Use MExtractSignal  (fixed window)
+// i=2: Use MExtractSignal2 (sliding window: default)
+// i=3: Use MExtractSignal3 (coherent sliding window for all pixels)
+//
 // At the end of the eventloop, plots and results are displayed, depending on 
 // the flags set (see DisplayResult()) 
@@ -62,4 +68,9 @@
 */
 //End_Html
+//
+// Different arrival time extractors can be chosen via the command SetArrivalTimeLevel(UInt_t i)
+// Up to now, the following extractors are available:
+// i=1: Use MArrivalTimeCalc  (using MCubicSpline, arrival time == position at half maximum)
+// i=2: Use MArrivalTimeCalc2 (mean time of fWindowSize time slices with the highest integral content: default)
 //
 /////////////////////////////////////////////////////////////////////////////
@@ -91,4 +102,10 @@
 #include "MCalibrationChargeBlindPix.h"
 #include "MCalibrationChargeCalc.h"
+
+#include "MHGausEvents.h"
+#include "MHCalibrationCam.h"
+#include "MHCalibrationChargeCam.h"
+#include "MHCalibrationRelTimeCam.h"
+#include "MCalibrationRelTimeCam.h"
 
 #include "MReadMarsFile.h"
@@ -100,8 +117,13 @@
 #include "MExtractBlindPixel.h"
 #include "MExtractSignal2.h"
+#include "MExtractSignal3.h"
 #include "MFCosmics.h"
 #include "MContinue.h"
 #include "MFillH.h"
 
+#include "MArrivalTimeCam.h"
+#include "MArrivalTimeCalc.h"
+#include "MArrivalTimeCalc2.h"
+
 #include "MJCalibration.h"
 #include "MStatusDisplay.h"
@@ -115,8 +137,10 @@
 // Default constructor. 
 //
-// Sets fRuns to 0, fColor to kNONE, fDisplay to kNormalDisplay
+// Sets fRuns to 0, fColor to kNONE, fDisplay to kNormalDisplay, 
+// fRelTime to kFALSE, fExtractorLevel to 2, fArrivalTimeLevel to 2
 //
 MJCalibration::MJCalibration(const char *name, const char *title) 
-    : fRuns(0), fColor(MCalibrationCam::kNONE), fDisplayType(kNormalDisplay)
+    : fRuns(0), fColor(MCalibrationCam::kNONE), fDisplayType(kNormalDisplay),
+      fRelTimes(kFALSE), fExtractorLevel(2), fArrivalTimeLevel(2)
 {
   fName  = name  ? name  : "MJCalibration";
@@ -265,5 +289,12 @@
     MHCamera disp28(geomcam, "Cal;AbsTimeMean",       "Abs. Arrival Times");
     MHCamera disp29(geomcam, "Cal;AbsTimeRms",        "RMS of Arrival Times");
-
+    MHCamera disp30(geomcam, "time;MeanTime",         "Mean Rel. Arrival Times");
+    MHCamera disp31(geomcam, "time;SigmaTime",        "Sigma Rel. Arrival Times");
+    MHCamera disp32(geomcam, "time;TimeProb",         "Probability of Time Fit");
+    MHCamera disp33(geomcam, "time;NotFitValid",      "Pixels with not valid fit results");
+    MHCamera disp34(geomcam, "time;Oscillating",      "Oscillating Pixels");
+
+
+    
     // Fitted charge means and sigmas
     disp1.SetCamContent(fCalibrationCam,  0);
@@ -366,4 +397,22 @@
     disp29.SetYTitle("RMS Abs. Time [FADC slices]");
 
+    if (fRelTimes)
+      {
+
+        disp30.SetCamContent(fRelTimeCam,0);
+        disp30.SetCamError(  fRelTimeCam,1);
+        disp31.SetCamContent(fRelTimeCam,2);
+        disp31.SetCamError(  fRelTimeCam,3);
+        disp32.SetCamContent(fRelTimeCam,4);
+        disp33.SetCamContent(fBadPixels,20);
+        disp34.SetCamContent(fBadPixels,21);
+    
+        disp30.SetYTitle("Time Offset [ns]");
+        disp31.SetYTitle("Timing resolution [ns]");
+        disp32.SetYTitle("P_{Time} [1]");
+        disp33.SetYTitle("[1]");
+        disp34.SetYTitle("[1]");
+      }
+    
     gStyle->SetOptStat(1111);
     gStyle->SetOptFit();
@@ -401,4 +450,15 @@
         CamDraw(c4, 2, 3, disp24, 0);
         CamDraw(c4, 3, 3, disp25, 0);
+
+        if (fRelTimes)
+          {
+            // Rel. Times
+            TCanvas &c5 = fDisplay->AddTab("Rel. Times");
+            c5.Divide(2,4);
+            
+            CamDraw(c5, 1, 2, disp30, 2);
+            CamDraw(c5, 2, 2, disp31, 2);
+          }
+
 
         return;
@@ -456,4 +516,14 @@
         CamDraw(c16, 2, 2, disp29, 1);
 
+        if (fRelTimes)
+          {
+            // Rel. Times
+            TCanvas &c17 = fDisplay->AddTab("Rel. Times");
+            c17.Divide(2,4);
+            
+            CamDraw(c17, 1, 2, disp30, 2, 1);
+            CamDraw(c17, 2, 2, disp31, 2, 1);
+          }
+        
         return;
       }
@@ -462,4 +532,18 @@
       {
 
+        MHCalibrationCam *cam = (MHCalibrationCam*)plist.FindObject("MHCalibrationChargeCam");
+
+        for (Int_t aidx=0;aidx<cam->GetAverageAreas();aidx++)
+          {
+            cam->GetAverageHiGainArea(aidx).DrawClone("all");
+            cam->GetAverageLoGainArea(aidx).DrawClone("all");
+          }
+        
+        for (Int_t sector=1;sector<cam->GetAverageSectors();sector++)
+          {
+            cam->GetAverageHiGainSector(sector).DrawClone("all");
+            cam->GetAverageLoGainSector(sector).DrawClone("all");
+          }
+
         // Charges
         TCanvas &c21 = fDisplay->AddTab("Fit.Charge");
@@ -535,4 +619,37 @@
         CamDraw(c30, 1, 2, disp28, 2);
         CamDraw(c30, 2, 2, disp29, 1);
+
+        if (fRelTimes)
+          {
+            // Rel. Times
+            TCanvas &c31 = fDisplay->AddTab("Rel. Times");
+            c31.Divide(3,4);
+            
+            CamDraw(c31, 1, 3, disp30, 2, 1);
+            CamDraw(c31, 2, 3, disp31, 2, 1);
+            CamDraw(c31, 3, 3, disp32, 4, 1);
+
+            // Time Defects
+            TCanvas &c32 = fDisplay->AddTab("Time Def.");
+            c32.Divide(2,2);
+            
+            CamDraw(c32, 1, 2, disp33,0);
+            CamDraw(c32, 2, 2, disp34,0);
+
+            MHCalibrationCam *cam = (MHCalibrationCam*)plist.FindObject("MHCalibrationRelTimeCam");
+            
+            for (Int_t aidx=0;aidx<cam->GetAverageAreas();aidx++)
+              {
+                cam->GetAverageHiGainArea(aidx).DrawClone("all");
+                cam->GetAverageLoGainArea(aidx).DrawClone("all");
+              }
+            
+            for (Int_t sector=1;sector<cam->GetAverageSectors();sector++)
+              {
+                cam->GetAverageHiGainSector(sector).DrawClone("all");
+                cam->GetAverageLoGainSector(sector).DrawClone("all");
+              }
+            
+          }
 
         return;
@@ -772,19 +889,23 @@
 //   2) MCalibrationQECam     (fQECam)
 //   3) MCalibrationChargeCam (fCalibrationCam)
-//   4) MBadPixelsCam         (fBadPixels)
-//   5) MCalibrationChargePINDiode
-//   6) MCalibrationChargeBlindPix
+//   4) MCalibrationRelTimeCam (fRelTimeCam)   (only if flag fRelTimes is chosen)
+//   5) MBadPixelsCam         (fBadPixels)
+//   6) MCalibrationChargePINDiode
+//   7) MCalibrationChargeBlindPix
 // - Put into the MTaskList:
 //   1)  MReadMarsFile
 //   2)  MBadPixelsMerge
 //   3)  MGeomApply
-//   4)  MExtractSignal2
+//   4)  MExtractSignal, MExtractSignal2 or MExtractSignal3, depending on fExtractorLevel
 //   5)  MExtractPINDiode
 //   6)  MExtractBlindPixel
-//   7)  MContinue(MFCosmics)
-//   8)  MFillH("MHCalibrationChargePINDiode", "MExtractedSignalPINDiode")
-//   9)  MFillH("MHCalibrationChargeBlindPix", "MExtractedSignalBlindPixel")
-//   10) MFillH("MHCalibrationChargeCam",      "MExtractedSignalCam")
-//   11) MCalibrationChargeCalc
+//   7)  MArrivalTimeCalc, MArrivalTimeCalc2, depending on fArrivalTimeLevel (only if flag fRelTimes is chosen)
+//   8)  MContinue(MFCosmics)
+//   9)  MFillH("MHCalibrationChargePINDiode", "MExtractedSignalPINDiode")
+//   10) MFillH("MHCalibrationChargeBlindPix", "MExtractedSignalBlindPixel")
+//   11) MFillH("MHCalibrationChargeCam",      "MExtractedSignalCam")
+//   12) MFillH("MHCalibrationChargeCam",      "MExtractedSignalCam")
+//   13) MCalibrationChargeCalc
+//   14) MFillH("MHCalibrationRelTimeCam",     "MArrivalTimeCam") (only if flag fRelTimes is chosen)
 // - Execute MEvtLoop
 // - DisplayResult()
@@ -793,107 +914,144 @@
 Bool_t MJCalibration::ProcessFile(MPedestalCam &pedcam)
 {
-    if (!fRuns)
-    {
-        *fLog << err << "No Runs choosen... abort." << endl;
-        return kFALSE;
-    }
-
-    if (fRuns->GetNumRuns() != fRuns->GetNumEntries())
-    {
-        *fLog << err << "Number of files found doesn't match number of runs... abort." << endl;
-        return kFALSE;
-    }
-
-    *fLog << inf;
-    fLog->Separator(GetDescriptor());
-    *fLog << "Calculate MCalibrationCam from Runs " << fRuns->GetRunsAsString() << endl;
-    *fLog << endl;
-
-    MReadMarsFile read("Events");
-    read.DisableAutoScheme();
-    static_cast<MRead&>(read).AddFiles(*fRuns);
-
-    //
-    // As long, as we don't have digital modules, 
-    // we have to set the color of the pulser LED by hand
-    //
-    MCalibrationChargePINDiode pindiode;
-    MCalibrationChargeBlindPix blindpix;
-
-    // Setup Tasklist
-    MParList plist;
-    plist.AddToList(&pedcam);
-    plist.AddToList(&fBadPixels);
-    plist.AddToList(&fQECam);
-    plist.AddToList(&fCalibrationCam);
-    plist.AddToList(&pindiode);
-    plist.AddToList(&blindpix);
-
-    MTaskList tlist;
-    plist.AddToList(&tlist);
-
-    MGeomApply               apply;
-    //    MBadPixelsMerge          merge(&fBadPixels);
-    MExtractPINDiode         pinext;
-    MExtractBlindPixel       blindext;
-    // MExtractSignal   extract; // Do not use this at the moment...
-    MExtractSignal2          extract;
-    MCalibrationChargeCalc   calcalc;
-
-    // 
-    // As long as there are no DM's, have to colour by hand 
-    //
-    calcalc.SetPulserColor(fColor);
-
-    MFillH fillpin("MHCalibrationChargePINDiode", "MExtractedSignalPINDiode");
-    MFillH fillbnd("MHCalibrationChargeBlindPix", "MExtractedSignalBlindPixel");
-    MFillH fillcam("MHCalibrationChargeCam",      "MExtractedSignalCam");
-    fillpin.SetNameTab("PINDiode");
-    fillbnd.SetNameTab("BlindPix");
-    fillcam.SetNameTab("Charge");
-
-    // 
-    // Apply a filter against cosmics
-    // (will have to be needed in the future
-    // when the calibration hardware-trigger is working)
-    // 
-    MFCosmics cosmics;
-    MContinue cont(&cosmics);
-
-    tlist.AddToList(&read);
-    //    tlist.AddToList(&merge);
-    tlist.AddToList(&apply);
-    tlist.AddToList(&extract);
-    tlist.AddToList(&pinext);  
-    tlist.AddToList(&blindext);
-    tlist.AddToList(&cont);
-    tlist.AddToList(&fillcam);
-    tlist.AddToList(&fillpin);
-    tlist.AddToList(&fillbnd);
-    tlist.AddToList(&calcalc);
-
-    // Create and setup the eventloop
-    MEvtLoop evtloop(fName);
-    evtloop.SetParList(&plist);
-    evtloop.SetDisplay(fDisplay);
-    evtloop.SetLogStream(fLog);
-
-    // Execute first analysis
-    if (!evtloop.Eventloop())
-    {
-        *fLog << err << GetDescriptor() << ": Failed." << endl;
-        return kFALSE;
-    }
-
-    tlist.PrintStatistics();
-
-    DisplayResult(plist);
-
-    if (!WriteResult())
-        return kFALSE;
-
-    *fLog << inf << GetDescriptor() << ": Done." << endl;
-
-    return kTRUE;
+  if (!fRuns)
+    {
+      *fLog << err << "No Runs choosen... abort." << endl;
+      return kFALSE;
+    }
+  
+  if (fRuns->GetNumRuns() != fRuns->GetNumEntries())
+    {
+      *fLog << err << "Number of files found doesn't match number of runs... abort." << endl;
+      return kFALSE;
+    }
+  
+  *fLog << inf;
+  fLog->Separator(GetDescriptor());
+  *fLog << "Calculate MCalibrationCam from Runs " << fRuns->GetRunsAsString() << endl;
+  *fLog << endl;
+  
+  MReadMarsFile read("Events");
+  read.DisableAutoScheme();
+  static_cast<MRead&>(read).AddFiles(*fRuns);
+  
+  MCalibrationChargePINDiode pindiode;
+  MCalibrationChargeBlindPix blindpix;
+  
+  // Setup Tasklist
+  MParList plist;
+  plist.AddToList(&pedcam);
+  plist.AddToList(&fBadPixels);
+  plist.AddToList(&fQECam);
+  plist.AddToList(&fCalibrationCam);
+  plist.AddToList(&pindiode);
+  plist.AddToList(&blindpix);
+
+  MTaskList tlist;
+  plist.AddToList(&tlist);
+  
+  MGeomApply               apply;
+  //    MBadPixelsMerge          merge(&fBadPixels);
+  MExtractPINDiode         pinext;
+  MExtractBlindPixel       blindext;
+  MExtractSignal           extract1; 
+  MExtractSignal2          extract2;
+  MExtractSignal3          extract3;
+  MArrivalTimeCalc         tmecalc1;
+  MArrivalTimeCalc2        tmecalc2;
+  MCalibrationChargeCalc   calcalc;
+  
+  // 
+  // As long as there are no DM's, have to colour by hand 
+  //
+  calcalc.SetPulserColor(fColor);
+  
+  MFillH fillpin("MHCalibrationChargePINDiode", "MExtractedSignalPINDiode");
+  MFillH fillbnd("MHCalibrationChargeBlindPix", "MExtractedSignalBlindPixel");
+  MFillH fillcam("MHCalibrationChargeCam",      "MExtractedSignalCam");
+  MFillH filltme("MHCalibrationRelTimeCam",     "MArrivalTimeCam");
+  fillpin.SetNameTab("PINDiode");
+  fillbnd.SetNameTab("BlindPix");
+  fillcam.SetNameTab("Charge");
+  filltme.SetNameTab("RelTimes");
+  
+  
+  // 
+  // Apply a filter against cosmics
+  // (will have to be needed in the future
+  // when the calibration hardware-trigger is working)
+  // 
+  MFCosmics cosmics;
+  MContinue cont(&cosmics);
+  
+  tlist.AddToList(&read);
+  //    tlist.AddToList(&merge);
+  tlist.AddToList(&apply);
+
+  if (fExtractorLevel <= 1)
+    tlist.AddToList(&extract1);
+  else if (fExtractorLevel == 2) 
+    tlist.AddToList(&extract2);
+  else if (fExtractorLevel == 3) 
+    tlist.AddToList(&extract3);
+  else
+    {
+      *fLog << err << GetDescriptor() 
+            << ": No valid Signal extractor has been chosen, have only: " << fExtractorLevel 
+            << " aborting..." << endl;
+      return kFALSE;
+    }
+  
+
+  tlist.AddToList(&pinext);  
+  tlist.AddToList(&blindext);
+  
+  if (fRelTimes)
+    {
+      plist.AddToList(&fRelTimeCam);
+      if (fArrivalTimeLevel <= 1)
+        tlist.AddToList(&tmecalc1);
+      else if (fArrivalTimeLevel == 2) 
+        tlist.AddToList(&tmecalc2);
+      else
+        {
+          *fLog << err << GetDescriptor() 
+                << ": No valid Signal ArrivalTime Level has been chosen, have only: " << fArrivalTimeLevel 
+                << " aborting..." << endl;
+          return kFALSE;
+        }
+    }
+
+  tlist.AddToList(&cont);
+  tlist.AddToList(&fillcam);
+  tlist.AddToList(&fillpin);
+  tlist.AddToList(&fillbnd);
+  tlist.AddToList(&calcalc);
+
+  if (fRelTimes)
+    tlist.AddToList(&filltme);
+  
+  // Create and setup the eventloop
+  MEvtLoop evtloop(fName);
+  evtloop.SetParList(&plist);
+  evtloop.SetDisplay(fDisplay);
+  evtloop.SetLogStream(fLog);
+  
+  // Execute first analysis
+  if (!evtloop.Eventloop())
+    {
+      *fLog << err << GetDescriptor() << ": Failed." << endl;
+      return kFALSE;
+    }
+  
+  tlist.PrintStatistics();
+  
+  DisplayResult(plist);
+  
+  if (!WriteResult())
+    return kFALSE;
+  
+  *fLog << inf << GetDescriptor() << ": Done." << endl;
+  
+  return kTRUE;
 }
 
Index: /trunk/MagicSoft/Mars/mjobs/MJCalibration.h
===================================================================
--- /trunk/MagicSoft/Mars/mjobs/MJCalibration.h	(revision 3736)
+++ /trunk/MagicSoft/Mars/mjobs/MJCalibration.h	(revision 3737)
@@ -4,4 +4,7 @@
 #ifndef MARS_MCalibrationChargeCam
 #include "MCalibrationChargeCam.h"
+#endif
+#ifndef MARS_MCalibrationRelTimeCam
+#include "MCalibrationRelTimeCam.h"
 #endif
 #ifndef MARS_MCalibrationQECam
@@ -26,12 +29,18 @@
   MRunIter *fRuns;                                         // Calibration files
   
-  MCalibrationChargeCam fCalibrationCam;                   // Calibration conversion factors FADC2Phe
-  MCalibrationQECam     fQECam;                            // Quantum efficiency, can be set from previous runs
-  MBadPixelsCam         fBadPixels;                        // Bad Pixels cam, can be set from previous runs
+  MBadPixelsCam          fBadPixels;                       // Bad Pixels cam, can be set from previous runs
+  MCalibrationChargeCam  fCalibrationCam;                  // Calibration conversion factors FADC2Phe
+  MCalibrationQECam      fQECam;                           // Quantum efficiency, can be set from previous runs
+  MCalibrationRelTimeCam fRelTimeCam;                      // Calibration constants rel. times
 
   MCalibrationCam::PulserColor_t fColor;                   // Colour of the pulsed LEDs
 
-  enum  Display_t { kFullDisplay, kDataCheck, kNormalDisplay }; // Possible Display types
+  enum  Display_t   { kFullDisplay, kDataCheck, kNormalDisplay }; // Possible Display types
+  
   Display_t fDisplayType;                                  // Chosen Display type
+
+  Bool_t fRelTimes;                                        // Flag if relative times have to be calibrated
+  UInt_t fExtractorLevel;                                  // Level signal extractor (e.g. MExtractSignal2) 
+  UInt_t fArrivalTimeLevel;                                // Level arr. time extractor (e.g. MArrivalTimeCalc2)
   
   void DrawProjection   ( MHCamera *obj, Int_t fit) const; // Draw projection of pixels values
@@ -42,5 +51,5 @@
   void   DisplayResult(MParList &plist);
   Bool_t WriteResult();
-  
+
 public:
 
@@ -51,17 +60,26 @@
   
   TString GetOutputFile() const;
-  
-  MCalibrationChargeCam &GetCalibrationCam()     { return fCalibrationCam; }
-  MCalibrationQECam     &GetQECam()              { return fQECam;          }    
-  const MBadPixelsCam   &GetBadPixels() const    { return fBadPixels;      }
+
+  MCalibrationChargeCam  &GetCalibrationCam()     { return fCalibrationCam; }  
+  MCalibrationRelTimeCam &GetRelTimeCam()         { return fRelTimeCam;     }
+  MCalibrationQECam      &GetQECam()              { return fQECam;          }    
+  const MBadPixelsCam    &GetBadPixels() const    { return fBadPixels;      }
   
   void SetBadPixels(const MBadPixelsCam &bad)    { bad.Copy(fBadPixels);   }
   void SetQECam    (const MCalibrationQECam &qe) { qe.Copy(fQECam);        }    
-  void SetColor    (const MCalibrationCam::PulserColor_t color) { fColor = color;   }
+  void SetColor    (const MCalibrationCam::PulserColor_t color) { fColor = color; }
 
   // Displays
-  void SetFullDisplay()  { fDisplayType = kFullDisplay;  }
-  void SetDataCheck()  { fDisplayType = kDataCheck;  }
-  void SetNormalDisplay()  { fDisplayType = kNormalDisplay;  }
+  void SetFullDisplay()    { fDisplayType = kFullDisplay;   }
+  void SetDataCheck()      { fDisplayType = kDataCheck;     }
+  void SetNormalDisplay()  { fDisplayType = kNormalDisplay; }
+
+  // Rel. Time
+  void SetRelTimeCalibration(const Bool_t b=kTRUE) { fRelTimes         = b; }
+
+  // Extractors
+  void SetExtractorLevel    (const UInt_t i=1    ) { fExtractorLevel   = i; }
+  void SetArrivalTimeLevel  (const UInt_t i=1    ) { fArrivalTimeLevel = i; }  
+      
   
   Bool_t ReadCalibrationCam();
