Index: trunk/MagicSoft/Mars/Changelog
===================================================================
--- trunk/MagicSoft/Mars/Changelog	(revision 8897)
+++ trunk/MagicSoft/Mars/Changelog	(revision 8898)
@@ -18,4 +18,39 @@
 
                                                  -*-*- END OF LINE -*-*-
+
+ 2008/05/25 Thomas Bretz
+
+   * mtrigger/MTriggerPattern.cc:
+     - fixed a typo in a comment 
+
+   * mtrigger/MFTriggerPattern.[h,cc]:
+     - some code cleanup (mainly unified all the Require and Deny 
+       functions into one)
+     - added a DenyAll member function
+     - added Allow member functions including an AllowAll member function
+
+
+   * mjobs/MJPedestal.cc:
+     - To choose pedestals we now deny all other trigger bits except the
+       pedestal bit and in the case of data runs we deny all bits
+       except trigger lvl1 and trigger lvl2
+
+   * mjobs/MJCalibration.cc:
+     - In addition to denial of prescaled calibration events we
+       deny any bit in the unprescaled pattern but allow only
+       calibration events
+
+   * mjobs/MJCalibrateSignal.cc:
+     - Instead of the denial of only calibration and pedestal events,
+       we now deny any bit in the pattern, but allow Trigger Lvl1
+       and Trigger Lvl2 events to choose cosmics
+     - Instead of the denial of only lvl1 and lvl2 events,
+       we now deny any bit in the pattern, but allow pedestal
+       events to choose pedestals
+     - Instead of requiring only calibration events,
+       we now deny any bit in the pattern, but require the calibration
+       bit to choose calibration events
+
+
 
  2008/05/24 Thomas Bretz
Index: trunk/MagicSoft/Mars/NEWS
===================================================================
--- trunk/MagicSoft/Mars/NEWS	(revision 8897)
+++ trunk/MagicSoft/Mars/NEWS	(revision 8898)
@@ -80,4 +80,7 @@
     * Tab "TrigPat" added showing the distribution of the trigger pattern
       as found in the run-files (normalized with the run length)
+
+    * The selection of events from the trigger pattern has been improved.
+      If the trigger pattern is corrupted events won't pass anymore.
 
  ;star
Index: trunk/MagicSoft/Mars/mjobs/MJCalibrateSignal.cc
===================================================================
--- trunk/MagicSoft/Mars/mjobs/MJCalibrateSignal.cc	(revision 8897)
+++ trunk/MagicSoft/Mars/mjobs/MJCalibrateSignal.cc	(revision 8898)
@@ -432,11 +432,12 @@
     // data file will be processed. In any case there are no interleaved
     // calibration events in such data, so this is fine.
+    // We allow only cosmics triggered events to pass (before prescaling)
     MFTriggerPattern fcalped;
     fcalped.SetInverted();
     fcalped.SetDefault(kTRUE);
-    //    ftp.RequireCalibration();
-    fcalped.DenyCalibration();
-    fcalped.DenyPedestal();
-    //    ftp.DenyPinDiode();
+    fcalped.DenyAll();
+    fcalped.AllowTriggerLvl1();
+    fcalped.AllowTriggerLvl2();
+    //fcalped.AllowSumTrigger();
 
     // This will skip interleaved events with a cal- or ped-trigger
@@ -505,4 +506,6 @@
     // without artifially calibration events
     //
+    // Deny or allow is done before prescaling.
+    //
     MFTriggerPattern fped;
     fped.SetDefault(kTRUE);
@@ -510,7 +513,6 @@
     if (!extractor1->HasLoGain())
     {
+        fped.DenyAll();
         fped.RequirePedestal();
-        fped.DenyTriggerLvl1();
-        fped.DenyTriggerLvl2();
     }
 
@@ -565,8 +567,11 @@
     MExtractBlindPixel      bldext;
 
+    // Execute for all events with the calibration trigger. If no
+    // trigger pattern is available do not execute it
+    // The selection is done before prescaling.
     MFTriggerPattern        fcalib("CalibFilter");
     fcalib.SetDefault(kFALSE);
+    fcalib.DenyAll();
     fcalib.RequireCalibration();
-    //fcalib.DenyPedestal(); // This should never happen!
 
     MCalibrationChargeCalc  chcalc;
@@ -769,4 +774,6 @@
     if (fIsInterlaced)
     {
+        // The task list is executed for all events with the calibration
+        // trigger
         tlist2.AddToList(&fcalib);     // MFTriggerPattern
         tlist2.AddToList(&tlist4);
Index: trunk/MagicSoft/Mars/mjobs/MJCalibration.cc
===================================================================
--- trunk/MagicSoft/Mars/mjobs/MJCalibration.cc	(revision 8897)
+++ trunk/MagicSoft/Mars/mjobs/MJCalibration.cc	(revision 8898)
@@ -19,5 +19,5 @@
 !   Author(s): Markus Gaug, 02/2004 <mailto:markus@ifae.es>
 !
-!   Copyright: MAGIC Software Development, 2000-2007
+!   Copyright: MAGIC Software Development, 2000-2008
 !
 !
@@ -1715,8 +1715,12 @@
     // anyway. So we set the default such that the MContinue ccalib
     // will never be executed.
+    // We allow to have only calibration events before Prescaling.
+    // We require that the calibration events have not been prescaled (why?)
     MTriggerPatternDecode     trgpat;
     MFTriggerPattern          fcalib("CalibFilter");
     fcalib.SetDefault(kFALSE);
     fcalib.DenyCalibration(MFTriggerPattern::kPrescaled);
+    fcalib.DenyAll();
+    fcalib.AllowCalibration();
 
     MContinue                 ccalib(&fcalib,"ContTrigPattern");
@@ -1831,7 +1835,7 @@
 
     //
-    // Apply a filter against cosmics
-    // (will have to be needed in the future
-    // when the calibration hardware-trigger is working)
+    // Apply a filter against cosmics (this is for the old times in which
+    // the calibration events where triggered by level 1 and for
+    // sanity against empty trigger events)
     //
     MFCosmics cosmics;
Index: trunk/MagicSoft/Mars/mjobs/MJPedestal.cc
===================================================================
--- trunk/MagicSoft/Mars/mjobs/MJPedestal.cc	(revision 8897)
+++ trunk/MagicSoft/Mars/mjobs/MJPedestal.cc	(revision 8898)
@@ -1096,9 +1096,12 @@
     // data file will be processed. In any case there are no interleaved
     // calibration events in such data, so this is fine.
+    // The selection is done with the trigger bits before prescaling
     MTriggerPatternDecode decode;
     MFTriggerPattern fcalib("CalibFilter");
     fcalib.SetDefault(kTRUE);
-    fcalib.DenyCalibration();
-    fcalib.DenyPedestal();
+    fcalib.DenyAll();
+    fcalib.AllowTriggerLvl1();
+    fcalib.AllowTriggerLvl2();
+    //fcalib.AllowSumTrigger();
 
     tlist.AddToList(&decode);
@@ -1130,12 +1133,9 @@
 
     //------------------------------
+    // Require that before the Prescaling we had only a pedestal trigger
     MFTriggerPattern ftp2("PedestalFilter");
     ftp2.SetDefault(kTRUE);
+    ftp2.DenyAll();
     ftp2.RequirePedestal();
-    ftp2.DenyCalibration();
-
-    // NEW!
-    ftp2.DenyTriggerLvl1();
-    ftp2.DenyTriggerLvl2();
 
     if (!fSequence.IsMonteCarlo() && (!fExtractor || !fExtractor->HasLoGain()))
Index: trunk/MagicSoft/Mars/mtrigger/MFTriggerPattern.cc
===================================================================
--- trunk/MagicSoft/Mars/mtrigger/MFTriggerPattern.cc	(revision 8897)
+++ trunk/MagicSoft/Mars/mtrigger/MFTriggerPattern.cc	(revision 8898)
@@ -19,5 +19,5 @@
 !   Author(s): Thomas Bretz  12/2004 <mailto:tbretz@astro.uni-wuerzburg.de>
 !
-!   Copyright: MAGIC Software Development, 2004-2007
+!   Copyright: MAGIC Software Development, 2004-2008
 !
 \* ======================================================================== */
@@ -32,4 +32,9 @@
 //
 // For more details see: MTriggerPattern
+//
+//
+// Input Containers:
+//   MTriggerPattern
+//
 //
 /////////////////////////////////////////////////////////////////////////////
@@ -67,8 +72,15 @@
     fMaskRequiredPrescaled   = trigpatt.fMaskRequiredPrescaled;
     fMaskRequiredUnprescaled = trigpatt.fMaskRequiredUnprescaled;
+
+    fMaskDeniedPrescaled     = trigpatt.fMaskDeniedPrescaled;
+    fMaskDeniedUnprescaled   = trigpatt.fMaskDeniedUnprescaled;
+
+    fDefault                 = trigpatt.fDefault;
 }
 
 
 // --------------------------------------------------------------------------
+//
+// Search for MTriggerPattern in the paremeter list.
 //
 Int_t MFTriggerPattern::PreProcess(MParList *pList)
@@ -85,4 +97,9 @@
 
 // --------------------------------------------------------------------------
+//
+// If Prescaled and Unprescaled pattern is 0 return default.
+// If all bits of the fMaskRequired* mask are found in the pattern set
+// fResult to true.
+// If any bit matches the fMasDenied* mask fResult is forced to be false.
 //
 Int_t MFTriggerPattern::Process()
@@ -110,63 +127,67 @@
 }
 
-void MFTriggerPattern::RequireTriggerLvl1(Prescale_t prescaled)
-{
-    prescaled==kPrescaled ? (fMaskRequiredPrescaled |= MTriggerPattern::kTriggerLvl1) : (fMaskRequiredUnprescaled |= MTriggerPattern::kTriggerLvl1);
-}
-
-void MFTriggerPattern::RequireTriggerLvl2(Prescale_t prescaled)
-{
-    prescaled==kPrescaled ? (fMaskRequiredPrescaled |= MTriggerPattern::kTriggerLvl2) : (fMaskRequiredUnprescaled |= MTriggerPattern::kTriggerLvl2);
-}
-
-void MFTriggerPattern::RequireCalibration(Prescale_t prescaled)
-{
-    prescaled==kPrescaled ? (fMaskRequiredPrescaled |= MTriggerPattern::kCalibration) : (fMaskRequiredUnprescaled |= MTriggerPattern::kCalibration);
-}
-
-void MFTriggerPattern::RequirePedestal(Prescale_t prescaled)
-{
-    prescaled==kPrescaled ? (fMaskRequiredPrescaled |= MTriggerPattern::kPedestal)    : (fMaskRequiredUnprescaled |= MTriggerPattern::kPedestal);
-}
-
-void MFTriggerPattern::RequirePinDiode(Prescale_t prescaled)
-{
-    prescaled==kPrescaled ? (fMaskRequiredPrescaled |= MTriggerPattern::kPinDiode)    : (fMaskRequiredUnprescaled |= MTriggerPattern::kPinDiode);
-}
-
-void MFTriggerPattern::RequireSumTrigger(Prescale_t prescaled)
-{
-    prescaled==kPrescaled ? (fMaskRequiredPrescaled |= MTriggerPattern::kSumTrigger)  : (fMaskRequiredUnprescaled |= MTriggerPattern::kSumTrigger);
-}
-
-
-void MFTriggerPattern::DenyTriggerLvl1(Prescale_t prescaled)
-{
-    prescaled==kPrescaled ? (fMaskDeniedPrescaled |= MTriggerPattern::kTriggerLvl1) : (fMaskDeniedUnprescaled |= MTriggerPattern::kTriggerLvl1);
-}
-
-void MFTriggerPattern::DenyTriggerLvl2(Prescale_t prescaled)
-{
-    prescaled==kPrescaled ? (fMaskDeniedPrescaled |= MTriggerPattern::kTriggerLvl2) : (fMaskDeniedUnprescaled |= MTriggerPattern::kTriggerLvl2);
-}
-
-void MFTriggerPattern::DenyCalibration(Prescale_t prescaled)
-{
-    prescaled==kPrescaled ? (fMaskDeniedPrescaled |= MTriggerPattern::kCalibration) : (fMaskDeniedUnprescaled |= MTriggerPattern::kCalibration);
-}
-
-void MFTriggerPattern::DenyPedestal(Prescale_t prescaled)
-{
-    prescaled==kPrescaled ? (fMaskDeniedPrescaled |= MTriggerPattern::kPedestal)    : (fMaskDeniedUnprescaled |= MTriggerPattern::kPedestal);
-}
-
-void MFTriggerPattern::DenyPinDiode(Prescale_t prescaled)
-{
-    prescaled==kPrescaled ? (fMaskDeniedPrescaled |= MTriggerPattern::kPinDiode)    : (fMaskDeniedUnprescaled |= MTriggerPattern::kPinDiode);
-}
-
-void MFTriggerPattern::DenySumTrigger(Prescale_t prescaled)
-{
-    prescaled==kPrescaled ? (fMaskDeniedPrescaled |= MTriggerPattern::kSumTrigger)  : (fMaskDeniedUnprescaled |= MTriggerPattern::kSumTrigger);
+// -------------------------------------------------------------------------
+//
+// Require that a prescaled or unprescaled bit in the trigger pattern is
+// passed. The bit is defined by mask, the prescaling by prescaled. The
+// default is unprescaled.
+//
+// Because it doesn't make sense to require a denied bit we reset
+// the deny bit at the same time.
+//
+void MFTriggerPattern::Require(const Byte_t mask, Prescale_t prescaled=kUnPrescaled)
+{
+    prescaled==kPrescaled ? (fMaskRequiredPrescaled |=  mask) : (fMaskRequiredUnprescaled |=  mask);
+    prescaled==kPrescaled ? (fMaskDeniedPrescaled   &= ^mask) : (fMaskDeniedUnprescaled   &= ^mask);
+}
+
+// -------------------------------------------------------------------------
+//
+// Deny that a prescaled or unprescaled bit in the trigger pattern is
+// passed. The bit is defined by mask, the prescaling by prescaled. The
+// default is unprescaled.
+//
+// Because it doesn't make sense to deny a required bit we reset
+// the require bit at the same time.
+//
+void MFTriggerPatter::Deny(const Byte_t mask, Prescale_t prescaled=kUnPrescaled)
+{
+    prescaled==kPrescaled ? (fMaskDeniedPrescaled   |=  mask) : (fMaskDeniedUnprescaled   |=  mask);
+    prescaled==kPrescaled ? (fMaskRequiredPrescaled &= ^mask) : (fMaskRequiredUnprescaled &= ^mask);
+}
+
+// -------------------------------------------------------------------------
+//
+// Remove the given bits from the deny-mask. Thus you can first deny
+// all bits to pass and then define which bit you want to allow
+// to pass. The bit is defined by mask, the prescaling by prescaled. The
+// default is unprescaled.
+//
+void MFTriggerPatter::Allow(const Byte_t mask, Prescale_t prescaled=kUnPrescaled)
+{
+    prescaled==kPrescaled ? (fMaskDeniedPrescaled &= ^mask) : (fMaskDeniedUnprescaled &= ^mask);
+}
+
+
+// -------------------------------------------------------------------------
+//
+// Deny all bits (i.e. also require non bits) for the given prescaling
+// option. The prescaling is defined by prescaled. The default is
+// unprescaled.
+//
+void MFTriggerPattern::DenyAll(Prescale_t prescaled)
+{
+    Deny(0xff, prescaled);
+}
+
+// -------------------------------------------------------------------------
+//
+// Allow all bits. resets the deny mask for the given prescaling option,
+// but keeps the require mask unchanged. The prescaling is defined
+// by prescaled. The default is unprescaled.
+//
+void MFTriggerPattern::AllowAll(Prescale_t prescaled)
+{
+    prescaled==kPrescaled ? (fMaskDeniedPrescaled = 0) : (fMaskDeniedUnprescaled = 0);
 }
 
@@ -268,12 +289,12 @@
 // This method is there because is not possible to deny trigger patterns
 // using only the Require pattern. Possible arguments are (upper/lower
-// case is ignored):
-//
-//           "LT1"  : Trigger Level 1 flag
-//           "CAL"  : Calibration flag
-//           "LT2"  : Trigger Level 2 flag
-//           "PED"  : Pedestal flag
-//           "PIND" : Pin Diode flag
-//           "SUMT" : Sum Trigger flag
+// case is ignored) the flags for:
+//
+//           "LT1"  : Trigger Level 1
+//           "CAL"  : Calibration
+//           "LT2"  : Trigger Level 2
+//           "PED"  : Pedestal
+//           "PIND" : Pin Diode
+//           "SUMT" : Sum Trigger
 // 
 // concatenations of these strings are allowed and considered as 
@@ -304,9 +325,2 @@
         DenySumTrigger(prescaled);
 }
-
-// --------------------------------------------------------------------------
-//
-Bool_t MFTriggerPattern::IsExpressionTrue() const
-{
-    return fResult;
-}
Index: trunk/MagicSoft/Mars/mtrigger/MFTriggerPattern.h
===================================================================
--- trunk/MagicSoft/Mars/mtrigger/MFTriggerPattern.h	(revision 8897)
+++ trunk/MagicSoft/Mars/mtrigger/MFTriggerPattern.h	(revision 8898)
@@ -25,10 +25,17 @@
 
   Bool_t fDefault;                  // Default which is used if trigger pattern has default value (p==0&&u==0)
-  Bool_t fResult;                   //!
+  Bool_t fResult;                   //! Calculated result to be returned by IsExpressionTrue
 
+  // MFTriggerPattern
+  void Require(const Byte_t mask, Prescale_t prescaled=kUnPrescaled);
+  void Deny(const Byte_t mask, Prescale_t prescaled=kUnPrescaled);
+  void Allow(const Byte_t mask, Prescale_t prescaled=kUnPrescaled);
+
+  // MTask
   Int_t PreProcess(MParList *pList);
   Int_t Process();
 
-  Bool_t IsExpressionTrue() const;
+  // MFilter
+  Bool_t IsExpressionTrue() const { return fResult; }
 
 public:
@@ -36,17 +43,28 @@
   MFTriggerPattern(MFTriggerPattern &trigpatt);
 
-  void RequireTriggerLvl1(Prescale_t prescaled=kUnPrescaled);
-  void RequireTriggerLvl2(Prescale_t prescaled=kUnPrescaled);
-  void RequireCalibration(Prescale_t prescaled=kUnPrescaled);
-  void RequirePedestal(Prescale_t prescaled=kUnPrescaled);
-  void RequirePinDiode(Prescale_t prescaled=kUnPrescaled);
-  void RequireSumTrigger(Prescale_t prescaled=kUnPrescaled);
+  // Setter
+  void RequireTriggerLvl1(Prescale_t prescaled=kUnPrescaled) { Require(MTriggerPattern::kTriggerLvl1, prescaled); }
+  void RequireTriggerLvl2(Prescale_t prescaled=kUnPrescaled) { Require(MTriggerPattern::kTriggerLvl2, prescaled); }
+  void RequireCalibration(Prescale_t prescaled=kUnPrescaled) { Require(MTriggerPattern::kCalibration, prescaled); }
+  void RequirePedestal(Prescale_t prescaled=kUnPrescaled)    { Require(MTriggerPattern::kPedestal, prescaled);    }
+  void RequirePinDiode(Prescale_t prescaled=kUnPrescaled)    { Require(MTriggerPattern::kPinDiode, prescaled);    }
+  void RequireSumTrigger(Prescale_t prescaled=kUnPrescaled)  { Require(MTriggerPattern::kSumTrigger, prescaled);  }
 
-  void DenyTriggerLvl1(Prescale_t prescaled=kUnPrescaled);
-  void DenyTriggerLvl2(Prescale_t prescaled=kUnPrescaled);
-  void DenyCalibration(Prescale_t prescaled=kUnPrescaled);
-  void DenyPedestal(Prescale_t prescaled=kUnPrescaled);
-  void DenyPinDiode(Prescale_t prescaled=kUnPrescaled);
-  void DenySumTrigger(Prescale_t prescaled=kUnPrescaled);
+  void DenyTriggerLvl1(Prescale_t prescaled=kUnPrescaled)    { Deny(MTriggerPattern::kTriggerLvl1, prescaled); }
+  void DenyTriggerLvl2(Prescale_t prescaled=kUnPrescaled)    { Deny(MTriggerPattern::kTriggerLvl2, prescaled); }
+  void DenyCalibration(Prescale_t prescaled=kUnPrescaled)    { Deny(MTriggerPattern::kCalibration, prescaled); }
+  void DenyPedestal(Prescale_t prescaled=kUnPrescaled)       { Deny(MTriggerPattern::kPedestal, prescaled);    }
+  void DenyPinDiode(Prescale_t prescaled=kUnPrescaled)       { Deny(MTriggerPattern::kPinDiode, prescaled);    }
+  void DenySumTrigger(Prescale_t prescaled=kUnPrescaled)     { Deny(MTriggerPattern::kSumTrigger, prescaled);  }
+
+  void AllowTriggerLvl1(Prescale_t prescaled=kUnPrescaled)   { Allow(MTriggerPattern::kTriggerLvl1, prescaled); }
+  void AllowTriggerLvl2(Prescale_t prescaled=kUnPrescaled)   { Allow(MTriggerPattern::kTriggerLvl2, prescaled); }
+  void AllowCalibration(Prescale_t prescaled=kUnPrescaled)   { Allow(MTriggerPattern::kCalibration, prescaled); }
+  void AllowPedestal(Prescale_t prescaled=kUnPrescaled)      { Allow(MTriggerPattern::kPedestal, prescaled);    }
+  void AllowPinDiode(Prescale_t prescaled=kUnPrescaled)      { Allow(MTriggerPattern::kPinDiode, prescaled);    }
+  void AllowSumTrigger(Prescale_t prescaled=kUnPrescaled)    { Allow(MTriggerPattern::kSumTrigger, prescaled);  }
+
+  void DenyAll(Prescale_t prescaled=kUnPrescaled);
+  void AllowAll(Prescale_t prescaled=kUnPrescaled);
 
   void Require(TString patt, Prescale_t prescaled=kUnPrescaled);
Index: trunk/MagicSoft/Mars/mtrigger/MTriggerPattern.cc
===================================================================
--- trunk/MagicSoft/Mars/mtrigger/MTriggerPattern.cc	(revision 8897)
+++ trunk/MagicSoft/Mars/mtrigger/MTriggerPattern.cc	(revision 8898)
@@ -52,5 +52,5 @@
 // 2) The second concerns prescaled triggers.
 // 
-// The prescaler is a devise installed AFTER the LT2. It collects
+// The prescaler is a devicee installed AFTER the LT2. It collects
 // all kind of triggers and can prescale each trigger by a different
 // prescaling factor. This means that we can set the prescaler to
