PSXtcInput/src/DamagePolicy.cpp

Go to the documentation of this file.
00001 //--------------------------------------------------------------------------
00002 // File and Version Information:
00003 //      $Id: DamagePolicy.cpp 7696 2014-02-27 00:40:59Z salnikov@SLAC.STANFORD.EDU $
00004 //
00005 // Description:
00006 //      Class DamagePolicy...
00007 //
00008 // Author List:
00009 //      Andy Salnikov
00010 //
00011 //------------------------------------------------------------------------
00012 
00013 //-----------------------
00014 // This Class's Header --
00015 //-----------------------
00016 #include "PSXtcInput/DamagePolicy.h"
00017 
00018 //-----------------
00019 // C/C++ Headers --
00020 //-----------------
00021 
00022 //-------------------------------
00023 // Collaborating Class Headers --
00024 //-------------------------------
00025 #include "MsgLogger/MsgLogger.h"
00026 
00027 //-----------------------------------------------------------------------
00028 // Local Macros, Typedefs, Structures, Unions and Forward Declarations --
00029 //-----------------------------------------------------------------------
00030 
00031 //              ----------------------------------------
00032 //              -- Public Function Member Definitions --
00033 //              ----------------------------------------
00034 
00035 namespace PSXtcInput {
00036 
00037 //----------------
00038 // Constructors --
00039 //----------------
00040 DamagePolicy::DamagePolicy() :
00041     psana::Configurable("psana")
00042 {
00043   m_storeOutOfOrderDamage = config("store-out-of-order-damage", false);
00044   m_storeUserEbeamDamage = config("store-user-ebeam-damage", true);
00045   m_storeDamagedConfig = config("store-damaged-config", false);
00046 }
00047 
00048 // return true if damage/type combo is good to store, false if we don't want it going in event.
00049 // note - always returns True for undamaged types, but we do not store all undamaged types (such as Xtc).
00050 bool DamagePolicy::eventDamagePolicy(Pds::Damage damage, enum Pds::TypeId::Type typeId)
00051 {
00052   if (damage.value() == 0) return true;
00053 
00054   MsgLog(name(), debug,
00055       "eventDamagePolicy: nonzero damage=" << std::hex << damage.value() << " typeId=" << std::dec << typeId << " "
00056           << Pds::TypeId::name(typeId));
00057 
00058   bool userDamageBitSet = (damage.value() & (1 << Pds::Damage::UserDefined));
00059   uint32_t otherDamageBits = (damage.bits() & (~(1 << Pds::Damage::UserDefined)));
00060   bool userDamageByteSet = damage.userBits();
00061 
00062   if (not userDamageBitSet and userDamageByteSet) {
00063     MsgLog(name(), warning,
00064         "UserDefined damage bit is *not* set but user bits are present: damage=" << std::hex << damage.value()
00065             << " typeId=" << typeId << Pds::TypeId::name(typeId));
00066     return false;
00067   }
00068 
00069   bool userDamageOk = ((not userDamageBitSet and not userDamageByteSet)
00070       or (userDamageBitSet and (typeId == Pds::TypeId::Id_EBeam) and m_storeUserEbeamDamage));
00071 
00072   bool onlyOutOfOrderInOtherBits = otherDamageBits == (1 << Pds::Damage::OutOfOrder);
00073   if (userDamageOk) {
00074     if (otherDamageBits == 0) return true;
00075     if ((onlyOutOfOrderInOtherBits) and m_storeOutOfOrderDamage) return true;
00076   }
00077   MsgLog(name(), debug,
00078       "eventDamagePolicy: do not store, userDamageOk=" << userDamageOk << " only OutOfOrder in other bits="
00079           << onlyOutOfOrderInOtherBits << " store out of order=" << m_storeOutOfOrderDamage);
00080 
00081   return false;
00082 }
00083 
00084 bool DamagePolicy::configDamagePolicy(Pds::Damage damage)
00085 {
00086   if (damage.value() == 0 or m_storeDamagedConfig) return true;
00087   return false;
00088 }
00089 
00090 } // namespace PSXtcInput

Generated on 19 Dec 2016 for PSANAclasses by  doxygen 1.4.7