Skip to content

Commit 6562d2d

Browse files
authored
Merge pull request #49015 from saswatinandan/HI_test_with_v1
Modification of existing rawprime version of SiStripApproxCluster
2 parents 3b7d442 + 1d8ce7c commit 6562d2d

File tree

10 files changed

+583
-12
lines changed

10 files changed

+583
-12
lines changed
Lines changed: 107 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,107 @@
1+
#ifndef DataFormats_SiStripCluster_SiStripApproximateClusterCollection_v1_h
2+
#define DataFormats_SiStripCluster_SiStripApproximateClusterCollection_v1_h
3+
4+
#include <vector>
5+
6+
#include "DataFormats/SiStripCluster/interface/SiStripApproximateCluster_v1.h"
7+
#include <iostream>
8+
#include <numeric>
9+
/**
10+
* This class provides a minimal interface that resembles
11+
* edmNew::DetSetVector, but is crafted such that we are comfortable
12+
* to provide an infinite backwards compatibility guarantee for it
13+
* (like all RAW data). Any modifications need to be made with care.
14+
* Please consult core software group if in doubt.
15+
**/
16+
namespace v1 {
17+
class SiStripApproximateClusterCollection {
18+
public:
19+
// Helper classes to make creation and iteration easier
20+
class Filler {
21+
public:
22+
void push_back(SiStripApproximateCluster_v1 const& cluster) { clusters_.push_back(cluster); }
23+
24+
private:
25+
friend SiStripApproximateClusterCollection;
26+
Filler(std::vector<SiStripApproximateCluster_v1>& clusters) : clusters_(clusters) {}
27+
28+
std::vector<SiStripApproximateCluster_v1>& clusters_;
29+
};
30+
31+
class const_iterator;
32+
class DetSet {
33+
public:
34+
using const_iterator = std::vector<SiStripApproximateCluster_v1>::const_iterator;
35+
36+
unsigned int id() const {
37+
return std::accumulate(coll_->detIds_.cbegin(), coll_->detIds_.cbegin() + detIndex_ + 1, 0);
38+
}
39+
40+
void move(unsigned int clusBegin) const { clusBegin_ = clusBegin; }
41+
const_iterator begin() const { return coll_->clusters_.begin() + clusBegin_; }
42+
const_iterator cbegin() const { return begin(); }
43+
const_iterator end() const { return coll_->clusters_.begin() + clusEnd_; }
44+
const_iterator cend() const { return end(); }
45+
46+
private:
47+
friend SiStripApproximateClusterCollection::const_iterator;
48+
DetSet(SiStripApproximateClusterCollection const* coll, unsigned int detIndex)
49+
: coll_(coll), detIndex_(detIndex), clusEnd_(coll->clusters_.size()) {}
50+
51+
SiStripApproximateClusterCollection const* const coll_;
52+
unsigned int const detIndex_;
53+
mutable unsigned int clusBegin_ = 0;
54+
unsigned int const clusEnd_;
55+
};
56+
57+
class const_iterator {
58+
public:
59+
DetSet operator*() const { return DetSet(coll_, index_); }
60+
61+
const_iterator& operator++() {
62+
++index_;
63+
if (index_ == coll_->detIds_.size()) {
64+
*this = const_iterator();
65+
}
66+
return *this;
67+
}
68+
69+
const_iterator operator++(int) {
70+
const_iterator clone = *this;
71+
++(*this);
72+
return clone;
73+
}
74+
75+
bool operator==(const_iterator const& other) const { return coll_ == other.coll_ and index_ == other.index_; }
76+
bool operator!=(const_iterator const& other) const { return not operator==(other); }
77+
78+
private:
79+
friend SiStripApproximateClusterCollection;
80+
// default-constructed object acts as the sentinel
81+
const_iterator() = default;
82+
const_iterator(SiStripApproximateClusterCollection const* coll) : coll_(coll) {}
83+
84+
SiStripApproximateClusterCollection const* coll_ = nullptr;
85+
unsigned int index_ = 0;
86+
};
87+
88+
// Actual public interface
89+
SiStripApproximateClusterCollection() = default;
90+
91+
void reserve(std::size_t dets, std::size_t clusters);
92+
Filler beginDet(unsigned int detId);
93+
94+
const_iterator begin() const { return clusters_.empty() ? end() : const_iterator(this); }
95+
const_iterator cbegin() const { return begin(); }
96+
const_iterator end() const { return const_iterator(); }
97+
const_iterator cend() const { return end(); }
98+
99+
private:
100+
// The detIds_ and beginIndices_ have one element for each Det. An
101+
// element of beginIndices_ points to the first cluster of the Det
102+
// in clusters_.
103+
std::vector<unsigned int> detIds_; // DetId for the Det
104+
std::vector<SiStripApproximateCluster_v1> clusters_;
105+
};
106+
} // namespace v1
107+
#endif
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
#ifndef DataFormats_SiStripCluster_SiStripApproximateCluster_v1_h
2+
#define DataFormats_SiStripCluster_SiStripApproximateCluster_v1_h
3+
4+
#include "FWCore/Utilities/interface/typedefs.h"
5+
#include "assert.h"
6+
7+
class SiStripCluster;
8+
class SiStripApproximateCluster_v1 {
9+
public:
10+
SiStripApproximateCluster_v1() {}
11+
12+
explicit SiStripApproximateCluster_v1(cms_uint16_t compBarycenter, cms_uint8_t width, cms_uint8_t compavgCharge)
13+
: compBarycenter_(compBarycenter), width_(width), compavgCharge_(compavgCharge) {}
14+
15+
explicit SiStripApproximateCluster_v1(const SiStripCluster& cluster,
16+
unsigned int maxNSat,
17+
float hitPredPos,
18+
float& previous_cluster,
19+
unsigned int& module_length,
20+
unsigned int& previous_module_length,
21+
bool peakFilter);
22+
23+
const cms_uint16_t compBarycenter() const { return compBarycenter_; }
24+
25+
float barycenter(float previous_barycenter = 0,
26+
unsigned int module_length = 0,
27+
unsigned int previous_module_length = 0) const {
28+
float _barycenter;
29+
cms_uint16_t compBarycenter = (compBarycenter_ & 0x7FFF);
30+
if (previous_barycenter == -999)
31+
_barycenter = compBarycenter * maxBarycenter_ / maxRange_;
32+
else {
33+
_barycenter = ((compBarycenter * maxBarycenter_ / maxRange_) - (module_length - previous_module_length)) +
34+
previous_barycenter;
35+
}
36+
assert(_barycenter <= maxBarycenter_ && "Returning barycenter > maxBarycenter");
37+
return _barycenter;
38+
}
39+
cms_uint8_t width() const { return width_; }
40+
float avgCharge() const {
41+
cms_uint8_t compavgCharge = (compavgCharge_ & 0x3F);
42+
float avgCharge_ = compavgCharge * maxavgCharge_ / maxavgChargeRange_;
43+
assert(avgCharge_ <= maxavgCharge_ && "Returning avgCharge > maxavgCharge");
44+
return avgCharge_;
45+
}
46+
bool filter() const { return (compavgCharge_ & (1 << kfilterMask)); }
47+
bool isSaturated() const { return (compavgCharge_ & (1 << kSaturatedMask)); }
48+
bool peakFilter() const { return (compBarycenter_ & (1 << kpeakFilterMask)); }
49+
50+
private:
51+
cms_uint16_t compBarycenter_ = 0;
52+
cms_uint8_t width_ = 0;
53+
cms_uint8_t compavgCharge_ = 0;
54+
static constexpr double maxRange_ = 32767;
55+
static constexpr double maxBarycenter_ = 1536.;
56+
static constexpr double maxavgChargeRange_ = 63;
57+
static constexpr double maxavgCharge_ = 255.;
58+
static constexpr double trimMaxADC_ = 30.;
59+
static constexpr double trimMaxFracTotal_ = .15;
60+
static constexpr double trimMaxFracNeigh_ = .25;
61+
static constexpr double maxTrimmedSizeDiffNeg_ = .7;
62+
static constexpr double maxTrimmedSizeDiffPos_ = 1.;
63+
static constexpr int kfilterMask = 6;
64+
static constexpr int kpeakFilterMask = 7;
65+
static constexpr int kSaturatedMask = 15;
66+
};
67+
#endif // DataFormats_SiStripCluster_SiStripApproximateCluster_v1_h

DataFormats/SiStripCluster/interface/SiStripCluster.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33

44
#include "DataFormats/SiStripDigi/interface/SiStripDigi.h"
55
#include "DataFormats/SiStripCluster/interface/SiStripApproximateCluster.h"
6+
#include "DataFormats/SiStripCluster/interface/SiStripApproximateCluster_v1.h"
67
#include <vector>
78
#include <numeric>
89
#include <iostream>
@@ -45,6 +46,11 @@ class SiStripCluster {
4546
}
4647

4748
SiStripCluster(const SiStripApproximateCluster cluster, const uint16_t maxStrips);
49+
SiStripCluster(const SiStripApproximateCluster_v1 cluster,
50+
const uint16_t maxStrips,
51+
float pc = -999,
52+
unsigned int module_length = 0,
53+
unsigned int previous_module_length = 0);
4854

4955
// extend the cluster
5056
template <typename Iter>
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
#include "DataFormats/SiStripCluster/interface/SiStripApproximateClusterCollection_v1.h"
2+
using namespace v1;
3+
void SiStripApproximateClusterCollection::reserve(std::size_t dets, std::size_t clusters) {
4+
detIds_.reserve(dets);
5+
clusters_.reserve(clusters);
6+
}
7+
8+
SiStripApproximateClusterCollection::Filler SiStripApproximateClusterCollection::beginDet(unsigned int detId) {
9+
detIds_.push_back((detIds_.empty()) ? detId : detId - (std::accumulate(detIds_.cbegin(), detIds_.cend(), 0)));
10+
return Filler(clusters_);
11+
}
Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
#include "DataFormats/SiStripCluster/interface/SiStripApproximateCluster_v1.h"
2+
#include "DataFormats/SiStripCluster/interface/SiStripCluster.h"
3+
#include <algorithm>
4+
#include <cassert>
5+
#include <cmath>
6+
7+
SiStripApproximateCluster_v1::SiStripApproximateCluster_v1(const SiStripCluster& cluster,
8+
unsigned int maxNSat,
9+
float hitPredPos,
10+
float& previous_cluster,
11+
unsigned int& module_length,
12+
unsigned int& previous_module_length,
13+
bool peakFilter) {
14+
bool filter_, isSaturated_, peakFilter_;
15+
if (previous_cluster == -999.)
16+
compBarycenter_ = std::round(cluster.barycenter() * maxRange_ / maxBarycenter_);
17+
else
18+
compBarycenter_ =
19+
std::round(((cluster.barycenter() - previous_cluster) + (module_length - previous_module_length)) * maxRange_ /
20+
maxBarycenter_);
21+
previous_cluster = barycenter(previous_cluster, module_length, previous_module_length);
22+
assert(cluster.barycenter() <= maxBarycenter_ && "Got a barycenter > maxBarycenter");
23+
assert(compBarycenter_ <= maxRange_ && "Filling compBarycenter > maxRange");
24+
width_ = std::min(255, (int)cluster.size()); //cluster.size();
25+
float avgCharge_ = cluster.charge() * 1. / width_;
26+
assert(avgCharge_ <= maxavgCharge_ && "Got a avgCharge > maxavgCharge");
27+
compavgCharge_ = std::round(avgCharge_ * maxavgChargeRange_ / maxavgCharge_);
28+
assert(compavgCharge_ <= maxavgChargeRange_ && "Filling compavgCharge > maxavgChargeRange");
29+
filter_ = false;
30+
isSaturated_ = false;
31+
peakFilter_ = peakFilter;
32+
33+
//mimicing the algorithm used in StripSubClusterShapeTrajectoryFilter...
34+
//Looks for 3 adjacent saturated strips (ADC>=254)
35+
const auto& ampls = cluster.amplitudes();
36+
unsigned int thisSat = (ampls[0] >= 254), maxSat = thisSat;
37+
for (unsigned int i = 1, n = ampls.size(); i < n; ++i) {
38+
if (ampls[i] >= 254) {
39+
thisSat++;
40+
} else if (thisSat > 0) {
41+
maxSat = std::max<int>(maxSat, thisSat);
42+
thisSat = 0;
43+
}
44+
}
45+
if (thisSat > 0) {
46+
maxSat = std::max<int>(maxSat, thisSat);
47+
}
48+
if (maxSat >= maxNSat) {
49+
filter_ = true;
50+
isSaturated_ = true;
51+
}
52+
53+
unsigned int hitStripsTrim = ampls.size();
54+
int sum = std::accumulate(ampls.begin(), ampls.end(), 0);
55+
uint8_t trimCut = std::min<uint8_t>(trimMaxADC_, std::floor(trimMaxFracTotal_ * sum));
56+
auto begin = ampls.begin();
57+
auto last = ampls.end() - 1;
58+
while (hitStripsTrim > 1 && (*begin < std::max<uint8_t>(trimCut, trimMaxFracNeigh_ * (*(begin + 1))))) {
59+
hitStripsTrim--;
60+
++begin;
61+
}
62+
while (hitStripsTrim > 1 && (*last < std::max<uint8_t>(trimCut, trimMaxFracNeigh_ * (*(last - 1))))) {
63+
hitStripsTrim--;
64+
--last;
65+
}
66+
if (hitStripsTrim < std::floor(std::abs(hitPredPos) - maxTrimmedSizeDiffNeg_)) {
67+
filter_ = false;
68+
} else if (hitStripsTrim <= std::ceil(std::abs(hitPredPos) + maxTrimmedSizeDiffPos_)) {
69+
filter_ = true;
70+
} else {
71+
filter_ = peakFilter_;
72+
}
73+
compavgCharge_ = (compavgCharge_ | (filter_ << kfilterMask));
74+
compavgCharge_ = (compavgCharge_ | (peakFilter_ << kpeakFilterMask));
75+
compBarycenter_ = (compBarycenter_ | (isSaturated_ << kSaturatedMask));
76+
}

DataFormats/SiStripCluster/src/SiStripCluster.cc

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,3 +39,25 @@ SiStripCluster::SiStripCluster(const SiStripApproximateCluster cluster, const ui
3939
}
4040
firstStrip_ |= approximateMask;
4141
}
42+
43+
SiStripCluster::SiStripCluster(const SiStripApproximateCluster_v1 cluster,
44+
const uint16_t maxStrips,
45+
float p_bc,
46+
unsigned int module_length,
47+
unsigned int previous_module_length)
48+
: error_x(-99999.9) {
49+
barycenter_ = cluster.barycenter(p_bc, module_length, previous_module_length);
50+
charge_ = cluster.width() * cluster.avgCharge();
51+
amplitudes_.resize(cluster.width(), cluster.avgCharge());
52+
filter_ = cluster.filter();
53+
54+
float halfwidth_ = 0.5f * float(cluster.width());
55+
56+
//initialize firstStrip_
57+
firstStrip_ = std::max(barycenter_ - halfwidth_, 0.f);
58+
59+
if UNLIKELY (firstStrip_ + cluster.width() > maxStrips) {
60+
firstStrip_ = maxStrips - cluster.width();
61+
}
62+
firstStrip_ |= approximateMask;
63+
}

DataFormats/SiStripCluster/src/classes.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,9 @@
77
#include "DataFormats/SiStripCluster/interface/SiStripCluster.h"
88
#include "DataFormats/SiStripCluster/interface/SiStripClustersSOA.h"
99
#include "DataFormats/SiStripCluster/interface/SiStripApproximateCluster.h"
10+
#include "DataFormats/SiStripCluster/interface/SiStripApproximateCluster_v1.h"
1011
#include "DataFormats/SiStripCluster/interface/SiStripApproximateClusterCollection.h"
12+
#include "DataFormats/SiStripCluster/interface/SiStripApproximateClusterCollection_v1.h"
1113
#include "DataFormats/Common/interface/ContainerMask.h"
1214

1315
#endif // SISTRIPCLUSTER_CLASSES_H

DataFormats/SiStripCluster/src/classes_def.xml

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,36 @@
5959
<class name="edmNew::DetSetVector<edm::Ref<edmNew::DetSetVector<SiStripApproximateCluster>,SiStripApproximateCluster,edmNew::DetSetVector<SiStripApproximateCluster>::FindForDetSetVector> >" />
6060
<class name="edm::Wrapper<edmNew::DetSetVector<edm::Ref<edmNew::DetSetVector<SiStripApproximateCluster>,SiStripApproximateCluster,edmNew::DetSetVector<SiStripApproximateCluster>::FindForDetSetVector> > >" />
6161

62+
63+
64+
<class name="SiStripApproximateCluster_v1" ClassVersion="7">
65+
<version ClassVersion="7" checksum="1154754493"/>
66+
<version ClassVersion="6" checksum="132211472"/>
67+
<version ClassVersion="5" checksum="3495825183"/>
68+
<version ClassVersion="4" checksum="2854791577"/>
69+
<version ClassVersion="3" checksum="2041370183"/>
70+
</class>
71+
<class name="v1::SiStripApproximateClusterCollection" ClassVersion="4">
72+
<version ClassVersion="4" checksum="2896589077"/>
73+
<version ClassVersion="3" checksum="3101417750"/>
74+
</class>
75+
<class name="edm::Wrapper<v1::SiStripApproximateClusterCollection>"/>
76+
77+
<class name="edmNew::DetSetVector<SiStripApproximateCluster_v1>"/>
78+
<class name="edm::Wrapper<edmNew::DetSetVector<SiStripApproximateCluster_v1>>"/>
79+
80+
<class name="std::vector<SiStripApproximateCluster_v1>"/>
81+
82+
<class name="edm::Ref<edmNew::DetSetVector<SiStripApproximateCluster_v1>, SiStripApproximateCluster_v1, edmNew::DetSetVector<SiStripApproximateCluster_v1>::FindForDetSetVector>"/>
83+
84+
85+
<class name="edm::ContainerMask<edmNew::DetSetVector<SiStripApproximateCluster_v1> >"/>
86+
<class name="edm::Wrapper<edm::ContainerMask<edmNew::DetSetVector<SiStripApproximateCluster_v1> > >"/>
87+
88+
89+
<class name="std::vector<edm::Ref<edmNew::DetSetVector<SiStripApproximateCluster_v1>,SiStripApproximateCluster_v1,edmNew::DetSetVector<SiStripApproximateCluster_v1>::FindForDetSetVector> >" />
90+
<class name="edmNew::DetSetVector<edm::Ref<edmNew::DetSetVector<SiStripApproximateCluster_v1>,SiStripApproximateCluster_v1,edmNew::DetSetVector<SiStripApproximateCluster_v1>::FindForDetSetVector> >" />
91+
<class name="edm::Wrapper<edmNew::DetSetVector<edm::Ref<edmNew::DetSetVector<SiStripApproximateCluster_v1>,SiStripApproximateCluster_v1,edmNew::DetSetVector<SiStripApproximateCluster_v1>::FindForDetSetVector> > >" />
6292
<class name="SiStripClustersSOA" ClassVersion="3">
6393
<version ClassVersion="3" checksum="2739562998"/>
6494
</class>

0 commit comments

Comments
 (0)