PSEvt/src/DamageMap.cpp

Go to the documentation of this file.
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 /// print everything in the DamageMap - EventKeys and damage as well as 
00052 /// DroppedContribution damage
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 }

Generated on 19 Dec 2016 for PSANAclasses by  doxygen 1.4.7