Index: /trunk/MagicSoft/Mars/Changelog
===================================================================
--- /trunk/MagicSoft/Mars/Changelog	(revision 4604)
+++ /trunk/MagicSoft/Mars/Changelog	(revision 4605)
@@ -21,4 +21,8 @@
 
   2004/08/12: Markus Gaug
+
+   * msignal/MExtractBlindPixel.[h,cc]
+     - Set the method from outside
+     - unified the defaults to new blind pixels
 
    * mjobs/MJCalibration.[h,cc]
Index: /trunk/MagicSoft/Mars/mcalib/MCalibrate.cc
===================================================================
--- /trunk/MagicSoft/Mars/mcalib/MCalibrate.cc	(revision 4604)
+++ /trunk/MagicSoft/Mars/mcalib/MCalibrate.cc	(revision 4605)
@@ -398,5 +398,5 @@
 
       //
-      // The following part is the outcommented first version of the error calculation
+      // The following part is the commented first version of the error calculation
       // Contact Markus Gaug for questions (or wait for the next documentation update...)
       //
Index: /trunk/MagicSoft/Mars/mjobs/MJCalibration.cc
===================================================================
--- /trunk/MagicSoft/Mars/mjobs/MJCalibration.cc	(revision 4604)
+++ /trunk/MagicSoft/Mars/mjobs/MJCalibration.cc	(revision 4605)
@@ -109,4 +109,6 @@
 #include "MCalibrationChargePINDiode.h"
 #include "MCalibrationChargeBlindPix.h"
+#include "MCalibrationChargeBlindCam.h"
+#include "MCalibrationChargeBlindPix.h"
 #include "MCalibrationChargeCalc.h"
 
@@ -114,5 +116,6 @@
 #include "MHCalibrationCam.h"
 #include "MHCalibrationChargeCam.h"
-#include "MHCalibrationChargeBlindPix.h"
+#include "MHCalibrationChargeBlindCam.h"
+#include "MHCalibrationChargePINDiode.h"
 #include "MHCalibrationRelTimeCam.h"
 #include "MCalibrationRelTimeCam.h"
@@ -142,5 +145,7 @@
 using namespace std;
 
-const Int_t MJCalibration::gkIFAEBoxInaugurationRun = 20113;
+const Int_t MJCalibration::gkIFAEBoxInaugurationRun       = 20113;
+const Int_t MJCalibration::gkSecondBlindPixelInstallation = 31693;
+const Int_t MJCalibration::gkThirdBlindPixelInstallation  = 99999;
 // --------------------------------------------------------------------------
 //
@@ -210,4 +215,5 @@
 void MJCalibration::DisplayResult(MParList &plist)
 {
+
     if (!fDisplay)
         return;
@@ -417,9 +423,10 @@
     if (fDisplayType == kDataCheckDisplay)
       {
+
         TCanvas &c1 = fDisplay->AddTab("Fit.Charge");
         c1.Divide(3, 3);
         
-        disp1.CamDraw(c1, 1, 3, 5);
-        disp4.CamDraw(c1, 2, 3, 5);
+        disp1.CamDraw( c1, 1, 3, 5);
+        disp4.CamDraw( c1, 2, 3, 5);
         disp28.CamDraw(c1, 3, 3, 5);
 
@@ -456,5 +463,4 @@
             disp31.CamDraw(c5, 2, 2, 2);
           }
-
 
         return;
@@ -684,6 +690,20 @@
       //
       // Here starts the list of runs where the shifters did not put 
-      // a colour, but which have been found out by other means
+      // a colour, but which have been found out by other means. 
+      // FIXME: This list has is only preliminary and has to move into the 
+      //        database!!
       //
+      if (filenames.Contains("_30090_"))
+        if (fColor == MCalibrationCam::kNONE)
+          {
+            *fLog << "Found colour: kGREEN  in " << filenames << endl;
+            fColor = MCalibrationCam::kGREEN;
+          }
+        else if (fColor != MCalibrationCam::kNONE)
+          {
+            *fLog << err << "Different colour found in " << filenames << "... abort" << endl;
+            return kFALSE;
+          }
+
       if (filenames.Contains("_27474_"))
         if (fColor == MCalibrationCam::kNONE)
@@ -801,5 +821,5 @@
       //
       // Here start the runs where the shifter put 
-      // the colour
+      // the colour. 
       //
       if (filenames.Contains("green"))
@@ -933,5 +953,5 @@
 //   8)  MContinue(MFCosmics)
 //   9)  MFillH("MHCalibrationChargePINDiode", "MExtractedSignalPINDiode")
-//   10) MFillH("MHCalibrationChargeBlindPix", "MExtractedSignalBlindPixel")
+//   10) MFillH("MHCalibrationChargeBlindCam", "MExtractedSignalBlindPixel")
 //   11) MFillH("MHCalibrationChargeCam",      "MExtractedSignalCam")
 //   12) MFillH("MHCalibrationChargeCam",      "MExtractedSignalCam")
@@ -987,19 +1007,50 @@
   }
 
-  MHCalibrationChargeCam   chargecam;
+  MHCalibrationChargeCam      chargecam;
+  MHCalibrationChargeBlindCam blindcam;
 
   plist.AddToList(&pedcam);
-  plist.AddToList(&chargecam);
+  plist.AddToList(&chargecam);  
+  plist.AddToList(&blindcam);  
   plist.AddToList(&fBadPixels);
   plist.AddToList(&fQECam);
   plist.AddToList(&fCalibrationCam);
-  plist.AddToList(&fCalibrationBlindPix);
+  plist.AddToList(&fCalibrationBlindCam);
   plist.AddToList(&fCalibrationPINDiode);
   plist.AddToList(&fRelTimeCam);
 
   MGeomApply               apply;
-  //    MBadPixelsMerge          merge(&fBadPixels);
   MExtractPINDiode         pinext;
   MExtractBlindPixel       blindext;
+  
+  //
+  // Initialize the blind pixel. Unfortunately, there is a hardware difference 
+  // in the first blind pixel until run "gkSecondBlindPixelInstallation" and the 
+  // later setup. The first needs to use a filter because of the length of 
+  // spurious NSB photon signals. The latter get better along extracting the amplitude
+  // from a small window.
+  //
+  TArrayI arr = fRuns->GetRuns();
+  if (arr[fRuns->GetNumRuns()-1] < gkSecondBlindPixelInstallation)
+    {
+      blindext.SetModified(kFALSE);
+      blindext.SetExtractionType(MExtractBlindPixel::kIntegral);
+      blindext.SetExtractionType(MExtractBlindPixel::kFilter);
+      blindext.SetRange(10,19,0,2);
+      blindcam.SetFitFunc( MHCalibrationChargeBlindPix::kEPoisson5 );
+    }
+  else
+    {
+      blindext.SetModified(kTRUE);
+      blindext.SetExtractionType(MExtractBlindPixel::kAmplitude);
+      blindext.SetExtractionType(MExtractBlindPixel::kFilter);
+      blindext.SetRange(5,8,0,2);
+      blindext.SetNSBFilterLimit(38);
+      if (arr[fRuns->GetNumRuns()-1] < gkThirdBlindPixelInstallation)
+        blindext.SetNumBlindPixels(2);
+      else
+        blindext.SetNumBlindPixels(3);
+    }
+  
   MExtractSlidingWindow    extract2;
   MExtractTimeFastSpline   timespline;
@@ -1024,5 +1075,5 @@
   
   MFillH fillpin("MHCalibrationChargePINDiode", "MExtractedSignalPINDiode");
-  MFillH fillbnd("MHCalibrationChargeBlindPix", "MExtractedSignalBlindPixel");
+  MFillH fillbnd("MHCalibrationChargeBlindCam", "MExtractedSignalBlindPixel");
   MFillH fillcam("MHCalibrationChargeCam",      "MExtractedSignalCam");
   MFillH filltme("MHCalibrationRelTimeCam",     "MArrivalTimeCam");
@@ -1032,19 +1083,15 @@
   filltme.SetNameTab("RelTimes");
 
+  TString drawoption;
+
   if (fDisplayType == kDataCheckDisplay)
-    {
-      fillcam.SetDrawOption("datacheck");
-      fillbnd.SetDrawOption("datacheck");
-      fillpin.SetDrawOption("datacheck");
-      filltme.SetDrawOption("datacheck");
-    }
-
+    drawoption += "datacheck";
   if (fDisplayType == kFullDisplay)
-    {
-      fillcam.SetDrawOption("all");
-      filltme.SetDrawOption("all");
-    }
-  
-  
+    drawoption += " all";
+  
+  fillcam.SetDrawOption(drawoption.Data());
+  fillbnd.SetDrawOption(drawoption.Data());
+  fillpin.SetDrawOption(drawoption.Data());
+  filltme.SetDrawOption(drawoption.Data());
   // 
   // Apply a filter against cosmics
@@ -1067,5 +1114,4 @@
     }
   
-
   tlist.AddToList(&pinext);  
   tlist.AddToList(&blindext);
@@ -1088,17 +1134,16 @@
   tlist.AddToList(&fillcam);
 
+  if (fRelTimes)
+    {
+      tlist.AddToList(&filltme);
+      tlist.AddToList(&timecalc);
+    }
+  
+  if (IsUseBlindPixel())
+    tlist.AddToList(&fillbnd);
   if (IsUsePINDiode())
     tlist.AddToList(&fillpin);
-  if (IsUseBlindPixel())
-    tlist.AddToList(&fillbnd);
 
   tlist.AddToList(&calcalc);
-
-  if (fRelTimes)
-    {
-      tlist.AddToList(&filltme);
-      tlist.AddToList(&timecalc);
-    }
-  
 
   // Create and setup the eventloop
@@ -1117,4 +1162,37 @@
   tlist.PrintStatistics();
 
+  //
+  // The next lines are necessary in order to avoid that 
+  // the last entry drawn by MFillH gets deleted again from 
+  // the display. No idea where this comes from...
+  //
+  if (fDisplay)
+    {
+      if (IsUsePINDiode())
+        {
+          MHCalibrationChargePINDiode *pin = 
+            (MHCalibrationChargePINDiode*)plist.FindObject("MHCalibrationChargePINDiode");
+          pin->DrawClone(Form("nonew %s",drawoption.Data()));
+        }
+      else if (IsUseBlindPixel())
+        {
+          MHCalibrationChargeBlindCam *cam = 
+            (MHCalibrationChargeBlindCam*)plist.FindObject("MHCalibrationChargeBlindCam");
+          cam->DrawClone(Form("nonew %s",drawoption.Data()));
+        }
+      else if (fRelTimes)
+        {
+          MHCalibrationRelTimeCam *cam = 
+            (MHCalibrationRelTimeCam*)plist.FindObject("MHCalibrationRelTimeCam");
+          cam->DrawClone(Form("nonew %s",drawoption.Data()));
+        }
+      else
+        {
+          MHCalibrationChargeCam *cam = 
+            (MHCalibrationChargeCam*)plist.FindObject("MHCalibrationChargeCam");
+          cam->DrawClone(Form("nonew %s",drawoption.Data()));
+        }
+    }
+  
   DisplayResult(plist);
 
@@ -1249,7 +1327,7 @@
     }
 
-    if (fCalibrationBlindPix.Write()<=0)
-    {
-        *fLog << err << "Unable to write MCalibrationChargeBlindPix to " << oname << endl;
+    if (fCalibrationBlindCam.Write()<=0)
+    {
+        *fLog << err << "Unable to write MCalibrationChargeBlindCam to " << oname << endl;
         return kFALSE;
     }
Index: /trunk/MagicSoft/Mars/msignal/MExtractBlindPixel.cc
===================================================================
--- /trunk/MagicSoft/Mars/msignal/MExtractBlindPixel.cc	(revision 4604)
+++ /trunk/MagicSoft/Mars/msignal/MExtractBlindPixel.cc	(revision 4605)
@@ -74,8 +74,7 @@
 using namespace std;
 
+const Int_t   MExtractBlindPixel::fgNumBlindPixels   = 2;
 const UInt_t  MExtractBlindPixel::fgBlindPixelIds[3] = { 559, 560, 561 };
 const UInt_t  MExtractBlindPixel::fgBlindPixelIdx    = 559;
-const Byte_t  MExtractBlindPixel::fgFirst            =   0;
-const Byte_t  MExtractBlindPixel::fgLast             =   7;
 const Byte_t  MExtractBlindPixel::fgHiGainFirst      =  10;
 const Byte_t  MExtractBlindPixel::fgHiGainLast       =  19;
@@ -84,5 +83,4 @@
 const Int_t   MExtractBlindPixel::fgNSBFilterLimit   =  70;
 const Float_t MExtractBlindPixel::fgResolution       = 0.003;
-const UInt_t  MExtractBlindPixel::gkModificationRun  = 31693;
 const Float_t MExtractBlindPixel::gkOverflow         = 300.;
 // --------------------------------------------------------------------------
@@ -114,6 +112,5 @@
   SetRange(fgHiGainFirst, fgHiGainLast, fgLoGainFirst, fgLoGainLast);
   
-  SetFirst();
-  SetLast();
+  SetNumBlindPixels();
 
   Clear();
@@ -206,12 +203,8 @@
 // - MExtractor::PreProcess(pList)
 //
-// Sets fModified to kTRUE if the current run number is greater or equal gkModificationRun
-//
 // The following output containers are also searched and created if
 // they were not found:
 //
 //  - MExtractedBlindPixel
-//
-// 
 //
 Int_t MExtractBlindPixel::PreProcess(MParList *pList)
@@ -255,21 +248,14 @@
     delete [] fHiGainSecondDeriv;
 
-  if ( fRunHeader->GetRunNumber() >= gkModificationRun )
+  if (fModified)
   {
-      fModified = kTRUE;
-      SetExtractionType(kAmplitude);
-      SetRange(fFirst,fLast);
-      for (Int_t i=0;i<3;i++)
+    for (Int_t i=0;i<fNumBlindPixels;i++)
       {
-	  SetBlindPixelIdx(fgBlindPixelIds[i],i);
-	  fBlindPixel->SetBlindPixelIdx(fgBlindPixelIds[i],i);
+        SetBlindPixelIdx(fgBlindPixelIds[i],i);
+        fBlindPixel->SetBlindPixelIdx(fgBlindPixelIds[i],i);
       }
   }
   else
-  {
-      fBlindPixel->SetBlindPixelIdx(fBlindPixelIdx.At(0));
-      SetExtractionType(kIntegral);
-      SetExtractionType(kFilter);
-  }
+    fBlindPixel->SetBlindPixelIdx(fBlindPixelIdx.At(0));
 
   fBlindPixel->SetExtractionType(fExtractionType);
@@ -351,4 +337,5 @@
                 fHiLoLast ?  (Int_t)fHiLoLast-1 : (Int_t)fHiGainLast ) 
         << endl;
+
   if (IsExtractionType(kFilter))
     *fLog << inf << GetDescriptor() << ": Will use Filter using " 
@@ -377,5 +364,5 @@
 
   Int_t summ = 0;
-  Byte_t *p     = ptr;
+  Byte_t *p   = ptr;
   Byte_t *end = ptr + fHiGainLast - fHiGainFirst + 1;
 
@@ -694,5 +681,5 @@
       Byte_t sat  = 0;
 
-      if (!fModified)
+      if (IsExtractionType(kFilter))
       {
 
@@ -706,6 +693,22 @@
 	      continue;
 	  }
+
+          sum = 0;
+	  FindSignalFilter(pixel.GetLoGainSamples(), sum, sat);          
+
+          /*
+          if (fModified)
+            {
+              if (sum > fNSBFilterLimit)
+                {
+                  fBlindPixel->SetExtractedSignal(-1.,id);
+                  fBlindPixel->SetNumSaturated(sat,id);
+                  fBlindPixel->SetReadyToSave();
+                  continue;
+                }
+            }
+          */
       }
-
+      
       Float_t newsum = 0.;
       sat = 0;
@@ -716,4 +719,5 @@
 	FindIntegral    (pixel.GetHiGainSamples()+fHiGainFirst, pixel.GetLoGainSamples(), newsum, sat);
   
+
       fBlindPixel->SetExtractedSignal(newsum,id);
       fBlindPixel->SetNumSaturated(sat,id);
Index: /trunk/MagicSoft/Mars/msignal/MExtractBlindPixel.h
===================================================================
--- /trunk/MagicSoft/Mars/msignal/MExtractBlindPixel.h	(revision 4604)
+++ /trunk/MagicSoft/Mars/msignal/MExtractBlindPixel.h	(revision 4605)
@@ -15,8 +15,7 @@
 private:
 
+  static const Int_t   fgNumBlindPixels;   //! Default number of blind pixels after modification run  
   static const UInt_t  fgBlindPixelIds[3]; //! Default blind pixel indices after modification run
   static const UInt_t  fgBlindPixelIdx;    //! Default blind pixels index before modification run
-  static const Byte_t  fgFirst;            //! Default First FADC slice after modification run (currently set to: 2  ) 
-  static const Byte_t  fgLast ;            //! Default Last  FADC slice after modification run (currently set to: 13 ) 
   static const Byte_t  fgHiGainFirst;      //! Default First FADC slice Hi-Gain Signal (currently set to: 10   ) 
   static const Byte_t  fgHiGainLast;       //! Default Last  FADC slice Hi-Gain Signal (currently set to: 29   ) 
@@ -26,10 +25,7 @@
   static const Float_t fgResolution;       //! Default for fResolution         (currently set to: 0.003)
   static const Float_t gkOverflow;         //! Default sum to assign overflow in case of saturation
-  static const UInt_t  gkModificationRun;  //! Run number from which on three blind pixels are used
 
   MExtractedSignalBlindPixel *fBlindPixel; // Extracted signal of the Blind Pixel
 
-  Byte_t   fFirst;                         // First extraction slice for runs after modification
-  Byte_t   fLast;                          // Last extraction slice for runs after modification
   Byte_t   fHiLoFirst;                     // If not zero, start extraction from fHiLoFirst slice of Low-Gain
 
@@ -45,4 +41,6 @@
   Byte_t  fExtractionType;                 // What extraction type has been chosen?
 
+  Int_t   fNumBlindPixels;                 // Current number of blind pixels
+  
 public:
   enum ExtractionType_t { kAmplitude, kIntegral, kFilter };
@@ -74,7 +72,9 @@
     fBlindPixelIdx.AddAt(idx,nr); }
   void SetExtractionType( const ExtractionType_t typ=kAmplitude );
-  void SetFirst         ( const Byte_t         first=fgFirst )  { fFirst          = first; }
-  void SetLast          ( const Byte_t         last =fgLast  )  { fLast           = last;  }
   void SetNSBFilterLimit( const Int_t   lim=fgNSBFilterLimit )  { fNSBFilterLimit = lim;   }     
+  void SetModified     ( const Bool_t b=kTRUE)               {   fModified = b;    }
+  
+  void SetNumBlindPixels( const Int_t   num=fgNumBlindPixels )  { fNumBlindPixels = num;   }
+  
   void SetRange         ( const Byte_t  hifirst=0, const Byte_t hilast=0, 
    		          const Byte_t  lofirst=0, const Byte_t lolast=0 );
