165 {
167 m_chrono->chronoStart(
"FPGAOutputValidationAlg::pixel diff");
168 const SG::ReadHandleKey<xAOD::PixelClusterContainer>& key0 =
m_pixelKeys[0];
169 const SG::ReadHandleKey<xAOD::PixelClusterContainer>& key1 =
m_pixelKeys[1];
170 SG::ReadHandle<xAOD::PixelClusterContainer> handle0{key0, ctx};
172 SG::ReadHandle<xAOD::PixelClusterContainer> handle1{key1, ctx};
174
176 const auto& pixelClusters0 = *handle0;
177 std::unordered_multimap<xAOD::DetectorIDHashType, const xAOD::PixelCluster*> pixelClustersHashIdMap0;
178 for (const auto* cluster0 : pixelClusters0) {
180 pixelClustersHashIdMap0.insert(std::make_pair(hashId0, cluster0));
181 }
182 const std::vector<ClusterPair<xAOD::PixelCluster>> pixelClusterPairsWithCommonRdos = findNonMergedClusters(pixelClustersHashIdMap0);
183 if (pixelClusterPairsWithCommonRdos.size() > 0) {
184 std::stringstream
ss;
185 for (const auto& pair : pixelClusterPairsWithCommonRdos) {
186 ss <<
"Found " << pair.commonRDOs <<
" common RDOs between clusters with hash "
187 << pair.clusters.first->identifierHash() << ": "
188 << pair.clusters.first->identifier() << " and "
189 << pair.clusters.second->identifier() << "\n";
190 }
192 }
193 }
194
196 std::unordered_multimap<xAOD::DetectorIdentType, const xAOD::PixelCluster*> pixelClustersMap1;
197 std::unordered_multimap<xAOD::DetectorIDHashType, const xAOD::PixelCluster*> pixelClustersHashIdMap1;
198 for (const auto* cluster1 : pixelClusters1) {
201 pixelClustersMap1.insert(std::make_pair(id1, cluster1));
202 pixelClustersHashIdMap1.insert(std::make_pair(hashId1, cluster1));
203 }
204
205 for (auto cluster0 : *handle0) {
206 const std::vector<const xAOD::PixelCluster*> matchedClusters = findMatchingCluster(cluster0, pixelClustersMap1, pixelClustersHashIdMap1,
209
210 if (matchedClusters.size() == 0) {
211 std::vector<std::string>
regions {
"all"};
212 if(
m_pixelid->barrel_ec(cluster0->rdoList()[0]) == 0)
regions.push_back(
"barrel");
213 else regions.push_back(
"endcap");
214 for (
const auto& region :
regions) {
215 Monitored::Group(
217 Monitored::Scalar<float>(handle0.key() + "_UNMATCHED_GLOBALPOSITION_Z_" + region, cluster0->globalPosition()[2]),
218 Monitored::Scalar<float>(handle0.key() + "_UNMATCHED_GLOBALPOSITION_R_" + region, sqrt(cluster0->globalPosition()[0]*cluster0->globalPosition()[0] +
219 cluster0->globalPosition()[1]*cluster0->globalPosition()[1])),
220 Monitored::Scalar<float>("nmatched_pixel_clusters_"+region, matchedClusters.size() - 0.5)
221 );
222 }
223 continue;
224 }
225 if (matchedClusters.size() > 1) {
227 return StatusCode::FAILURE;
228 }
229
231
232 std::vector<std::string>
regions {
"all"};
233 if(
m_pixelid->barrel_ec(cluster0->rdoList()[0]) == 0)
regions.push_back(
"barrel");
234 else regions.push_back(
"endcap");
235
236 for(
auto const& region:
regions)
237 {
238 Monitored::Group(
240 Monitored::Scalar<float>(
"diff_pixel_locx_" +region , cluster0->localPosition<2>()[0] - cluster1->
localPosition<2>()[0]),
241 Monitored::Scalar<float>(
"diff_pixel_locy_" +region , cluster0->localPosition<2>()[1] - cluster1->
localPosition<2>()[1]),
242 Monitored::Scalar<float>(
"diff_pixel_covxx_" +region , cluster0->localCovariance<2>()(0, 0) - cluster1->
localCovariance<2>()(0, 0)),
243 Monitored::Scalar<float>(
"diff_pixel_covyy_" +region , cluster0->localCovariance<2>()(1, 1) - cluster1->
localCovariance<2>()(1, 1)),
244 Monitored::Scalar<float>(
"diff_pixel_globalx_" +region , cluster0->globalPosition()[0] - cluster1->
globalPosition()[0]),
245 Monitored::Scalar<float>(
"diff_pixel_globaly_" +region , cluster0->globalPosition()[1] - cluster1->
globalPosition()[1]),
246 Monitored::Scalar<float>(
"diff_pixel_globalz_" +region , cluster0->globalPosition()[2] - cluster1->
globalPosition()[2]),
247 Monitored::Scalar<int>(
"diff_pixel_channelsphi_" +region , cluster0->channelsInPhi() - cluster1->
channelsInPhi()),
248 Monitored::Scalar<int>(
"diff_pixel_channelseta_" +region , cluster0->channelsInEta() - cluster1->
channelsInEta()),
249 Monitored::Scalar<float>(
"diff_pixel_widtheta_" +region , cluster0->widthInEta() - cluster1->
widthInEta()),
251 Monitored::Scalar<int>(
"diff_pixel_rdos_" +region , cluster0->rdoList().size() - cluster1->
rdoList().size()),
254 Monitored::Scalar<float>(
"pixel_globalZ_ref_" + region, cluster1->
globalPosition()[2]),
255 Monitored::Scalar<float>("nmatched_pixel_clusters_"+region, matchedClusters.size() - 0.5)
256 );
257 if(region != "all")
258 {
259 Monitored::Group(
261 Monitored::Scalar<float>(
"diff_pixel_locx_"+region+
"Layer" + std::to_string(
m_pixelid->layer_disk(
m_pixelid->wafer_id(cluster0->identifierHash()))),
262 cluster0->localPosition<2>()[0] - cluster1->
localPosition<2>()[0]),
263 Monitored::Scalar<float>(
"diff_pixel_locy_"+region+
"Layer" + std::to_string(
m_pixelid->layer_disk(
m_pixelid->wafer_id(cluster0->identifierHash()))),
264 cluster0->localPosition<2>()[1] - cluster1->
localPosition<2>()[1]),
265 Monitored::Scalar<float>(
"diff_pixel_covxx_"+region+
"Layer" + std::to_string(
m_pixelid->layer_disk(
m_pixelid->wafer_id(cluster0->identifierHash()))),
266 cluster0->localCovariance<2>()(0, 0) - cluster1->
localCovariance<2>()(0, 0)),
267 Monitored::Scalar<float>(
"diff_pixel_covyy_"+region+
"Layer" + std::to_string(
m_pixelid->layer_disk(
m_pixelid->wafer_id(cluster0->identifierHash()))),
268 cluster0->localCovariance<2>()(1, 1) - cluster1->
localCovariance<2>()(1, 1)),
269 Monitored::Scalar<float>(
"diff_pixel_globalX_"+region+
"Layer" + std::to_string(
m_pixelid->layer_disk(
m_pixelid->wafer_id(cluster0->identifierHash()))),
271 Monitored::Scalar<float>(
"diff_pixel_globalY_"+region+
"Layer" + std::to_string(
m_pixelid->layer_disk(
m_pixelid->wafer_id(cluster0->identifierHash()))),
273 Monitored::Scalar<float>(
"diff_pixel_globalZ_"+region+
"Layer" + std::to_string(
m_pixelid->layer_disk(
m_pixelid->wafer_id(cluster0->identifierHash()))),
275 Monitored::Scalar<float>("nmatched_pixel_clusters_"+region, matchedClusters.size() - 0.5)
276 );
277 }
278 }
279 }
280 m_chrono->chronoStop(
"FPGAOutputValidationAlg::pixel diff");
281 }
282
284 m_chrono->chronoStart(
"FPGAOutputValidationAlg::strip diff");
285 const SG::ReadHandleKey<xAOD::StripClusterContainer>& key0 =
m_stripKeys[0];
286 const SG::ReadHandleKey<xAOD::StripClusterContainer>& key1 =
m_stripKeys[1];
287 SG::ReadHandle<xAOD::StripClusterContainer> handle0{key0, ctx};
289 SG::ReadHandle<xAOD::StripClusterContainer> handle1{key1, ctx};
291
294 std::unordered_multimap<xAOD::DetectorIDHashType, const xAOD::StripCluster*> stripClustersHashIdMap0;
295 for (const auto* cluster0 : stripClusters0) {
297 stripClustersHashIdMap0.insert(std::make_pair(hashId0, cluster0));
298 }
299
300
301 const std::vector<ClusterPair<xAOD::StripCluster>> stripPairsWithCommonRdos = findNonMergedClusters(stripClustersHashIdMap0);
302
303
304 if (stripPairsWithCommonRdos.size() > 0) {
305 std::stringstream
ss;
306 for (const auto& pair : stripPairsWithCommonRdos) {
307 ss <<
"Found " << pair.commonRDOs <<
" common RDOs between clusters with hash "
308 << pair.clusters.first->identifierHash() << ": "
309 << pair.clusters.first->identifier() << " and "
310 << pair.clusters.second->identifier() << "\n";
311 }
313 }
314 }
316 std::unordered_multimap<xAOD::DetectorIdentType, const xAOD::StripCluster*> stripClustersMap1;
317 std::unordered_multimap<xAOD::DetectorIDHashType, const xAOD::StripCluster*> stripClustersHashIdMap1;
318 for (const auto *cluster1 : stripClusters1) {
321 stripClustersMap1.insert(std::make_pair(id1, cluster1));
322 stripClustersHashIdMap1.insert(std::make_pair(hashId1, cluster1));
323 }
324
325
326 for (auto cluster0 : *handle0) {
327 const std::vector<const xAOD::StripCluster*> matchedClusters = findMatchingCluster(cluster0, stripClustersMap1, stripClustersHashIdMap1,
330
331 if (matchedClusters.size() == 0 && handle1->size() > 0) {
332 std::vector<std::string>
regions {
"all"};
333 if(
m_stripid->barrel_ec(cluster0->rdoList()[0]) == 0)
regions.push_back(
"barrel");
334 else regions.push_back(
"endcap");
335 for (
const auto& region :
regions) {
336 Monitored::Group(
338 Monitored::Scalar<float>(handle0.key() + "_UNMATCHED_GLOBALPOSITION_Z_" + region, cluster0->globalPosition()[2]),
339 Monitored::Scalar<float>(handle0.key() + "_UNMATCHED_GLOBALPOSITION_R_" + region, sqrt(cluster0->globalPosition()[0]*cluster0->globalPosition()[0] +
340 cluster0->globalPosition()[1]*cluster0->globalPosition()[1])),
341 Monitored::Scalar<float>("nmatched_strip_clusters_"+region, matchedClusters.size() - 0.5)
342 );
343 }
344 continue;
345 }
346 if (matchedClusters.size() > 1) {
348 return StatusCode::FAILURE;
349 }
350
352
353 std::vector<std::string>
regions {
"all"};
354 if(
m_stripid->barrel_ec(cluster0->rdoList()[0]) == 0)
regions.push_back(
"barrel");
355 else regions.push_back(
"endcap");
356
357 for(
auto const& region:
regions)
358 {
359 Monitored::Group(
361 Monitored::Scalar<float>(
"diff_strip_locx_" + region, cluster0->localPosition<1>()[0] - cluster1->
localPosition<1>()[0]),
362 Monitored::Scalar<float>(
"diff_strip_locxZoom_" + region, cluster0->localPosition<1>()[0] - cluster1->
localPosition<1>()[0]),
363 Monitored::Scalar<float>(
"diff_strip_covxx_" + region, cluster0->localCovariance<1>()(0, 0) - cluster1->
localCovariance<1>()(0, 0)),
364 Monitored::Scalar<float>(
"diff_strip_globalx_" + region, cluster0->globalPosition()[0] - cluster1->
globalPosition()[0]),
365 Monitored::Scalar<float>(
"diff_strip_globaly_" + region, cluster0->globalPosition()[1] - cluster1->
globalPosition()[1]),
366 Monitored::Scalar<float>(
"diff_strip_globalz_" + region, cluster0->globalPosition()[2] - cluster1->
globalPosition()[2]),
367 Monitored::Scalar<float>(
"diff_strip_channelsphi_" + region, cluster0->channelsInPhi() - cluster1->
channelsInPhi()),
368 Monitored::Scalar<int>(
"diff_strip_rdos_" +region , cluster0->rdoList().size() - cluster1->
rdoList().size()),
371 Monitored::Scalar<float>(
"strip_globalZ_ref_" + region, cluster1->
globalPosition()[2]),
372 Monitored::Scalar<float>("nmatched_strip_clusters_"+region, matchedClusters.size() - 0.5)
373 );
374 if(region != "all")
375 {
376 Monitored::Group(
378 Monitored::Scalar<float>(
"diff_strip_locx_"+region+
"Layer" + std::to_string(
m_stripid->layer_disk(
m_pixelid->wafer_id(cluster0->identifierHash()))),
379 cluster0->localPosition<1>()[0] - cluster1->
localPosition<1>()[0]),
380 Monitored::Scalar<float>(
"diff_strip_locxZoom_"+region+
"Layer" + std::to_string(
m_stripid->layer_disk(
m_pixelid->wafer_id(cluster0->identifierHash()))),
381 cluster0->localPosition<1>()[0] - cluster1->
localPosition<1>()[0]),
382 Monitored::Scalar<float>(
"diff_strip_covxx_"+region+
"Layer" + std::to_string(
m_stripid->layer_disk(
m_pixelid->wafer_id(cluster0->identifierHash()))),
383 cluster0->localCovariance<1>()(0, 0) - cluster1->
localCovariance<1>()(0, 0)),
384 Monitored::Scalar<float>(
"diff_strip_globalX_"+region+
"Layer" + std::to_string(
m_stripid->layer_disk(
m_pixelid->wafer_id(cluster0->identifierHash()))),
386 Monitored::Scalar<float>(
"diff_strip_globalY_"+region+
"Layer" + std::to_string(
m_stripid->layer_disk(
m_pixelid->wafer_id(cluster0->identifierHash()))),
388 Monitored::Scalar<float>(
"diff_strip_globalZ_"+region+
"Layer" + std::to_string(
m_stripid->layer_disk(
m_pixelid->wafer_id(cluster0->identifierHash()))),
390 Monitored::Scalar<float>("nmatched_strip_clusters_"+region, matchedClusters.size() - 0.5)
391 );
392 }
393 }
394 }
395 m_chrono->chronoStop(
"FPGAOutputValidationAlg::strip diff");
396 }
397
400 SG::ReadHandle<xAOD::PixelClusterContainer> handle{
key, ctx};
402
403
404 for(auto cluster : *handle)
405 {
406 std::vector<std::string>
regions {
"all"};
407 if(
m_pixelid->barrel_ec(cluster->rdoList()[0]) == 0)
regions.push_back(
"barrel");
408 else regions.push_back(
"endcap");
409
410 for(
auto const& region:
regions)
411 {
412 Monitored::Group(
414 Monitored::Scalar<float>(
key.key() +
"_LOCALPOSITION_X_" + region, cluster->localPosition<2>()[0]),
415 Monitored::Scalar<float>(
key.key() +
"_LOCALPOSITION_Y_" + region, cluster->localPosition<2>()[1]),
416 Monitored::Scalar<float>(
key.key() +
"_LOCALCOVARIANCE_XX_" + region, cluster->localCovariance<2>()(0, 0)),
417 Monitored::Scalar<float>(
key.key() +
"_LOCALCOVARIANCE_YY_" + region, cluster->localCovariance<2>()(1, 1)),
418 Monitored::Scalar<float>(
key.key() +
"_GLOBALPOSITION_X_" + region, cluster->globalPosition()[0]),
419 Monitored::Scalar<float>(
key.key() +
"_GLOBALPOSITION_Y_" + region, cluster->globalPosition()[1]),
420 Monitored::Scalar<float>(
key.key() +
"_GLOBALPOSITION_Z_" + region, cluster->globalPosition()[2]),
421 Monitored::Scalar<int>(
key.key() +
"_CHANNELS_IN_PHI_" + region, cluster->channelsInPhi()),
422 Monitored::Scalar<int>(
key.key() +
"_CHANNELS_IN_ETA_" + region, cluster->channelsInEta()),
423 Monitored::Scalar<float>(
key.key() +
"_WIDTH_IN_ETA_" + region, cluster->widthInEta()),
425 );
426 }
427 }
428 }
429
432 SG::ReadHandle<xAOD::StripClusterContainer> handle{
key, ctx};
434
435 for(auto cluster : *handle)
436 {
437 std::vector<std::string>
regions {
"all"};
438 if(
m_stripid->barrel_ec(cluster->rdoList()[0]) == 0)
regions.push_back(
"barrel");
439 else regions.push_back(
"endcap");
440
441 for(
auto const& region:
regions)
442 {
443 Monitored::Group(
445 Monitored::Scalar<float>(
key.key() +
"_LOCALPOSITIONZOOM_X_" + region, cluster->localPosition<1>()(0,0)),
446 Monitored::Scalar<float>(
key.key() +
"_LOCALPOSITION_X_" + region, cluster->localPosition<1>()(0,0)),
447 Monitored::Scalar<float>(
key.key() +
"_LOCALCOVARIANCE_XX_" + region, cluster->localCovariance<1>()(0, 0)),
448 Monitored::Scalar<float>(
key.key() +
"_GLOBALPOSITION_X_" + region, cluster->globalPosition()[0]),
449 Monitored::Scalar<float>(
key.key() +
"_GLOBALPOSITION_Y_" + region, cluster->globalPosition()[1]),
450 Monitored::Scalar<float>(
key.key() +
"_GLOBALPOSITION_Z_" + region, cluster->globalPosition()[2]),
451 Monitored::Scalar<float>(
key.key() +
"_CHANNELS_IN_PHI_" + region, cluster->channelsInPhi())
452 );
453 }
454 }
455 }
456
457 return StatusCode::SUCCESS;
458}
#define ATH_CHECK
Evaluate an expression and check for errors.
static const std::vector< std::string > regions
SG::ReadHandleKeyArray< xAOD::PixelClusterContainer > m_pixelKeys
Gaudi::Property< size_t > m_allowedRdoMisses
Gaudi::Property< bool > m_checkClusterRdos
SG::ReadHandleKeyArray< xAOD::StripClusterContainer > m_stripKeys
Gaudi::Property< bool > m_doDiffHistograms
ToolHandle< GenericMonitoringTool > m_monitoringTool
const PixelID * m_pixelid
ServiceHandle< IChronoStatSvc > m_chrono
Gaudi::Property< bool > m_matchByID
virtual bool isValid() override final
Can the handle be successfully dereferenced?
int channelsInPhi() const
Returns the dimensions of the cluster in numbers of channels in phi (x) and eta (y) directions,...
const std::vector< Identifier > rdoList() const
Returns the list of identifiers of the channels building the cluster.
ConstVectorMap< 3 > globalPosition() const
Returns the global position of the pixel cluster.
int channelsInEta() const
float widthInEta() const
Returns the width of the cluster in phi (x) and eta (y) directions, respectively.
ConstVectorMap< 3 > globalPosition() const
Returns the global position of the strip cluster.
int channelsInPhi() const
Returns the dimensions of the cluster in numbers of channels in phi (x), respectively.
const std::vector< Identifier > rdoList() const
Returns the list of identifiers of the channels building the cluster.
ConstMatrixMap< N > localCovariance() const
Returns the local covariance of the measurement.
DetectorIDHashType identifierHash() const
Returns the IdentifierHash of the measurement (corresponds to the detector element IdentifierHash)
DetectorIdentType identifier() const
Returns the full Identifier of the measurement.
ConstVectorMap< N > localPosition() const
Returns the local position of the measurement.
int computeTotalToT(const SG::AuxElement &cluster)
PixelClusterContainer_v1 PixelClusterContainer
Define the version of the pixel cluster container.
StripCluster_v1 StripCluster
Define the version of the strip cluster class.
long unsigned int DetectorIdentType
StripClusterContainer_v1 StripClusterContainer
Define the version of the strip cluster container.
PixelCluster_v1 PixelCluster
Define the version of the pixel cluster class.
unsigned int DetectorIDHashType
@ detector ID element hash