|
45 | 45 | #include <Framework/AnalysisDataModel.h> |
46 | 46 | #include <Framework/AnalysisHelpers.h> |
47 | 47 | #include <Framework/AnalysisTask.h> |
| 48 | +#include <Framework/Concepts.h> |
48 | 49 | #include <Framework/Configurable.h> |
49 | 50 | #include <Framework/Expressions.h> |
50 | 51 | #include <Framework/HistogramRegistry.h> |
@@ -96,8 +97,10 @@ enum CellScaleMode { |
96 | 97 | struct EmcalCorrectionTask { |
97 | 98 | Produces<o2::aod::EMCALClusters> clusters; |
98 | 99 | Produces<o2::aod::EMCALMCClusters> mcclusters; |
| 100 | + Produces<o2::aod::Dispersions> dispersions; |
99 | 101 | Produces<o2::aod::EMCALAmbiguousClusters> clustersAmbiguous; |
100 | 102 | Produces<o2::aod::EMCALAmbiguousMCClusters> mcclustersAmbiguous; |
| 103 | + Produces<o2::aod::AmbigousDispersions> ambigousDispersions; |
101 | 104 | Produces<o2::aod::EMCALClusterCells> clustercells; // cells belonging to given cluster |
102 | 105 | Produces<o2::aod::EMCALAmbiguousClusterCells> clustercellsambiguous; |
103 | 106 | Produces<o2::aod::EMCALMatchedTracks> matchedTracks; |
@@ -387,6 +390,10 @@ struct EmcalCorrectionTask { |
387 | 390 | } |
388 | 391 | } |
389 | 392 |
|
| 393 | + auto hClusters = mHistManager.add<TH1>("hClusters", "hClusters", O2HistType::kTH1D, {{2, -0.5, 1.5}}); |
| 394 | + hClusters->GetXaxis()->SetBinLabel(1, "all clusters"); |
| 395 | + hClusters->GetXaxis()->SetBinLabel(2, "cross boundary cluster"); |
| 396 | + |
390 | 397 | // For some runs, LG cells require an extra time shift of 2 * 8.8ns due to problems in the time calibration |
391 | 398 | // Affected run ranges (inclusive) are initialised here (min,max) |
392 | 399 | mExtraTimeShiftRunRanges.emplace_back(535365, 535645); // LHC23g-LHC23h |
@@ -422,7 +429,9 @@ struct EmcalCorrectionTask { |
422 | 429 | { |
423 | 430 | LOG(debug) << "Starting process full."; |
424 | 431 | clusters.reserve(MaxClusterPerDFPerClusterizer * mClusterizers.size()); |
| 432 | + dispersions.reserve(MaxClusterPerDFPerClusterizer * mClusterizers.size()); |
425 | 433 | clustersAmbiguous.reserve(MaxAmbClusterPerDFPerClusterizer * mClusterizers.size()); |
| 434 | + ambigousDispersions.reserve(MaxAmbClusterPerDFPerClusterizer * mClusterizers.size()); |
426 | 435 | clustercells.reserve(MaxCellsPerClusterPerDFPerClusterizer * mClusterizers.size()); |
427 | 436 | clustercellsambiguous.reserve(MaxCellsPerAmbClusterPerDFPerClusterizer * mClusterizers.size()); |
428 | 437 |
|
@@ -529,7 +538,7 @@ struct EmcalCorrectionTask { |
529 | 538 |
|
530 | 539 | // Store the clusters in the table where a matching collision could |
531 | 540 | // be identified. |
532 | | - fillClusterTable<CollEventSels::filtered_iterator>(col, vertexPos, iClusterizer, cellIndicesBC, &indexMapPair, &trackGlobalIndex); |
| 541 | + fillClusterTable<CollEventSels::filtered_iterator>(col, vertexPos, iClusterizer, cellIndicesBC, cells, &indexMapPair, &trackGlobalIndex, nullptr, nullptr); |
533 | 542 | } else { |
534 | 543 | mHistManager.fill(HIST("hBCMatchErrors"), 2); |
535 | 544 | } |
@@ -582,7 +591,9 @@ struct EmcalCorrectionTask { |
582 | 591 | LOG(debug) << "Starting process full."; |
583 | 592 |
|
584 | 593 | clusters.reserve(MaxClusterPerDFPerClusterizer * mClusterizers.size()); |
| 594 | + dispersions.reserve(MaxClusterPerDFPerClusterizer * mClusterizers.size()); |
585 | 595 | clustersAmbiguous.reserve(MaxAmbClusterPerDFPerClusterizer * mClusterizers.size()); |
| 596 | + ambigousDispersions.reserve(MaxAmbClusterPerDFPerClusterizer * mClusterizers.size()); |
586 | 597 | clustercells.reserve(MaxCellsPerClusterPerDFPerClusterizer * mClusterizers.size()); |
587 | 598 | clustercellsambiguous.reserve(MaxCellsPerAmbClusterPerDFPerClusterizer * mClusterizers.size()); |
588 | 599 |
|
@@ -694,7 +705,7 @@ struct EmcalCorrectionTask { |
694 | 705 |
|
695 | 706 | // Store the clusters in the table where a matching collision could |
696 | 707 | // be identified. |
697 | | - fillClusterTable<CollEventSels::filtered_iterator>(col, vertexPos, iClusterizer, cellIndicesBC, &indexMapPair, &trackGlobalIndex, &indexMapPairSecondary, &secondaryGlobalIndex); |
| 708 | + fillClusterTable<CollEventSels::filtered_iterator>(col, vertexPos, iClusterizer, cellIndicesBC, cells, &indexMapPair, &trackGlobalIndex, &indexMapPairSecondary, &secondaryGlobalIndex); |
698 | 709 | } else { |
699 | 710 | mHistManager.fill(HIST("hBCMatchErrors"), 2); |
700 | 711 | } |
@@ -748,8 +759,10 @@ struct EmcalCorrectionTask { |
748 | 759 |
|
749 | 760 | clusters.reserve(MaxClusterPerDFPerClusterizer * mClusterizers.size()); |
750 | 761 | mcclusters.reserve(MaxClusterPerDFPerClusterizer * mClusterizers.size()); |
| 762 | + dispersions.reserve(MaxClusterPerDFPerClusterizer * mClusterizers.size()); |
751 | 763 | clustersAmbiguous.reserve(MaxAmbClusterPerDFPerClusterizer * mClusterizers.size()); |
752 | 764 | mcclustersAmbiguous.reserve(MaxAmbClusterPerDFPerClusterizer * mClusterizers.size()); |
| 765 | + ambigousDispersions.reserve(MaxAmbClusterPerDFPerClusterizer * mClusterizers.size()); |
753 | 766 | clustercells.reserve(MaxCellsPerClusterPerDFPerClusterizer * mClusterizers.size()); |
754 | 767 | clustercellsambiguous.reserve(MaxCellsPerAmbClusterPerDFPerClusterizer * mClusterizers.size()); |
755 | 768 |
|
@@ -891,7 +904,7 @@ struct EmcalCorrectionTask { |
891 | 904 |
|
892 | 905 | // Store the clusters in the table where a matching collision could |
893 | 906 | // be identified. |
894 | | - fillClusterTable<CollEventSels::filtered_iterator>(col, vertexPos, iClusterizer, cellIndicesBC, &indexMapPair, &trackGlobalIndex); |
| 907 | + fillClusterTable<CollEventSels::filtered_iterator>(col, vertexPos, iClusterizer, cellIndicesBC, cells, &indexMapPair, &trackGlobalIndex); |
895 | 908 | } else { |
896 | 909 | mHistManager.fill(HIST("hBCMatchErrors"), 2); |
897 | 910 | } |
@@ -943,8 +956,10 @@ struct EmcalCorrectionTask { |
943 | 956 |
|
944 | 957 | clusters.reserve(MaxClusterPerDFPerClusterizer * mClusterizers.size()); |
945 | 958 | mcclusters.reserve(MaxClusterPerDFPerClusterizer * mClusterizers.size()); |
| 959 | + dispersions.reserve(MaxClusterPerDFPerClusterizer * mClusterizers.size()); |
946 | 960 | clustersAmbiguous.reserve(MaxAmbClusterPerDFPerClusterizer * mClusterizers.size()); |
947 | 961 | mcclustersAmbiguous.reserve(MaxAmbClusterPerDFPerClusterizer * mClusterizers.size()); |
| 962 | + ambigousDispersions.reserve(MaxAmbClusterPerDFPerClusterizer * mClusterizers.size()); |
948 | 963 | clustercells.reserve(MaxCellsPerClusterPerDFPerClusterizer * mClusterizers.size()); |
949 | 964 | clustercellsambiguous.reserve(MaxCellsPerAmbClusterPerDFPerClusterizer * mClusterizers.size()); |
950 | 965 |
|
@@ -1088,7 +1103,7 @@ struct EmcalCorrectionTask { |
1088 | 1103 |
|
1089 | 1104 | // Store the clusters in the table where a matching collision could |
1090 | 1105 | // be identified. |
1091 | | - fillClusterTable<CollEventSels::filtered_iterator>(col, vertexPos, iClusterizer, cellIndicesBC, &indexMapPair, &trackGlobalIndex, &indexMapPairSecondary, &secondaryGlobalIndex); |
| 1106 | + fillClusterTable<CollEventSels::filtered_iterator>(col, vertexPos, iClusterizer, cellIndicesBC, cells, &indexMapPair, &trackGlobalIndex, &indexMapPairSecondary, &secondaryGlobalIndex); |
1092 | 1107 | } else { |
1093 | 1108 | mHistManager.fill(HIST("hBCMatchErrors"), 2); |
1094 | 1109 | } |
@@ -1139,7 +1154,9 @@ struct EmcalCorrectionTask { |
1139 | 1154 | LOG(debug) << "Starting process standalone."; |
1140 | 1155 |
|
1141 | 1156 | clusters.reserve(MaxClusterPerDFPerClusterizer * mClusterizers.size()); |
| 1157 | + dispersions.reserve(MaxClusterPerDFPerClusterizer * mClusterizers.size()); |
1142 | 1158 | clustersAmbiguous.reserve(MaxAmbClusterPerDFPerClusterizer * mClusterizers.size()); |
| 1159 | + ambigousDispersions.reserve(MaxAmbClusterPerDFPerClusterizer * mClusterizers.size()); |
1143 | 1160 | clustercells.reserve(MaxCellsPerClusterPerDFPerClusterizer * mClusterizers.size()); |
1144 | 1161 | clustercellsambiguous.reserve(MaxCellsPerAmbClusterPerDFPerClusterizer * mClusterizers.size()); |
1145 | 1162 |
|
@@ -1234,7 +1251,7 @@ struct EmcalCorrectionTask { |
1234 | 1251 |
|
1235 | 1252 | // Store the clusters in the table where a matching collision could |
1236 | 1253 | // be identified. |
1237 | | - fillClusterTable<aod::Collision>(col, vertexPos, iClusterizer, cellIndicesBC); |
| 1254 | + fillClusterTable<aod::Collision>(col, vertexPos, iClusterizer, cellIndicesBC, cells); |
1238 | 1255 | } |
1239 | 1256 | } else { // ambiguous |
1240 | 1257 | // LOG(warning) << "No vertex found for event. Assuming (0,0,0)."; |
@@ -1303,12 +1320,11 @@ struct EmcalCorrectionTask { |
1303 | 1320 | LOG(debug) << "Converted to analysis clusters."; |
1304 | 1321 | } |
1305 | 1322 |
|
1306 | | - template <typename Collision> |
1307 | | - void fillClusterTable(Collision const& col, math_utils::Point3D<float> const& vertexPos, size_t iClusterizer, const gsl::span<int64_t> cellIndicesBC, MatchResult* indexMapPair = nullptr, const std::vector<int64_t>* trackGlobalIndex = nullptr, MatchResult* indexMapPairSecondaries = nullptr, const std::vector<int64_t>* secondariesGlobalIndex = nullptr) |
| 1323 | + template <o2::soa::is_iterator Collision, o2::soa::is_table Cells> |
| 1324 | + void fillClusterTable(Collision const& col, math_utils::Point3D<float> const& vertexPos, size_t iClusterizer, const gsl::span<int64_t> cellIndicesBC, Cells const& cells, MatchResult* indexMapPair = nullptr, const std::vector<int64_t>* trackGlobalIndex = nullptr, MatchResult* indexMapPairSecondaries = nullptr, const std::vector<int64_t>* secondariesGlobalIndex = nullptr) |
1308 | 1325 | { |
1309 | 1326 | // get the clusterType once |
1310 | 1327 | const auto clusterType = static_cast<int>(mClusterDefinitions[iClusterizer]); |
1311 | | - |
1312 | 1328 | int cellindex = -1; |
1313 | 1329 | unsigned int iCluster = 0; |
1314 | 1330 | float energy = 0.f; |
@@ -1341,16 +1357,40 @@ struct EmcalCorrectionTask { |
1341 | 1357 | cluster.getClusterTime(), cluster.getIsExotic(), |
1342 | 1358 | cluster.getDistanceToBadChannel(), cluster.getNExMax(), |
1343 | 1359 | clusterType); |
| 1360 | + dispersions(cluster.getDispersion()); |
1344 | 1361 | ++nCluster; |
| 1362 | + mHistManager.fill(HIST("hClusters"), 0); |
1345 | 1363 | if (!mClusterLabels.empty()) { |
1346 | 1364 | mcclusters(mClusterLabels[iCluster].getLabels(), mClusterLabels[iCluster].getEnergyFractions()); |
1347 | 1365 | } |
1348 | 1366 | // loop over cells in cluster and save to table |
| 1367 | + bool hasLargeDispersion = cluster.getDispersion() > 8; |
| 1368 | + if (hasLargeDispersion) { |
| 1369 | + mHistManager.fill(HIST("hClusters"), 1); |
| 1370 | + LOG(info) << "Found cluster with large dispersion = " << cluster.getDispersion() << "\t M02 = " << cluster.getM02() << "\t NCells = " << cluster.getNCells(); |
| 1371 | + } |
1349 | 1372 | for (int ncell = 0; ncell < cluster.getNCells(); ncell++) { |
1350 | 1373 | cellindex = cluster.getCellIndex(ncell); |
1351 | 1374 | LOG(debug) << "trying to find cell index " << cellindex << " in map"; |
1352 | 1375 | if (cellIndicesBC[cellindex] >= 0) { |
1353 | 1376 | clustercells(clusters.lastIndex(), cellIndicesBC[cellindex]); |
| 1377 | + auto cellGlobalIndex = cellIndicesBC[cellindex]; |
| 1378 | + |
| 1379 | + if (hasLargeDispersion) { |
| 1380 | + auto theCell = cells.rawIteratorAt(cellGlobalIndex); |
| 1381 | + auto towerId = theCell.cellNumber(); |
| 1382 | + |
| 1383 | + auto [nSupMod, nModule, nIphi, nIeta] = geometry->GetCellIndex(towerId); |
| 1384 | + auto [iphiLocal, ietaLocal] = geometry->GetCellPhiEtaIndexInSModule(nSupMod, nModule, nIphi, nIeta); |
| 1385 | + auto [rowGlobal, colGlobal] = geometry->GlobalRowColFromIndex(towerId); |
| 1386 | + |
| 1387 | + LOG(info) << " Cell globalIndex = " << cellGlobalIndex |
| 1388 | + << " towerId = " << towerId |
| 1389 | + << " SM = " << nSupMod |
| 1390 | + << " local(eta, phi) = (" << ietaLocal << ", " << iphiLocal << ")" |
| 1391 | + << " global(eta, phi) = (" << colGlobal << ", " << rowGlobal << ")" |
| 1392 | + << " E = " << theCell.amplitude(); |
| 1393 | + } |
1354 | 1394 | ++nCells; |
1355 | 1395 | } |
1356 | 1396 | } // end of cells of cluser loop |
@@ -1426,6 +1466,7 @@ struct EmcalCorrectionTask { |
1426 | 1466 | cluster.getM20(), cluster.getNCells(), cluster.getClusterTime(), |
1427 | 1467 | cluster.getIsExotic(), cluster.getDistanceToBadChannel(), |
1428 | 1468 | cluster.getNExMax(), static_cast<int>(mClusterDefinitions.at(iClusterizer))); |
| 1469 | + ambigousDispersions(cluster.getDispersion()); |
1429 | 1470 | ++nClusterAmb; |
1430 | 1471 | if (!mClusterLabels.empty()) { |
1431 | 1472 | mcclustersAmbiguous(mClusterLabels[iCluster].getLabels(), mClusterLabels[iCluster].getEnergyFractions()); |
|
0 commit comments