Index: /trunk/MagicSoft/Mars/Changelog
===================================================================
--- /trunk/MagicSoft/Mars/Changelog	(revision 4278)
+++ /trunk/MagicSoft/Mars/Changelog	(revision 4279)
@@ -25,4 +25,6 @@
     - add a function GetSize()
 
+   * msignal/MExtractTimeFastSpline.cc
+     - fixed a bug introduced on 1.6. and accelerate it a bit. 
 
  2004/06/04: Markus Gaug
Index: /trunk/MagicSoft/Mars/msignal/MExtractTimeFastSpline.cc
===================================================================
--- /trunk/MagicSoft/Mars/msignal/MExtractTimeFastSpline.cc	(revision 4278)
+++ /trunk/MagicSoft/Mars/msignal/MExtractTimeFastSpline.cc	(revision 4279)
@@ -193,15 +193,17 @@
   for (Int_t i=1;i<range-1;i++)
     {
+      p++;
       pp = fHiGainSecondDeriv[i-1] + 4.;
       fHiGainSecondDeriv[i] = -1.0/pp;
-      fHiGainFirstDeriv [i] = *(p+2) - 2.* *(p+1) + *(p);
+      fHiGainFirstDeriv [i] = *(p+1) - 2.* *(p) + *(p-1);
       fHiGainFirstDeriv [i] = (6.0*fHiGainFirstDeriv[i]-fHiGainFirstDeriv[i-1])/pp;
-      p++;
     }
 
   fHiGainSecondDeriv[range-1] = 0.;
 
-  for (Int_t k=range-2;k>=0;k--)
-    fHiGainSecondDeriv[k] = (fHiGainSecondDeriv[k]*fHiGainSecondDeriv[k+1] + fHiGainFirstDeriv[k])/6.;
+  for (Int_t k=range-2;k>0;k--)
+    fHiGainSecondDeriv[k] = fHiGainSecondDeriv[k]*fHiGainSecondDeriv[k+1] + fHiGainFirstDeriv[k];
+  for (Int_t k=range-2;k>0;k--)
+    fHiGainSecondDeriv[k] /= 6.;
   
   //
@@ -219,6 +221,6 @@
   Float_t klocont = (Float_t)*(first+klo);
   Float_t khicont = (Float_t)*(first+khi);
-  time          = lower;
-  Float_t abmax = klocont;
+  time          = upper;
+  Float_t abmax = khicont;
 
   //
@@ -226,16 +228,16 @@
   // interval maxpos+1.
   //
-  while (x<upper-0.1)
-    {
-
+  while (x<upper-0.3)
+    {
+      
       x += step;
       a -= step;
       b += step;
-
+      
       y = a*klocont
         + b*khicont
         + (a*a*a-a)*fHiGainSecondDeriv[klo] 
         + (b*b*b-b)*fHiGainSecondDeriv[khi];
-
+      
       if (y > abmax)
         {
@@ -243,21 +245,21 @@
           time   = x;
         }
-
-    }
-
- if (time < lower+0.1)
-    {
-
-      upper = (Float_t)maxpos-1.;
-      lower = (Float_t)maxpos-2.;
+    }
+  
+
+ if (time > upper-0.1)
+    {
+
+      upper = (Float_t)maxpos+1.;
+      lower = (Float_t)maxpos;
       x     = lower;
       a     = 1.;
       b     = 0.;
-      khi   = maxpos-1;
-      klo   = maxpos-2;
+      khi   = maxpos+1;
+      klo   = maxpos;
       klocont = (Float_t)*(first+klo);
       khicont = (Float_t)*(first+khi);
 
-      while (x<upper-0.1)
+      while (x<upper-0.3)
         {
 
@@ -309,4 +311,14 @@
     }
 
+  if (time < klo + 0.02)
+    {
+      klo--;
+      khi--;
+      klocont = (Float_t)*(first+klo);
+      khicont = (Float_t)*(first+khi);
+      upper--;
+      lower--;
+    }
+  
   x     = maxpossave;
   a     = upper - x;
@@ -330,5 +342,4 @@
           time   = x;
         }
-      
     }
 
@@ -340,5 +351,5 @@
   // First, find the right FADC slice:
   // 
-  klo   = maxpos - 1;
+  klo   = maxpos;
   while (klo > maxpos-4)
     {
@@ -443,15 +454,17 @@
   for (Int_t i=1;i<range-1;i++)
     {
+      p++;
       pp = fLoGainSecondDeriv[i-1] + 4.;
       fLoGainSecondDeriv[i] = -1.0/pp;
-      fLoGainFirstDeriv [i] = *(p+2) - 2.* *(p+1) + *(p);
+      fLoGainFirstDeriv [i] = *(p+1) - 2.* *(p) + *(p-1);
       fLoGainFirstDeriv [i] = (6.0*fLoGainFirstDeriv[i]-fLoGainFirstDeriv[i-1])/pp;
-      p++;
     }
 
   fLoGainSecondDeriv[range-1] = 0.;
 
-  for (Int_t k=range-2;k>=0;k--)
-    fLoGainSecondDeriv[k] = (fLoGainSecondDeriv[k]*fLoGainSecondDeriv[k+1] + fLoGainFirstDeriv[k])/6.;
+  for (Int_t k=range-2;k>0;k--)
+    fLoGainSecondDeriv[k] = fLoGainSecondDeriv[k]*fLoGainSecondDeriv[k+1] + fLoGainFirstDeriv[k];
+  for (Int_t k=range-2;k>0;k--)
+    fLoGainSecondDeriv[k] /= 6.;
   
   //
@@ -469,6 +482,6 @@
   Float_t klocont = (Float_t)*(first+klo);
   Float_t khicont = (Float_t)*(first+khi);
-  time  = lower;
-  Float_t abmax = klocont;
+  time          = upper;
+  Float_t abmax = khicont;
 
   //
@@ -476,5 +489,5 @@
   // interval maxpos+1.
   //
-  while (x<upper-0.1)
+  while (x<upper-0.3)
     {
 
@@ -496,18 +509,18 @@
     }
 
- if (time < lower+0.1)
-    {
-
-      upper = (Float_t)maxpos-1.;
-      lower = (Float_t)maxpos-2.;
+ if (time > upper-0.1)
+    {
+
+      upper = (Float_t)maxpos+1.;
+      lower = (Float_t)maxpos;
       x     = lower;
       a     = 1.;
       b     = 0.;
-      khi   = maxpos-1;
-      klo   = maxpos-2;
+      khi   = maxpos+1;
+      klo   = maxpos;
       klocont = (Float_t)*(first+klo);
       khicont = (Float_t)*(first+khi);
 
-      while (x<upper-0.1)
+      while (x<upper-0.3)
         {
 
@@ -559,4 +572,14 @@
     }
 
+  if (time < klo + 0.01)
+    {
+      klo--;
+      khi--;
+      klocont = (Float_t)*(first+klo);
+      khicont = (Float_t)*(first+khi);
+      upper--;
+      lower--;
+    }
+  
   x     = maxpossave;
   a     = upper - x;
