00001 #include "PSEvt/DamageMap.h"
00002 #include "MsgLogger/MsgLogger.h"
00003
00004 namespace {
00005 const char * logger = "DamageMap";
00006 }
00007
00008 PSEvt::DamageMap::iterator PSEvt::DamageMap::find(const PSEvt::EventKey &eventKey) {
00009 PSEvt::DamageMap::iterator pos = m_map.find(eventKey);
00010 if (pos == m_map.end()) {
00011 if (eventKey.key().size() > 0) {
00012 PSEvt::EventKey eventKeyNoStr(eventKey.typeinfo(), eventKey.src(),"");
00013 PSEvt::DamageMap::iterator posNoStr = m_map.find(eventKeyNoStr);
00014 return posNoStr;
00015 }
00016 }
00017 return pos;
00018 }
00019
00020 PSEvt::DamageMap::const_iterator PSEvt::DamageMap::find(const PSEvt::EventKey &eventKey) const {
00021 PSEvt::DamageMap::const_iterator pos = m_map.find(eventKey);
00022 if (pos == m_map.end()) {
00023 if (eventKey.key().size() > 0) {
00024 PSEvt::EventKey eventKeyNoStr(eventKey.typeinfo(), eventKey.src(),"");
00025 PSEvt::DamageMap::const_iterator posNoStr = m_map.find(eventKeyNoStr);
00026 return posNoStr;
00027 }
00028 }
00029 return pos;
00030 }
00031
00032 void PSEvt::DamageMap::addSrcDamage(Pds::Src src, Pds::Damage damage) {
00033 if ( damage.bits() & (1<<Pds::Damage::DroppedContribution)) {
00034 m_droppedContribs.push_back(std::make_pair(src,damage));
00035 } else {
00036 MsgLog(logger,trace,"Unexpected, addSrcDamage called but damage does not contain "
00037 << "DroppedContribution bit, src= " << src << " damage = " << damage.value());
00038 }
00039 }
00040
00041 std::map<uint32_t,int> PSEvt::DamageMap::damageCounts() const {
00042 std::map<uint32_t,int> counts;
00043 for (const_iterator pos = begin(); pos != end(); ++pos) {
00044 uint32_t damageValue = pos->second.value();
00045 int &count = counts[damageValue];
00046 ++count;
00047 }
00048 return counts;
00049 }
00050
00051
00052
00053 std::ostream & PSEvt::operator<<(std::ostream &o, const PSEvt::DamageMap &damageMap) {
00054 PSEvt::DamageMap::const_iterator pos;
00055 bool first = true;
00056 o.setf(std::ios::hex,std::ios::basefield);
00057 for (pos = damageMap.begin(); pos != damageMap.end(); ++pos) {
00058 const PSEvt::EventKey &eventKey = pos->first;
00059 const Pds::Damage & damage = pos->second;
00060 if (not first) o << ", ";
00061 first = false;
00062 o << eventKey << " damage=0x" << damage.value();
00063 }
00064 if (damageMap.splitEvent()) {
00065 const std::vector<std::pair<Pds::Src,Pds::Damage> > &droppedContribs = damageMap.getSrcDroppedContributions();
00066 o << "DroppedContributions: ";
00067 for (size_t idx=0; idx < droppedContribs.size(); ++idx) {
00068 const std::pair<Pds::Src,Pds::Damage> & srcDamagePair = droppedContribs.at(idx);
00069 const Pds::Src & src = srcDamagePair.first;
00070 const Pds::Damage & damage = srcDamagePair.second;
00071 o << "src="<< src << " dmg=0x" <<damage.value();
00072 if (idx < droppedContribs.size()-1) {
00073 o << ", ";
00074 }
00075 }
00076 }
00077 o.unsetf(std::ios::hex);
00078 return o;
00079 }