Index: /trunk/MagicSoft/Mars/msignal/MExtractTimeAndCharge.cc
===================================================================
--- /trunk/MagicSoft/Mars/msignal/MExtractTimeAndCharge.cc	(revision 4258)
+++ /trunk/MagicSoft/Mars/msignal/MExtractTimeAndCharge.cc	(revision 4258)
@@ -0,0 +1,204 @@
+/* ======================================================================== *\
+!
+! *
+! * This file is part of MARS, the MAGIC Analysis and Reconstruction
+! * Software. It is distributed to you in the hope that it can be a useful
+! * and timesaving tool in analysing Data of imaging Cerenkov telescopes.
+! * It is distributed WITHOUT ANY WARRANTY.
+! *
+! * Permission to use, copy, modify and distribute this software and its
+! * documentation for any purpose is hereby granted without fee,
+! * provided that the above copyright notice appear in all copies and
+! * that both that copyright notice and this permission notice appear
+! * in supporting documentation. It is provided "as is" without express
+! * or implied warranty.
+! *
+!
+!
+!   Author(s): Markus Gaug, 05/2004 <mailto:markus@ifae.es>
+!
+!   Copyright: MAGIC Software Development, 2000-2004
+!
+!
+\* ======================================================================== */
+
+//////////////////////////////////////////////////////////////////////////////
+//
+//   MExtractTimeAndCharge
+//
+//   Base class for the signal extractors which extract the arrival time 
+//   and the signal at the same time. Uses the functions 
+//   FindTimeAndChargeHiGain() and FindTimeAndChargeLoGain() to extract the signal and 
+//   substract the pedestal value    
+//
+//   The following variables have to be set by the derived class and 
+//   do not have defaults:
+//   - fNumHiGainSamples
+//   - fNumLoGainSamples
+//   - fSqrtHiGainSamples
+//   - fSqrtLoGainSamples
+//
+// Input Containers:
+//   MRawEvtData
+//   MRawRunHeader
+//   MPedestalCam
+//
+// Output Containers:
+//   MArrivalTimeCam
+//   MExtractedSignalCam
+//
+//////////////////////////////////////////////////////////////////////////////
+#include "MExtractTimeAndCharge.h"
+
+#include "MLog.h"
+#include "MLogManip.h"
+
+#include "MParList.h"
+
+#include "MRawEvtData.h"
+#include "MRawEvtPixelIter.h"
+#include "MRawRunHeader.h"
+
+#include "MPedestalCam.h"
+#include "MPedestalPix.h"
+
+#include "MArrivalTimeCam.h"
+#include "MArrivalTimePix.h"
+
+#include "MExtractedSignalCam.h"
+#include "MExtractedSignalPix.h"
+
+ClassImp(MExtractTimeAndCharge);
+
+using namespace std;
+
+// --------------------------------------------------------------------------
+//
+// The PreProcess searches for the following input containers:
+//  - MRawEvtData
+//  - MRawRunHeader
+//  - MPedestalCam
+//
+// The following output containers are also searched and created if
+// they were not found:
+//
+//  - MExtractedSignalCam
+//  - MArrivalTimeCam    
+//
+Int_t MExtractTimeAndCharge::PreProcess(MParList *pList)
+{
+
+  if (!MExtractTime::PreProcess(pList))
+    return kFALSE;
+  
+  fSignals = (MExtractedSignalCam*)pList->FindCreateObj(AddSerialNumber("MExtractedSignalCam"));
+  if (!fSignals)
+    {
+      *fLog << err << GetDescriptor()
+            << ": Could not find nor create MExtractedSignalCam,... aborting." << endl;
+      return kFALSE;
+    }
+  
+  
+  return kTRUE;
+}
+
+// --------------------------------------------------------------------------
+//
+// The ReInit calls:
+// -  MExtractor::ReInit()
+//
+// Call: 
+// - MArrivalTimeCam::SetUsedFADCSlices(fHiGainFirst, fHiGainLast, fNumHiGainSamples,
+//                                      fLoGainFirst, fLoGainLast, fNumLoGainSamples);
+//
+Bool_t MExtractTimeAndCharge::ReInit(MParList *pList)
+{
+  
+  MExtractTime::ReInit(pList);
+
+  fSignals->SetUsedFADCSlices(fHiGainFirst, fHiGainLast+fHiLoLast, fNumHiGainSamples,
+                              fLoGainFirst, fLoGainLast, fNumLoGainSamples);
+
+  return kTRUE;
+}
+
+void MExtractTimeAndCharge::FindTimeAndChargeHiGain(Byte_t *firstused, Byte_t *logain, Float_t &sum, Float_t &dsum, 
+                                                    Float_t &time, Float_t &dtime,
+                                                    Byte_t &sat, const MPedestalPix &ped) const
+{
+  return;
+}
+
+void MExtractTimeAndCharge::FindTimeAndChargeLoGain(Byte_t *firstused, Float_t &sum, Float_t &dsum, 
+                                                    Float_t &time, Float_t &dtime,
+                                                    Byte_t &sat, const MPedestalPix &ped) const
+{
+  return;
+}
+
+
+// --------------------------------------------------------------------------
+//
+// Calculate the integral of the FADC time slices and store them as a new
+// pixel in the MArrivalTimeCam container.
+// Calculate the integral of the FADC time slices and store them as a new
+// pixel in the MExtractedSignalCam container.
+//
+Int_t MExtractTimeAndCharge::Process()
+{
+
+  MRawEvtPixelIter pixel(fRawEvt);
+  fArrTime->Clear();
+
+  while (pixel.Next())
+    {
+      //
+      // Find signal in hi- and lo-gain
+      //
+      Float_t sumhi =0., deltasumhi =0.;
+      Float_t timehi=0., deltatimehi=0.;
+      Byte_t sathi=0;
+
+      const Int_t pixid = pixel.GetPixelId();
+      const MPedestalPix  &ped = (*fPedestals)[pixid];
+
+      FindTimeAndChargeHiGain(pixel.GetHiGainSamples()+fHiGainFirst, pixel.GetLoGainSamples(), 
+                              sumhi, deltasumhi, 
+                              timehi, deltatimehi, 
+                              sathi, ped);
+      
+      Float_t sumlo =0., deltasumlo =0.;
+      Float_t timelo=0., deltatimelo=0.;
+      Byte_t satlo=0;
+
+      FindTimeAndChargeLoGain(pixel.GetLoGainSamples()+fLoGainFirst, 
+                              sumlo, deltasumlo, 
+                              timelo, deltatimelo, 
+                              satlo, ped);
+
+      MExtractedSignalPix &pix = (*fSignals)[pixid];
+      MArrivalTimePix     &tix = (*fArrTime)[pixid];      
+
+      const Float_t pedes  = ped.GetPedestal();
+      const Float_t pedrms = ped.GetPedestalRms();
+      
+      pix.SetExtractedSignal(sumhi - pedes*fNumHiGainSamples, pedrms*fSqrtHiGainSamples,
+                             sumlo - pedes*fNumLoGainSamples, pedrms*fSqrtLoGainSamples);
+      
+      pix.SetGainSaturation(sathi, sathi, satlo);
+      
+      pix.SetNumHiGainSlices(fNumHiGainSamples);
+      pix.SetNumLoGainSlices(fNumLoGainSamples);      
+      
+      tix.SetArrivalTime(timehi, deltatimehi, timelo-fOffsetLoGain, deltatimelo);
+      tix.SetGainSaturation(sathi, sathi, satlo);
+ 
+    } /* while (pixel.Next()) */
+
+  fArrTime->SetReadyToSave();
+  fSignals->SetReadyToSave();
+
+  return kTRUE;
+}
+
Index: /trunk/MagicSoft/Mars/msignal/MExtractTimeAndCharge.h
===================================================================
--- /trunk/MagicSoft/Mars/msignal/MExtractTimeAndCharge.h	(revision 4258)
+++ /trunk/MagicSoft/Mars/msignal/MExtractTimeAndCharge.h	(revision 4258)
@@ -0,0 +1,32 @@
+#ifndef MARS_MExtractTimeAndCharge
+#define MARS_MExtractTimeAndCharge
+
+#ifndef MARS_MExtractTime
+#include "MExtractTime.h"
+#endif
+
+class MPedestalPix;
+class MExtractTimeAndCharge : public MExtractTime
+{
+protected:
+
+  virtual Int_t PreProcess(MParList *pList);
+  virtual Bool_t ReInit(MParList *pList);
+  virtual Int_t Process();
+
+  virtual void FindTimeAndChargeHiGain(Byte_t *firstused, Byte_t *logain, Float_t &sum, Float_t &dsum,
+                                       Float_t &time, Float_t &dtime,
+                                       Byte_t &sat, const MPedestalPix &ped) const;
+  virtual void FindTimeAndChargeLoGain(Byte_t *firstused, Float_t &sum,  Float_t &dsum,
+                                       Float_t &time, Float_t &dtime,
+                                       Byte_t &sat, const MPedestalPix &ped) const;
+
+public:
+
+  ClassDef(MExtractTimeAndCharge, 0)   // Time And Charge Extractor Base Class
+};
+
+#endif
+
+
+
