Skip to content

Commit af562e4

Browse files
committed
clusterizer caches connected detid and offsets in calibrations
1 parent d67ace5 commit af562e4

File tree

7 files changed

+122
-14
lines changed

7 files changed

+122
-14
lines changed

CalibFormats/SiStripObjects/interface/SiStripDetCabling.h

+2
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,8 @@ class SiStripDetCabling
5959
uint32_t undetectedNumber(const std::string & subDet, const uint16_t layer) const { return detNumber(subDet, layer, 2); }
6060
inline const SiStripFedCabling * fedCabling() const {return fedCabling_;}
6161

62+
std::map< uint32_t, std::vector<int> > const & connected() const { return connected_;}
63+
6264
private:
6365
SiStripDetCabling(const SiStripDetCabling&); // stop default
6466
const SiStripDetCabling& operator=(const SiStripDetCabling&); // stop default

CalibFormats/SiStripObjects/interface/SiStripGain.h

+2-1
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,8 @@ class SiStripGain
6363
// getters
6464
// For the product of all apvGains
6565
// -------------------------------
66-
const SiStripApvGain::Range getRange(const uint32_t& detID) const { return apvgain_->getRange(detID);}
66+
const SiStripApvGain::Range getRange(uint32_t detID) const { return apvgain_->getRange(detID);}
67+
SiStripApvGain::Range getRangeByPos(unsigned short pos) const { return apvgain_->getRangeByPos(pos);}
6768
static float getStripGain(const uint16_t& strip, const SiStripApvGain::Range& range) { return SiStripApvGain::getStripGain(strip, range);}
6869
static float getApvGain(const uint16_t& apv, const SiStripApvGain::Range& range) { return SiStripApvGain::getApvGain(apv, range); }
6970

CalibFormats/SiStripObjects/interface/SiStripQuality.h

+4
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,10 @@ class SiStripQuality GCC11_FINAL : public SiStripBadStrip {
123123
inline void setPrintDebugOutput(const bool printDebug) { printDebug_ = printDebug; }
124124
inline void setUseEmptyRunInfo(const bool useEmptyRunInfo) { useEmptyRunInfo_ = useEmptyRunInfo; }
125125

126+
127+
SiStripDetCabling const * cabling() const { return SiStripDetCabling_;}
128+
129+
126130
private:
127131

128132
void compact(std::vector<unsigned int>&,std::vector<unsigned int>&,unsigned short&);

CondFormats/SiStripObjects/interface/SiStripApvGain.h

+2-1
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,8 @@ class SiStripApvGain {
6262

6363

6464
bool put(const uint32_t& detID, Range input);
65-
const Range getRange(const uint32_t& detID) const;
65+
const Range getRange(const uint32_t detID) const;
66+
Range getRangeByPos(unsigned short pos) const;
6667
void getDetIds(std::vector<uint32_t>& DetIds_) const;
6768

6869

CondFormats/SiStripObjects/src/SiStripApvGain.cc

+9-1
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ bool SiStripApvGain::put(const uint32_t& DetId, Range input) {
2626
return true;
2727
}
2828

29-
const SiStripApvGain::Range SiStripApvGain::getRange(const uint32_t& DetId) const {
29+
const SiStripApvGain::Range SiStripApvGain::getRange(const uint32_t DetId) const {
3030
// get SiStripApvGain Range of DetId
3131
RegistryConstIterator p = std::lower_bound(v_detids.begin(),v_detids.end(),DetId);
3232
if (p==v_detids.end() || *p!=DetId)
@@ -40,6 +40,14 @@ const SiStripApvGain::Range SiStripApvGain::getRange(const uint32_t& DetId) cons
4040
}
4141
}
4242

43+
SiStripApvGain::Range SiStripApvGain::getRangeByPos(unsigned short pos) const {
44+
unsigned int ibegin = *(v_ibegin.begin()+pos);
45+
unsigned int iend = *(v_iend.begin()+pos);
46+
__builtin_prefetch((&v_gains.front())+ibegin);
47+
return SiStripApvGain::Range(v_gains.begin()+ibegin,v_gains.begin()+iend);
48+
}
49+
50+
4351
void SiStripApvGain::getDetIds(std::vector<uint32_t>& DetIds_) const {
4452
// returns vector of DetIds in map
4553
// DetIds_=v_detids;

RecoLocalTracker/SiStripClusterizer/interface/StripClusterizerAlgorithm.h

+13-5
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ class SiStripDigi;
1111
#include "CondFormats/SiStripObjects/interface/SiStripNoises.h"
1212
#include "CalibFormats/SiStripObjects/interface/SiStripQuality.h"
1313
#include "EventFilter/SiStripRawToDigi/interface/SiStripFEDBuffer.h"
14-
14+
#include <limits>
1515

1616
class StripClusterizerAlgorithm {
1717

@@ -40,7 +40,7 @@ class StripClusterizerAlgorithm {
4040
StripClusterizerAlgorithm() : qualityLabel(""), noise_cache_id(0), gain_cache_id(0), quality_cache_id(0) {}
4141

4242
uint32_t currentId() {return detId;}
43-
virtual void setDetId(const uint32_t);
43+
bool setDetId(const uint32_t);
4444
float noise(const uint16_t& strip) const { return SiStripNoises::getNoise( strip, noiseRange ); }
4545
float gain(const uint16_t& strip) const { return SiStripGain::getStripGain( strip, gainRange ); }
4646
bool bad(const uint16_t& strip) const { return qualityHandle->IsStripBad( qualityRange, strip ); }
@@ -60,15 +60,23 @@ class StripClusterizerAlgorithm {
6060
}
6161
}
6262

63-
std::vector<uint32_t> detIds;
63+
static constexpr unsigned short invalidI = std::numeric_limits<unsigned short>::max();
64+
struct Index {
65+
unsigned short
66+
gi=invalidI,
67+
ni=invalidI,
68+
qi=invalidI;
69+
};
70+
std::vector<uint32_t> detIds; // from cabling (connected)
71+
std::vector<Index> indices;
6472
SiStripApvGain::Range gainRange;
6573
SiStripNoises::Range noiseRange;
6674
SiStripQuality::Range qualityRange;
6775
edm::ESHandle<SiStripGain> gainHandle;
6876
edm::ESHandle<SiStripNoises> noiseHandle;
6977
edm::ESHandle<SiStripQuality> qualityHandle;
70-
uint32_t noise_cache_id, gain_cache_id, quality_cache_id, detId;
71-
78+
uint32_t noise_cache_id, gain_cache_id, quality_cache_id, detId=0;
79+
unsigned short ind=0;
7280

7381
};
7482
#endif

RecoLocalTracker/SiStripClusterizer/src/StripClusterizerAlgorithm.cc

+90-6
Original file line numberDiff line numberDiff line change
@@ -6,39 +6,123 @@
66
#include "CalibTracker/Records/interface/SiStripQualityRcd.h"
77
#include "DataFormats/SiStripDigi/interface/SiStripDigi.h"
88
#include "DataFormats/SiStripCluster/interface/SiStripCluster.h"
9+
#include "CalibFormats/SiStripObjects/interface/SiStripDetCabling.h"
10+
911
#include <string>
12+
#include <algorithm>
13+
#include <cassert>
1014

1115
void StripClusterizerAlgorithm::
1216
initialize(const edm::EventSetup& es) {
1317
uint32_t n_cache_id = es.get<SiStripNoisesRcd>().cacheIdentifier();
1418
uint32_t g_cache_id = es.get<SiStripGainRcd>().cacheIdentifier();
1519
uint32_t q_cache_id = es.get<SiStripQualityRcd>().cacheIdentifier();
1620

21+
bool mod=false;
1722
if(g_cache_id != gain_cache_id) {
1823
es.get<SiStripGainRcd>().get( gainHandle );
1924
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;
2226
}
2327
if(n_cache_id != noise_cache_id) {
2428
es.get<SiStripNoisesRcd>().get( noiseHandle );
2529
noise_cache_id = n_cache_id;
26-
std::vector<uint32_t> dum; noiseHandle->getDetIds(dum); assert(detIds==dum);
30+
mod=true;
2731
}
2832
if(q_cache_id != quality_cache_id) {
2933
es.get<SiStripQualityRcd>().get( qualityLabel, qualityHandle );
3034
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+
3296
}
97+
3398
}
3499

35100

36-
void StripClusterizerAlgorithm::
101+
bool StripClusterizerAlgorithm::
37102
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+
39122
noiseRange = noiseHandle->getRange(id);
40123
qualityRange = qualityHandle->getRange(id);
41124
detId = id;
125+
return true;
42126
}
43127

44128
void StripClusterizerAlgorithm::clusterize(const edm::DetSetVector<SiStripDigi>& input, output_t& output) {clusterize_(input, output);}

0 commit comments

Comments
 (0)