Index: /trunk/MagicSoft/Mars/mcalib/MCalibrationChargeCam.cc
===================================================================
--- /trunk/MagicSoft/Mars/mcalib/MCalibrationChargeCam.cc	(revision 3351)
+++ /trunk/MagicSoft/Mars/mcalib/MCalibrationChargeCam.cc	(revision 3352)
@@ -377,13 +377,15 @@
   *fLog << all << id << " Excluded pixels " << endl;
   *fLog << endl;
-  *fLog << all << "Average Inner Pix:         " 
-		<< ":  Ped.  Rms: "            << fAverageInnerPix->GetPedRms()        << " +- " << fAverageInnerPix->GetPedRmsErr() 
-		<< "   Mean signal: "          << fAverageInnerPix->GetMeanCharge()    << " +- " << fAverageInnerPix->GetSigmaCharge() 
+  *fLog << all << "Average Inner Pix:" 
+		<< "   Ped.  Rms: "            << fAverageInnerPix->GetPedRms()        << " +- " << fAverageInnerPix->GetPedRmsErr() 
+		<< "   Mean signal: "          << fAverageInnerPix->GetMeanCharge()    << " +- " << fAverageInnerPix->GetMeanChargeErr() 
+		<< "   Sigma signal: "         << fAverageInnerPix->GetSigmaCharge()    << " +- "<< fAverageInnerPix->GetSigmaChargeErr() 
 		<< "   Reduced Sigma: "        << fAverageInnerPix->GetRSigmaCharge() 
 		<< "   Nr Phe's: "             << fAverageInnerPix->GetPheFFactorMethod() 
 		<< endl;
-  *fLog << all << "Average Outer Pix:         " 
-		<< ":  Ped.  Rms: "            << fAverageOuterPix->GetPedRms()        << " +- " << fAverageOuterPix->GetPedRmsErr() 
-		<< "   Mean signal: "          << fAverageOuterPix->GetMeanCharge()    << " +- " << fAverageOuterPix->GetSigmaCharge() 
+  *fLog << all << "Average Outer Pix:" 
+		<< "   Ped.  Rms: "            << fAverageOuterPix->GetPedRms()        << " +- " << fAverageOuterPix->GetPedRmsErr() 
+		<< "   Mean signal: "          << fAverageOuterPix->GetMeanCharge()    << " +- " << fAverageOuterPix->GetMeanChargeErr() 
+		<< "   Sigma signal: "         << fAverageOuterPix->GetSigmaCharge()    << " +- "<< fAverageOuterPix->GetSigmaChargeErr() 
 		<< "   Reduced Sigma: "        << fAverageOuterPix->GetRSigmaCharge() 
 		<< "   Nr Phe's: "             << fAverageOuterPix->GetPheFFactorMethod() 
Index: /trunk/MagicSoft/Mars/mcalib/MHCalibrationChargeCam.cc
===================================================================
--- /trunk/MagicSoft/Mars/mcalib/MHCalibrationChargeCam.cc	(revision 3351)
+++ /trunk/MagicSoft/Mars/mcalib/MHCalibrationChargeCam.cc	(revision 3352)
@@ -27,11 +27,43 @@
 //                                                               
 // MHCalibrationChargeCam                                               
+//
+// Fills the extracted signals of MExtractedSignalCam into the MH-classes: 
+//
+// MHCalibrationChargeHiGainPix, MHCalibrationChargeLoGainPix for each pixel 
+// and additionally two classes containing an average of the inner and the outer 
+// pixels, respectively
+// 
+// By default, subsequently the hi-gain classes are treated unless 
+// more than fNumHiGainSaturationLimit (default: 1%) of the overall FADC 
+// slices show saturation. In that case, the low-gain classes are treated. 
+// If more than fNumLoGainSaturationLimit (default: 1%) of the overall 
+// low-gain FADC slices saturate, the pixel is declared not valid and no further 
+// treatment is pursued. 
+// 
+// The filled histograms are fitted to a Gaussian and the mean and sigma with 
+// its errors and the fit probability are extracted. If none of these values are 
+// NaN's and if the probability is bigger than fProbLimit (default: 0.5%), the fit 
+// is declared valid. Otherwise, histogram means and RMS's are taken directly, but the 
+// flag kFitValid is set to FALSE. Outliers of more than fPickUpLimit (default: 5) sigmas 
+// from the mean are counted as PickUp events. 
+//
+// Additionally, the slice number with the highest value is stored and a corresponding 
+// histogram is filled. This histogram serves only for a rought cross-check if the 
+// signal does not lie at the edges of chose extraction window. 
+//
+// The class also fills arrays with the signal vs. event number, creates a fourier 
+// spectrum out of it and investigates if the projected frequencies follow an exponential 
+// distribution. In case that the probability of the exponential fit is less than 
+// fProbLimit, the pixel is declared HiGainOscillating or LoGainOscillating, respectively.
+// 
+// The results are written into MCalibrationChargeCam.
 //                                                               
-// Contains a list of MHCalibrationPix 
-// plus the MHCalibrationBlindPix 
-// and the  MHCalibrationPINDiode
 /////////////////////////////////////////////////////////////////////////////
 #include "MHCalibrationChargeCam.h"
 
+#include <TVirtualPad.h>
+#include <TCanvas.h>
+#include <TPad.h>
+
 #include "MLog.h"
 #include "MLogManip.h"
@@ -41,8 +73,12 @@
 #include "MHCalibrationChargeHiGainPix.h"
 #include "MHCalibrationChargeLoGainPix.h"
+#include "MHCalibrationChargePix.h"
 
 #include "MCalibrationChargeCam.h"
 #include "MCalibrationChargePix.h"
 
+#include "MGeomCam.h"
+#include "MGeomPix.h"
+
 #include "MRawEvtData.h"
 #include "MRawEvtPixelIter.h"
@@ -63,5 +99,5 @@
 {
     fName  = name  ? name  : "MHCalibrationChargeCam";
-    fTitle = title ? title : "";
+    fTitle = title ? title : "Class to fill the calibration histograms ";
 
     fHiGainArray = new TObjArray;
@@ -71,4 +107,35 @@
     fLoGainArray->SetOwner();
 
+    fAverageHiGainInnerPix = new MHCalibrationChargeHiGainPix("AverageHiGainInnerPix","Average HiGain FADC sums of inner pixels");
+    fAverageLoGainInnerPix = new MHCalibrationChargeLoGainPix("AverageLoGainInnerPix","Average LoGain FADC sums of inner pixels");
+    fAverageHiGainOuterPix = new MHCalibrationChargeHiGainPix("AverageHiGainOuterPix","Average HiGain FADC sums of outer pixels");
+    fAverageLoGainOuterPix = new MHCalibrationChargeLoGainPix("AverageLoGainOuterPix","Average LoGain FADC sums of outer pixels");
+
+/*
+    fAverageHiGainInnerPix->GetHGausHist()->SetName("HCalibrationChargeAverageInnerHiGainPix");
+    fAverageHiGainOuterPix->GetHGausHist()->SetName("HCalibrationChargeAverageOuterHiGainPix");
+    fAverageLoGainInnerPix->GetHGausHist()->SetName("HCalibrationChargeAverageInnerLoGainPix");
+    fAverageLoGainOuterPix->GetHGausHist()->SetName("HCalibrationChargeAverageOuterLoGainPix");
+*/
+    fAverageHiGainInnerPix->GetHGausHist()->SetTitle("Summed FADC slices average Inner pixels HiGain");
+    fAverageLoGainInnerPix->GetHGausHist()->SetTitle("Summed FADC slices average Inner pixels LoGain");
+    fAverageHiGainOuterPix->GetHGausHist()->SetTitle("Summed FADC slices average Outer pixels HiGain");
+    fAverageLoGainOuterPix->GetHGausHist()->SetTitle("Summed FADC slices average Outer pixels LoGain");
+
+    fAverageHiGainInnerPix->GetHAbsTime()->SetTitle("Absolute Arrival Time average Inner pixels HiGain");
+    fAverageLoGainInnerPix->GetHAbsTime()->SetTitle("Absolute Arrival Time average Inner pixels LoGain");
+    fAverageHiGainOuterPix->GetHAbsTime()->SetTitle("Absolute Arrival Time average Outer pixels HiGain");
+    fAverageLoGainOuterPix->GetHAbsTime()->SetTitle("Absolute Arrival Time average Outer pixels LoGain");
+
+    fAverageHiGainInnerPix->SetChargeLast(1000.);
+    fAverageLoGainInnerPix->SetChargeLast(100.);
+    fAverageHiGainOuterPix->SetChargeLast(1000.);
+    fAverageLoGainOuterPix->SetChargeLast(100.);
+
+    fAverageHiGainInnerPix->SetChargeNbins(4000);
+    fAverageLoGainInnerPix->SetChargeNbins(4000);
+    fAverageHiGainOuterPix->SetChargeNbins(4000);
+    fAverageLoGainOuterPix->SetChargeNbins(4000);
+
     SetNumHiGainSaturationLimit();
     SetNumLoGainSaturationLimit();
@@ -86,4 +153,9 @@
   delete fHiGainArray;
   delete fLoGainArray;
+
+  delete fAverageHiGainInnerPix;
+  delete fAverageLoGainInnerPix;
+  delete fAverageHiGainOuterPix;
+  delete fAverageLoGainOuterPix;
 }
 
@@ -131,12 +203,15 @@
 TObject *MHCalibrationChargeCam::Clone(const char *) const
 {
+
     const Int_t nhi = fHiGainArray->GetSize();
     const Int_t nlo = fLoGainArray->GetSize();
-
     //
     // FIXME, this might be done faster and more elegant, by direct copy.
     //
     MHCalibrationChargeCam *cam = new MHCalibrationChargeCam;
-
+//    MHCalibrationChargeCam cam;
+    Copy(*cam);
+
+/*
     cam->fHiGainArray->Expand(nhi);
     cam->fLoGainArray->Expand(nlo);
@@ -152,4 +227,22 @@
         (*cam->fLoGainArray)[i] = (*fLoGainArray)[i]->Clone();
     }
+
+    delete cam->fAverageHiGainInnerPix;
+    delete cam->fAverageLoGainInnerPix;
+    delete cam->fAverageHiGainOuterPix;
+    delete cam->fAverageLoGainOuterPix;
+
+    cam->GetAverageHiGainInnerPix() = *(MHCalibrationChargeHiGainPix*)fAverageHiGainInnerPix->Clone();
+    cam->GetAverageLoGainInnerPix() = *(MHCalibrationChargeLoGainPix*)fAverageLoGainInnerPix->Clone();
+
+    cam->GetAverageHiGainOuterPix() = *(MHCalibrationChargeHiGainPix*)fAverageHiGainOuterPix->Clone();
+    cam->GetAverageLoGainOuterPix() = *(MHCalibrationChargeLoGainPix*)fAverageLoGainOuterPix->Clone();
+
+    fAverageHiGainInnerPix->Copy(cam->GetAverageHiGainInnerPix());
+    fAverageLoGainInnerPix->Copy(cam->GetAverageLoGainInnerPix());
+    fAverageHiGainOuterPix->Copy(cam->GetAverageHiGainOuterPix());
+    fAverageLoGainOuterPix->Copy(cam->GetAverageLoGainOuterPix());
+*/
+
     return cam;
 }
@@ -163,8 +256,29 @@
 {
   
+  fRawEvt = (MRawEvtData*)pList->FindObject("MRawEvtData");
+
+  if (!fRawEvt)
+  {
+      gLog << err << dbginf << "MRawEvtData not found... aborting." << endl;
+      return kFALSE;
+  }
+
+  fGeom = (MGeomCam*)pList->FindObject("MGeomCam");
+
+  if (!fGeom)
+  {
+      gLog << err << dbginf << "MGeomCam not found... aborting." << endl;
+      return kFALSE;
+  }
+
   fHiGainArray->Delete();
   fLoGainArray->Delete();
+
+  fAverageHiGainInnerPix->Init();
+  fAverageLoGainInnerPix->Init();  
+  fAverageHiGainOuterPix->Init();
+  fAverageLoGainOuterPix->Init();  
+
   return kTRUE;
-
 }
 
@@ -179,11 +293,4 @@
   }
 
-  fRawEvt = (MRawEvtData*)pList->FindObject("MRawEvtData");
-  if (!fRawEvt)
-  {
-      gLog << err << dbginf << "MRawEvtData not found... aborting." << endl;
-      return kFALSE;
-  }
-
   MExtractedSignalCam *signal = (MExtractedSignalCam*)pList->FindObject("MExtractedSignalCam");
   if (!signal)
@@ -192,29 +299,35 @@
       return kFALSE;
     }
+
+  const Int_t n = signal->GetSize();
+
+  if (fHiGainArray->GetEntries()==0)
+  {
+      fHiGainArray->Expand(n);
   
-  const Int_t n = signal->GetSize();
-
-  fHiGainArray->Expand(n);
+      for (Int_t i=0; i<n; i++)
+      {
+	  (*fHiGainArray)[i] = new MHCalibrationChargeHiGainPix;
+	  (*this)[i].Init();
+	  (*this)[i].ChangeHistId(i);
+	  
+      }
+  }
+
+  if (fLoGainArray->GetEntries()==0)
+  {
+      fLoGainArray->Expand(n);
+      
+      for (Int_t i=0; i<n; i++)
+      {
+	  (*fLoGainArray)[i] = new MHCalibrationChargeLoGainPix;
+	  (*this)(i).Init();
+	  (*this)(i).ChangeHistId(i);
+      }
+  }
+
+  return kTRUE;
+}
   
-  for (Int_t i=0; i<n; i++)
-  {
-      (*fHiGainArray)[i] = new MHCalibrationChargeHiGainPix;
-      (*this)[i].Init();
-      (*this)[i].ChangeHistId(i);
-      
-  }
-
-  fLoGainArray->Expand(n);
-  
-  for (Int_t i=0; i<n; i++)
-  {
-      (*fLoGainArray)[i] = new MHCalibrationChargeLoGainPix;
-      (*this)(i).Init();
-      (*this)(i).ChangeHistId(i);
-  }
-  
-  return kTRUE;
-}
-
 
 // --------------------------------------------------------------------------
@@ -229,5 +342,5 @@
     }
   
-  const Int_t n = signal->GetSize();
+  Int_t n = signal->GetSize();
 
   if (fHiGainArray->GetEntries() != n)
@@ -242,7 +355,22 @@
       return kFALSE;
     }
-  
+
+  //
+  // First the extracted signal
+  // 
+  Float_t sumhiinnertot = 0.;
+  Float_t sumloinnertot = 0.;
+  Float_t sumhioutertot = 0.;
+  Float_t sumlooutertot = 0.;
+  Int_t   sumhiinnersat = 0;
+  Int_t   sumloinnersat = 0;
+  Int_t   sumhioutersat = 0;
+  Int_t   sumlooutersat = 0;
+  Int_t   numinner = 0;
+  Int_t   numouter = 0;
+
   for (int i=0; i<n; i++)
     {
+
       const MExtractedSignalPix &pix = (*signal)[i];
       
@@ -253,10 +381,45 @@
       (*this)(i).FillHistAndArray(sumlo);
 
-      (*this)[i].SetSaturated((Int_t)pix.GetNumHiGainSaturated()); 
-      (*this)(i).SetSaturated((Int_t)pix.GetNumLoGainSaturated()); 
-    }
-
+      const Int_t sathi = (Int_t)pix.GetNumHiGainSaturated();
+      const Int_t satlo = (Int_t)pix.GetNumLoGainSaturated();
+
+      (*this)[i].SetSaturated(sathi); 
+      (*this)(i).SetSaturated(satlo); 
+
+      if (fGeom->GetPixRatio(i) == 1.)
+      {
+	  sumhiinnertot += sumhi;
+	  sumloinnertot += sumlo;
+	  sumhiinnersat += sathi;
+	  sumloinnersat += satlo;
+	  numinner++;
+      }
+      else
+      {
+	  sumhioutertot += sumhi;
+	  sumlooutertot += sumlo;
+	  sumhioutersat += sathi;
+	  sumlooutersat += satlo;
+	  numouter++;
+      }
+
+    }
+
+  fAverageHiGainInnerPix->FillHistAndArray(sumhiinnertot/numinner); 
+  fAverageLoGainInnerPix->FillHistAndArray(sumloinnertot/numinner); 
+  fAverageHiGainOuterPix->FillHistAndArray(sumhioutertot/numouter); 
+  fAverageLoGainOuterPix->FillHistAndArray(sumlooutertot/numouter); 
+
+  fAverageHiGainInnerPix->SetSaturated(sumhiinnersat/numinner); 
+  fAverageLoGainInnerPix->SetSaturated(sumloinnersat/numinner); 
+  fAverageHiGainOuterPix->SetSaturated(sumhioutersat/numouter); 
+  fAverageLoGainOuterPix->SetSaturated(sumlooutersat/numouter); 
+
+  //
+  // Now the times
+  //
+  sumhiinnertot = sumloinnertot = sumhioutertot = sumlooutertot = 0.;
+  numinner = numouter = 0;
   MRawEvtPixelIter pixel(fRawEvt);
-  
   while (pixel.Next())
     {
@@ -270,5 +433,20 @@
       (*this)(pixid).FillAbsTime(timelo);
 
-    }
+      if (fGeom->GetPixRatio(pixel.GetPixelId()) == 1.)
+      {
+	  sumhiinnertot += timehi;
+	  sumloinnertot += timelo;
+      }
+      else
+      {
+	  sumhioutertot += timehi;
+	  sumlooutertot += timelo;
+      }
+    }
+
+  fAverageHiGainInnerPix-> FillAbsTime(sumhiinnertot/numinner); 
+  fAverageLoGainInnerPix-> FillAbsTime(sumloinnertot/numinner); 
+  fAverageHiGainOuterPix-> FillAbsTime(sumhioutertot/numouter); 
+  fAverageLoGainOuterPix-> FillAbsTime(sumlooutertot/numouter); 
 
   return kTRUE;
@@ -291,53 +469,8 @@
     {
      
-	MHCalibrationChargeHiGainPix &pixhi = (*this)[i];
-	MCalibrationChargePix        &pix   = (*fCam)[i];
-
-        if (pixhi.IsEmpty())
-            continue;
-
-	if (pixhi.GetSaturated() > fNumHiGainSaturationLimit*pixhi.GetHGausHist()->GetEntries())
-	{
-	    pix.SetHiGainSaturation();
-	    continue;
-	}
-
-        //
-        // 2) Fit the Hi Gain histograms with a Gaussian
-        //
-	if (pixhi.FitGaus())
-	    pix.SetHiGainFitted();
-        //
-        // 3) In case of failure set the bit kFitted to false and take histogram means and RMS
-        //
-	else if (pixhi.RepeatFit())
-	    pix.SetHiGainFitted();
-	else
-	    pixhi.BypassFit();
-
-	//
-	// 4) Check for pickup
-	//
-	pixhi.CountPickup();
-
-        //
-        // 5) Check for oscillations
-        // 
-	pixhi.CreateFourierSpectrum();
-
-	//
-        // 6) Retrieve the results and store them in this class
-	//
-	pix.SetHiGainMeanCharge(     pixhi.GetMean()     );
-	pix.SetHiGainMeanChargeErr(  pixhi.GetMeanErr()  );
-	pix.SetHiGainSigmaCharge(    pixhi.GetSigma()    );
-	pix.SetHiGainSigmaChargeErr( pixhi.GetSigmaErr() );
-	pix.SetHiGainChargeProb    ( pixhi.GetProb()     );
-
-	pix.SetAbsTimeMean         ( pixhi.GetAbsTimeMean());
-	pix.SetAbsTimeRms          ( pixhi.GetAbsTimeRms() );
-
-	pix.SetHiGainOscillating   ( !pixhi.IsFourierSpectrumOK() );
-	pix.SetHiGainNumPickup     (  pixhi.GetPickup()           );
+	MHCalibrationChargeHiGainPix &histhi = (*this)[i];
+	MCalibrationChargePix        &pix    = (*fCam)[i];
+
+	FinalizeHiGainHists(histhi,pix);
     }
 
@@ -345,61 +478,126 @@
     {
      
-	MHCalibrationChargeLoGainPix &pixlo = (*this)(i);
-	MCalibrationChargePix        &pix   = (*fCam)[i];
-
-        if (pixlo.IsEmpty())
-            continue;
-
-	if (pixlo.GetSaturated() > fNumHiGainSaturationLimit*pixlo.GetHGausHist()->GetEntries())
-	{
-	    pix.SetLoGainSaturation();
-	    continue;
-	}
-        //
-        // 2) Fit the Lo Gain histograms with a Gaussian
-        //
-	if (pixlo.FitGaus())
-	    pix.SetLoGainFitted();
-        //
-        // 3) In case of failure set the bit kFitted to false and take histogram means and RMS
-        //
-	else if (pixlo.RepeatFit())
-	    pix.SetLoGainFitted();
-	else
-	    pixlo.BypassFit();
-
-	//
-	// 4) Check for pickup
-	//
-	pixlo.CountPickup();
-
-        //
-        // 5) Check for oscillations
-        // 
-	pixlo.CreateFourierSpectrum();
-
-	//
-        // 6) Retrieve the results and store them in this class
-	//
-	pix.SetLoGainMeanCharge(     pixlo.GetMean()     );
-	pix.SetLoGainMeanChargeErr(  pixlo.GetMeanErr()  );
-	pix.SetLoGainSigmaCharge(    pixlo.GetSigma()    );
-	pix.SetLoGainSigmaChargeErr( pixlo.GetSigmaErr() );
-	pix.SetLoGainChargeProb    ( pixlo.GetProb()     );
-
-	if (pix.IsHiGainSaturation())
-	{
-	    pix.SetAbsTimeMean     ( pixlo.GetAbsTimeMean());
-	    pix.SetAbsTimeRms      ( pixlo.GetAbsTimeRms() );
-	}	    
-
-	pix.SetLoGainOscillating   ( !pixlo.IsFourierSpectrumOK() );
-	pix.SetLoGainNumPickup     (  pixlo.GetPickup()           );
-
-    }
+	MHCalibrationChargeLoGainPix &histlo = (*this)(i);
+	MCalibrationChargePix        &pix    = (*fCam)[i];
+
+	FinalizeLoGainHists(histlo,pix);
+    }
+
+    FinalizeHiGainHists(*fAverageHiGainInnerPix,*fCam->GetAverageInnerPix());
+    FinalizeLoGainHists(*fAverageLoGainInnerPix,*fCam->GetAverageInnerPix());
+    FinalizeHiGainHists(*fAverageHiGainOuterPix,*fCam->GetAverageOuterPix());
+    FinalizeLoGainHists(*fAverageLoGainOuterPix,*fCam->GetAverageOuterPix());
 
     return kTRUE;
 }
 
+void MHCalibrationChargeCam::FinalizeHiGainHists(MHCalibrationChargeHiGainPix &hist, MCalibrationChargePix &pix)
+{
+
+    if (hist.IsEmpty())
+	return;
+    
+    if (hist.GetSaturated() > fNumHiGainSaturationLimit*hist.GetHGausHist()->GetEntries())
+    {
+	pix.SetHiGainSaturation();
+	return;
+    }
+    
+    //
+    // 2) Fit the Hi Gain histograms with a Gaussian
+    //
+    if (hist.FitGaus())
+	pix.SetHiGainFitted();
+    //
+    // 3) In case of failure set the bit kFitted to false and take histogram means and RMS
+    //
+    else if (hist.RepeatFit())
+	pix.SetHiGainFitted();
+    else
+	hist.BypassFit();
+    
+    //
+    // 4) Check for pickup
+    //
+    hist.CountPickup();
+    
+    //
+    // 5) Check for oscillations
+    // 
+    hist.CreateFourierSpectrum();
+    
+    //
+    // 6) Retrieve the results and store them in this class
+    //
+    pix.SetHiGainMeanCharge(     hist.GetMean()     );
+    pix.SetHiGainMeanChargeErr(  hist.GetMeanErr()  );
+    pix.SetHiGainSigmaCharge(    hist.GetSigma()    );
+    pix.SetHiGainSigmaChargeErr( hist.GetSigmaErr() );
+    pix.SetHiGainChargeProb    ( hist.GetProb()     );
+    
+    pix.SetAbsTimeMean         ( hist.GetAbsTimeMean());
+    pix.SetAbsTimeRms          ( hist.GetAbsTimeRms() );
+    
+    pix.SetHiGainOscillating   ( !hist.IsFourierSpectrumOK() );
+    pix.SetHiGainNumPickup     (  hist.GetPickup()           );
+    
+}
+
+
+void MHCalibrationChargeCam::FinalizeLoGainHists(MHCalibrationChargeLoGainPix &hist, MCalibrationChargePix &pix)
+{
+
+
+    if (hist.IsEmpty())
+            return;
+
+    if (hist.GetSaturated() > fNumLoGainSaturationLimit*hist.GetHGausHist()->GetEntries())
+    {
+	pix.SetLoGainSaturation();
+	return;
+    }
+    //
+    // 2) Fit the Lo Gain histograms with a Gaussian
+    //
+    if (hist.FitGaus())
+	pix.SetLoGainFitted();
+    //
+    // 3) In case of failure set the bit kFitted to false and take histogram means and RMS
+    //
+    else if (hist.RepeatFit())
+	pix.SetLoGainFitted();
+    else
+	hist.BypassFit();
+    
+    //
+    // 4) Check for pickup
+    //
+    hist.CountPickup();
+    
+    //
+    // 5) Check for oscillations
+    // 
+    hist.CreateFourierSpectrum();
+    
+    //
+    // 6) Retrieve the results and store them in this class
+    //
+    pix.SetLoGainMeanCharge(     hist.GetMean()     );
+    pix.SetLoGainMeanChargeErr(  hist.GetMeanErr()  );
+    pix.SetLoGainSigmaCharge(    hist.GetSigma()    );
+    pix.SetLoGainSigmaChargeErr( hist.GetSigmaErr() );
+    pix.SetLoGainChargeProb    ( hist.GetProb()     );
+    
+    if (pix.IsHiGainSaturation())
+    {
+	pix.SetAbsTimeMean     ( hist.GetAbsTimeMean());
+	pix.SetAbsTimeRms      ( hist.GetAbsTimeRms() );
+    }	    
+    
+    pix.SetLoGainOscillating   ( !hist.IsFourierSpectrumOK() );
+    pix.SetLoGainNumPickup     (  hist.GetPickup()           );
+    
+}    
+
 Bool_t MHCalibrationChargeCam::GetPixelContent(Double_t &val, Int_t idx, const MGeomCam &cam, Int_t type) const
 {
@@ -413,5 +611,49 @@
 void MHCalibrationChargeCam::DrawPixelContent(Int_t idx) const
 {
-  (*this)[idx].DrawClone();
-}
-
+
+    if (idx == -1)
+	fAverageHiGainInnerPix->DrawClone();
+    if (idx == -2)
+	fAverageHiGainOuterPix->DrawClone();
+    if (idx == -3)
+	fAverageLoGainInnerPix->DrawClone();
+    if (idx == -4)
+	fAverageLoGainOuterPix->DrawClone();
+    (*this)[idx].DrawClone();
+
+}
+
+
+void MHCalibrationChargeCam::Draw(const Option_t *opt)
+{
+
+  TVirtualPad *pad = gPad ? gPad : MH::MakeDefCanvas(this);  
+  pad->SetBorderMode(0);
+
+  pad->Divide(2,2);
+
+  pad->cd(1);
+
+  if (!fAverageHiGainInnerPix->IsEmpty())
+    gPad->SetLogy();
+  fAverageHiGainInnerPix->Draw(opt);
+
+  pad->cd(2);
+
+  if (!fAverageLoGainInnerPix->IsEmpty())
+    gPad->SetLogy();
+  fAverageLoGainInnerPix->Draw(opt);
+
+  pad->cd(3);
+
+  if (!fAverageHiGainOuterPix->IsEmpty())
+    gPad->SetLogy();
+  fAverageHiGainOuterPix->Draw(opt);
+
+  pad->cd(4);
+
+  if (!fAverageLoGainOuterPix->IsEmpty())
+    gPad->SetLogy();
+  fAverageLoGainOuterPix->Draw(opt);
+
+}
Index: /trunk/MagicSoft/Mars/mcalib/MHCalibrationChargeCam.h
===================================================================
--- /trunk/MagicSoft/Mars/mcalib/MHCalibrationChargeCam.h	(revision 3351)
+++ /trunk/MagicSoft/Mars/mcalib/MHCalibrationChargeCam.h	(revision 3352)
@@ -14,5 +14,7 @@
 
 class MRawEvtData;
+class MGeomCam;
 class MCalibrationChargeCam;
+class MCalibrationChargePix;
 class MHCalibrationChargeHiGainPix;
 class MHCalibrationChargeLoGainPix;
@@ -21,16 +23,23 @@
 private:
 
-  static const Float_t fgNumHiGainSaturationLimit; // The default number of fNumHiGainSaturationLimit
-  static const Float_t fgNumLoGainSaturationLimit; // The default number of fNumLoGainSaturationLimit
+  static const Float_t fgNumHiGainSaturationLimit;   // The default number of fNumHiGainSaturationLimit
+  static const Float_t fgNumLoGainSaturationLimit;   // The default number of fNumLoGainSaturationLimit
 
   Float_t fNumHiGainSaturationLimit;      // The rel. number of saturated higain FADC slices in the whole run upon which the pixel is called saturated
   Float_t fNumLoGainSaturationLimit;      // The rel. number of saturated logain FADC slices in the whole run upon which the pixel is called saturated
   
-  TObjArray *fHiGainArray;                //-> Array of MHCalibrationChargePix with hists
-  TObjArray *fLoGainArray;                //-> Array of MHCalibrationChargePix with hists
-  
-  MCalibrationChargeCam  *fCam;           //!  Class holding the results
-  MRawEvtData            *fRawEvt;        //!  Raw event data (time slices)
+  TObjArray *fHiGainArray;                           //-> Array of MHCalibrationChargePix with hists
+  TObjArray *fLoGainArray;                           //-> Array of MHCalibrationChargePix with hists
+  MHCalibrationChargeHiGainPix *fAverageHiGainInnerPix;   //-> One MHCalibrationChargeHiGainPix with the average of all inner pixels
+  MHCalibrationChargeLoGainPix *fAverageLoGainInnerPix;   //-> One MHCalibrationChargeLoGainPix with the average of all inner pixels
+  MHCalibrationChargeHiGainPix *fAverageHiGainOuterPix;   //-> One MHCalibrationChargeHiGainPix with the average of all outer pixels
+  MHCalibrationChargeLoGainPix *fAverageLoGainOuterPix;   //-> One MHCalibrationChargeLoGainPix with the average of all outer pixels
 
+  MCalibrationChargeCam  *fCam;                      //!  Class holding the results
+  MRawEvtData            *fRawEvt;                   //!  Raw event data (time slices)
+  MGeomCam               *fGeom;                     //!  MAGIC geometry
+
+  void FinalizeHiGainHists(MHCalibrationChargeHiGainPix &hist, MCalibrationChargePix &pix);
+  void FinalizeLoGainHists(MHCalibrationChargeLoGainPix &hist, MCalibrationChargePix &pix);
 
 public:
@@ -42,13 +51,24 @@
   void SetNumLoGainSaturationLimit( const Float_t lim=fgNumLoGainSaturationLimit) { fNumLoGainSaturationLimit = lim; }
 
-  Float_t GetNumHiGainSaturationLimit()                             const  { return fNumHiGainSaturationLimit; }
-  Float_t GetNumLoGainSaturationLimit()                             const  { return fNumLoGainSaturationLimit; }
+  Float_t GetNumHiGainSaturationLimit()                       const  { return fNumHiGainSaturationLimit; }
+  Float_t GetNumLoGainSaturationLimit()                       const  { return fNumLoGainSaturationLimit; }
 
-  
-  MHCalibrationChargeHiGainPix &operator[](UInt_t i);
-  const MHCalibrationChargeHiGainPix &operator[](UInt_t i) const;
+        MHCalibrationChargeHiGainPix &operator[](UInt_t i);
+  const MHCalibrationChargeHiGainPix &operator[](UInt_t i)    const;
 
-  MHCalibrationChargeLoGainPix &operator()(UInt_t i);
-  const MHCalibrationChargeLoGainPix &operator()(UInt_t i) const;
+        MHCalibrationChargeLoGainPix &operator()(UInt_t i);
+  const MHCalibrationChargeLoGainPix &operator()(UInt_t i)    const;
+
+        MHCalibrationChargeHiGainPix  &GetAverageHiGainInnerPix()        { return *fAverageHiGainInnerPix; }
+  const MHCalibrationChargeHiGainPix  &GetAverageHiGainInnerPix()  const { return *fAverageHiGainInnerPix; }
+
+        MHCalibrationChargeLoGainPix  &GetAverageLoGainInnerPix()        { return *fAverageLoGainInnerPix; }
+  const MHCalibrationChargeLoGainPix  &GetAverageLoGainInnerPix()  const { return *fAverageLoGainInnerPix; }
+
+        MHCalibrationChargeHiGainPix  &GetAverageHiGainOuterPix()        { return *fAverageHiGainOuterPix; }
+  const MHCalibrationChargeHiGainPix  &GetAverageHiGainOuterPix()  const { return *fAverageHiGainOuterPix; }
+
+        MHCalibrationChargeLoGainPix  &GetAverageLoGainOuterPix()        { return *fAverageLoGainOuterPix; }
+  const MHCalibrationChargeLoGainPix  &GetAverageLoGainOuterPix()  const { return *fAverageLoGainOuterPix; }
 
   Bool_t SetupFill(const MParList *pList);
@@ -58,4 +78,7 @@
   
   TObject *Clone(const char *) const;
+
+  // Draw
+  void Draw(const Option_t *opt);
 
   Bool_t GetPixelContent ( Double_t &val, Int_t idx, const MGeomCam &cam, Int_t type=0) const;
