4545#include < Framework/AnalysisDataModel.h>
4646#include < Framework/AnalysisHelpers.h>
4747#include < Framework/AnalysisTask.h>
48+ #include < Framework/Concepts.h>
4849#include < Framework/Configurable.h>
4950#include < Framework/Expressions.h>
5051#include < Framework/HistogramRegistry.h>
@@ -96,8 +97,10 @@ enum CellScaleMode {
9697struct EmcalCorrectionTask {
9798 Produces<o2::aod::EMCALClusters> clusters;
9899 Produces<o2::aod::EMCALMCClusters> mcclusters;
100+ Produces<o2::aod::Dispersions> dispersions;
99101 Produces<o2::aod::EMCALAmbiguousClusters> clustersAmbiguous;
100102 Produces<o2::aod::EMCALAmbiguousMCClusters> mcclustersAmbiguous;
103+ Produces<o2::aod::AmbigousDispersions> ambigousDispersions;
101104 Produces<o2::aod::EMCALClusterCells> clustercells; // cells belonging to given cluster
102105 Produces<o2::aod::EMCALAmbiguousClusterCells> clustercellsambiguous;
103106 Produces<o2::aod::EMCALMatchedTracks> matchedTracks;
@@ -404,7 +407,7 @@ struct EmcalCorrectionTask {
404407 }
405408 }
406409
407- template <typename BCType>
410+ template <o2::soa::is_iterator BCType>
408411 void initZorroCCDB (const BCType& bc)
409412 {
410413 if (applySoftwareTriggerSelection) {
@@ -422,7 +425,9 @@ struct EmcalCorrectionTask {
422425 {
423426 LOG (debug) << " Starting process full." ;
424427 clusters.reserve (MaxClusterPerDFPerClusterizer * mClusterizers .size ());
428+ dispersions.reserve (MaxClusterPerDFPerClusterizer * mClusterizers .size ());
425429 clustersAmbiguous.reserve (MaxAmbClusterPerDFPerClusterizer * mClusterizers .size ());
430+ ambigousDispersions.reserve (MaxAmbClusterPerDFPerClusterizer * mClusterizers .size ());
426431 clustercells.reserve (MaxCellsPerClusterPerDFPerClusterizer * mClusterizers .size ());
427432 clustercellsambiguous.reserve (MaxCellsPerAmbClusterPerDFPerClusterizer * mClusterizers .size ());
428433
@@ -529,7 +534,7 @@ struct EmcalCorrectionTask {
529534
530535 // Store the clusters in the table where a matching collision could
531536 // be identified.
532- fillClusterTable<CollEventSels::filtered_iterator>(col, vertexPos, iClusterizer, cellIndicesBC, &indexMapPair, &trackGlobalIndex);
537+ fillClusterTable<CollEventSels::filtered_iterator>(col, vertexPos, iClusterizer, cellIndicesBC, &indexMapPair, &trackGlobalIndex, nullptr , nullptr );
533538 } else {
534539 mHistManager .fill (HIST (" hBCMatchErrors" ), 2 );
535540 }
@@ -582,7 +587,9 @@ struct EmcalCorrectionTask {
582587 LOG (debug) << " Starting process full." ;
583588
584589 clusters.reserve (MaxClusterPerDFPerClusterizer * mClusterizers .size ());
590+ dispersions.reserve (MaxClusterPerDFPerClusterizer * mClusterizers .size ());
585591 clustersAmbiguous.reserve (MaxAmbClusterPerDFPerClusterizer * mClusterizers .size ());
592+ ambigousDispersions.reserve (MaxAmbClusterPerDFPerClusterizer * mClusterizers .size ());
586593 clustercells.reserve (MaxCellsPerClusterPerDFPerClusterizer * mClusterizers .size ());
587594 clustercellsambiguous.reserve (MaxCellsPerAmbClusterPerDFPerClusterizer * mClusterizers .size ());
588595
@@ -748,8 +755,10 @@ struct EmcalCorrectionTask {
748755
749756 clusters.reserve (MaxClusterPerDFPerClusterizer * mClusterizers .size ());
750757 mcclusters.reserve (MaxClusterPerDFPerClusterizer * mClusterizers .size ());
758+ dispersions.reserve (MaxClusterPerDFPerClusterizer * mClusterizers .size ());
751759 clustersAmbiguous.reserve (MaxAmbClusterPerDFPerClusterizer * mClusterizers .size ());
752760 mcclustersAmbiguous.reserve (MaxAmbClusterPerDFPerClusterizer * mClusterizers .size ());
761+ ambigousDispersions.reserve (MaxAmbClusterPerDFPerClusterizer * mClusterizers .size ());
753762 clustercells.reserve (MaxCellsPerClusterPerDFPerClusterizer * mClusterizers .size ());
754763 clustercellsambiguous.reserve (MaxCellsPerAmbClusterPerDFPerClusterizer * mClusterizers .size ());
755764
@@ -943,8 +952,10 @@ struct EmcalCorrectionTask {
943952
944953 clusters.reserve (MaxClusterPerDFPerClusterizer * mClusterizers .size ());
945954 mcclusters.reserve (MaxClusterPerDFPerClusterizer * mClusterizers .size ());
955+ dispersions.reserve (MaxClusterPerDFPerClusterizer * mClusterizers .size ());
946956 clustersAmbiguous.reserve (MaxAmbClusterPerDFPerClusterizer * mClusterizers .size ());
947957 mcclustersAmbiguous.reserve (MaxAmbClusterPerDFPerClusterizer * mClusterizers .size ());
958+ ambigousDispersions.reserve (MaxAmbClusterPerDFPerClusterizer * mClusterizers .size ());
948959 clustercells.reserve (MaxCellsPerClusterPerDFPerClusterizer * mClusterizers .size ());
949960 clustercellsambiguous.reserve (MaxCellsPerAmbClusterPerDFPerClusterizer * mClusterizers .size ());
950961
@@ -1139,7 +1150,9 @@ struct EmcalCorrectionTask {
11391150 LOG (debug) << " Starting process standalone." ;
11401151
11411152 clusters.reserve (MaxClusterPerDFPerClusterizer * mClusterizers .size ());
1153+ dispersions.reserve (MaxClusterPerDFPerClusterizer * mClusterizers .size ());
11421154 clustersAmbiguous.reserve (MaxAmbClusterPerDFPerClusterizer * mClusterizers .size ());
1155+ ambigousDispersions.reserve (MaxAmbClusterPerDFPerClusterizer * mClusterizers .size ());
11431156 clustercells.reserve (MaxCellsPerClusterPerDFPerClusterizer * mClusterizers .size ());
11441157 clustercellsambiguous.reserve (MaxCellsPerAmbClusterPerDFPerClusterizer * mClusterizers .size ());
11451158
@@ -1303,12 +1316,11 @@ struct EmcalCorrectionTask {
13031316 LOG (debug) << " Converted to analysis clusters." ;
13041317 }
13051318
1306- template <typename Collision>
1319+ template <o2::soa::is_iterator Collision>
13071320 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 )
13081321 {
13091322 // get the clusterType once
13101323 const auto clusterType = static_cast <int >(mClusterDefinitions [iClusterizer]);
1311-
13121324 int cellindex = -1 ;
13131325 unsigned int iCluster = 0 ;
13141326 float energy = 0 .f ;
@@ -1341,11 +1353,11 @@ struct EmcalCorrectionTask {
13411353 cluster.getClusterTime (), cluster.getIsExotic (),
13421354 cluster.getDistanceToBadChannel (), cluster.getNExMax (),
13431355 clusterType);
1356+ dispersions (cluster.getDispersion ());
13441357 ++nCluster;
13451358 if (!mClusterLabels .empty ()) {
13461359 mcclusters (mClusterLabels [iCluster].getLabels (), mClusterLabels [iCluster].getEnergyFractions ());
13471360 }
1348- // loop over cells in cluster and save to table
13491361 for (int ncell = 0 ; ncell < cluster.getNCells (); ncell++) {
13501362 cellindex = cluster.getCellIndex (ncell);
13511363 LOG (debug) << " trying to find cell index " << cellindex << " in map" ;
@@ -1391,7 +1403,7 @@ struct EmcalCorrectionTask {
13911403 } // end of cluster loop
13921404 }
13931405
1394- template <typename BC >
1406+ template <o2::soa::is_iterator BC >
13951407 void fillAmbigousClusterTable (BC const & bc, size_t iClusterizer, const gsl::span<int64_t > cellIndicesBC, bool hasCollision)
13961408 {
13971409 int cellindex = -1 ;
@@ -1426,6 +1438,7 @@ struct EmcalCorrectionTask {
14261438 cluster.getM20 (), cluster.getNCells (), cluster.getClusterTime (),
14271439 cluster.getIsExotic (), cluster.getDistanceToBadChannel (),
14281440 cluster.getNExMax (), static_cast <int >(mClusterDefinitions .at (iClusterizer)));
1441+ ambigousDispersions (cluster.getDispersion ());
14291442 ++nClusterAmb;
14301443 if (!mClusterLabels .empty ()) {
14311444 mcclustersAmbiguous (mClusterLabels [iCluster].getLabels (), mClusterLabels [iCluster].getEnergyFractions ());
@@ -1439,7 +1452,7 @@ struct EmcalCorrectionTask {
14391452 } // end of cluster loop
14401453 }
14411454
1442- template <typename Collision>
1455+ template <o2::soa::is_iterator Collision>
14431456 void doTrackMatching (Collision const & col, MyGlobTracks const & tracks, MatchResult& indexMapPair, std::vector<int64_t >& trackGlobalIndex)
14441457 {
14451458 auto groupedTracks = tracks.sliceBy (perCollision, col.globalIndex ());
@@ -1455,7 +1468,7 @@ struct EmcalCorrectionTask {
14551468 indexMapPair = matchTracksToCluster (mClusterPhi , mClusterEta , trackPhi, trackEta, maxMatchingDistance, MaxMatchesPerCluster);
14561469 }
14571470
1458- template <typename Collision>
1471+ template <o2::soa::is_iterator Collision>
14591472 void doSecondaryTrackMatching (Collision const & col, EMV0Legs const & v0legs, MatchResult& indexMapPair, std::vector<int64_t >& trackGlobalIndex, MyGlobTracks const & tracks)
14601473 {
14611474 auto groupedV0Legs = v0legs.sliceBy (perCollisionEMV0Legs, col.globalIndex ());
@@ -1491,7 +1504,7 @@ struct EmcalCorrectionTask {
14911504 indexMapPair = matchTracksToCluster (mClusterPhi , mClusterEta , trackPhi, trackEta, maxMatchingDistance, MaxMatchesPerCluster);
14921505 }
14931506
1494- template <typename Tracks>
1507+ template <o2::soa::is_table Tracks>
14951508 void fillTrackInfo (Tracks const & tracks, std::vector<float >& trackPhi, std::vector<float >& trackEta, std::vector<int64_t >& trackGlobalIndex)
14961509 {
14971510 for (const auto & track : tracks) {
0 commit comments