00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016 #include "PSXtcInput/DamagePolicy.h"
00017
00018
00019
00020
00021
00022
00023
00024
00025 #include "MsgLogger/MsgLogger.h"
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035 namespace PSXtcInput {
00036
00037
00038
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
00049
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 }