164 {
166 m_chrono->chronoStart(
"FPGAOutputValidationAlg::pixel diff");
167 const SG::ReadHandleKey<xAOD::PixelClusterContainer>& key0 =
m_pixelKeys[0];
168 const SG::ReadHandleKey<xAOD::PixelClusterContainer>& key1 =
m_pixelKeys[1];
169 SG::ReadHandle<xAOD::PixelClusterContainer> handle0{key0, ctx};
171 SG::ReadHandle<xAOD::PixelClusterContainer> handle1{key1, ctx};
173
175 const auto& pixelClusters0 = *handle0;
176 std::unordered_multimap<xAOD::DetectorIDHashType, const xAOD::PixelCluster*> pixelClustersHashIdMap0;
177 for (const auto* cluster0 : pixelClusters0) {
179 pixelClustersHashIdMap0.insert(std::make_pair(hashId0, cluster0));
180 }
181 const std::vector<ClusterPair<xAOD::PixelCluster>> pixelClusterPairsWithCommonRdos = findNonMergedClusters(pixelClustersHashIdMap0);
182 if (pixelClusterPairsWithCommonRdos.size() > 0) {
183 std::stringstream
ss;
184 for (const auto& pair : pixelClusterPairsWithCommonRdos) {
185 ss <<
"Found " << pair.commonRDOs <<
" common RDOs between clusters with hash "
186 << pair.clusters.first->identifierHash() << ": "
187 << pair.clusters.first->identifier() << " and "
188 << pair.clusters.second->identifier() << "\n";
189 }
191 }
192 }
193
195 std::unordered_multimap<xAOD::DetectorIdentType, const xAOD::PixelCluster*> pixelClustersMap1;
196 std::unordered_multimap<xAOD::DetectorIDHashType, const xAOD::PixelCluster*> pixelClustersHashIdMap1;
197 for (const auto* cluster1 : pixelClusters1) {
200 pixelClustersMap1.insert(std::make_pair(id1, cluster1));
201 pixelClustersHashIdMap1.insert(std::make_pair(hashId1, cluster1));
202 }
203
204 for (auto cluster0 : *handle0) {
205 const std::vector<const xAOD::PixelCluster*> matchedClusters = findMatchingCluster(cluster0, pixelClustersMap1, pixelClustersHashIdMap1,
208
209 if (matchedClusters.size() == 0) {
210 std::vector<std::string>
regions {
"all"};
211 if(
m_pixelid->barrel_ec(cluster0->rdoList()[0]) == 0)
regions.push_back(
"barrel");
212 else regions.push_back(
"endcap");
213 for (
const auto& region :
regions) {
214 Monitored::Group(
216 Monitored::Scalar<float>(handle0.key() + "_UNMATCHED_GLOBALPOSITION_Z_" + region, cluster0->globalPosition()[2]),
217 Monitored::Scalar<float>(handle0.key() + "_UNMATCHED_GLOBALPOSITION_R_" + region, sqrt(cluster0->globalPosition()[0]*cluster0->globalPosition()[0] +
218 cluster0->globalPosition()[1]*cluster0->globalPosition()[1])),
219 Monitored::Scalar<float>("nmatched_pixel_clusters_"+region, matchedClusters.size() - 0.5)
220 );
221 }
222 continue;
223 }
224 if (matchedClusters.size() > 1) {
226 return StatusCode::FAILURE;
227 }
228
230
231 std::vector<std::string>
regions {
"all"};
232 if(
m_pixelid->barrel_ec(cluster0->rdoList()[0]) == 0)
regions.push_back(
"barrel");
233 else regions.push_back(
"endcap");
234
235 for(
auto const& region:
regions)
236 {
237 Monitored::Group(
239 Monitored::Scalar<float>(
"diff_pixel_locx_" +region , cluster0->localPosition<2>()[0] - cluster1->
localPosition<2>()[0]),
240 Monitored::Scalar<float>(
"diff_pixel_locy_" +region , cluster0->localPosition<2>()[1] - cluster1->
localPosition<2>()[1]),
241 Monitored::Scalar<float>(
"diff_pixel_covxx_" +region , cluster0->localCovariance<2>()(0, 0) - cluster1->
localCovariance<2>()(0, 0)),
242 Monitored::Scalar<float>(
"diff_pixel_covyy_" +region , cluster0->localCovariance<2>()(1, 1) - cluster1->
localCovariance<2>()(1, 1)),
243 Monitored::Scalar<float>(
"diff_pixel_globalx_" +region , cluster0->globalPosition()[0] - cluster1->
globalPosition()[0]),
244 Monitored::Scalar<float>(
"diff_pixel_globaly_" +region , cluster0->globalPosition()[1] - cluster1->
globalPosition()[1]),
245 Monitored::Scalar<float>(
"diff_pixel_globalz_" +region , cluster0->globalPosition()[2] - cluster1->
globalPosition()[2]),
246 Monitored::Scalar<int>(
"diff_pixel_channelsphi_" +region , cluster0->channelsInPhi() - cluster1->
channelsInPhi()),
247 Monitored::Scalar<int>(
"diff_pixel_channelseta_" +region , cluster0->channelsInEta() - cluster1->
channelsInEta()),
248 Monitored::Scalar<float>(
"diff_pixel_widtheta_" +region , cluster0->widthInEta() - cluster1->
widthInEta()),
249 Monitored::Scalar<int>(
"diff_pixel_tot_" +region , cluster0->totalToT() - cluster1->
totalToT()),
250 Monitored::Scalar<int>(
"diff_pixel_rdos_" +region , cluster0->rdoList().size() - cluster1->
rdoList().size()),
253 Monitored::Scalar<float>(
"pixel_globalZ_ref_" + region, cluster1->
globalPosition()[2]),
254 Monitored::Scalar<float>("nmatched_pixel_clusters_"+region, matchedClusters.size() - 0.5)
255 );
256 if(region != "all")
257 {
258 Monitored::Group(
260 Monitored::Scalar<float>(
"diff_pixel_locx_"+region+
"Layer" + std::to_string(
m_pixelid->layer_disk(
m_pixelid->wafer_id(cluster0->identifierHash()))),
261 cluster0->localPosition<2>()[0] - cluster1->
localPosition<2>()[0]),
262 Monitored::Scalar<float>(
"diff_pixel_locy_"+region+
"Layer" + std::to_string(
m_pixelid->layer_disk(
m_pixelid->wafer_id(cluster0->identifierHash()))),
263 cluster0->localPosition<2>()[1] - cluster1->
localPosition<2>()[1]),
264 Monitored::Scalar<float>(
"diff_pixel_covxx_"+region+
"Layer" + std::to_string(
m_pixelid->layer_disk(
m_pixelid->wafer_id(cluster0->identifierHash()))),
265 cluster0->localCovariance<2>()(0, 0) - cluster1->
localCovariance<2>()(0, 0)),
266 Monitored::Scalar<float>(
"diff_pixel_covyy_"+region+
"Layer" + std::to_string(
m_pixelid->layer_disk(
m_pixelid->wafer_id(cluster0->identifierHash()))),
267 cluster0->localCovariance<2>()(1, 1) - cluster1->
localCovariance<2>()(1, 1)),
268 Monitored::Scalar<float>(
"diff_pixel_globalX_"+region+
"Layer" + std::to_string(
m_pixelid->layer_disk(
m_pixelid->wafer_id(cluster0->identifierHash()))),
270 Monitored::Scalar<float>(
"diff_pixel_globalY_"+region+
"Layer" + std::to_string(
m_pixelid->layer_disk(
m_pixelid->wafer_id(cluster0->identifierHash()))),
272 Monitored::Scalar<float>(
"diff_pixel_globalZ_"+region+
"Layer" + std::to_string(
m_pixelid->layer_disk(
m_pixelid->wafer_id(cluster0->identifierHash()))),
274 Monitored::Scalar<float>("nmatched_pixel_clusters_"+region, matchedClusters.size() - 0.5)
275 );
276 }
277 }
278 }
279 m_chrono->chronoStop(
"FPGAOutputValidationAlg::pixel diff");
280 }
281
283 m_chrono->chronoStart(
"FPGAOutputValidationAlg::strip diff");
284 const SG::ReadHandleKey<xAOD::StripClusterContainer>& key0 =
m_stripKeys[0];
285 const SG::ReadHandleKey<xAOD::StripClusterContainer>& key1 =
m_stripKeys[1];
286 SG::ReadHandle<xAOD::StripClusterContainer> handle0{key0, ctx};
288 SG::ReadHandle<xAOD::StripClusterContainer> handle1{key1, ctx};
290
293 std::unordered_multimap<xAOD::DetectorIDHashType, const xAOD::StripCluster*> stripClustersHashIdMap0;
294 for (const auto* cluster0 : stripClusters0) {
296 stripClustersHashIdMap0.insert(std::make_pair(hashId0, cluster0));
297 }
298
299
300 const std::vector<ClusterPair<xAOD::StripCluster>> stripPairsWithCommonRdos = findNonMergedClusters(stripClustersHashIdMap0);
301
302
303 if (stripPairsWithCommonRdos.size() > 0) {
304 std::stringstream
ss;
305 for (const auto& pair : stripPairsWithCommonRdos) {
306 ss <<
"Found " << pair.commonRDOs <<
" common RDOs between clusters with hash "
307 << pair.clusters.first->identifierHash() << ": "
308 << pair.clusters.first->identifier() << " and "
309 << pair.clusters.second->identifier() << "\n";
310 }
312 }
313 }
315 std::unordered_multimap<xAOD::DetectorIdentType, const xAOD::StripCluster*> stripClustersMap1;
316 std::unordered_multimap<xAOD::DetectorIDHashType, const xAOD::StripCluster*> stripClustersHashIdMap1;
317 for (const auto *cluster1 : stripClusters1) {
320 stripClustersMap1.insert(std::make_pair(id1, cluster1));
321 stripClustersHashIdMap1.insert(std::make_pair(hashId1, cluster1));
322 }
323
324
325 for (auto cluster0 : *handle0) {
326 const std::vector<const xAOD::StripCluster*> matchedClusters = findMatchingCluster(cluster0, stripClustersMap1, stripClustersHashIdMap1,
329
330 if (matchedClusters.size() == 0 && handle1->size() > 0) {
331 std::vector<std::string>
regions {
"all"};
332 if(
m_stripid->barrel_ec(cluster0->rdoList()[0]) == 0)
regions.push_back(
"barrel");
333 else regions.push_back(
"endcap");
334 for (
const auto& region :
regions) {
335 Monitored::Group(
337 Monitored::Scalar<float>(handle0.key() + "_UNMATCHED_GLOBALPOSITION_Z_" + region, cluster0->globalPosition()[2]),
338 Monitored::Scalar<float>(handle0.key() + "_UNMATCHED_GLOBALPOSITION_R_" + region, sqrt(cluster0->globalPosition()[0]*cluster0->globalPosition()[0] +
339 cluster0->globalPosition()[1]*cluster0->globalPosition()[1])),
340 Monitored::Scalar<float>("nmatched_strip_clusters_"+region, matchedClusters.size() - 0.5)
341 );
342 }
343 continue;
344 }
345 if (matchedClusters.size() > 1) {
347 return StatusCode::FAILURE;
348 }
349
351
352 std::vector<std::string>
regions {
"all"};
353 if(
m_stripid->barrel_ec(cluster0->rdoList()[0]) == 0)
regions.push_back(
"barrel");
354 else regions.push_back(
"endcap");
355
356 for(
auto const& region:
regions)
357 {
358 Monitored::Group(
360 Monitored::Scalar<float>(
"diff_strip_locx_" + region, cluster0->localPosition<1>()[0] - cluster1->
localPosition<1>()[0]),
361 Monitored::Scalar<float>(
"diff_strip_locxZoom_" + region, cluster0->localPosition<1>()[0] - cluster1->
localPosition<1>()[0]),
362 Monitored::Scalar<float>(
"diff_strip_covxx_" + region, cluster0->localCovariance<1>()(0, 0) - cluster1->
localCovariance<1>()(0, 0)),
363 Monitored::Scalar<float>(
"diff_strip_globalx_" + region, cluster0->globalPosition()[0] - cluster1->
globalPosition()[0]),
364 Monitored::Scalar<float>(
"diff_strip_globaly_" + region, cluster0->globalPosition()[1] - cluster1->
globalPosition()[1]),
365 Monitored::Scalar<float>(
"diff_strip_globalz_" + region, cluster0->globalPosition()[2] - cluster1->
globalPosition()[2]),
366 Monitored::Scalar<float>(
"diff_strip_channelsphi_" + region, cluster0->channelsInPhi() - cluster1->
channelsInPhi()),
367 Monitored::Scalar<int>(
"diff_strip_rdos_" +region , cluster0->rdoList().size() - cluster1->
rdoList().size()),
370 Monitored::Scalar<float>(
"strip_globalZ_ref_" + region, cluster1->
globalPosition()[2]),
371 Monitored::Scalar<float>("nmatched_strip_clusters_"+region, matchedClusters.size() - 0.5)
372 );
373 if(region != "all")
374 {
375 Monitored::Group(
377 Monitored::Scalar<float>(
"diff_strip_locx_"+region+
"Layer" + std::to_string(
m_stripid->layer_disk(
m_pixelid->wafer_id(cluster0->identifierHash()))),
378 cluster0->localPosition<1>()[0] - cluster1->
localPosition<1>()[0]),
379 Monitored::Scalar<float>(
"diff_strip_locxZoom_"+region+
"Layer" + std::to_string(
m_stripid->layer_disk(
m_pixelid->wafer_id(cluster0->identifierHash()))),
380 cluster0->localPosition<1>()[0] - cluster1->
localPosition<1>()[0]),
381 Monitored::Scalar<float>(
"diff_strip_covxx_"+region+
"Layer" + std::to_string(
m_stripid->layer_disk(
m_pixelid->wafer_id(cluster0->identifierHash()))),
382 cluster0->localCovariance<1>()(0, 0) - cluster1->
localCovariance<1>()(0, 0)),
383 Monitored::Scalar<float>(
"diff_strip_globalX_"+region+
"Layer" + std::to_string(
m_stripid->layer_disk(
m_pixelid->wafer_id(cluster0->identifierHash()))),
385 Monitored::Scalar<float>(
"diff_strip_globalY_"+region+
"Layer" + std::to_string(
m_stripid->layer_disk(
m_pixelid->wafer_id(cluster0->identifierHash()))),
387 Monitored::Scalar<float>(
"diff_strip_globalZ_"+region+
"Layer" + std::to_string(
m_stripid->layer_disk(
m_pixelid->wafer_id(cluster0->identifierHash()))),
389 Monitored::Scalar<float>("nmatched_strip_clusters_"+region, matchedClusters.size() - 0.5)
390 );
391 }
392 }
393 }
394 m_chrono->chronoStop(
"FPGAOutputValidationAlg::strip diff");
395 }
396
399 SG::ReadHandle<xAOD::PixelClusterContainer> handle{
key, ctx};
401
402
403 for(auto cluster : *handle)
404 {
405 std::vector<std::string>
regions {
"all"};
406 if(
m_pixelid->barrel_ec(cluster->rdoList()[0]) == 0)
regions.push_back(
"barrel");
407 else regions.push_back(
"endcap");
408
409 for(
auto const& region:
regions)
410 {
411 Monitored::Group(
413 Monitored::Scalar<float>(
key.key() +
"_LOCALPOSITION_X_" + region, cluster->localPosition<2>()[0]),
414 Monitored::Scalar<float>(
key.key() +
"_LOCALPOSITION_Y_" + region, cluster->localPosition<2>()[1]),
415 Monitored::Scalar<float>(
key.key() +
"_LOCALCOVARIANCE_XX_" + region, cluster->localCovariance<2>()(0, 0)),
416 Monitored::Scalar<float>(
key.key() +
"_LOCALCOVARIANCE_YY_" + region, cluster->localCovariance<2>()(1, 1)),
417 Monitored::Scalar<float>(
key.key() +
"_GLOBALPOSITION_X_" + region, cluster->globalPosition()[0]),
418 Monitored::Scalar<float>(
key.key() +
"_GLOBALPOSITION_Y_" + region, cluster->globalPosition()[1]),
419 Monitored::Scalar<float>(
key.key() +
"_GLOBALPOSITION_Z_" + region, cluster->globalPosition()[2]),
420 Monitored::Scalar<int>(
key.key() +
"_CHANNELS_IN_PHI_" + region, cluster->channelsInPhi()),
421 Monitored::Scalar<int>(
key.key() +
"_CHANNELS_IN_ETA_" + region, cluster->channelsInEta()),
422 Monitored::Scalar<float>(
key.key() +
"_WIDTH_IN_ETA_" + region, cluster->widthInEta()),
423 Monitored::Scalar<int>(
key.key() +
"_TOTAL_TOT_" + region, cluster->totalToT())
424 );
425 }
426 }
427 }
428
431 SG::ReadHandle<xAOD::StripClusterContainer> handle{
key, ctx};
433
434 for(auto cluster : *handle)
435 {
436 std::vector<std::string>
regions {
"all"};
437 if(
m_stripid->barrel_ec(cluster->rdoList()[0]) == 0)
regions.push_back(
"barrel");
438 else regions.push_back(
"endcap");
439
440 for(
auto const& region:
regions)
441 {
442 Monitored::Group(
444 Monitored::Scalar<float>(
key.key() +
"_LOCALPOSITIONZOOM_X_" + region, cluster->localPosition<1>()(0,0)),
445 Monitored::Scalar<float>(
key.key() +
"_LOCALPOSITION_X_" + region, cluster->localPosition<1>()(0,0)),
446 Monitored::Scalar<float>(
key.key() +
"_LOCALCOVARIANCE_XX_" + region, cluster->localCovariance<1>()(0, 0)),
447 Monitored::Scalar<float>(
key.key() +
"_GLOBALPOSITION_X_" + region, cluster->globalPosition()[0]),
448 Monitored::Scalar<float>(
key.key() +
"_GLOBALPOSITION_Y_" + region, cluster->globalPosition()[1]),
449 Monitored::Scalar<float>(
key.key() +
"_GLOBALPOSITION_Z_" + region, cluster->globalPosition()[2]),
450 Monitored::Scalar<float>(
key.key() +
"_CHANNELS_IN_PHI_" + region, cluster->channelsInPhi())
451 );
452 }
453 }
454 }
455
456 return StatusCode::SUCCESS;
457}
#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.
int totalToT() const
Returns the sum of the ToTs of the channels building the cluster.
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.
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