CMS 3D CMS Logo

SiPixelDigisClustersFromSoA.cc
Go to the documentation of this file.
20 
21 // local include(s)
22 #include "PixelClusterizerBase.h"
23 
24 //#define GPU_DEBUG
25 
26 template <typename TrackerTraits>
28 public:
29  explicit SiPixelDigisClustersFromSoAT(const edm::ParameterSet& iConfig);
30  ~SiPixelDigisClustersFromSoAT() override = default;
31 
32  static void fillDescriptions(edm::ConfigurationDescriptions& descriptions);
33 
34 private:
35  void produce(edm::StreamID, edm::Event& iEvent, const edm::EventSetup& iSetup) const override;
36 
38 
40 
43 
44  const SiPixelClusterThresholds clusterThresholds_; // Cluster threshold in electrons
45 
46  const bool produceDigis_;
47  const bool storeDigis_;
48 };
49 
50 template <typename TrackerTraits>
52  : topoToken_(esConsumes()),
53  digiGetToken_(consumes<legacy::SiPixelDigisSoA>(iConfig.getParameter<edm::InputTag>("src"))),
54  clusterPutToken_(produces<SiPixelClusterCollectionNew>()),
55  clusterThresholds_(iConfig.getParameter<int>("clusterThreshold_layer1"),
56  iConfig.getParameter<int>("clusterThreshold_otherLayers")),
57  produceDigis_(iConfig.getParameter<bool>("produceDigis")),
58  storeDigis_(iConfig.getParameter<bool>("produceDigis") && iConfig.getParameter<bool>("storeDigis")) {
59  if (produceDigis_)
60  digiPutToken_ = produces<edm::DetSetVector<PixelDigi>>();
61 }
62 
63 template <typename TrackerTraits>
66  desc.add<edm::InputTag>("src", edm::InputTag("siPixelDigisSoA"));
67  desc.add<int>("clusterThreshold_layer1", gpuClustering::clusterThresholdLayerOne);
68  desc.add<int>("clusterThreshold_otherLayers", gpuClustering::clusterThresholdOtherLayers);
69  desc.add<bool>("produceDigis", true);
70  desc.add<bool>("storeDigis", true);
71 
72  descriptions.addWithDefaultLabel(desc);
73 }
74 
75 template <typename TrackerTraits>
78  const edm::EventSetup& iSetup) const {
79  const auto& digis = iEvent.get(digiGetToken_);
80  const uint32_t nDigis = digis.size();
81  const auto& ttopo = iSetup.getData(topoToken_);
82  constexpr auto maxModules = TrackerTraits::numberOfModules;
83 
84  std::unique_ptr<edm::DetSetVector<PixelDigi>> collection;
85  if (produceDigis_)
86  collection = std::make_unique<edm::DetSetVector<PixelDigi>>();
87  if (storeDigis_)
88  collection->reserve(maxModules);
89  auto outputClusters = std::make_unique<SiPixelClusterCollectionNew>();
90  outputClusters->reserve(maxModules, nDigis / 2);
91 
92  edm::DetSet<PixelDigi>* detDigis = nullptr;
93  uint32_t detId = 0;
94  for (uint32_t i = 0; i < nDigis; i++) {
95  // check for uninitialized digis
96  // this is set in RawToDigi_kernel in SiPixelRawToClusterGPUKernel.cu
97  if (digis.rawIdArr(i) == 0)
98  continue;
99  // check for noisy/dead pixels (electrons set to 0)
100  if (digis.adc(i) == 0)
101  continue;
102 
103  detId = digis.rawIdArr(i);
104  if (storeDigis_) {
105  detDigis = &collection->find_or_insert(detId);
106  if ((*detDigis).empty())
107  (*detDigis).data.reserve(64); // avoid the first relocations
108  }
109  break;
110  }
111 
112  int32_t nclus = -1;
114 #ifdef EDM_ML_DEBUG
115  auto totClustersFilled = 0;
116 #endif
117 
118  auto fillClusters = [&](uint32_t detId) {
119  if (nclus < 0)
120  return; // this in reality should never happen
122  auto layer = (DetId(detId).subdetId() == 1) ? ttopo.pxbLayer(detId) : 0;
123  auto clusterThreshold = clusterThresholds_.getThresholdForLayerOnCondition(layer == 1);
124  for (int32_t ic = 0; ic < nclus + 1; ++ic) {
125  auto const& acluster = aclusters[ic];
126  // in any case we cannot go out of sync with gpu...
127  if (acluster.charge < clusterThreshold)
128  edm::LogWarning("SiPixelDigisClustersFromSoA") << "cluster below charge Threshold "
129  << "Layer/DetId/clusId " << layer << '/' << detId << '/' << ic
130  << " size/charge " << acluster.isize << '/' << acluster.charge;
131  // sort by row (x)
132  spc.emplace_back(acluster.isize, acluster.adc, acluster.x, acluster.y, acluster.xmin, acluster.ymin, ic);
133  aclusters[ic].clear();
134 #ifdef EDM_ML_DEBUG
135  ++totClustersFilled;
136  const auto& cluster{spc.back()};
137  LogDebug("SiPixelDigisClustersFromSoA")
138  << "putting in this cluster " << ic << " " << cluster.charge() << " " << cluster.pixelADC().size();
139 #endif
140  std::push_heap(spc.begin(), spc.end(), [](SiPixelCluster const& cl1, SiPixelCluster const& cl2) {
141  return cl1.minPixelRow() < cl2.minPixelRow();
142  });
143  }
144  nclus = -1;
145  // sort by row (x)
146  std::sort_heap(spc.begin(), spc.end(), [](SiPixelCluster const& cl1, SiPixelCluster const& cl2) {
147  return cl1.minPixelRow() < cl2.minPixelRow();
148  });
149  if (spc.empty())
150  spc.abort();
151  };
152 
153 #ifdef GPU_DEBUG
154  std::cout << "Dumping all digis. nDigis = " << nDigis << std::endl;
155 #endif
156 
157  for (uint32_t i = 0; i < nDigis; i++) {
158  // check for uninitialized digis
159  if (digis.rawIdArr(i) == 0)
160  continue;
161  // check for noisy/dead pixels (electrons set to 0)
162  if (digis.adc(i) == 0)
163  continue;
164  if (digis.clus(i) > 9000)
165  continue; // not in cluster; TODO add an assert for the size
166 #ifdef EDM_ML_DEBUG
167  assert(digis.rawIdArr(i) > 109999);
168 #endif
169  if (detId != digis.rawIdArr(i)) {
170 #ifdef GPU_DEBUG
171  std::cout << ">> Closed module --" << detId << "; nclus = " << nclus << std::endl;
172 #endif
173  // new module
174  fillClusters(detId);
175 #ifdef EDM_ML_DEBUG
176  assert(nclus == -1);
177 #endif
178  detId = digis.rawIdArr(i);
179  if (storeDigis_) {
180  detDigis = &collection->find_or_insert(detId);
181  if ((*detDigis).empty())
182  (*detDigis).data.reserve(64); // avoid the first relocations
183  else {
184  edm::LogWarning("SiPixelDigisClustersFromSoA")
185  << "Problem det present twice in input! " << (*detDigis).detId();
186  }
187  }
188  }
189  PixelDigi dig(digis.pdigi(i));
190 
191 #ifdef GPU_DEBUG
192  std::cout << i << ";" << digis.rawIdArr(i) << ";" << digis.clus(i) << ";" << digis.pdigi(i) << ";" << digis.adc(i)
193  << ";" << dig.row() << ";" << dig.column() << std::endl;
194 #endif
195 
196  if (storeDigis_)
197  (*detDigis).data.emplace_back(dig);
198  // fill clusters
199 #ifdef EDM_ML_DEBUG
200  assert(digis.clus(i) >= 0);
201  assert(digis.clus(i) < static_cast<int32_t>(TrackerTraits::maxNumClustersPerModules));
202 #endif
203  nclus = std::max(digis.clus(i), nclus);
204  auto row = dig.row();
205  auto col = dig.column();
206  SiPixelCluster::PixelPos pix(row, col);
207  aclusters[digis.clus(i)].add(pix, digis.adc(i));
208  }
209 
210  // fill final clusters
211  if (detId > 0)
212  fillClusters(detId);
213 
214 #ifdef EDM_ML_DEBUG
215  LogDebug("SiPixelDigisClustersFromSoA") << "filled " << totClustersFilled << " clusters";
216 #endif
217 
218  if (produceDigis_)
219  iEvent.put(digiPutToken_, std::move(collection));
220  iEvent.put(clusterPutToken_, std::move(outputClusters));
221 }
222 
void addWithDefaultLabel(ParameterSetDescription const &psetDescription)
ESGetTokenH3DDVariant esConsumes(std::string const &Record, edm::ConsumesCollector &)
Definition: DeDxTools.cc:283
void produce(edm::StreamID, edm::Event &iEvent, const edm::EventSetup &iSetup) const override
T const & getData(const ESGetToken< T, R > &iToken) const noexcept(false)
Definition: EventSetup.h:119
~SiPixelDigisClustersFromSoAT() override=default
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
assert(be >=bs)
const edm::ESGetToken< TrackerTopology, TrackerTopologyRcd > topoToken_
constexpr uint16_t numberOfModules
int minPixelRow() const
int iEvent
Definition: GenABIO.cc:224
constexpr uint16_t clusterThresholdOtherLayers
const SiPixelClusterThresholds clusterThresholds_
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:16
constexpr int subdetId() const
get the contents of the subdetector field (not cast into any detector&#39;s numbering enum) ...
Definition: DetId.h:48
constexpr uint16_t clusterThresholdLayerOne
SiPixelDigisClustersFromSoAT(const edm::ParameterSet &iConfig)
Definition: DetId.h:17
Pixel cluster – collection of neighboring pixels above threshold.
constexpr int32_t maxNumClustersPerModules
HLT enums.
void emplace_back(Args &&... args)
edm::EDPutTokenT< edm::DetSetVector< PixelDigi > > digiPutToken_
col
Definition: cuy.py:1009
edm::EDGetTokenT< legacy::SiPixelDigisSoA > digiGetToken_
bool add(SiPixelCluster::PixelPos const &p, uint16_t const iadc)
Log< level::Warning, false > LogWarning
edm::EDPutTokenT< SiPixelClusterCollectionNew > clusterPutToken_
def move(src, dest)
Definition: eostools.py:511
#define LogDebug(id)