1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
|
#include <vector>
#include "DataFormats/SiStripDigi/interface/SiStripDigi.h"
#include "DQM/SiStripCommon/interface/APVShot.h"
#include "FWCore/Utilities/interface/Exception.h"
#include <algorithm>
APVShot::APVShot() : _zs(true), _apv(-1), _nstrips(0), _median(-1), _detid() {}
APVShot::APVShot(const bool zs) : _zs(zs), _apv(-1), _nstrips(0), _median(-1), _detid() {}
APVShot::APVShot(const std::vector<SiStripDigi>& digis, const DetId& detid, const bool zs)
: _zs(zs), _apv(-1), _nstrips(0), _median(-1), _detid() {
computeShot(digis, detid, zs);
}
void APVShot::computeShot(const std::vector<SiStripDigi>& digis, const DetId& detid, const bool zs) {
_zs = zs;
_detid = detid;
_nstrips = 0;
_apv = -1;
_median = -1;
std::vector<unsigned int> charge;
for (std::vector<SiStripDigi>::const_iterator digi = digis.begin(); digi != digis.end(); ++digi) {
if (!_zs || digi->adc() > 0) {
int oldapv = _apv;
_apv = digi->strip() / 128;
if (oldapv >= 0 && oldapv != _apv)
throw cms::Exception("WrongDigiVector") << "Digis from Different APVs";
charge.push_back(digi->adc());
++_nstrips;
}
}
// charge to be sorted in descending order
std::sort(charge.begin(), charge.end());
std::reverse(charge.begin(), charge.end());
if (charge.size() > 64) {
_median = float(charge[64]);
}
}
const bool APVShot::isGenuine() const { return (_nstrips > _threshold); }
const int APVShot::apvNumber() const { return _apv; }
const int APVShot::nStrips() const { return _nstrips; }
const float APVShot::median() const { return _median; }
const int APVShot::subDet() const { return _detid.subdetId(); }
const unsigned int APVShot::detId() const { return _detid.rawId(); }
const int APVShot::_threshold = 64;
|