Index: trunk/MagicSoft/Mars/Changelog
===================================================================
--- trunk/MagicSoft/Mars/Changelog	(revision 6729)
+++ trunk/MagicSoft/Mars/Changelog	(revision 6730)
@@ -34,4 +34,6 @@
      - re-added MFEventSelector which had been removed by TB on the
        15.2.2005.
+     - added pulse position selector, as decided at the Berlin soft-
+       ware meeting.
    
    * mjobs/MJCalib.[h,cc]
Index: trunk/MagicSoft/Mars/mjobs/MJPedestal.cc
===================================================================
--- trunk/MagicSoft/Mars/mjobs/MJPedestal.cc	(revision 6729)
+++ trunk/MagicSoft/Mars/mjobs/MJPedestal.cc	(revision 6730)
@@ -62,5 +62,5 @@
 
 // Other basic classes
-#include "MExtractTimeAndChargeSlidingWindow.h"
+#include "MExtractTimeAndCharge.h"
 
 // parameter containers
@@ -78,4 +78,5 @@
 #include "MReadMarsFile.h"
 #include "MRawFileRead.h"
+#include "MRawEvtData.h"
 #include "MGeomApply.h"
 #include "MBadPixelsMerge.h"
@@ -83,4 +84,5 @@
 #include "MPedCalcPedRun.h"
 #include "MPedCalcFromLoGain.h"
+#include "MFTriggerPattern.h"
 
 #include <fstream>
@@ -978,5 +980,5 @@
 
     MFillH fillped(&hpedcam, "MPedestalCamIntermediate", "FillPedCam");
-    MFillH fillpul("MHCalibrationPulseTimeCam",   "MExtractedSignalCam", "FillPulseTime");
+    MFillH fillpul("MHCalibrationPulseTimeCam", "MRawEvtData", "FillPulseTime");
     //    MFillH fillped(&fPedestalHist, "MPedestalCamIntermediate", "FillPedCam");
     fillped.SetBit(MFillH::kDoNotDisplay);
@@ -996,11 +998,11 @@
       }
 
-    MExtractTimeAndChargeSlidingWindow exttest;
-
-    if (fPulsePosCheck && fExtractionType != kFundamental)
+    MFTriggerPattern fcalib("CalibFilter");
+    fcalib.RequireCalibration();
+    fcalib.SetInverted();
+
+    if (fPulsePosCheck)
       {
-        exttest.SetRange(0,25,0,0);
-        exttest.SetPedestals(&fPedestalCamIn);
-        tlist.AddToList(&exttest);
+        fillpul.SetFilter(&fcalib);
         tlist.AddToList(&fillpul);
       }
@@ -1186,22 +1188,68 @@
       }
     
-    if (fPulsePosCheck && fExtractionType != kFundamental)
+    if (fDisplayType!=kDisplayNone)
+        DisplayResult(plist);
+
+    if (!WriteResult())
+        return kFALSE;
+
+    if (fPulsePosCheck)
       {
+
+        MHCalibrationPulseTimeCam *hcam = (MHCalibrationPulseTimeCam*)plist.FindObject("MHCalibrationPulseTimeCam");
+        if (fPixelCheck)
+          {
+            hcam->DrawClone();
+            MHCalibrationPix &pix = (*hcam)[fCheckedPixId];
+            pix.DrawClone();
+          }
+        
         MCalibrationPulseTimeCam *cam = (MCalibrationPulseTimeCam*)plist.FindObject("MCalibrationPulseTimeCam");
+        MRawEvtData *data = (MRawEvtData*)plist.FindObject("MRawEvtData");
         if (cam)
           {
             const Float_t meanpulsetime = cam->GetAverageArea(0).GetHiGainMean();
-            const Float_t sigmapulsetime = cam->GetAverageArea(0).GetHiGainSigma();
-            *fLog << inf << "Mean pulse time (cosmics): " << meanpulsetime << "+-" << sigmapulsetime << endl;
+            const Float_t rmspulsetime = cam->GetAverageArea(0).GetHiGainRms();
+            *fLog << inf << "Mean pulse time (cosmics): " << meanpulsetime << "+-" << rmspulsetime << endl;
+            const Int_t newfirst = 1.5*rmspulsetime > 3. 
+              ? (Int_t)(meanpulsetime-1.5*rmspulsetime) 
+              : (Int_t)(meanpulsetime-3.);
+            const Int_t wshigain = fExtractor->InheritsFrom("MExtractTimeAndCharge") 
+              ? ((MExtractTimeAndCharge*)fExtractor)->GetWindowSizeHiGain()
+              : 6;
+            const Int_t wslogain = fExtractor->InheritsFrom("MExtractTimeAndCharge") 
+              ? ((MExtractTimeAndCharge*)fExtractor)->GetWindowSizeLoGain()
+              : 6;
+            const Int_t newlast  = 1.5*rmspulsetime > 3. 
+              ? (Int_t)(meanpulsetime+1.5*rmspulsetime)
+              : (Int_t)(meanpulsetime+3.);
+            *fLog << inf << "Try to set new range limits: ("<<newfirst<<","<<newlast+wshigain<<")"<<endl;
+            if (newfirst < 0)
+              {
+                *fLog << err << "Pulse is too much to the left, cannot go below 0! " << endl;
+                return kFALSE;
+              }
+            if (newlast+wshigain > data->GetNumHiGainSamples())
+              {
+                *fLog << err << "Pulse is too much to the right, cannot go beyond higain limits! " 
+                      << " Try to use a different extractor ... " << endl;
+                return kFALSE;
+              }
+            if (newlast+wslogain > data->GetNumLoGainSamples())
+              {
+                *fLog << err << "Pulse is too much to the right, cannot go beyond logain limits! " 
+                      << " Try to use a different extractor ... " << endl;
+                return kFALSE;
+              }
+            fExtractor->SetRange(newfirst,newlast+wshigain,newfirst,data->GetNumLoGainSamples());
+          }
+        else
+          {
+            *fLog << err << "Could not determine mean pulse position, abort... " << endl;
+            return kFALSE;
           }
       }
     
 
-    if (fDisplayType!=kDisplayNone)
-        DisplayResult(plist);
-
-    if (!WriteResult())
-        return kFALSE;
-
     *fLog << all << GetDescriptor() << ": Done." << endl;
     *fLog << endl << endl;
