Index: /trunk/MagicSoft/Mars/msignal/MExtractTimeAndChargeSpline.cc
===================================================================
--- /trunk/MagicSoft/Mars/msignal/MExtractTimeAndChargeSpline.cc	(revision 5496)
+++ /trunk/MagicSoft/Mars/msignal/MExtractTimeAndChargeSpline.cc	(revision 5497)
@@ -271,19 +271,4 @@
   SETBIT(fFlags,typ);
 
-  if (IsExtractionType(kAmplitude))
-    {
-      fNumHiGainSamples = 1.;
-      fNumLoGainSamples = fLoGainLast ? 1. : 0.; 
-      fSqrtHiGainSamples = 1.;
-      fSqrtLoGainSamples = 1.;
-    }
-
-  if (IsExtractionType(kIntegral))
-    {
-      fNumHiGainSamples  = TMath::Floor(fRiseTime + fFallTime);
-      fNumLoGainSamples  = fLoGainLast ? fNumHiGainSamples + 1. : 0.;
-      fSqrtHiGainSamples = TMath::Sqrt(fNumHiGainSamples);
-      fSqrtLoGainSamples = TMath::Sqrt(fNumLoGainSamples);
-    }
 }
 
@@ -300,7 +285,4 @@
 Bool_t MExtractTimeAndChargeSpline::ReInit(MParList *pList)
 {
-
-  if (!MExtractTimeAndCharge::ReInit(pList))
-    return kFALSE;
 
   if (fHiGainSignal)
@@ -334,4 +316,23 @@
   fLoGainSecondDeriv = new Float_t[range];
   memset(fLoGainSecondDeriv,0,range*sizeof(Float_t));
+
+  if (IsExtractionType(kAmplitude))
+    {
+      fNumHiGainSamples = 1.;
+      fNumLoGainSamples = fLoGainLast ? 1. : 0.; 
+      fSqrtHiGainSamples = 1.;
+      fSqrtLoGainSamples = 1.;
+    }
+
+  if (IsExtractionType(kIntegral))
+    {
+      fNumHiGainSamples  = fRiseTime + fFallTime;
+      fNumLoGainSamples  = fLoGainLast ? fNumHiGainSamples + 1. : 0.;
+      fSqrtHiGainSamples = TMath::Sqrt(fNumHiGainSamples);
+      fSqrtLoGainSamples = TMath::Sqrt(fNumLoGainSamples);
+    }
+
+  if (!MExtractTimeAndCharge::ReInit(pList))
+    return kFALSE;
 
   return kTRUE;
@@ -441,4 +442,15 @@
           + (-0.375)*fHiGainSecondDeriv[2] 
           + (-0.375)*fHiGainSecondDeriv[3];
+      return;
+    }
+
+  if (IsNoiseCalculation() && IsExtractionType(kIntegral))
+    {
+      //
+      // Take the spline value at the middle of the third slice (to avoid egde effects)
+      // 
+      Int_t first = 2;
+      Int_t last  = first + (Int_t)(fRiseTime+fFallTime);
+      CalcIntegralHiGain(sum,first,last);
       return;
     }
@@ -695,27 +707,14 @@
       // Now integrate the whole thing!
       // 
-      Int_t startslice = IsNoiseCalculation() ? 0 : (Int_t)(fAbMaxPos - fRiseTime);
-      Int_t lastslice  = IsNoiseCalculation() ? (Int_t)(fRiseTime+fFallTime) : (Int_t)(fAbMaxPos + fFallTime);
-      
-      if (startslice < 0)
-        {
-          lastslice -= startslice;
-          startslice = 0;
-        }
-
+      Int_t startslice = (Int_t)(fAbMaxPos - fRiseTime);
+      Int_t lastslice  = (Int_t)(fAbMaxPos + fFallTime);
+      
       if (lastslice > range)
-        lastslice = range;
-
-      Int_t i = startslice;
-      sum = 0.5*fHiGainSignal[i];
-      
-      //
-      // We sum 1.5 times the second deriv. coefficients because these had been 
-      // divided by 6. already. Usually, 0.25*fHiGainSecondDeriv should be added.
-      //
-      for (i=startslice+1; i<lastslice; i++)
-        sum += fHiGainSignal[i] + 1.5*fHiGainSecondDeriv[i];
-      
-      sum += 0.5*fHiGainSignal[lastslice];
+        {
+          lastslice = range;
+          startslice += (lastslice - range);
+        }
+      
+      CalcIntegralHiGain(sum, startslice, lastslice);
     }
   
@@ -771,23 +770,4 @@
     }
   
-  //
-  // Allow no saturated slice 
-  // and 
-  // Don't start if the maxpos is too close to the left limit.
-  //
-  if (sat || maxpos < 1)
-    {
-      time =  IsExtractionType(kMaximum) 
-        ? (Float_t)(fLoGainFirst + maxpos) 
-        : (Float_t)(fLoGainFirst + maxpos - 1);
-      return;
-    }
-      
-  if (maxpos < 2 && IsExtractionType(kHalfMaximum))
-    {
-      time = (Float_t)(fLoGainFirst + maxpos - 1);
-      return;
-    }
-
   Float_t pp;
 
@@ -809,4 +789,46 @@
     fLoGainSecondDeriv[k] /= 6.;
   
+  if (IsNoiseCalculation() && IsExtractionType(kAmplitude))
+    {
+      //
+      // Take the spline value at the middle of the third slice (to avoid egde effects)
+      // 
+      sum = 0.5*fLoGainSignal[2]
+          + 0.5*fLoGainSignal[3]
+          + (-0.375)*fLoGainSecondDeriv[2] 
+          + (-0.375)*fLoGainSecondDeriv[3];
+      return;
+    }
+
+  if (IsNoiseCalculation() && IsExtractionType(kIntegral))
+    {
+      //
+      // Take the spline value at the middle of the third slice (to avoid egde effects)
+      // 
+      Int_t first = 2;
+      Int_t last  = first + (Int_t)(fRiseTime+fFallTime);
+      CalcIntegralLoGain(sum,first,last);
+      return;
+    }
+
+  //
+  // Allow no saturated slice 
+  // and 
+  // Don't start if the maxpos is too close to the left limit.
+  //
+  if (sat || maxpos < 1)
+    {
+      time =  IsExtractionType(kMaximum) 
+        ? (Float_t)(fLoGainFirst + maxpos) 
+        : (Float_t)(fLoGainFirst + maxpos - 1);
+      return;
+    }
+      
+  if (maxpos < 2 && IsExtractionType(kHalfMaximum))
+    {
+      time = (Float_t)(fLoGainFirst + maxpos - 1);
+      return;
+    }
+
   //
   // Now find the maximum  
@@ -1046,24 +1068,63 @@
       // Now integrate the whole thing!
       // 
-      Int_t startslice = IsNoiseCalculation() ? 0 : (Int_t)(fAbMaxPos - fRiseTime);
-      Int_t lastslice  = IsNoiseCalculation() ? (Int_t)(fRiseTime+fFallTime) : (Int_t)(fAbMaxPos + fFallTime + 1);
-      
-      if (startslice < 0)
-        {
-          lastslice -= startslice;
-          startslice = 0;
-        }
-
-      Int_t i = startslice;
-      sum = 0.5*fLoGainSignal[i];
-      
-      for (i=startslice+1; i<lastslice; i++)
-        sum += fLoGainSignal[i] + 1.5*fLoGainSecondDeriv[i];
-      
-      sum += 0.5*fLoGainSignal[lastslice];
-    }
-  
-
+      Int_t startslice = (Int_t)(fAbMaxPos - fRiseTime);
+      Int_t lastslice  = (Int_t)(fAbMaxPos + fFallTime + 1);
+      
+      if (lastslice > range)
+        {
+          lastslice = range;
+          startslice += (lastslice - range);
+        }
+      CalcIntegralLoGain(sum, startslice, lastslice);
+    }
 }
+
+void MExtractTimeAndChargeSpline::CalcIntegralHiGain(Float_t &sum, Int_t startslice, Int_t lastslice)
+{
+
+  if (startslice < 0)
+    {
+      lastslice -= startslice;
+      startslice = 0;
+    }
+  
+  Int_t i = startslice;
+  sum = 0.5*fHiGainSignal[i];
+  
+  //
+  // We sum 1.5 times the second deriv. coefficients because these had been 
+  // divided by 6. already. Usually, 0.25*fHiGainSecondDeriv should be added.
+  //
+  for (i=startslice+1; i<lastslice; i++)
+    sum += fHiGainSignal[i] + 1.5*fHiGainSecondDeriv[i];
+  
+  sum += 0.5*fHiGainSignal[lastslice];
+
+}
+
+void MExtractTimeAndChargeSpline::CalcIntegralLoGain(Float_t &sum, Int_t startslice, Int_t lastslice)
+{
+
+  if (startslice < 0)
+    {
+      lastslice -= startslice;
+      startslice = 0;
+    }
+  
+  Int_t i = startslice;
+  sum = 0.5*fLoGainSignal[i];
+  
+  //
+  // We sum 1.5 times the second deriv. coefficients because these had been 
+  // divided by 6. already. Usually, 0.25*fLoGainSecondDeriv should be added.
+  //
+  for (i=startslice+1; i<lastslice; i++)
+    sum += fLoGainSignal[i] + 1.5*fLoGainSecondDeriv[i];
+  
+  sum += 0.5*fLoGainSignal[lastslice];
+
+}
+
+
 
 // --------------------------------------------------------------------------
@@ -1128,2 +1189,4 @@
 
 }
+
+
Index: /trunk/MagicSoft/Mars/msignal/MExtractTimeAndChargeSpline.h
===================================================================
--- /trunk/MagicSoft/Mars/msignal/MExtractTimeAndChargeSpline.h	(revision 5496)
+++ /trunk/MagicSoft/Mars/msignal/MExtractTimeAndChargeSpline.h	(revision 5497)
@@ -40,5 +40,8 @@
   
   Int_t ReadEnv(const TEnv &env, TString prefix, Bool_t print);
-  
+
+  void CalcIntegralHiGain(Float_t &sum, Int_t startslice, Int_t lastslice);
+  void CalcIntegralLoGain(Float_t &sum, Int_t startslice, Int_t lastslice);
+
 public:
 
@@ -58,11 +61,11 @@
   Float_t GetFallTime() const { return fFallTime; }
 
-  void SetRange    ( Byte_t hifirst=0, Byte_t hilast=0, Byte_t lofirst=0, Byte_t lolast=0 );  
-  void SetResolution   ( Float_t f=fgResolution  )  { fResolution  = f;  }
-  void SetRiseTime     ( Float_t f=fgRiseTime    )  { fRiseTime    = f;  }
-  void SetFallTime     ( Float_t f=fgFallTime    )  { fFallTime    = f;  }
+  void SetRange      ( Byte_t hifirst=0, Byte_t hilast=0, Byte_t lofirst=0, Byte_t lolast=0 );  
+  void SetResolution ( const Float_t f=fgResolution  )  { fResolution  = f;  }
+  void SetRiseTime   ( const Float_t f=fgRiseTime    )  { fRiseTime    = f;  }
+  void SetFallTime   ( const Float_t f=fgFallTime    )  { fFallTime    = f;  }
 
-  void SetTimeType     ( ExtractionType_t typ=kMaximum ); 
-  void SetChargeType   ( ExtractionType_t typ=kAmplitude);
+  void SetTimeType   ( const ExtractionType_t typ=kMaximum ); 
+  void SetChargeType ( const ExtractionType_t typ=kAmplitude);
   
   void FindTimeAndChargeHiGain(Byte_t *first, Byte_t *logain, Float_t &sum, Float_t &dsum,
