|
6 | 6 | #include "CalibTracker/Records/interface/SiStripQualityRcd.h"
|
7 | 7 | #include "DataFormats/SiStripDigi/interface/SiStripDigi.h"
|
8 | 8 | #include "DataFormats/SiStripCluster/interface/SiStripCluster.h"
|
| 9 | +#include "CalibFormats/SiStripObjects/interface/SiStripDetCabling.h" |
| 10 | + |
9 | 11 | #include <string>
|
| 12 | +#include <algorithm> |
| 13 | +#include <cassert> |
10 | 14 |
|
11 | 15 | void StripClusterizerAlgorithm::
|
12 | 16 | initialize(const edm::EventSetup& es) {
|
13 | 17 | uint32_t n_cache_id = es.get<SiStripNoisesRcd>().cacheIdentifier();
|
14 | 18 | uint32_t g_cache_id = es.get<SiStripGainRcd>().cacheIdentifier();
|
15 | 19 | uint32_t q_cache_id = es.get<SiStripQualityRcd>().cacheIdentifier();
|
16 | 20 |
|
| 21 | + bool mod=false; |
17 | 22 | if(g_cache_id != gain_cache_id) {
|
18 | 23 | es.get<SiStripGainRcd>().get( gainHandle );
|
19 | 24 | gain_cache_id = g_cache_id;
|
20 |
| - if (detIds.empty()) gainHandle->getDetIds(detIds); |
21 |
| - std::vector<uint32_t> dum; gainHandle->getDetIds(dum); assert(detIds==dum); |
| 25 | + mod=true; |
22 | 26 | }
|
23 | 27 | if(n_cache_id != noise_cache_id) {
|
24 | 28 | es.get<SiStripNoisesRcd>().get( noiseHandle );
|
25 | 29 | noise_cache_id = n_cache_id;
|
26 |
| - std::vector<uint32_t> dum; noiseHandle->getDetIds(dum); assert(detIds==dum); |
| 30 | + mod=true; |
27 | 31 | }
|
28 | 32 | if(q_cache_id != quality_cache_id) {
|
29 | 33 | es.get<SiStripQualityRcd>().get( qualityLabel, qualityHandle );
|
30 | 34 | quality_cache_id = q_cache_id;
|
31 |
| - std::vector<uint32_t> dum; qualityHandle->getDetIds(dum); assert(detIds==dum); |
| 35 | + mod=true; |
| 36 | + } |
| 37 | + if (mod) { |
| 38 | + // redo indexing! |
| 39 | + SiStripDetCabling const * cabling = qualityHandle->cabling(); |
| 40 | + auto const & conn = cabling->connected(); |
| 41 | + assert(cabling); std::cout << "cabling " << conn.size() << std::endl; |
| 42 | + detIds.reserve(conn.size()); |
| 43 | + for (auto const & c : conn) detIds.push_back(c.first); |
| 44 | + indices.resize(detIds.size()); |
| 45 | + |
| 46 | + { // quality |
| 47 | + std::vector<uint32_t> dum; qualityHandle->getDetIds(dum); |
| 48 | + assert(dum.size()<invalidI); |
| 49 | + unsigned short j=0, i=0; |
| 50 | + while (i<dum.size() && j<detIds.size()) { |
| 51 | + if (dum[i]<detIds[j]) ++i; |
| 52 | + else if (detIds[j]<dum[i]) {indices[j].qi=invalidI; ++j;} |
| 53 | + else { |
| 54 | + indices[j].qi=i; ++i; ++j; |
| 55 | + } |
| 56 | + } |
| 57 | + unsigned int nn=0; |
| 58 | + for(auto k=0U; k<detIds.size();++k) { if (indices[k].qi<invalidI) {++nn; assert(dum[indices[k].qi]==detIds[k]);}} |
| 59 | + assert(nn<=dum.size()); |
| 60 | + std::cout << "quality " << dum.size() << " " <<nn<< std::endl; |
| 61 | + } |
| 62 | + { //noise |
| 63 | + std::vector<uint32_t> dum; noiseHandle->getDetIds(dum); |
| 64 | + assert(dum.size()<invalidI); |
| 65 | + unsigned short j=0, i=0; |
| 66 | + while (i<dum.size() && j<detIds.size()) { |
| 67 | + if (dum[i]<detIds[j]) ++i; |
| 68 | + else if (detIds[j]<dum[i]) {indices[j].ni=invalidI; ++j;} |
| 69 | + else { |
| 70 | + indices[j].ni=i; ++i; ++j; |
| 71 | + } |
| 72 | + } |
| 73 | + unsigned int nn=0; |
| 74 | + for(auto k=0U; k<detIds.size();++k) { if (indices[k].ni<invalidI) {++nn; assert(dum[indices[k].ni]==detIds[k]);}} |
| 75 | + assert(nn<=dum.size()); |
| 76 | + std::cout << "noise " << dum.size() << " " <<nn<< std::endl; |
| 77 | + } |
| 78 | + { //gain |
| 79 | + std::vector<uint32_t> dum; gainHandle->getDetIds(dum); |
| 80 | + assert(dum.size()<invalidI); |
| 81 | + unsigned short j=0, i=0; |
| 82 | + while (i<dum.size() && j<detIds.size()) { |
| 83 | + if (dum[i]<detIds[j]) ++i; |
| 84 | + else if (detIds[j]<dum[i]) {indices[j].gi=invalidI; ++j;} |
| 85 | + else { |
| 86 | + indices[j].gi=i; ++i; ++j; |
| 87 | + } |
| 88 | + } |
| 89 | + unsigned int nn=0; |
| 90 | + for(auto k=0U; k<detIds.size();++k) { if (indices[k].gi<invalidI) {++nn; assert(dum[indices[k].gi]==detIds[k]);}} |
| 91 | + assert(nn<=dum.size()); |
| 92 | + std::cout << "gain " << dum.size() << " " <<nn<< std::endl; |
| 93 | + } |
| 94 | + |
| 95 | + |
32 | 96 | }
|
| 97 | + |
33 | 98 | }
|
34 | 99 |
|
35 | 100 |
|
36 |
| -void StripClusterizerAlgorithm:: |
| 101 | +bool StripClusterizerAlgorithm:: |
37 | 102 | setDetId(const uint32_t id) {
|
38 |
| - gainRange = gainHandle->getRange(id); |
| 103 | + if (id==detId) return true; // rare.... |
| 104 | + auto b = detIds.begin(); |
| 105 | + auto e = detIds.end(); |
| 106 | + if (id>detId) b+=ind; |
| 107 | + else e=b+ind; |
| 108 | + auto p = std::lower_bound(b,e,id); |
| 109 | + if (p==e || id!=(*p)) { |
| 110 | + std::cout << "id " << id << " not connected. impossible at HLT" << std::endl; |
| 111 | + std::cout << "old id " << detId << std::endl; |
| 112 | + return false; |
| 113 | + } |
| 114 | + detId = id; |
| 115 | + ind = p-detIds.begin(); |
| 116 | + assert(detIds[ind]==detId); |
| 117 | + |
| 118 | + gainRange = gainHandle->getRangeByPos(indices[ind].gi); |
| 119 | + auto old = gainHandle->getRange(id); |
| 120 | + assert(old==gainRange); |
| 121 | + |
39 | 122 | noiseRange = noiseHandle->getRange(id);
|
40 | 123 | qualityRange = qualityHandle->getRange(id);
|
41 | 124 | detId = id;
|
| 125 | + return true; |
42 | 126 | }
|
43 | 127 |
|
44 | 128 | void StripClusterizerAlgorithm::clusterize(const edm::DetSetVector<SiStripDigi>& input, output_t& output) {clusterize_(input, output);}
|
|
0 commit comments