Index: trunk/MagicSoft/Mars/mjobs/MJCalibration.cc
===================================================================
--- trunk/MagicSoft/Mars/mjobs/MJCalibration.cc	(revision 3055)
+++ trunk/MagicSoft/Mars/mjobs/MJCalibration.cc	(revision 3069)
@@ -51,4 +51,5 @@
 #include "MReadMarsFile.h"
 #include "MGeomApply.h"
+#include "MBadPixelsMerge.h"
 #include "MExtractSignal.h"
 #include "MExtractSignal2.h"
@@ -382,4 +383,11 @@
         return kFALSE;
     }
+
+    if (fBadPixels.Write()<=0)
+    {
+        *fLog << err << "Unable to write MBadPixelsCam to " << oname << endl;
+        return kFALSE;
+    }
+
     return kTRUE;
 
@@ -426,4 +434,15 @@
         *fLog << "Unable to read MCalibrationCam 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);
     }
 
@@ -466,4 +485,6 @@
 
     MGeomApply       apply;
+    MBadPixelsMerge  merge(&fBadPixels);
+    // MExtractSignal   extract; // Do not use this at the moment...
     MExtractSignal2  extract;
     MCalibrationCalc calcalc;
@@ -476,6 +497,7 @@
     //calcalc.SkipBlindPixelFit();
 
+    tlist.AddToList(&read);
     tlist.AddToList(&apply);
-    tlist.AddToList(&read);
+    tlist.AddToList(&merge);
     tlist.AddToList(&extract);
     tlist.AddToList(&calcalc);
Index: trunk/MagicSoft/Mars/mjobs/MJCalibration.h
===================================================================
--- trunk/MagicSoft/Mars/mjobs/MJCalibration.h	(revision 3055)
+++ trunk/MagicSoft/Mars/mjobs/MJCalibration.h	(revision 3069)
@@ -4,4 +4,7 @@
 #ifndef MARS_MCalibrationCam
 #include "MCalibrationCam.h"
+#endif
+#ifndef MARS_MBadPixelsCam
+#include "MBadPixelsCam.h"
 #endif
 
@@ -21,4 +24,5 @@
 
     MCalibrationCam fCalibrationCam;
+    MBadPixelsCam   fBadPixels;
 
     void DrawProjection(MHCamera *obj1, Int_t fit) const;
@@ -35,5 +39,9 @@
 
     TString GetOutputFile() const;
-    MCalibrationCam &GetCalibrationCam() { return fCalibrationCam; }
+
+    const MCalibrationCam &GetCalibrationCam() const { return fCalibrationCam; }
+    const MBadPixelsCam   &GetBadPixels()      const { return fBadPixels; }
+
+    void SetBadPixels(MBadPixelsCam &bad) { bad.Copy(fBadPixels); }
 
     Bool_t ReadCalibrationCam();
Index: trunk/MagicSoft/Mars/mjobs/MJExtractSignal.cc
===================================================================
--- trunk/MagicSoft/Mars/mjobs/MJExtractSignal.cc	(revision 3055)
+++ trunk/MagicSoft/Mars/mjobs/MJExtractSignal.cc	(revision 3069)
@@ -51,4 +51,5 @@
 #include "MReadMarsFile.h"
 #include "MGeomApply.h"
+#include "MBadPixelsMerge.h"
 #include "MExtractSignal.h"
 #include "MFillH.h"
@@ -236,4 +237,11 @@
         return kFALSE;
     }
+
+    if (fBadPixels.Write()<=0)
+    {
+        *fLog << err << "Unable to write MBadPixelsCam to " << oname << endl;
+        return kFALSE;
+    }
+
     return kTRUE;
 
@@ -301,6 +309,7 @@
     plist.AddToList(&tlist);
 
-    MGeomApply     apply; // Only necessary to craete geometry
-    MExtractSignal extract;
+    MGeomApply      apply; // Only necessary to craete geometry
+    MBadPixelsMerge merge(&fBadPixels);
+    MExtractSignal  extract;
 
     MHCamEvent evt("ExtSignal");
@@ -313,7 +322,9 @@
     write.AddContainer("MRawRunHeader",       "RunHeaders");
     write.AddContainer("MPedestalCam",        "RunHeaders");
+    write.AddContainer("MBadPixelsCam",       "RunHeaders");
 
     tlist.AddToList(&read);
     tlist.AddToList(&apply);
+    tlist.AddToList(&merge);
     tlist.AddToList(&extract);
     if (TestBit(kEnableGraphicalOutput))
@@ -365,4 +376,15 @@
     }
 
+    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();
@@ -406,12 +428,14 @@
     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;
+    MGeomApply      apply; // Only necessary to craete geometry
+    MBadPixelsMerge merge(&fBadPixels);
+    MExtractSignal  extract;
+    MCalibrate      calib;
+    MPedPhotCalc    calc;
 
     MHCamEvent evt1("ExtOffset");
@@ -424,4 +448,5 @@
     tlist.AddToList(&read);
     tlist.AddToList(&apply);
+    tlist.AddToList(&merge);
     tlist.AddToList(&extract);
     if (TestBit(kEnableGraphicalOutput))
Index: trunk/MagicSoft/Mars/mjobs/MJExtractSignal.h
===================================================================
--- trunk/MagicSoft/Mars/mjobs/MJExtractSignal.h	(revision 3055)
+++ trunk/MagicSoft/Mars/mjobs/MJExtractSignal.h	(revision 3069)
@@ -4,4 +4,7 @@
 #ifndef MARS_MPedPhotCam
 #include "MPedPhotCam.h"
+#endif
+#ifndef MARS_MBadPixelsCam
+#include "MBadPixelsCam.h"
 #endif
 
@@ -21,5 +24,6 @@
     MRunIter *fRuns;
 
-    MPedPhotCam fPedPhotCam;
+    MPedPhotCam   fPedPhotCam;
+    MBadPixelsCam fBadPixels;
 
     void   DisplayResult(MParList &plist);
@@ -40,8 +44,11 @@
     TString GetOutputFileD() const;
 
+    const MPedPhotCam   &GetPedPhotCam() const { return fPedPhotCam; }
+    const MBadPixelsCam &GetBadPixels()  const { return fBadPixels; }
+
+    void SetBadPixels(MBadPixelsCam &bad) { bad.Copy(fBadPixels); }
+
     Bool_t ProcessD(MPedestalCam &pedcam);
     Bool_t ProcessP(MPedestalCam &pedcam, MCalibrationCam &calcam);
-
-    const MPedPhotCam &GetPedPhotCam() const { return fPedPhotCam; }
 
     ClassDef(MJExtractSignal, 0) // Tool to create a pedestal file (MPedestalCam)
Index: trunk/MagicSoft/Mars/mjobs/MJPedestal.cc
===================================================================
--- trunk/MagicSoft/Mars/mjobs/MJPedestal.cc	(revision 3055)
+++ trunk/MagicSoft/Mars/mjobs/MJPedestal.cc	(revision 3069)
@@ -52,4 +52,5 @@
 #include "MReadMarsFile.h"
 #include "MGeomApply.h"
+#include "MBadPixelsMerge.h"
 #include "MPedCalcPedRun.h"
 
@@ -87,6 +88,17 @@
     if (fPedestalCam.Read()<=0)
     {
-        *fLog << "Unable to read MPedestalCam from " << fname << endl;
-        return kFALSE;
+        *fLog << err << "Unable to read MPedestalCam from " << fname << endl;
+        return kFALSE;
+    }
+
+    if (file.FindKey("MBadPixelsCam"))
+    {
+        MBadPixelsCam bad;
+        if (bad.Read()<=0)
+        {
+            *fLog << err << "Unable to read MBadPixelsCam from " << fname << endl;
+            return kFALSE;
+        }
+        fBadPixels.Merge(bad);
     }
 
@@ -95,4 +107,80 @@
 
     return kTRUE;
+}
+
+void MJPedestal::DrawProjection(MHCamera *obj1, Int_t fit) const
+{
+    TH1D *obj2 = (TH1D*)obj1->Projection();
+    obj2->Draw();
+    obj2->SetBit(kCanDelete);
+
+    const Double_t min   = obj2->GetBinCenter(obj2->GetXaxis()->GetFirst());
+    const Double_t max   = obj2->GetBinCenter(obj2->GetXaxis()->GetLast());
+    const Double_t integ = obj2->Integral("width")/2.5066283;
+    const Double_t mean  = obj2->GetMean();
+    const Double_t rms   = obj2->GetRMS();
+    const Double_t width = max-min;
+
+    if (rms==0 || width==0)
+        return;
+
+    const TString dgausformula("([0]-[3])/[2]*exp(-0.5*(x-[1])*(x-[1])/[2]/[2])"
+                               "+[3]/[5]*exp(-0.5*(x-[4])*(x-[4])/[5]/[5])");
+
+    TF1 *f=0;
+    switch (fit)
+    {
+        // FIXME: MAYBE add function to TH1?
+    case 0:
+        f = new TF1("sgaus", "gaus(0)", min, max);
+        f->SetLineColor(kYellow);
+        f->SetBit(kCanDelete);
+        f->SetParNames("Area", "#mu", "#sigma");
+        f->SetParameters(integ/rms, mean, rms);
+        f->SetParLimits(0, 0,   integ);
+        f->SetParLimits(1, min, max);
+        f->SetParLimits(2, 0,   width/1.5);
+        obj2->Fit(f, "QLRM");
+        break;
+
+    case 1:
+        f = new TF1("dgaus", dgausformula, min, max);
+        f->SetLineColor(kYellow);
+        f->SetBit(kCanDelete);
+        f->SetParNames("A_{tot}", "#mu_{1}", "#sigma_{1}", "A_{2}", "#mu_{2}", "#sigma_{2}");
+        f->SetParameters(integ,         (min+mean)/2, width/4,
+                         integ/width/2, (max+mean)/2, width/4);
+        // The left-sided Gauss
+        f->SetParLimits(0, integ-1.5,      integ+1.5);
+        f->SetParLimits(1, min+(width/10), mean);
+        f->SetParLimits(2, 0,              width/2);
+        // The right-sided Gauss
+        f->SetParLimits(3, 0,    integ);
+        f->SetParLimits(4, mean, max-(width/10));
+        f->SetParLimits(5, 0,    width/2);
+        obj2->Fit(f, "QLRM");
+        break;
+
+    default:
+        obj2->Fit("gaus", "Q");
+        obj2->GetFunction("gaus")->SetLineColor(kYellow);
+        break;
+    }
+}
+
+void MJPedestal::CamDraw(TCanvas &c, Int_t x, Int_t y, MHCamera &cam1, Int_t fit)
+{
+    c.cd(x);
+    gPad->SetBorderMode(0);
+    MHCamera *obj1=(MHCamera*)cam1.DrawCopy("hist");
+    obj1->AddNotify(fPedestalCam);
+
+    c.cd(x+y);
+    gPad->SetBorderMode(0);
+    obj1->Draw();
+
+    c.cd(x+2*y);
+    gPad->SetBorderMode(0);
+    DrawProjection(obj1, fit);
 }
 
@@ -123,7 +211,8 @@
 
     disp0.SetCamContent(fPedestalCam, 0);
-    disp0.SetCamError(fPedestalCam, 1);
+    disp0.SetCamError  (fPedestalCam, 1);
+
     disp1.SetCamContent(fPedestalCam, 2);
-    disp1.SetCamError(fPedestalCam, 3);
+    disp1.SetCamError  (fPedestalCam, 3);
 
     disp0.SetYTitle("P [fadc/slice]");
@@ -136,93 +225,7 @@
     c3.Divide(2,3);
 
-    *fLog << "BALBALBALBA" <<endl;
-
     CamDraw(c3, 1, 2, disp0, 0);
     CamDraw(c3, 2, 2, disp1, 1);
-
-}
-
-
-void MJPedestal::DrawProjection(MHCamera *obj1, Int_t fit) const
-{
-  
-  TH1D *obj2 = (TH1D*)obj1->Projection();
-  obj2->Draw();
-  obj2->SetBit(kCanDelete);
-  
-  const Double_t min   = obj2->GetBinCenter(obj2->GetXaxis()->GetFirst());
-  const Double_t max   = obj2->GetBinCenter(obj2->GetXaxis()->GetLast());
-  const Double_t integ = obj2->Integral("width")/2.5066283;
-  const Double_t mean  = obj2->GetMean();
-  const Double_t rms   = obj2->GetRMS();
-  const Double_t width = max-min;
-  
-  if (rms == 0. || width == 0. )
-    return;
-
-  const TString dgausformula = TString("([0]-[3])/[2]*exp(-0.5*(x-[1])*(x-[1])/[2]/[2])"
-                                       "+[3]/[5]*exp(-0.5*(x-[4])*(x-[4])/[5]/[5])");
-
-  TF1 *f=0;
-  switch (fit)
-    {
-    case 0:
-      f = new TF1("sgaus","gaus(0)",min,max);
-      f->SetLineColor(kYellow);
-      f->SetBit(kCanDelete);
-      f->SetParNames("Area","#mu","#sigma");
-      f->SetParameters(integ/rms,mean,rms);
-      f->SetParLimits(0, 0.  , integ);
-      f->SetParLimits(1, min , max);
-      f->SetParLimits(2, 0   , width/1.5);
-      obj2->Fit(f,"QLRM");
-      break;
-      
-    case 1:
-      f = new TF1("dgaus",dgausformula.Data(),min,max);
-      f->SetLineColor(kYellow);
-      f->SetBit(kCanDelete);
-      f->SetParNames("A_{tot}","#mu_{1}","#sigma_{1}","A_{2}","#mu_{2}","#sigma_{2}");
-      f->SetParameters(integ,(min+mean)/2.,width/4.,
-                       integ/width/2.,(max+mean)/2.,width/4.);
-      // The left-sided Gauss 
-      f->SetParLimits(0,integ-1.5      , integ+1.5);
-      f->SetParLimits(1,min+(width/10.), mean);
-      f->SetParLimits(2,0              , width/2.);
-      // The right-sided Gauss 
-      f->SetParLimits(3,0   , integ);
-      f->SetParLimits(4,mean, max-(width/10.));
-      f->SetParLimits(5,0   , width/2.);
-      obj2->Fit(f,"QLRM");
-      break;
-      
-    default:
-      obj2->Fit("gaus","Q");
-      obj2->GetFunction("gaus")->SetLineColor(kYellow);
-      break;
-    }
-}
-
-
-
-void MJPedestal::CamDraw(TCanvas &c, Int_t x, Int_t y, MHCamera &cam1, Int_t fit)
-{
-
-    c.cd(x);
-    gPad->SetBorderMode(0);
-    MHCamera *obj1=(MHCamera*)cam1.DrawCopy("hist");
-    obj1->AddNotify(fPedestalCam);
-
-    c.cd(x+y);
-    gPad->SetBorderMode(0);
-    obj1->Draw();
-    ((MHCamera*)obj1)->SetPrettyPalette();
-
-    c.cd(x+2*y);
-    gPad->SetBorderMode(0);
-    DrawProjection(obj1, fit);
-
-}
-
+}
 
 Bool_t MJPedestal::WriteResult()
@@ -248,4 +251,11 @@
         return kFALSE;
     }
+
+    if (fBadPixels.Write()<=0)
+    {
+        *fLog << err << "Unable to write MBadPixelsCam to " << oname << endl;
+        return kFALSE;
+    }
+
     return kTRUE;
 }
@@ -298,10 +308,12 @@
     plist.AddToList(&tlist);
 
-    MGeomApply     geomapl;
+    MGeomApply      geomapl;
+    MBadPixelsMerge merge(&fBadPixels);
     //MExtractSignal sigcalc;
-    MPedCalcPedRun pedcalc;
+    MPedCalcPedRun  pedcalc;
 
     tlist.AddToList(&read);
     tlist.AddToList(&geomapl);
+    tlist.AddToList(&merge);
     //tlist.AddToList(&sigcalc);
     tlist.AddToList(&pedcalc);
Index: trunk/MagicSoft/Mars/mjobs/MJPedestal.h
===================================================================
--- trunk/MagicSoft/Mars/mjobs/MJPedestal.h	(revision 3055)
+++ trunk/MagicSoft/Mars/mjobs/MJPedestal.h	(revision 3069)
@@ -4,4 +4,7 @@
 #ifndef MARS_MPedestalCam
 #include "MPedestalCam.h"
+#endif
+#ifndef MARS_MBadPixelsCam
+#include "MBadPixelsCam.h"
 #endif
 
@@ -17,10 +20,13 @@
     MRunIter *fRuns;
 
-    MPedestalCam fPedestalCam;
+    MPedestalCam  fPedestalCam;
+    MBadPixelsCam fBadPixels;
 
+    Bool_t ReadPedestalCam();
+    Bool_t WriteResult();
+    
     void   DrawProjection(MHCamera *obj1, Int_t fit) const;
     void   CamDraw(TCanvas &c, Int_t x, Int_t y, MHCamera &cam1, Int_t fit);
     void   DisplayResult(MParList &plist);
-    Bool_t WriteResult();
 
 public:
@@ -31,7 +37,10 @@
 
     TString GetOutputFile() const;
-    MPedestalCam &GetPedestalCam() { return fPedestalCam; }
 
-    Bool_t ReadPedestalCam();
+    const MPedestalCam  &GetPedestalCam() const { return fPedestalCam; }
+    const MBadPixelsCam &GetBadPixels()   const { return fBadPixels; }
+
+    void SetBadPixels(MBadPixelsCam &bad) { bad.Copy(fBadPixels); }
+
     Bool_t ProcessFile();
     Bool_t Process();
Index: trunk/MagicSoft/Mars/mjobs/Makefile
===================================================================
--- trunk/MagicSoft/Mars/mjobs/Makefile	(revision 3055)
+++ trunk/MagicSoft/Mars/mjobs/Makefile	(revision 3069)
@@ -23,5 +23,6 @@
 #
 INCLUDES = -I. -I../mbase -I../mgui -I../mgeom -I../mdata -I../mhbase \
-	   -I../mfileio -I../mfilter -I../manalysis -I../mhist -I../mcalib
+	   -I../mfileio -I../mfilter -I../manalysis -I../mhist -I../mcalib \
+           -I../mbadpixels
 
 #manalysis: MChisqEval (MParameters)
