Index: trunk/MagicSoft/Mars/Changelog
===================================================================
--- trunk/MagicSoft/Mars/Changelog	(revision 3853)
+++ trunk/MagicSoft/Mars/Changelog	(revision 3854)
@@ -46,4 +46,9 @@
      - camera drawing facilities: CamDraw, DrawProjection and 
        DrawRadialProfile, used by all jobs
+
+   * mjobs/MJExtractCalibTest.[h,cc]
+   * mjobs/Makefile
+   * mjobs/MJobsLinkDef.h
+     - new class to test the calibration results
 
    * mcalib/MCalibrationChargeCalc.cc
Index: trunk/MagicSoft/Mars/mjobs/MJExtractCalibTest.cc
===================================================================
--- trunk/MagicSoft/Mars/mjobs/MJExtractCalibTest.cc	(revision 3854)
+++ trunk/MagicSoft/Mars/mjobs/MJExtractCalibTest.cc	(revision 3854)
@@ -0,0 +1,529 @@
+/* ======================================================================== *\
+!
+! *
+! * 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-2004
+!
+!
+\* ======================================================================== */
+
+/////////////////////////////////////////////////////////////////////////////
+//
+//  MJExtractCalibTest
+//
+/////////////////////////////////////////////////////////////////////////////
+#include "MJExtractCalibTest.h"
+
+#include <TFile.h>
+#include <TStyle.h>
+#include <TCanvas.h>
+#include <TSystem.h>
+
+#include "MLog.h"
+#include "MLogManip.h"
+
+#include "MRunIter.h"
+#include "MParList.h"
+#include "MTaskList.h"
+#include "MEvtLoop.h"
+
+#include "MHCamera.h"
+
+#include "MPedestalCam.h"
+#include "MBadPixelsCam.h"
+#include "MCerPhotEvt.h"
+#include "MCalibrationChargeCam.h"
+#include "MCalibrationQECam.h"
+#include "MHCamEvent.h"
+
+#include "MReadMarsFile.h"
+#include "MGeomApply.h"
+#include "MExtractSignal.h"
+#include "MFillH.h"
+#include "MCalibrate.h"
+#include "MPedPhotCalc.h"
+#include "MWriteRootFile.h"
+
+#include "MStatusDisplay.h"
+
+ClassImp(MJExtractCalibTest);
+
+using namespace std;
+
+MJExtractCalibTest::MJExtractCalibTest(const char *name, const char *title) : fRuns(0)
+{
+    fName  = name  ? name  : "MJExtractCalibTest";
+    fTitle = title ? title : "Tool to extract, calibrate and test signals from a file";
+}
+
+
+void MJExtractCalibTest::DisplayResult(MParList &plist)
+{
+  if (!fDisplay)
+    return;
+  
+  //
+  // Update display
+  //
+  TString title = fDisplay->GetTitle();
+  title += "--  Extraction-Calibration-Test ";
+  title += fRuns->GetRunsAsString();
+  title += "  --";
+  fDisplay->SetTitle(title);
+
+  //
+  // Get container from list
+  //
+  MGeomCam &geomcam = *(MGeomCam*)plist.FindObject("MGeomCam");
+  
+  // Create histograms to display
+  MHCamera disp1 (geomcam, "Cal;Photons",           "Mean of calibrated Photons");
+  MHCamera disp2 (geomcam, "Cal;SigmaPhotons",      "Sigma of calibrated photons");
+  MHCamera disp3 (geomcam, "Cal;PhotonsPerArea",    "Mean Photons per Area");
+  MHCamera disp4 (geomcam, "Cal;SigmaPhotPerArea",  "Sigma Photons per Area");
+
+  // Fitted charge means and sigmas
+  disp1.SetCamContent(fTestCam,  0);
+  disp1.SetCamError(  fTestCam,  1);
+  disp2.SetCamContent(fTestCam,  2);
+  disp2.SetCamError(  fTestCam,  3);
+  disp3.SetCamContent(fTestCam,  7);
+  disp3.SetCamError(  fTestCam,  8);
+  disp4.SetCamContent(fTestCam,  9);
+  disp4.SetCamError(  fTestCam,  10);
+
+  disp1.SetYTitle("Photons");
+  disp2.SetYTitle("\\sigma_{phot}");
+  disp3.SetYTitle("Photons per Area [mm^{-2}]");
+  disp4.SetYTitle("\\sigma_{phot} per Area [mm^{-2}]");
+  
+  gStyle->SetOptStat(1111);
+  gStyle->SetOptFit();
+
+  TCanvas &c = fDisplay->AddTab("TestCharges");
+  c.Divide(4,4);
+
+  CamDraw(c, 1, 4, disp1, 2, 1);
+  CamDraw(c, 2, 4, disp2, 2, 1);        
+  CamDraw(c, 3, 4, disp3, 1, 1);        
+  CamDraw(c, 4, 4, disp4, 2, 1);        
+
+  return;
+
+}
+
+
+void MJExtractCalibTest::SetOutputPath(const char *path)
+{
+  fOutputPath = path;
+  if (fOutputPath.EndsWith("/"))
+    fOutputPath = fOutputPath(0, fOutputPath.Length()-1);
+}
+
+TString MJExtractCalibTest::GetOutputFileD() const
+{
+  if (!fRuns)
+    return "";
+  
+  return Form("%s/%s-F3.root", (const char*)fOutputPath, (const char*)fRuns->GetRunsAsFileName());
+}
+
+TString MJExtractCalibTest::GetOutputFileP() const
+{
+  if (!fRuns)
+    return "";
+
+  return Form("%s/%s-F2.root", (const char*)fOutputPath, (const char*)fRuns->GetRunsAsFileName());
+}
+
+Bool_t MJExtractCalibTest::ProcessD(MPedestalCam &pedcam, MCalibrationChargeCam &calcam, MCalibrationQECam &qecam)
+{
+  const TString fname = GetOutputFileD();
+  
+  if (gSystem->AccessPathName(fname, kFileExists))
+    return ProcessFileD(pedcam,calcam,qecam);
+  
+  return kTRUE;
+}
+
+Bool_t MJExtractCalibTest::ProcessFileD(MPedestalCam &pedcam, MCalibrationChargeCam &calcam, MCalibrationQECam &qecam)
+{
+  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 MExtractedSignalCam from Runs " << fRuns->GetRunsAsString() << endl;
+  *fLog << endl;
+  
+  MCerPhotEvt          cerphot;
+
+  // Setup Lists
+  MParList plist;
+  plist.AddToList(&pedcam);
+  plist.AddToList(&calcam);
+  plist.AddToList(&qecam);
+  plist.AddToList(&cerphot);
+  plist.AddToList(&fTestCam);
+  plist.AddToList(&fBadPixels);
+  
+  MTaskList tlist;
+  plist.AddToList(&tlist);
+
+  // Setup Task-lists
+  MReadMarsFile read("Events");
+  read.DisableAutoScheme();
+  static_cast<MRead&>(read).AddFiles(*fRuns);
+  
+  MGeomApply      apply; // Only necessary to craete geometry
+  MExtractSignal  extract;
+  MCalibrate      photcalc;
+  photcalc.SetCalibrationMode(MCalibrate::kFfactor);
+
+  MHCamEvent evt("ExtSignal");
+  evt.SetType(0);
+  MFillH fill(&evt, "MExtractedSignalCam");
+  
+  MFillH fillcam("MHCalibrationTestCam", "MCerPhotEvt");
+  fillcam.SetNameTab("Test");
+
+  /*
+  MWriteRootFile write(GetOutputFileD(), "RECREATE", fRuns->GetRunsAsString(), 2);
+  write.AddContainer("MExtractedSignalCam", "Events");
+  write.AddContainer("MTime",               "Events");
+  write.AddContainer("MRawEvtHeader",       "Events");
+  write.AddContainer("MPedestalCam",        "RunHeaders");
+  write.AddContainer("MRawRunHeader",       "RunHeaders");
+  write.AddContainer("MBadPixelsCam",       "RunHeaders");
+  */
+
+  tlist.AddToList(&read);
+  tlist.AddToList(&apply);
+  tlist.AddToList(&extract);
+  if (TestBit(kEnableGraphicalOutput))
+    tlist.AddToList(&fill);
+  tlist.AddToList(&photcalc);
+  tlist.AddToList(&fillcam);
+  //  tlist.AddToList(&write);
+  
+  // 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);
+
+  *fLog << inf << GetDescriptor() << ": Done." << endl;
+  
+  return kTRUE;
+}
+
+Bool_t MJExtractCalibTest::ReadPedPhotCam()
+{
+    const TString fname = GetOutputFileP();
+
+    if (gSystem->AccessPathName(fname, kFileExists))
+    {
+        *fLog << err << "Input file " << fname << " doesn't exist." << endl;
+        return kFALSE;
+    }
+
+    *fLog << inf << "Reading from file: " << fname << endl;
+
+    TFile file(fname, "READ");
+    if (fPedPhotCam.Read()<=0)
+    {
+        *fLog << "Unable to read MPedPhotCam from " << fname << endl;
+        return kFALSE;
+    }
+
+    if (file.FindKey("MBadPixelsCam"))
+    {
+        MBadPixelsCam bad;
+        if (bad.Read()<=0)
+        {
+            *fLog << "Unable to read MBadPixelsCam from " << fname << endl;
+            return kFALSE;
+        }
+        fBadPixels.Merge(bad);
+    }
+
+    if (fDisplay /*&& !fDisplay->GetCanvas("Pedestals")*/) // FIXME!
+        fDisplay->Read();
+
+    return kTRUE;
+}
+
+Bool_t MJExtractCalibTest::ProcessP(MPedestalCam &pedcam, MCalibrationChargeCam &calcam, MCalibrationQECam &qecam)
+{
+    if (!ReadPedPhotCam())
+        return ProcessFileP(pedcam, calcam, qecam);
+
+    return kTRUE;
+}
+
+Bool_t MJExtractCalibTest::ProcessFileP(MPedestalCam &pedcam, MCalibrationChargeCam &calcam, MCalibrationQECam &qecam)
+{
+    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 MExtractedSignalCam from Runs " << fRuns->GetRunsAsString() << endl;
+    *fLog << endl;
+
+    MReadMarsFile read("Events");
+    read.DisableAutoScheme();
+    static_cast<MRead&>(read).AddFiles(*fRuns);
+
+    // Setup Tasklist
+    MParList plist;
+    plist.AddToList(&pedcam);
+    plist.AddToList(&calcam);
+    plist.AddToList(&fPedPhotCam);
+    plist.AddToList(&fBadPixels);
+
+    MTaskList tlist;
+    plist.AddToList(&tlist);
+
+    MGeomApply      apply; // Only necessary to craete geometry
+    MExtractSignal  extract;
+    MCalibrate      calib;
+    MPedPhotCalc    calc;
+
+    MHCamEvent evt1("ExtOffset");
+    MHCamEvent evt2("CalOffset");
+    evt1.SetType(0);
+    evt2.SetType(0);
+    MFillH fill1(&evt1, "MExtractedSignalCam", "FillExtractedSignal");
+    MFillH fill2(&evt2, "MCerPhotEvt",         "FillCerPhotEvt");
+
+    tlist.AddToList(&read);
+    tlist.AddToList(&apply);
+    tlist.AddToList(&extract);
+    if (TestBit(kEnableGraphicalOutput))
+        tlist.AddToList(&fill1);
+    tlist.AddToList(&calib);
+    tlist.AddToList(&calc);
+    if (TestBit(kEnableGraphicalOutput))
+        tlist.AddToList(&fill2);
+
+    // 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);
+
+    *fLog << inf << GetDescriptor() << ": Done." << endl;
+
+    return kTRUE;
+}
+
+/*
+Bool_t MJExtractCalibTest::ProcessFile(MPedestalCam *pedcam, MCalibrationChargeCam *calcam)
+{
+    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;
+    }
+
+    Int_t type = 0;
+    if (pedcam &&  calcam) type = 2;
+    if (pedcam && !calcam) type = 3;
+
+    *fLog << inf;
+    fLog->Separator(GetDescriptor());
+    *fLog << "Calculating from Runs " << fRuns->GetRunsAsString() << endl;
+    *fLog << endl;
+
+    MReadMarsFile read("Events");
+    read.DisableAutoScheme();
+    static_cast<MRead&>(read).AddFiles(*fRuns);
+
+    // Setup Tasklist
+    MParList plist;
+    switch (type)
+    {
+    case 2:
+        plist.AddToList(calcam);
+        plist.AddToList(&fPedPhotCam);
+    case 3:
+        plist.AddToList(pedcam);
+    }
+
+    MTaskList tlist;
+    plist.AddToList(&tlist);
+
+    MGeomApply     apply; // Only necessary to craete geometry
+    MExtractSignal extract;
+    MCalibrate     calib;
+    MPedPhotCalc   calc;
+
+
+    MHCamEvent evt1("ExtOffset");
+    MHCamEvent evt2("CalOffset");
+    evt1.SetType(0);
+    evt2.SetType(0);
+    MFillH fill1(&evt1, "MExtractedSignalCam", "FillExtractedSignal");
+    MFillH fill2(&evt2, "MCerPhotEvt",         "FillCerPhotEvt");
+
+    tlist.AddToList(&read);
+    tlist.AddToList(&apply);
+    tlist.AddToList(&extract);
+    if (TestBit(kEnableGraphicalOutput))
+        tlist.AddToList(&fill1);
+    tlist.AddToList(&calib);
+    tlist.AddToList(&calc);
+    if (TestBit(kEnableGraphicalOutput))
+        tlist.AddToList(&fill2);
+
+
+    MHCamEvent evt("ExtSignal");
+    evt.SetType(0);
+    MFillH fill(&evt, "MExtractedSignalCam");
+
+    MWriteRootFile write(GetOutputFileD(), "RECREATE", fRuns->GetRunsAsString(), 2);
+    write.AddContainer("MExtractedSignalCam", "Events");
+    write.AddContainer("MTime",               "Events");
+    write.AddContainer("MRawRunHeader",       "RunHeaders");
+    write.AddContainer("MPedestalCam",        "RunHeaders");
+
+    tlist.AddToList(&read);
+    tlist.AddToList(&apply);
+    tlist.AddToList(&extract);
+    if (TestBit(kEnableGraphicalOutput))
+        tlist.AddToList(&fill);
+    tlist.AddToList(&write);
+
+    // 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;
+
+
+    // ------------------------------------------------------
+
+    MGeomApply     apply; // Only necessary to craete geometry
+    MExtractSignal extract;
+    MCalibrate     calib;
+    MPedPhotCalc   calc;
+
+    MHCamEvent evt1("ExtOffset");
+    MHCamEvent evt2("CalOffset");
+    evt1.SetType(0);
+    evt2.SetType(0);
+    MFillH fill1(&evt1, "MExtractedSignalCam", "FillExtractedSignal");
+    MFillH fill2(&evt2, "MCerPhotEvt",         "FillCerPhotEvt");
+
+    tlist.AddToList(&read);
+    tlist.AddToList(&apply);
+    tlist.AddToList(&extract);
+    if (TestBit(kEnableGraphicalOutput))
+        tlist.AddToList(&fill1);
+    tlist.AddToList(&calib);
+    tlist.AddToList(&calc);
+    if (TestBit(kEnableGraphicalOutput))
+        tlist.AddToList(&fill2);
+
+    // 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/MJExtractCalibTest.h
===================================================================
--- trunk/MagicSoft/Mars/mjobs/MJExtractCalibTest.h	(revision 3854)
+++ trunk/MagicSoft/Mars/mjobs/MJExtractCalibTest.h	(revision 3854)
@@ -0,0 +1,64 @@
+#ifndef MARS_MJExtractCalibTest
+#define MARS_MJExtractCalibTest
+
+#ifndef MARS_MHCalibrationTestCam
+#include "MHCalibrationTestCam.h"
+#endif
+#ifndef MARS_MPedPhotCam
+#include "MPedPhotCam.h"
+#endif
+#ifndef MARS_MBadPixelsCam
+#include "MBadPixelsCam.h"
+#endif
+#ifndef MARS_MGCamDisplays
+#include "MGCamDisplays.h"
+#endif
+
+class MRunIter;
+class MParList;
+class MPedestalCam;
+class MCalibrationChargeCam;
+class MCalibrationQECam;
+class MPedPhotCam;
+class MHCalibrationTestCam;
+class MJExtractCalibTest : public MParContainer, public MGCamDisplays
+{
+private:
+
+  TString fOutputPath;
+
+  MRunIter *fRuns;
+  
+  MBadPixelsCam        fBadPixels;
+  MHCalibrationTestCam fTestCam;
+  MPedPhotCam          fPedPhotCam;
+
+  Bool_t ReadPedPhotCam();
+    
+  void   DisplayResult(MParList &plist);
+  
+  Bool_t ProcessFileD(MPedestalCam &pedcam, MCalibrationChargeCam &calcam, MCalibrationQECam &qecam);
+  Bool_t ProcessFileP(MPedestalCam &pedcam, MCalibrationChargeCam &calcam, MCalibrationQECam &qecam);
+
+public:
+  MJExtractCalibTest(const char *name=NULL, const char *title=NULL);
+  
+  void SetInput(MRunIter *iter) { fRuns = iter; }
+  void SetOutputPath(const char *path=".");
+  
+  TString GetOutputFileP() const;
+  TString GetOutputFileD() const;
+  
+  MHCalibrationTestCam &GetTestCam()    { return fTestCam; }
+  MPedPhotCam          &GetPedPhotCam() { return fPedPhotCam; }
+  const MBadPixelsCam &GetBadPixels()  const { return fBadPixels; }
+  
+  void SetBadPixels(const MBadPixelsCam &bad) { bad.Copy(fBadPixels); }
+  
+  Bool_t ProcessD(MPedestalCam &pedcam, MCalibrationChargeCam &calcam, MCalibrationQECam &qecam);
+  Bool_t ProcessP(MPedestalCam &pedcam, MCalibrationChargeCam &calcam, MCalibrationQECam &qecam);
+  
+  ClassDef(MJExtractCalibTest, 0) // Tool to extract, calibrate and test the signal 
+};
+
+#endif
Index: trunk/MagicSoft/Mars/mjobs/Makefile
===================================================================
--- trunk/MagicSoft/Mars/mjobs/Makefile	(revision 3853)
+++ trunk/MagicSoft/Mars/mjobs/Makefile	(revision 3854)
@@ -35,4 +35,5 @@
            MJCalibration.cc \
            MJExtractSignal.cc \
+           MJExtractCalibTest.cc \
            MGCamDisplays.cc 
 
