Index: trunk/MagicSoft/Mars/Changelog
===================================================================
--- trunk/MagicSoft/Mars/Changelog	(revision 2944)
+++ trunk/MagicSoft/Mars/Changelog	(revision 2945)
@@ -4,4 +4,10 @@
 
                                                  -*-*- END OF LINE -*-*-
+ 2004/01/28: Javier Rico
+
+   * mcalib/MCalibrate.[h.cc]
+     - include possibility to select the calibration method to be used
+
+
  2004/01/28: Markus Gaug
 
Index: trunk/MagicSoft/Mars/mcalib/MCalibrate.cc
===================================================================
--- trunk/MagicSoft/Mars/mcalib/MCalibrate.cc	(revision 2944)
+++ trunk/MagicSoft/Mars/mcalib/MCalibrate.cc	(revision 2945)
@@ -17,6 +17,7 @@
 !
 !   Author(s): Javier Lopez 12/2003 <mailto:jlopez@ifae.es>
-!
-!   Copyright: MAGIC Software Development, 2000-2001
+!   Modified by: Javier Rico  01/2004 <mailto:jrico@ifae.es>
+!
+!   Copyright: MAGIC Software Development, 2000-2004
 !
 !
@@ -29,5 +30,6 @@
 //   This task takes the integrated charge from MExtractedSignal and apply
 //   the calibration constants from MCalibraitionCam to the charge. Then
-//   stores number of photons obtained in MCerPhotEvt.
+//   stores number of photons obtained in MCerPhotEvt. Selection of different
+//   calibration methods is allowed through SetCalibrationMode member function
 //
 //   Input Containers:
@@ -65,5 +67,5 @@
 // Default constructor. 
 //
-MCalibrate::MCalibrate(const char *name, const char *title)
+MCalibrate::MCalibrate(CalibrationMode_t calmode,const char *name, const char *title) : fCalibrationMode(calmode)
 {
     fName  = name  ? name  : "MCalibrate";
@@ -85,5 +87,7 @@
 Int_t MCalibrate::PreProcess(MParList *pList)
 {
+
     fSignals = (MExtractedSignalCam*)pList->FindObject(AddSerialNumber("MExtractedSignalCam"));
+
     if (!fSignals)
     {
@@ -92,10 +96,15 @@
     }
 
-    fCalibrations = (MCalibrationCam*)pList->FindObject(AddSerialNumber("MCalibrationCam"));
-    if (!fCalibrations)
-    {
-      *fLog << err << AddSerialNumber("MCalibrationCam") << " not found ... aborting." << endl;
-        return kFALSE;
-    }
+   if(fCalibrationMode>kNone)
+      {
+
+	fCalibrations = (MCalibrationCam*)pList->FindObject(AddSerialNumber("MCalibrationCam"));
+	if (!fCalibrations)
+	  {
+	    *fLog << err << AddSerialNumber("MCalibrationCam") << " not found ... aborting." << endl;
+	    return kFALSE;
+	  }
+
+      }
 
     fCerPhotEvt = (MCerPhotEvt*)pList->FindCreateObj(AddSerialNumber("MCerPhotEvt"));
@@ -108,4 +117,26 @@
 // --------------------------------------------------------------------------
 //
+// Check for validity of the selected calibration method, switch to a 
+// different one in case of need
+//
+Int_t MCalibrate::ReInit()
+{
+  if(fCalibrationMode == kBlindPixel && !fCalibrations->IsBlindPixelMethodValid())
+    {
+      *fLog << warn << GetDescriptor() << "Warning: Blind pixel calibration method not valid, switching to F-factor method" << endl;
+      fCalibrationMode = kFfactor;
+    }
+
+  if(fCalibrationMode == kPinDiode && !fCalibrations->IsPINDiodeMethodValid())
+    { 
+      *fLog << warn << GetDescriptor() << "Warning: PIN diode calibration method not valid, switching to F-factor method" << endl;
+      fCalibrationMode = kFfactor;
+    }
+  return kTRUE;
+}
+// --------------------------------------------------------------------------
+//
+// Apply the calibration factors to the extracted signal according to the 
+// selected calibration method
 //
 Int_t MCalibrate::Process()
@@ -123,22 +154,49 @@
   */
 
-  UInt_t numpix = fSignals->GetSize();
-
-  for (UInt_t pixid=0; pixid< numpix; pixid++)
-    {
-      const MCalibrationPix &pix = (*fCalibrations)[pixid];
-      
-      if (!pix.IsFitValid())
-        continue;
-
-      MExtractedSignalPix &sig =  (*fSignals)[pixid];
+  UInt_t npix = fSignals->GetSize();
+
+  Float_t hiloconv   = 1.;
+  Float_t hiloconverr= 0.;
+  Float_t calibrationConversionFactor = 1.;
+  Float_t calibrationConversionFactorError = 0.;
+  
+  for (UInt_t pixidx=0; pixidx<npix; pixidx++)
+    {
+      if(fCalibrationMode!=kNone)
+	{
+	  const MCalibrationPix &pix = (*fCalibrations)[pixidx];       
+	  
+	  if (!pix.IsFitValid())
+	    continue;
+	  
+	  hiloconv   = pix.GetConversionHiLo();
+	  hiloconverr= pix.GetConversionHiLoError();
+	  
+	  switch(fCalibrationMode)
+	    {
+	    case kBlindPixel:
+	      calibrationConversionFactor      = pix.GetMeanConversionBlindPixelMethod();
+	      calibrationConversionFactorError = pix.GetErrorConversionBlindPixelMethod();
+	      break;
+	    case kFfactor:
+	      calibrationConversionFactor      = pix.GetMeanConversionFFactorMethod();
+	      calibrationConversionFactorError = pix.GetErrorConversionFFactorMethod();
+	      break;
+	    default:
+	      *fLog << warn << "MCalibrate::Process Warning: Calibration mode value ("<<fCalibrationMode<<") not known" << endl;
+	      break;
+	    }
+	}
+      
+      MExtractedSignalPix &sig =  (*fSignals)[pixidx];
       
       Float_t signal;
       Float_t signalErr = 0.;
-      
+      Float_t nphot,nphotErr;
+            
       if (sig.IsLoGainUsed())
         {
-          signal    = sig.GetExtractedSignalLoGain()*pix.GetConversionHiLo();
-          signalErr = signal*pix.GetConversionHiLoError();
+          signal    = sig.GetExtractedSignalLoGain()*hiloconv;
+          signalErr = signal*hiloconverr;
         }
       else
@@ -152,23 +210,17 @@
 	    signal = sig.GetExtractedSignalHiGain();
         }
-
-      //      Float_t calibrationConversionFactor = pix.GetMeanConversionFFactorMethod();
-      const Float_t calibrationConversionFactor      = pix.GetMeanConversionBlindPixelMethod();
-      const Float_t calibrationConversionFactorError = pix.GetErrorConversionBlindPixelMethod();
-      
-      const Float_t nphot = signal*calibrationConversionFactor;
-
-      Float_t nphotErr    = signal*calibrationConversionFactorError
-                           *signal*calibrationConversionFactorError;
-
-      nphotErr += signalErr*calibrationConversionFactor
-                 *signalErr*calibrationConversionFactor;
+      
+      nphot    = signal*calibrationConversionFactor;
+      nphotErr = signal*calibrationConversionFactorError
+	*signal*calibrationConversionFactorError
+	+signalErr*calibrationConversionFactor
+	*signalErr*calibrationConversionFactor;
       
       nphotErr  = TMath::Sqrt(nphotErr);
       
-      MCerPhotPix *cpix = fCerPhotEvt->AddPixel(pixid, nphot, nphotErr);
+      MCerPhotPix *cpix = fCerPhotEvt->AddPixel(pixidx, nphot, nphotErr);
 
       if (sig.GetNumLoGainSaturated() > 0)
-          cpix->SetPixelSaturated();
+	cpix->SetPixelSaturated();
     }
   
Index: trunk/MagicSoft/Mars/mcalib/MCalibrate.h
===================================================================
--- trunk/MagicSoft/Mars/mcalib/MCalibrate.h	(revision 2944)
+++ trunk/MagicSoft/Mars/mcalib/MCalibrate.h	(revision 2945)
@@ -27,13 +27,19 @@
 
     Float_t fConversionHiLo;
+    UShort_t fCalibrationMode;
     
     Int_t PreProcess(MParList *pList);
     Int_t Process();
+    Int_t ReInit();
 
 public:
 
-    MCalibrate(const char *name=NULL, const char *title=NULL);
+    enum CalibrationMode_t{kNone=0,kBlindPixel,kFfactor,kPinDiode,kCombined};
+    static const CalibrationMode_t kDefault = kBlindPixel;
 
-    void SetConversionHiLo(Float_t conv) { fConversionHiLo = conv; }
+    MCalibrate(CalibrationMode_t calmode = kDefault,const char *name=NULL, const char *title=NULL);
+
+    void SetConversionHiLo(Float_t conv) { fConversionHiLo = conv; };
+    void SetCalibrationMode(CalibrationMode_t calmode=kDefault){ fCalibrationMode=calmode;};
     
     ClassDef(MCalibrate, 0)   // Task to calculate cerenkov photons using calibration constants
