00001 #include "SimMuon/MCTruth/interface/PSimHitMap.h" 00002 #include "SimDataFormats/CrossingFrame/interface/CrossingFrame.h" 00003 #include "SimDataFormats/CrossingFrame/interface/MixCollection.h" 00004 00005 PSimHitMap::PSimHitMap(const edm::InputTag & collectionTag) 00006 : theMap(), 00007 theEmptyContainer(), 00008 simHitsTag(collectionTag) 00009 { 00010 } 00011 00012 00013 void PSimHitMap::fill(const edm::Event & e) 00014 { 00015 theMap.clear(); 00016 edm::Handle<CrossingFrame<PSimHit> > cf; 00017 LogTrace("PSimHitMap") <<"getting CrossingFrame<PSimHit> collection - "<<simHitsTag; 00018 e.getByLabel(simHitsTag, cf); 00019 00020 MixCollection<PSimHit> simHits(cf.product()); 00021 LogTrace("PSimHitMap") <<"... size = "<<simHits.size(); 00022 00023 // arrange the hits by detUnit 00024 for(MixCollection<PSimHit>::MixItr hitItr = simHits.begin(); 00025 hitItr != simHits.end(); ++hitItr) 00026 { 00027 theMap[hitItr->detUnitId()].push_back(*hitItr); 00028 } 00029 } 00030 00031 00032 const edm::PSimHitContainer & PSimHitMap::hits(int detId) const 00033 { 00034 std::map<int, edm::PSimHitContainer>::const_iterator mapItr 00035 = theMap.find(detId); 00036 if(mapItr != theMap.end()) 00037 { 00038 return mapItr->second; 00039 } 00040 else 00041 { 00042 return theEmptyContainer; 00043 } 00044 } 00045 00046 00047 std::vector<int> PSimHitMap::detsWithHits() const 00048 { 00049 std::vector<int> result; 00050 result.reserve(theMap.size()); 00051 for(std::map<int, edm::PSimHitContainer>::const_iterator mapItr = theMap.begin(), 00052 mapEnd = theMap.end(); 00053 mapItr != mapEnd; 00054 ++mapItr) 00055 { 00056 result.push_back(mapItr->first); 00057 } 00058 return result; 00059 } 00060 00061