Go to the documentation of this file.00001 #include "SimDataFormats/TrackerDigiSimLink/interface/StripCompactDigiSimLinks.h"
00002
00003 #include <algorithm>
00004 #include <boost/foreach.hpp>
00005
00006
00007 StripCompactDigiSimLinks::Links
00008 StripCompactDigiSimLinks::getLinks(const StripCompactDigiSimLinks::key_type &key) const
00009 {
00010 std::vector<TrackRecord>::const_iterator last = trackRecords_.end();
00011 std::vector<TrackRecord>::const_iterator match = std::lower_bound(trackRecords_.begin(), last, key);
00012 if ((match != last) && (*match == key)) {
00013
00014 unsigned int end = (match+1 == last ? hitRecords_.size() : (match+1)->start);
00015 return Links(hitRecords_.begin()+match->start, hitRecords_.begin()+end);
00016 } else {
00017 return Links(hitRecords_.end(), hitRecords_.end());
00018 }
00019 }
00020
00021 StripCompactDigiSimLinks::StripCompactDigiSimLinks(const StripCompactDigiSimLinks::Filler &filler)
00022 {
00023 trackRecords_.reserve(filler.keySize());
00024 hitRecords_.reserve(filler.dataSize());
00025 BOOST_FOREACH( const Filler::Map::value_type &pair, filler.storage() ) {
00026 trackRecords_.push_back(TrackRecord(pair.first, hitRecords_.size()));
00027 hitRecords_.insert(hitRecords_.end(), pair.second.begin(), pair.second.end());
00028 }
00029 }
00030
00031 StripCompactDigiSimLinks::Filler::~Filler() {
00032 }
00033
00034 void
00035 StripCompactDigiSimLinks::Filler::insert(const StripCompactDigiSimLinks::key_type &key, const StripCompactDigiSimLinks::HitRecord &record)
00036 {
00037 Filler::Map::iterator it = storage_.find(key);
00038 if (it == storage_.end()) {
00039 storage_.insert(std::make_pair(key, std::vector<HitRecord>(1,record)));
00040 num_keys_++;
00041 num_values_++;
00042 } else {
00043 it->second.push_back(record);
00044 num_values_++;
00045 }
00046 }
00047
00048 std::map<uint32_t, std::vector<StripCompactDigiSimLinks::RevLink> >
00049 StripCompactDigiSimLinks::makeReverseMap() const
00050 {
00051 std::map<uint32_t, std::vector<StripCompactDigiSimLinks::RevLink> > ret;
00052 typedef std::vector<TrackRecord>::const_iterator trk_it;
00053 typedef std::vector<HitRecord>::const_iterator hit_it;
00054 hit_it hstart = hitRecords_.begin(), ith = hstart;
00055 for (trk_it itt = trackRecords_.begin(), endt = trackRecords_.end(); itt != endt; ++itt) {
00056 hit_it edh = (itt+1 != endt ? hstart + (itt+1)->start : hitRecords_.end());
00057 for (; ith < edh; ++ith) {
00058 ret[ith->detId].push_back(RevLink(*itt, *ith));
00059 }
00060 }
00061 return ret;
00062 }
00063