Index: trunk/MagicSoft/Mars/mcalib/MCalibrateData.cc
===================================================================
--- trunk/MagicSoft/Mars/mcalib/MCalibrateData.cc	(revision 7095)
+++ trunk/MagicSoft/Mars/mcalib/MCalibrateData.cc	(revision 7099)
@@ -135,6 +135,9 @@
 using namespace std;
 
-const Float_t MCalibrateData::fgCalibConvMinLimit = 0.01;
-const Float_t MCalibrateData::fgCalibConvMaxLimit = 5.;
+const Float_t MCalibrateData::gkCalibConvMinLimit = 0.01;
+const Float_t MCalibrateData::gkCalibConvMaxLimit = 5.;
+
+const MCalibrateData::CalibrationMode_t MCalibrateData::gkDefault = kFfactor;
+
 // --------------------------------------------------------------------------
 //
@@ -441,6 +444,5 @@
 {
 
-    *fLog << inf << GetDescriptor() 
-          << ": Updating Conversion Factors... " << endl;
+    *fLog << inf << GetDescriptor() << ": Updating Conversion Factors... " << endl;
     
     fCalibConsts.Reset();
@@ -495,19 +497,21 @@
             if (updatecam)
               {
-                MCalibrationChargePix &upix = (MCalibrationChargePix&)(*updatecam)[pixidx];
+                const MCalibrationChargePix &upix = (MCalibrationChargePix&)(*updatecam)[pixidx];
+
                 //
                 // Correct for the possible change in amplification of the individual pixels chain
                 // 
                 const Float_t pixmean = upix.GetConvertedMean();
-                calibUpdate = (pixmean == 0.) ? 1. : pix.GetConvertedMean() / pixmean;
+                calibUpdate = pixmean==0 ? 1 : pix.GetConvertedMean()/pixmean;
+
                 //
                 // Correct for global shifts in light emission
                 // 
-                MCalibrationChargePix &ugpix = (MCalibrationChargePix&)updatecam->GetAverageArea(0);
+                const MCalibrationChargePix &ugpix = (MCalibrationChargePix&)updatecam->GetAverageArea(0);
 
                 const Float_t globmean = avpix.GetConvertedMean();
-                calibUpdate = (globmean == 0.) ? 1. : ugpix.GetConvertedMean() / globmean;
-
-                MBadPixelsPix         &ubad  = (MBadPixelsPix&)        updatecam->GetAverageBadArea(0);
+                calibUpdate = globmean==0 ? 1 : ugpix.GetConvertedMean()/globmean;
+
+                MBadPixelsPix &ubad  = (MBadPixelsPix&)updatecam->GetAverageBadArea(0);
                 if (ubad.IsUncalibrated(MBadPixelsPix::kChargeIsPedestal))
                   {
@@ -581,4 +585,7 @@
                 calibUpdate = 1.;
                 break;
+
+              default:
+                  break;
               } /* switch calibration mode */
           } /* if(fCalibrationMode!=kNone) */
@@ -755,5 +762,5 @@
         out << "   " << GetUniqueName() << ".EnablePedestalType(MCalibrateData::kRun)" << endl;
 
-    if (fCalibrationMode != kDefault)
+    if (fCalibrationMode != gkDefault)
     {
         out << "   " << GetUniqueName() << ".SetCalibrationMode(MCalibrateData::";
@@ -865,8 +872,8 @@
     {
       *fLog << all
-            << Form("%s%3i","Pixel: ",pixidx)
-            << Form("%s%4.2f","  CalibConst: ",fCalibConsts[pixidx])
-            << Form("%s%4.2f","  F-Factor: ",fCalibFFactors[pixidx])
-            << Form("%s%4.2f","  HiLoConv: ",fHiLoConv[pixidx])
+            << "Pixel: " << Form("%3i",pixidx)
+            << "  CalibConst: " << Form("%4.2f",fCalibConsts[pixidx])
+            << "  F-Factor: "   << Form("%4.2f",fCalibFFactors[pixidx])
+            << "  HiLoConv: "   << Form("%4.2f",fHiLoConv[pixidx])
             << endl;
     }
Index: trunk/MagicSoft/Mars/mcalib/MCalibrateData.h
===================================================================
--- trunk/MagicSoft/Mars/mcalib/MCalibrateData.h	(revision 7095)
+++ trunk/MagicSoft/Mars/mcalib/MCalibrateData.h	(revision 7099)
@@ -23,8 +23,35 @@
 class MCalibrateData : public MTask
 {
+public:
+    enum CalibrationMode_t
+    {
+        kSkip       =  0,
+        kNone       =  1,
+        kFlatCharge =  2,
+        kBlindPixel =  3,
+        kFfactor    =  4,
+        kPinDiode   =  5,
+        kCombined   =  6,
+        kDummy      =  7
+    };
+
+    enum PedestalType_t
+    {
+        kNo    = BIT(0),
+        kRun   = BIT(1),
+        kEvent = BIT(2)
+    };
+
+    enum SignalType_t
+    {
+        kPhe,
+        kPhot
+    };
+
+    static const CalibrationMode_t gkDefault;
+
 private:
-
-  static const Float_t  fgCalibConvMinLimit; //! Minimum limit for conv. factor
-  static const Float_t  fgCalibConvMaxLimit; //! Maximum limit for conv. factor
+  static const Float_t gkCalibConvMinLimit; //! Minimum limit for conv. factor
+  static const Float_t gkCalibConvMaxLimit; //! Maximum limit for conv. factor
 
   Float_t  fCalibConvMinLimit;           // Minimum limit for conv. factor
@@ -39,5 +66,5 @@
   MCalibConstCam        *fCalibConstCam; //! Temporary calib consts storage
   
-  UShort_t fCalibrationMode;             // Flag defining the calibration mode (CalibrationMode_t)
+  CalibrationMode_t fCalibrationMode;    // Flag defining the calibration mode (CalibrationMode_t)
   Byte_t   fPedestalFlag;                // Flags defining to calibrate the pedestal each event or each run
   Byte_t   fSignalType;                  // Flag defining the signal type (kphot or kphe)
@@ -63,34 +90,6 @@
   
 public:
-
-    enum CalibrationMode_t
-    {
-        kSkip       =  0,
-        kNone       =  1,
-        kFlatCharge =  2,
-        kBlindPixel =  3,
-        kFfactor    =  4,
-        kPinDiode   =  5,
-        kCombined   =  6,
-        kDummy      =  7
-    };
-
-  static const CalibrationMode_t kDefault = kFfactor;
-  
-  enum PedestalType_t
-  {
-      kNo    = BIT(0),
-      kRun   = BIT(1),
-      kEvent = BIT(2)
-  };
-  
-  enum SignalType_t
-  {
-      kPhe,
-      kPhot
-  };
-  
-  MCalibrateData(CalibrationMode_t calmode=kDefault,
-                 const char *name=NULL, const char *title=NULL);
+    MCalibrateData(CalibrationMode_t calmode=gkDefault,
+                   const char *name=NULL, const char *title=NULL);
   
   void   AddPedestal(const char *name="Cam");
@@ -106,9 +105,9 @@
   Bool_t TestPedestalFlag(PedestalType_t i) const { return fPedestalFlag&i ? kTRUE : kFALSE; }
   
-  void   SetCalibrationMode ( CalibrationMode_t calmode=kDefault ) { fCalibrationMode=calmode; }
+  void   SetCalibrationMode ( CalibrationMode_t calmode=gkDefault) { fCalibrationMode=calmode; }
   void   SetSignalType      ( SignalType_t      sigtype=kPhe    ) { fSignalType     =sigtype; }  
 
-  void   SetCalibConvMinLimit( const Float_t f=fgCalibConvMinLimit ) { fCalibConvMinLimit = f; }
-  void   SetCalibConvMaxLimit( const Float_t f=fgCalibConvMaxLimit ) { fCalibConvMaxLimit = f; }
+  void   SetCalibConvMinLimit( const Float_t f=gkCalibConvMinLimit ) { fCalibConvMinLimit = f; }
+  void   SetCalibConvMaxLimit( const Float_t f=gkCalibConvMaxLimit ) { fCalibConvMaxLimit = f; }
     
   Bool_t UpdateConversionFactors( const MCalibrationChargeCam *updatecam=NULL);
@@ -118,8 +117,2 @@
 
 #endif   /* MCalibrateData */
-
-
-
-
-
-
Index: trunk/MagicSoft/Mars/mcalib/MCalibrationChargeCalc.cc
===================================================================
--- trunk/MagicSoft/Mars/mcalib/MCalibrationChargeCalc.cc	(revision 7095)
+++ trunk/MagicSoft/Mars/mcalib/MCalibrationChargeCalc.cc	(revision 7099)
@@ -181,6 +181,9 @@
 //  ClassVersion 2:
 //   - Float_t fPheErrLimit;
-//   + Float_t fPheErrLowerLimit;                   // Lower limit acceptance nr. phe's w.r.t. area idx mean (in sigmas)
-//   + Float_t fPheErrUpperLimit;                   // Upper limit acceptance nr. phe's w.r.t. area idx mean (in sigmas)
+//   + Float_t fPheErrLowerLimit; // Lower limit acceptance nr. phe's w.r.t. area idx mean (in sigmas)
+//   + Float_t fPheErrUpperLimit; // Upper limit acceptance nr. phe's w.r.t. area idx mean (in sigmas)
+//
+//  ClassVersion 3:
+//   + Bool_t  fUseExtractorRes;  // Include extractor resolution in F-Factor method
 //
 //////////////////////////////////////////////////////////////////////////////
@@ -280,5 +283,6 @@
 //
 MCalibrationChargeCalc::MCalibrationChargeCalc(const char *name, const char *title)
-    : fGeom(NULL), fSignal(NULL), fCalibPattern(NULL)
+    : fUseExtractorRes(kFALSE),
+    fGeom(NULL), fSignal(NULL), fCalibPattern(NULL), fExtractor(NULL)
 {
         
@@ -661,5 +665,5 @@
       return kTRUE;
   }
-  
+
   if (fNumProcessed == 0)
     return kTRUE;
@@ -1017,4 +1021,61 @@
             << endl;
       bad.SetUncalibrated(MBadPixelsPix::kDeviatingNumPhes);
+      bad.SetUnsuitable(MBadPixelsPix::kUnsuitableRun);
+      return kFALSE;
+    }
+
+  if (cal.GetPheFFactorMethod() < 0.)
+    {
+      bad.SetUncalibrated(MBadPixelsPix::kDeviatingNumPhes);
+      bad.SetUnsuitable(MBadPixelsPix::kUnsuitableRun);
+      cal.SetFFactorMethodValid(kFALSE);
+      return kFALSE;
+    }
+
+  if (!cal.CalcConvFFactor())
+    {
+      *fLog << warn << "Could not calculate the Conv. FADC counts to Phes in ";
+      *fLog << what << ":           " << Form("%4i", cal.GetPixId()) << endl;
+      bad.SetUncalibrated(MBadPixelsPix::kDeviatingNumPhes);
+      return kFALSE;
+    }
+
+  if (!fUseExtractorRes)
+    return kTRUE;
+
+  if (!fExtractor)
+    {
+      *fLog << err << "Extractor resolution has been chosen, but not extractor is set. Cannot calibrate" << endl;
+      return kFALSE;
+    }
+
+  const Float_t resinphes = cal.IsHiGainSaturation()
+    ? cal.GetPheFFactorMethod()*fExtractor->GetResolutionPerPheLoGain()
+    : cal.GetPheFFactorMethod()*fExtractor->GetResolutionPerPheHiGain();
+
+  Float_t resinfadc = cal.IsHiGainSaturation()
+    ? resinphes/cal.GetMeanConvFADC2Phe()/cal.GetConversionHiLo()
+    : resinphes/cal.GetMeanConvFADC2Phe();
+
+  if (resinfadc > 1.5*cal.GetPedRms() )
+    {
+      *fLog << warn << " Extractor Resolution: " << resinfadc << " bigger than Pedestal RMS " << cal.GetPedRms() << endl;
+      resinfadc = cal.GetPedRms();
+    }
+
+  if (!cal.CalcReducedSigma(resinfadc))
+    {
+        *fLog << warn << "Could not calculate the reduced sigma in " << what;
+        *fLog << ":                        " << Form("%4i",cal.GetPixId()) << endl;
+        bad.SetUncalibrated( MBadPixelsPix::kChargeSigmaNotValid );
+        return kFALSE;
+    }
+
+  if (!cal.CalcFFactor())
+    {
+        *fLog << warn << "Could not calculate the F-Factor in " << what;
+        *fLog << ":                             " << Form("%4i",cal.GetPixId()) << endl;
+      bad.SetUncalibrated(MBadPixelsPix::kDeviatingNumPhes);
+      bad.SetUnsuitable(MBadPixelsPix::kUnsuitableRun);
       return kFALSE;
     }
@@ -2299,4 +2360,9 @@
       rc = kTRUE;
     }
+  if (IsEnvDefined(env, prefix, "UseExtractorRes", print))
+    {
+      SetUseExtractorRes(GetEnvValue(env, prefix, "UseExtractorRes", fUseExtractorRes));
+      rc = kTRUE;
+    }
 
   return rc;
Index: trunk/MagicSoft/Mars/mcalib/MCalibrationChargeCalc.h
===================================================================
--- trunk/MagicSoft/Mars/mcalib/MCalibrationChargeCalc.h	(revision 7095)
+++ trunk/MagicSoft/Mars/mcalib/MCalibrationChargeCalc.h	(revision 7099)
@@ -2,17 +2,12 @@
 #define MARS_MCalibrationChargeCalc
 
-/////////////////////////////////////////////////////////////////////////////
-//                                                                         //
-// MCalibrationChargeCalc                                                   //
-//                                                                         //
-// Integrates the time slices of the all pixels of a calibration event     //
-// and substract the pedestal value                                        //
-//                                                                         //
-/////////////////////////////////////////////////////////////////////////////
-
 #ifndef MARS_MTask
 #include "MTask.h"
 #endif
 
+#ifndef ROOT_TArrayC
+#include <TArrayC.h>
+#endif
+
 #ifndef MARS_MBadPixelsPix
 #include "MBadPixelsPix.h"
@@ -21,8 +16,4 @@
 #ifndef MARS_MCalibrationCam
 #include "MCalibrationCam.h"
-#endif
-
-#ifndef ROOT_TArrayC
-#include <TArrayC.h>
 #endif
 
@@ -44,4 +35,5 @@
 class MBadPixelsIntensityCam;
 class MBadPixelsCam;
+class MExtractor;
 
 class MCalibrationChargeCalc : public MTask
@@ -91,4 +83,5 @@
 
   Int_t   fNumProcessed;                       // Number of processed events (for Intensity calibration)
+  Bool_t  fUseExtractorRes;                    // Include extractor resolution in F-Factor method
   
   // Pointers
@@ -108,4 +101,5 @@
   MCalibrationPattern            *fCalibPattern;   //! Calibration DM pattern
   MPedestalCam                   *fPedestals;      //! Pedestals all pixels (calculated previously from ped.file)
+  MExtractor                     *fExtractor;      //! Signal Extractor
 
   // enums
@@ -211,4 +205,5 @@
       : CLRBIT(fFlags, kDebug); }
 
+  void SetExtractor(MExtractor   *ext) { fExtractor=ext; }
   void SetPedestals(MPedestalCam *cam) { fPedestals=cam; }
 									 
@@ -223,6 +218,7 @@
   void SetPheErrUpperLimit  ( const Float_t f=fgPheErrUpperLimit       ) { fPheErrUpperLimit  = f;     }
   void SetPulserColor       ( const MCalibrationCam::PulserColor_t col ) { fPulserColor       = col;   }
-
-  ClassDef(MCalibrationChargeCalc, 2)   // Task calculating Calibration Containers and Quantum Efficiencies
+  void SetUseExtractorRes(Bool_t b=kTRUE) { fUseExtractorRes = b; }
+
+  ClassDef(MCalibrationChargeCalc, 3)   // Task calculating Calibration Containers and Quantum Efficiencies
 };
 
Index: trunk/MagicSoft/Mars/mcalib/MCalibrationChargePix.cc
===================================================================
--- trunk/MagicSoft/Mars/mcalib/MCalibrationChargePix.cc	(revision 7095)
+++ trunk/MagicSoft/Mars/mcalib/MCalibrationChargePix.cc	(revision 7099)
@@ -674,5 +674,5 @@
 // in GetRSigma() and GetRSigmaErr()
 //
-Bool_t MCalibrationChargePix::CalcReducedSigma()
+Bool_t MCalibrationChargePix::CalcReducedSigma(const Float_t extractorres)
 {
 
@@ -687,4 +687,5 @@
   const Float_t pedRmsSquare    = IsHiGainSaturation() ? fLoGainPedRmsSquare    : fPedRms*fPedRms;
   const Float_t pedRmsSquareVar = IsHiGainSaturation() ? fLoGainPedRmsSquareVar : 0.25*fPedVar*pedRmsSquare;
+  const Float_t extractorresVar = extractorres * extractorres;
 
   if (IsDebug())
@@ -696,4 +697,5 @@
             << " PedRmsSquare: " << pedRmsSquare
             << " pedRmsSquareVar: " << pedRmsSquareVar
+	    << " extractorresVar: " << extractorresVar
             << endl;
     }
@@ -705,5 +707,5 @@
   // Calculate the reduced sigmas
   //
-  fRSigmaSquare = sigmaSquare - pedRmsSquare;
+  fRSigmaSquare = sigmaSquare - pedRmsSquare - extractorresVar;
 
   if (IsDebug())
@@ -764,7 +766,8 @@
 Bool_t MCalibrationChargePix::CalcFFactor()
 {
-
-  if (fRSigmaSquare < 0.)
-    return kFALSE;
+    SetFFactorMethodValid(kFALSE);
+
+    if (fRSigmaSquare < 0.)
+        return kFALSE;
   
   //
Index: trunk/MagicSoft/Mars/mcalib/MCalibrationChargePix.h
===================================================================
--- trunk/MagicSoft/Mars/mcalib/MCalibrationChargePix.h	(revision 7095)
+++ trunk/MagicSoft/Mars/mcalib/MCalibrationChargePix.h	(revision 7099)
@@ -53,5 +53,4 @@
 
   MCalibrationChargePix(const char *name=NULL, const char *title=NULL);
-  ~MCalibrationChargePix() {}
   
   void Clear(Option_t *o="");
@@ -111,9 +110,9 @@
 
   // Calculations
-  void   CalcLoGainPedestal       ( const Float_t logainsamples);
-  Bool_t CalcReducedSigma  (  );
-  Bool_t CalcFFactor       (  );
-  Bool_t CalcConvFFactor   (  );  
-  Bool_t CalcMeanFFactor   ( const Float_t nphotons, const Float_t nphotonsrelvar );
+  void   CalcLoGainPedestal(const Float_t logainsamples);
+  Bool_t CalcReducedSigma(const Float_t extractorres=0);
+  Bool_t CalcFFactor();
+  Bool_t CalcConvFFactor();
+  Bool_t CalcMeanFFactor(const Float_t nphotons, const Float_t nphotonsrelvar);
   
   ClassDef(MCalibrationChargePix, 3)	// Container Charge Calibration Results Pixel
