diff --git a/RecoHGCal/TICL/plugins/TICLGraph.h b/RecoHGCal/TICL/plugins/TICLGraph.h index c204225556246..9684d7990d24f 100644 --- a/RecoHGCal/TICL/plugins/TICLGraph.h +++ b/RecoHGCal/TICL/plugins/TICLGraph.h @@ -18,10 +18,9 @@ class Node { const std::vector& getInnerNeighbours() const { return innerNeighboursId_; } void findSubComponents(std::vector& graph, std::vector& subComponent, std::string tabs); - - inline bool isInnerNeighbour(const unsigned int tid){ - auto findInner = std::find(innerNeighboursId_.begin(), innerNeighboursId_.end(), tid); - return findInner != innerNeighboursId_.end(); + inline bool isInnerNeighbour(const unsigned int tid) { + auto findInner = std::find(innerNeighboursId_.begin(), innerNeighboursId_.end(), tid); + return findInner != innerNeighboursId_.end(); } ~Node() = default; diff --git a/RecoHGCal/TICL/plugins/TracksterLinkingbySkeletons.cc b/RecoHGCal/TICL/plugins/TracksterLinkingbySkeletons.cc index d933c6c58ba9c..9930677a9e56e 100644 --- a/RecoHGCal/TICL/plugins/TracksterLinkingbySkeletons.cc +++ b/RecoHGCal/TICL/plugins/TracksterLinkingbySkeletons.cc @@ -13,10 +13,15 @@ namespace { bool isRoundTrackster(std::array skeleton) { return (skeleton[0].Z() == skeleton[2].Z()); } - bool isGoodTrackster(const ticl::Trackster &trackster, const std::array &skeleton, const unsigned int min_num_lcs, const float min_trackster_energy, const float pca_quality_th ) { + bool isGoodTrackster(const ticl::Trackster& trackster, + const std::array &skeleton, + const unsigned int min_num_lcs, + const float min_trackster_energy, + const float pca_quality_th) { bool isGood = false; - if (isRoundTrackster(skeleton) or trackster.vertices().size() < min_num_lcs or trackster.raw_energy() < min_trackster_energy) { + if (isRoundTrackster(skeleton) or trackster.vertices().size() < min_num_lcs or + trackster.raw_energy() < min_trackster_energy) { isGood = false; } else { auto const &eigenvalues = trackster.eigenvalues(); @@ -37,7 +42,8 @@ namespace { std::sqrt(point2.x() * point2.x() + point2.y() * point2.y()) * std::abs(point1.z()) / std::abs(point2.z()); float delta_phi = reco::deltaPhi(point1.Phi(), point2.Phi()); float projective_distance = (r1 - r2_at_z1) * (r1 - r2_at_z1) + r2_at_z1 * r2_at_z1 * delta_phi * delta_phi; - LogDebug("TracksterLinkingbySkeletons") << "Computing distance between point : " << point1 << " And point " << point2 << " Distance " << projective_distance << std::endl; + LogDebug("TracksterLinkingbySkeletons") << "Computing distance between point : " << point1 << " And point " + << point2 << " Distance " << projective_distance << std::endl; return projective_distance; } } // namespace @@ -54,9 +60,7 @@ TracksterLinkingbySkeletons::TracksterLinkingbySkeletons(const edm::ParameterSet dot_prod_th_(conf.getParameter("dot_prod_th")), min_distance_z_(conf.getParameter("min_distance_z")), max_distance_closest_points_(conf.getParameter("max_distance_closest_points")), - max_z_distance_closest_ponts_(conf.getParameter("max_z_distance_closest_ponts")) - {} - + max_z_distance_closest_ponts_(conf.getParameter("max_z_distance_closest_ponts")) {} void TracksterLinkingbySkeletons::buildLayers() { // build disks at HGCal front & EM-Had interface for track propagation @@ -164,27 +168,35 @@ bool TracksterLinkingbySkeletons::areCompatible(const ticl::Trackster &myTrackst const std::array &mySkeleton, const std::array &otherSkeleton) { if (!isGoodTrackster(myTrackster, mySkeleton, min_num_lcs_, min_trackster_energy_, pca_quality_th_)) { - LogDebug("TracksterLinkingbySkeletons") << "Inner Trackster wi energy " << myTrackster.raw_energy() << " Num LCs " << myTrackster.vertices().size() << " NOT GOOD " << std::endl; + LogDebug("TracksterLinkingbySkeletons") << "Inner Trackster wi energy " << myTrackster.raw_energy() << " Num LCs " + << myTrackster.vertices().size() << " NOT GOOD " << std::endl; return false; } else { - LogDebug("TracksterLinkingbySkeletons") << "Inner Trackster wi energy " << myTrackster.raw_energy() << " Num LCs " << myTrackster.vertices().size() << " IS GOOD " << std::endl; + LogDebug("TracksterLinkingbySkeletons") << "Inner Trackster wi energy " << myTrackster.raw_energy() << " Num LCs " + << myTrackster.vertices().size() << " IS GOOD " << std::endl; float proj_distance = projective_distance(mySkeleton[1], otherSkeleton[1]); bool areAlignedInProjectiveSpace = proj_distance < alignement_projective_th_; - LogDebug("TracksterLinkingbySkeletons") << "\t Trying to compare with outer Trackster with energy " << otherTrackster.raw_energy() << " Num LCS " << otherTrackster.vertices().size() << " Projective distance " << proj_distance << " areAlignedProjective " << areAlignedInProjectiveSpace << " TH " << alignement_projective_th_ << std::endl; + LogDebug("TracksterLinkingbySkeletons") + << "\t Trying to compare with outer Trackster with energy " << otherTrackster.raw_energy() << " Num LCS " + << otherTrackster.vertices().size() << " Projective distance " << proj_distance << " areAlignedProjective " + << areAlignedInProjectiveSpace << " TH " << alignement_projective_th_ << std::endl; if (isGoodTrackster(otherTrackster, otherSkeleton, min_num_lcs_, min_trackster_energy_, pca_quality_th_)) { // if both tracksters are good, then we can check the projective distance between the barycenters. // if the barycenters are aligned, then we check that the two skeletons are aligned if (areAlignedInProjectiveSpace) { - auto dotProdSkeletons = ((mySkeleton[2] - mySkeleton[0]).Unit()).Dot((otherSkeleton[2] - otherSkeleton[0]).Unit()); - bool alignedSkeletons = - dotProdSkeletons > dot_prod_th_; - LogDebug("TracksterLinkingbySkeletons") << "\t Outer Trackster is Good, checking for skeleton alignment " << alignedSkeletons << " dotProd " << dotProdSkeletons << " TH " << dot_prod_th_ << std::endl; - if(alignedSkeletons) - LogDebug("TracksterLinkingbySkeletons") << "\t\t Linked! " << std::endl; + auto dotProdSkeletons = + ((mySkeleton[2] - mySkeleton[0]).Unit()).Dot((otherSkeleton[2] - otherSkeleton[0]).Unit()); + bool alignedSkeletons = dotProdSkeletons > dot_prod_th_; + LogDebug("TracksterLinkingbySkeletons") + << "\t Outer Trackster is Good, checking for skeleton alignment " << alignedSkeletons << " dotProd " + << dotProdSkeletons << " TH " << dot_prod_th_ << std::endl; + if (alignedSkeletons) + LogDebug("TracksterLinkingbySkeletons") << "\t\t Linked! " << std::endl; return alignedSkeletons; } else { // we measure the distance between the two closest nodes in the two skeletons - LogDebug("TracksterLinkingbySkeletons") << "\t Outer Trackster is not aligned, check skeletons distances " << std::endl; + LogDebug("TracksterLinkingbySkeletons") + << "\t Outer Trackster is not aligned, check skeletons distances " << std::endl; int myClosestPoint = -1; int otherClosestPoint = -1; float minDistance_z = std::numeric_limits::max(); @@ -198,25 +210,36 @@ bool TracksterLinkingbySkeletons::areCompatible(const ticl::Trackster &myTrackst } } } - LogDebug("TracksterLinkingbySkeletons") << "\t\t Check distance in Z " << minDistance_z << " TH " << min_distance_z_ << std::endl; + LogDebug("TracksterLinkingbySkeletons") + << "\t\t Check distance in Z " << minDistance_z << " TH " << min_distance_z_ << std::endl; if (minDistance_z < min_distance_z_) { - LogDebug("TracksterLinkingbySkeletons") << "\t Trackster have distance in Z " << minDistance_z << "Checking if they are aligned in projective space " << projective_distance(mySkeleton[myClosestPoint], otherSkeleton[otherClosestPoint]) << " TH " << alignement_projective_th_ << std::endl; - if(projective_distance(mySkeleton[myClosestPoint], otherSkeleton[otherClosestPoint]) < alignement_projective_th_){ + LogDebug("TracksterLinkingbySkeletons") + << "\t Trackster have distance in Z " << minDistance_z + << "Checking if they are aligned in projective space " + << projective_distance(mySkeleton[myClosestPoint], otherSkeleton[otherClosestPoint]) << " TH " + << alignement_projective_th_ << std::endl; + if (projective_distance(mySkeleton[myClosestPoint], otherSkeleton[otherClosestPoint]) < + alignement_projective_th_) { LogDebug("TracksterLinkingbySkeletons") << "\t\t Linked! " << std::endl; } - return projective_distance(mySkeleton[myClosestPoint], otherSkeleton[otherClosestPoint]) < alignement_projective_th_; + return projective_distance(mySkeleton[myClosestPoint], otherSkeleton[otherClosestPoint]) < + alignement_projective_th_; } else { LogDebug("TracksterLinkingbySkeletons") << "\t\t Not Linked Distance Z " << minDistance_z << std::endl; return false; } } } else { - LogDebug("TracksterLinkingbySkeletons") << "\t Outer Trackster is NOT GOOD, check projective space alignment " << areAlignedInProjectiveSpace << " proj_distance " << alignement_projective_th_ << std::endl; + LogDebug("TracksterLinkingbySkeletons") + << "\t Outer Trackster is NOT GOOD, check projective space alignment " << areAlignedInProjectiveSpace + << " proj_distance " << alignement_projective_th_ << std::endl; if (areAlignedInProjectiveSpace) { LogDebug("TracksterLinkingbySkeletons") << "\t\t Linked! " << std::endl; return true; } else { - LogDebug("TracksterLinkingbySkeletons") << "\t Not aligned in projective space, check distance between closest points in the two skeletons " << std::endl; + LogDebug("TracksterLinkingbySkeletons") + << "\t Not aligned in projective space, check distance between closest points in the two skeletons " + << std::endl; // we measure the distance between the two closest nodes in the two skeletons int myClosestPoint = -1; int otherClosestPoint = -1; @@ -233,15 +256,16 @@ bool TracksterLinkingbySkeletons::areCompatible(const ticl::Trackster &myTrackst } } float d = projective_distance(mySkeleton[myClosestPoint], otherSkeleton[otherClosestPoint]); - LogDebug("TracksterLinkingbySkeletons") << "\t\t Distance between closest points " << d << " TH " << 10.f << " Z Distance " << minDistance_z << " TH " << max_distance_closest_points_ << std::endl; - if(d < max_distance_closest_points_ and minDistance_z < max_z_distance_closest_ponts_){ + LogDebug("TracksterLinkingbySkeletons") + << "\t\t Distance between closest points " << d << " TH " << 10.f << " Z Distance " << minDistance_z + << " TH " << max_distance_closest_points_ << std::endl; + if (d < max_distance_closest_points_ and minDistance_z < max_z_distance_closest_ponts_) { LogDebug("TracksterLinkingbySkeletons") << "\t\t\t Linked! " << d << std::endl; - } - else{ - LogDebug("TracksterLinkingbySkeletons") << "Distance between closest point " << d << " Distance in z " << max_z_distance_closest_ponts_ << std::endl; + } else { + LogDebug("TracksterLinkingbySkeletons") << "Distance between closest point " << d << " Distance in z " + << max_z_distance_closest_ponts_ << std::endl; } - return d < max_distance_closest_points_ and minDistance_z < max_z_distance_closest_ponts_; } } @@ -293,8 +317,7 @@ void TracksterLinkingbySkeletons::linkTracksters( float eta_max = std::min(abs(bary.eta()) + del_, TileConstants::maxEta); int tileIndex = bary.eta() > 0.f; const auto &tiles = tracksterTile[tileIndex]; - std::array search_box = tiles.searchBoxEtaPhi( - eta_min, eta_max, bary.phi() - del_, bary.phi() + del_); + std::array search_box = tiles.searchBoxEtaPhi(eta_min, eta_max, bary.phi() - del_, bary.phi() + del_); if (search_box[2] > search_box[3]) { search_box[3] += TileConstants::nPhiBins; } @@ -307,10 +330,13 @@ void TracksterLinkingbySkeletons::linkTracksters( continue; if (maskReceivedLink[n] == 0 or allNodes[t_idx].isInnerNeighbour(n)) continue; - if (isGoodTrackster(tracksters[t_idx], skeletons[t_idx], min_num_lcs_, min_trackster_energy_, pca_quality_th_)){ - LogDebug("TracksterLinkingbySkeletons") << "Trying to Link Trackster " << t_idx << " With Trackster " << n << std::endl; + if (isGoodTrackster( + tracksters[t_idx], skeletons[t_idx], min_num_lcs_, min_trackster_energy_, pca_quality_th_)) { + LogDebug("TracksterLinkingbySkeletons") + << "Trying to Link Trackster " << t_idx << " With Trackster " << n << std::endl; if (areCompatible(tracksters[t_idx], tracksters[n], skeletons[t_idx], skeletons[n])) { - LogDebug("TracksterLinkingbySkeletons") << "\t==== LINK: Trackster " << t_idx << " Linked with Trackster " << n << std::endl; + LogDebug("TracksterLinkingbySkeletons") + << "\t==== LINK: Trackster " << t_idx << " Linked with Trackster " << n << std::endl; maskReceivedLink[n] = 0; allNodes[t_idx].addOuterNeighbour(n); allNodes[n].addInnerNeighbour(t_idx); @@ -322,21 +348,20 @@ void TracksterLinkingbySkeletons::linkTracksters( } } - - LogDebug("TracksterLinkingbySkeletons") << "**************** FINAL GRAPH **********************" << std::endl; + LogDebug("TracksterLinkingbySkeletons") << "**************** FINAL GRAPH **********************" << std::endl; for (auto const &node : allNodes) { if (isRootTracksters[node.getId()]) { - LogDebug("TracksterLinkingbySkeletons") + LogDebug("TracksterLinkingbySkeletons") << "ISROOT " << " Node " << node.getId() << " position " << tracksters[node.getId()].barycenter() << " energy " << tracksters[node.getId()].raw_energy() << std::endl; } else { - LogDebug("TracksterLinkingbySkeletons") + LogDebug("TracksterLinkingbySkeletons") << "Node " << node.getId() << " position " << tracksters[node.getId()].barycenter() << " energy " << tracksters[node.getId()].raw_energy() << std::endl; } } - LogDebug("TracksterLinkingbySkeletons") << "********************************************************" << std::endl; + LogDebug("TracksterLinkingbySkeletons") << "********************************************************" << std::endl; TICLGraph graph(allNodes, isRootTracksters); diff --git a/RecoHGCal/TICL/python/customiseForTICLv5_cff.py b/RecoHGCal/TICL/python/customiseForTICLv5_cff.py index 2bd59cfeb794e..acab3ad26db8f 100644 --- a/RecoHGCal/TICL/python/customiseForTICLv5_cff.py +++ b/RecoHGCal/TICL/python/customiseForTICLv5_cff.py @@ -16,8 +16,8 @@ from RecoHGCal.TICL.ticlDumper_cfi import ticlDumper from RecoHGCal.TICL.mergedTrackstersProducer_cfi import mergedTrackstersProducer as _mergedTrackstersProducer from SimCalorimetry.HGCalAssociatorProducers.TSToSimTSAssociation_cfi import tracksterSimTracksterAssociationLinkingbyCLUE3D as _tracksterSimTracksterAssociationLinkingbyCLUE3D -from SimCalorimetry.HGCalAssociatorProducers.TSToSimTSAssociation_cfi import tracksterSimTracksterAssociationPRbyCLUE3D as _tracksterSimTracksterAssociationPRbyCLUE3D -from Validation.HGCalValidation.HGCalValidator_cff import hgcalValidatorv5 +from SimCalorimetry.HGCalAssociatorProducers.TSToSimTSAssociation_cfi import tracksterSimTracksterAssociationPRbyCLUE3D as _tracksterSimTracksterAssociationPRbyCLUE3D +from Validation.HGCalValidation.HGCalValidator_cff import hgcalValidator from RecoLocalCalo.HGCalRecProducers.HGCalUncalibRecHit_cfi import HGCalUncalibRecHit from RecoHGCal.TICL.SimTracksters_cff import ticlSimTracksters @@ -88,7 +88,7 @@ def customiseForTICLv5(process, enableDumper = False): label_tst = cms.InputTag("ticlTrackstersCLUE3DHAD") ) - process.mergedTrackstersProducer = _mergedTrackstersProducer.clone() + process.mergedTrackstersProducer = _mergedTrackstersProducer.clone() process.tracksterSimTracksterAssociationLinkingbyCLUE3D = _tracksterSimTracksterAssociationLinkingbyCLUE3D.clone( label_tst = cms.InputTag("mergedTrackstersProducer") @@ -107,8 +107,8 @@ def customiseForTICLv5(process, enableDumper = False): process.tracksterSimTracksterAssociationLinking.label_tst = cms.InputTag("ticlCandidate") process.tracksterSimTracksterAssociationPR.label_tst = cms.InputTag("ticlCandidate") - process.tracksterSimTracksterAssociationLinkingPU.label_tst = cms.InputTag("ticlTracksterLinks") - process.tracksterSimTracksterAssociationPRPU.label_tst = cms.InputTag("ticlTracksterLinks") + process.tracksterSimTracksterAssociationLinkingPU.label_tst = cms.InputTag("ticlCandidate") + process.tracksterSimTracksterAssociationPRPU.label_tst = cms.InputTag("ticlCandidate") process.mergeTICLTask = cms.Task() process.pfTICL = _pfTICLProducerV5.clone() process.hgcalAssociators = cms.Task(process.mergedTrackstersProducer, process.lcAssocByEnergyScoreProducer, process.layerClusterCaloParticleAssociationProducer, @@ -122,11 +122,18 @@ def customiseForTICLv5(process, enableDumper = False): process.tracksterSimTracksterAssociationLinkingPU, process.tracksterSimTracksterAssociationPRPU ) - process.hgcalValidatorv5 = hgcalValidatorv5.clone( + + labelTst = ["ticlTrackstersCLUE3DEM", "ticlTrackstersCLUE3DHAD", "ticlTracksterLinks"] + labelTst.extend([cms.InputTag("ticlSimTracksters", "fromCPs"), cms.InputTag("ticlSimTracksters")]) + lcInputMask = ["ticlTrackstersCLUE3DEM", "ticlTrackstersCLUE3DHAD", "ticlTracksterLinks"] + lcInputMask.extend([cms.InputTag("ticlSimTracksters", "fromCPs"), cms.InputTag("ticlSimTracksters")]) + process.hgcalValidator = hgcalValidator.clone( + label_tst = cms.VInputTag(labelTst), + LayerClustersInputMask = cms.VInputTag(lcInputMask), ticlTrackstersMerge = cms.InputTag("ticlCandidate"), - trackstersclue3d = cms.InputTag("mergedTrackstersProducer") ) - process.hgcalValidatorSequence = cms.Sequence(process.hgcalValidatorv5) + + process.hgcalValidatorSequence = cms.Sequence(process.hgcalValidator) process.hgcalValidation = cms.Sequence(process.hgcalSimHitValidationEE+process.hgcalSimHitValidationHEF+process.hgcalSimHitValidationHEB+process.hgcalDigiValidationEE+process.hgcalDigiValidationHEF+process.hgcalDigiValidationHEB+process.hgcalRecHitValidationEE+process.hgcalRecHitValidationHEF+process.hgcalRecHitValidationHEB+process.hgcalHitValidationSequence+process.hgcalValidatorSequence+process.hgcalTiclPFValidation+process.hgcalPFJetValidation) process.globalValidationHGCal = cms.Sequence(process.hgcalValidation) process.validation_step9 = cms.EndPath(process.globalValidationHGCal) diff --git a/Validation/HGCalValidation/interface/HGCalValidator.h b/Validation/HGCalValidation/interface/HGCalValidator.h index 8101ca43e8152..039ca5cd94d05 100644 --- a/Validation/HGCalValidation/interface/HGCalValidator.h +++ b/Validation/HGCalValidation/interface/HGCalValidator.h @@ -79,6 +79,7 @@ class HGCalValidator : public DQMGlobalEDAnalyzer { const bool doCandidatesPlots_; std::string label_candidates_; const edm::FileInPath cummatbudinxo_; + const bool isTICLv5_; std::vector> labelToken; edm::EDGetTokenT> simClusters_; diff --git a/Validation/HGCalValidation/interface/TICLCandidateValidator.h b/Validation/HGCalValidation/interface/TICLCandidateValidator.h index 33713dd2e188a..664a88f9586a8 100644 --- a/Validation/HGCalValidation/interface/TICLCandidateValidator.h +++ b/Validation/HGCalValidation/interface/TICLCandidateValidator.h @@ -31,7 +31,9 @@ class TICLCandidateValidator { edm::EDGetTokenT> recoTracksToken, edm::EDGetTokenT> trackstersToken, edm::EDGetTokenT associatorMapRtSToken, - edm::EDGetTokenT associatorMapStRToken); + edm::EDGetTokenT associatorMapStRToken, + edm::EDGetTokenT associatorMapRtSPUToken, + bool isTICLv5); ~TICLCandidateValidator(); void bookCandidatesHistos(DQMStore::IBooker& ibook, std::string baseDir); @@ -107,12 +109,26 @@ class TICLCandidateValidator { std::vector h_num_fake_neut_phi_candidate_pdgId; std::vector h_num_fake_neut_phi_candidate_energy; + std::vector h_chg_tracksters_in_candidate; + std::vector h_chg_candidate_regressed_energy; + std::vector h_chg_candidate_charge; + std::vector h_chg_candidate_pdgId; + std::vector h_chg_candidate_partType; + + std::vector h_neut_tracksters_in_candidate; + std::vector h_neut_candidate_regressed_energy; + std::vector h_neut_candidate_charge; + std::vector h_neut_candidate_pdgId; + std::vector h_neut_candidate_partType; + edm::EDGetTokenT> TICLCandidatesToken_; edm::EDGetTokenT> simTICLCandidatesToken_; edm::EDGetTokenT> recoTracksToken_; edm::EDGetTokenT> trackstersToken_; edm::EDGetTokenT associatorMapRtSToken_; edm::EDGetTokenT associatorMapStRToken_; + edm::EDGetTokenT associatorMapRtSPUToken_; + bool isTICLv5_ = false; }; #endif diff --git a/Validation/HGCalValidation/plugins/HGCalValidator.cc b/Validation/HGCalValidation/plugins/HGCalValidator.cc index 052f6cd415cbb..56e25460d9504 100644 --- a/Validation/HGCalValidation/plugins/HGCalValidator.cc +++ b/Validation/HGCalValidation/plugins/HGCalValidator.cc @@ -32,7 +32,8 @@ HGCalValidator::HGCalValidator(const edm::ParameterSet& pset) label_clustersmask(pset.getParameter>("LayerClustersInputMask")), doCandidatesPlots_(pset.getUntrackedParameter("doCandidatesPlots")), label_candidates_(pset.getParameter("ticlCandidates")), - cummatbudinxo_(pset.getParameter("cummatbudinxo")) { + cummatbudinxo_(pset.getParameter("cummatbudinxo")), + isTICLv5_(pset.getUntrackedParameter("isticlv5")) { //In this way we can easily generalize to associations between other objects also. const edm::InputTag& label_cp_effic_tag = pset.getParameter("label_cp_effic"); const edm::InputTag& label_cp_fake_tag = pset.getParameter("label_cp_fake"); @@ -66,18 +67,22 @@ HGCalValidator::HGCalValidator(const edm::ParameterSet& pset) consumes>(pset.getParameter("recoTracks")); edm::EDGetTokenT> trackstersToken = consumes>(pset.getParameter("ticlTrackstersMerge")); - //consumes>(pset.getParameter("trackstersclue3d")); edm::EDGetTokenT associatorMapRtSToken = consumes(pset.getParameter("mergeRecoToSimAssociator")); edm::EDGetTokenT associatorMapStRToken = consumes(pset.getParameter("mergeSimToRecoAssociator")); + edm::EDGetTokenT associatorMapRtSPUToken = + consumes( + pset.getParameter("mergeRecoToSimAssociatorPU")); candidateVal = TICLCandidateValidator(TICLCandidatesToken, simTICLCandidatesToken, recoTracksToken, trackstersToken, associatorMapRtSToken, - associatorMapStRToken); + associatorMapStRToken, + associatorMapRtSPUToken, + isTICLv5_); } for (auto& itag : label_tst) { diff --git a/Validation/HGCalValidation/python/HGCalValidator_cfi.py b/Validation/HGCalValidation/python/HGCalValidator_cfi.py index 12e4f2d7184a3..86607895af9f0 100644 --- a/Validation/HGCalValidation/python/HGCalValidator_cfi.py +++ b/Validation/HGCalValidation/python/HGCalValidator_cfi.py @@ -59,9 +59,9 @@ ticlTrackstersMerge = cms.InputTag("ticlTrackstersMerge"), simTiclCandidates = cms.InputTag("ticlSimTracksters"), recoTracks = cms.InputTag("generalTracks"), - trackstersclue3d = cms.InputTag("ticlTrackstersCLUE3DHigh"), mergeRecoToSimAssociator = cms.InputTag("tracksterSimTracksterAssociationLinking", "recoToSim"), mergeSimToRecoAssociator = cms.InputTag("tracksterSimTracksterAssociationLinking", "simToReco"), + mergeRecoToSimAssociatorPU = cms.InputTag("tracksterSimTracksterAssociationLinkingPU", "recoToSim"), #The cumulative material budget in front of each layer. To be more specific, it #is the material budget just in front of the active material (not including it). @@ -88,92 +88,9 @@ histoProducerAlgoBlock = HGVHistoProducerAlgoBlock, ### output configuration - dirName = cms.string('HGCAL/HGCalValidator/') - -) - -#labelTst = [cms.InputTag("ticlTracksters"+iteration) for iteration in ticlIterLabelsMerge] -labelTst = ["ticlTrackstersCLUE3DEM", "ticlTrackstersCLUE3DHAD", "ticlTracksterLinks"] -labelTst.extend([cms.InputTag("ticlSimTracksters", "fromCPs"), cms.InputTag("ticlSimTracksters")]) -lcInputMask = ["ticlTrackstersCLUE3DEM", "ticlTrackstersCLUE3DHAD", "ticlTracksterLinks"] -#lcInputMask = [cms.InputTag("ticlTracksters"+iteration) for iteration in ticlIterLabels] -lcInputMask.extend([cms.InputTag("ticlSimTracksters", "fromCPs"), cms.InputTag("ticlSimTracksters")]) - -hgcalValidatorv5 = DQMEDAnalyzer( - "HGCalValidator", - - ### general settings ### - # selection of CP for evaluation of efficiency # - CaloParticleSelectionForEfficiency, - - ### reco input configuration ### - #2DLayerClusters, PFClusters, Tracksters - label_lcl = layerClusterCaloParticleAssociation.label_lc, - label_tst = cms.VInputTag(labelTst), - label_simTS = cms.InputTag("ticlSimTracksters"), - label_simTSFromCP = cms.InputTag("ticlSimTracksters", "fromCPs"), - - associator = cms.untracked.InputTag("layerClusterCaloParticleAssociationProducer"), - - associatorSim = cms.untracked.InputTag("layerClusterSimClusterAssociationProducer"), - - #General info on layers etc. - SaveGeneralInfo = cms.untracked.bool(True), - #CaloParticle related plots - doCaloParticlePlots = cms.untracked.bool(True), - #Select caloParticles for efficiency or pass through - doCaloParticleSelection = cms.untracked.bool(True), - #SimCluster related plots - doSimClustersPlots = cms.untracked.bool(True), - label_SimClusters = cms.InputTag("SimClusters"), - label_SimClustersLevel = cms.InputTag("ClusterLevel"), - #Layer Cluster related plots - doLayerClustersPlots = cms.untracked.bool(True), - label_layerClusterPlots = cms.InputTag("hgcalMergeLayerClusters"), - label_LCToCPLinking = cms.InputTag("LCToCP_association"), - #Trackster related plots - doTrackstersPlots = cms.untracked.bool(True), - label_TS = cms.string("Morphology"), - label_TSToCPLinking = cms.string("TSToCP_linking"), - label_TSToSTSPR = cms.string("TSToSTS_patternRecognition"), - #candidates plots - doCandidatesPlots = cms.untracked.bool(True), - ticlCandidates = cms.string("ticlCandidate"), - - ticlTrackstersMerge = cms.InputTag("ticlTrackstersMerge"), - simTiclCandidates = cms.InputTag("ticlSimTracksters"), - recoTracks = cms.InputTag("generalTracks"), - trackstersclue3d = cms.InputTag("ticlCandidate"), - mergeRecoToSimAssociator = cms.InputTag("tracksterSimTracksterAssociationLinking", "recoToSim"), - mergeSimToRecoAssociator = cms.InputTag("tracksterSimTracksterAssociationLinking", "simToReco"), - - #The cumulative material budget in front of each layer. To be more specific, it - #is the material budget just in front of the active material (not including it). - #This file is created using the official material budget code. - cummatbudinxo = cms.FileInPath('Validation/HGCalValidation/data/D41.cumulative.xo'), - - ### sim input configuration ### - label_cp_effic = layerClusterCaloParticleAssociation.label_cp, - label_cp_fake = cms.InputTag("mix","MergedCaloTruth"), - #simClusters - label_scl = layerClusterSimClusterAssociation.label_scl, - - simVertices = cms.InputTag("g4SimHits"), - - LayerClustersInputMask = cms.VInputTag(lcInputMask), - - #Total number of layers of HGCal that we want to monitor - #Could get this also from HGCalImagingAlgo::maxlayer but better to get it from here - totallayers_to_monitor = cms.int32(52), - #Thicknesses we want to monitor. -1 is for scintillator - thicknesses_to_monitor = cms.vint32(120,200,300,-1), - - # HistoProducerAlgo. Defines the set of plots to be booked and filled - histoProducerAlgoBlock = HGVHistoProducerAlgoBlock, - - ### output configuration - dirName = cms.string('HGCAL/HGCalValidator/') + dirName = cms.string('HGCAL/HGCalValidator/'), + isticlv5 = cms.untracked.bool(False) ) from Configuration.ProcessModifiers.premix_stage2_cff import premix_stage2 diff --git a/Validation/HGCalValidation/python/hgcalPlots.py b/Validation/HGCalValidation/python/hgcalPlots.py index 50dc4bc37cb0e..732aa9e032268 100644 --- a/Validation/HGCalValidation/python/hgcalPlots.py +++ b/Validation/HGCalValidation/python/hgcalPlots.py @@ -20,7 +20,7 @@ from Validation.HGCalValidation.PostProcessorHGCAL_cfi import lcToCP_linking, simDict, tsToCP_linking, tsToSTS_patternRec, variables hgcVal_dqm = "DQMData/Run 1/HGCAL/Run summary/HGCalValidator/" -#The number of layers per endcap in the current default geometry scenario. +#The number of layers per endcap in the current default geometry scenario. geometryscenario = 47 #To be able to spot any issues both in -z and +z a layer id was introduced @@ -1177,18 +1177,18 @@ xmax=1., ymin=0.01, ymax=1.) -_energyscore_cp2lc_zminus = PlotGroup("Energy_vs_Score_CP2LC", [Plot("Energy_vs_Score_caloparticle2layer_perlayer{:02d}".format(i), title="Energy_vs_Score_CP2LC", +_energyscore_cp2lc_zminus = PlotGroup("Energy_vs_Score_CP2LC", [Plot("Energy_vs_Score_caloparticle2layer_perlayer{:02d}".format(i), title="Energy_vs_Score_CP2LC", xtitle="Layer {}".format(i), drawStyle="COLZ", adjustMarginRight=0.1, **_common_energy_score) for i in range(0, maxlayerzm) ], ncols=10) -_energyscore_cp2lc_zplus = PlotGroup("Energy_vs_Score_CP2LC", [Plot("Energy_vs_Score_caloparticle2layer_perlayer{:02d}".format(i), title="Energy_vs_Score_CP2LC", +_energyscore_cp2lc_zplus = PlotGroup("Energy_vs_Score_CP2LC", [Plot("Energy_vs_Score_caloparticle2layer_perlayer{:02d}".format(i), title="Energy_vs_Score_CP2LC", xtitle="Layer {}".format(i), drawStyle="COLZ", adjustMarginRight=0.1, **_common_energy_score) for i in range(maxlayerzm,maxlayerzp) ], ncols=10) _common_energy_score["xmin"]=-0.1 -_energyscore_lc2cp_zminus = PlotGroup("Energy_vs_Score_LC2CP", [Plot("Energy_vs_Score_layer2caloparticle_perlayer{:02d}".format(i), title="Energy_vs_Score_LC2CP", +_energyscore_lc2cp_zminus = PlotGroup("Energy_vs_Score_LC2CP", [Plot("Energy_vs_Score_layer2caloparticle_perlayer{:02d}".format(i), title="Energy_vs_Score_LC2CP", xtitle="Layer {}".format(i), drawStyle="COLZ", adjustMarginRight=0.1, **_common_energy_score) for i in range(0, maxlayerzm) ], ncols=10) -_energyscore_lc2cp_zplus = PlotGroup("Energy_vs_Score_LC2CP", [Plot("Energy_vs_Score_layer2caloparticle_perlayer{:02d}".format(i), title="Energy_vs_Score_LC2CP", +_energyscore_lc2cp_zplus = PlotGroup("Energy_vs_Score_LC2CP", [Plot("Energy_vs_Score_layer2caloparticle_perlayer{:02d}".format(i), title="Energy_vs_Score_LC2CP", xtitle="Layer {}".format(i), drawStyle="COLZ", adjustMarginRight=0.1, **_common_energy_score) for i in range(maxlayerzm,maxlayerzp) ], ncols=10) @@ -1709,7 +1709,7 @@ _multiplicityOfLCinTST_plots = [Plot("multiplicityOfLCinTST", drawCommand = "colz text45", normalizeToNumberOfEvents = True, **_common)] _multiplicityOfLCinTST_plots.extend([Plot("multiplicityOfLCinTST_vs_layerclusterenergy", - drawCommand = "colz text45", normalizeToNumberOfEvents = True, **_common)]) + drawCommand = "colz text45", normalizeToNumberOfEvents = True, **_common)]) _multiplicityOfLCinTST_plots.extend([Plot("multiplicityOfLCinTST_vs_layercluster_zplus", drawCommand = "colz text45", normalizeToNumberOfEvents = True, **_common)]) _multiplicityOfLCinTST_plots.extend([Plot("multiplicityOfLCinTST_vs_layercluster_zminus", @@ -1762,6 +1762,67 @@ _trackster_xyz_plots.extend([Plot("trackster_z", **_common)]) _trackster_xyz = PlotGroup("XYZ", _trackster_xyz_plots, ncols=3) +#-------------------------------------------------------------------------------------------- +# CANDIDATES +#-------------------------------------------------------------------------------------------- + +# all candidates +cand_plots_names = ["N of tracksters in candidate", "Candidates PDG Id", "Candidates charge", "Candidates type"] +_candidate_nts_plots = [] +for name in cand_plots_names: + _candidate_nts_plots.extend([Plot(name, **_common)]) +_candidatesPlots1 = PlotGroup("General_plots_pid_type", _candidate_nts_plots, ncols=2) + +cand_plots_names = ["Candidates pT", "Candidates raw energy", "Candidates regressed energy"] +_candidate_nts_plots = [] +for name in cand_plots_names: + _candidate_nts_plots.extend([Plot(name, **_common)]) +_candidatesPlots2 = PlotGroup("General_plots_pt_energy", _candidate_nts_plots, ncols=3) + +_candidatesPlots = [_candidatesPlots1, _candidatesPlots2] + +# divided by candidate's type +cand_type = ["charged_hadrons", "electrons", "muons", "neutral_hadrons", "neutral_pions", "photons"] +cand_plots_names = [" candidates PDG Id", " candidates charge", " candidates type"] +cand_plots_names_den = ["den_fake_cand_vs_energy_", "den_fake_cand_vs_eta_", "den_fake_cand_vs_phi_", "den_fake_cand_vs_pt_"] + +_all_cand_type_plots = [] +for ct in cand_type: + cand_type_plots = [Plot("N of tracksters in candidate for "+ct, title="N of tracksters in candidate for "+ct.replace("_", " "), **_common)] + for name in cand_plots_names: + cand_type_plots.extend([Plot(ct+name, title=ct.replace("_", " ")+name, **_common)]) + _all_cand_type_plots.append(cand_type_plots) + +_all_cand_ene_plots = [] +for ct in cand_type: + name = "candidates regressed energy" + cand_type_plots = [Plot(ct+name, title=ct.replace("_", " ")+" "+name, **_common)] + for name in cand_plots_names_den: + cand_type_plots.extend([Plot(name+ct, title=ct.replace("_", " ")+" candidates "+name.replace("den_fake_cand_vs_", "").replace("_", ""), **_common)]) + _all_cand_ene_plots.append(cand_type_plots) + +#efficiency and fake +_common_eff_fake = {"stat": False, "legend": False, "xbinlabelsize": 14, "xtitle": "Default", "xbinlabeloption": "d", "ymin": 0.0, "ymax": 1.1} +_all_cand_eff_plots = [] +for ct in cand_type: + cand_eff_plots = [] + for var in ["pt", "energy", "eta", "phi"]: + for cut in ["track", "pid", "energy"]: + cand_eff_plots.extend([Plot("eff_"+ct+"_"+cut+"_"+var, title=cut + " efficiency for "+ct.replace("_", " ")+" vs "+var, ytitle="Efficiency", **_common_eff_fake)]) + _all_cand_eff_plots.append(cand_eff_plots) + +_all_cand_fake_plots = [] +for ct in cand_type: + cand_fake_plots = [] + for var in ["pt", "energy", "eta", "phi"]: + for cut in ["track", "pid", "energy"]: + cand_fake_plots.extend([Plot("fake_"+ct+"_"+cut+"_"+var, title=cut + " fake rate for "+ct.replace("_", " ")+" vs "+var, ytitle="Fake rate", **_common_eff_fake)]) + _all_cand_fake_plots.append(cand_fake_plots) + +_allCandidatesPlots = [[],[],[],[],[],[]] +for i in range(6): + _allCandidatesPlots[i].extend([PlotGroup(cand_type[i]+"_type", _all_cand_type_plots[i], ncols=2), PlotGroup(cand_type[i]+"_kin", _all_cand_ene_plots[i], ncols=3), PlotGroup(cand_type[i]+"_eff", _all_cand_eff_plots[i], ncols=3), PlotGroup(cand_type[i]+"_fake", _all_cand_fake_plots[i], ncols=3)]) + #-------------------------------------------------------------------------------------------- # SIMHITS, DIGIS, RECHITS #-------------------------------------------------------------------------------------------- @@ -1776,143 +1837,143 @@ _common = {"stat": True, "drawStyle": "hist", "staty": 0.65} -_Occupancy_EE_zplus = PlotGroup("Occupancy_EE_zplus", [Plot("HitOccupancy_Plus_layer_{:02d}".format(i), title="Occupancy_EE_zplus", +_Occupancy_EE_zplus = PlotGroup("Occupancy_EE_zplus", [Plot("HitOccupancy_Plus_layer_{:02d}".format(i), title="Occupancy_EE_zplus", xtitle="Layer {}".format(i), **_common) for i in range(EE_min,EE_max+1) ], ncols=7) -_Occupancy_HE_Silicon_zplus = PlotGroup("Occupancy_HE_Silicon_zplus", [Plot("HitOccupancy_Plus_layer_{:02d}".format(i), title="Occupancy_HE_zplus", +_Occupancy_HE_Silicon_zplus = PlotGroup("Occupancy_HE_Silicon_zplus", [Plot("HitOccupancy_Plus_layer_{:02d}".format(i), title="Occupancy_HE_zplus", xtitle="Layer {}".format(i), **_common) for i in range(HESilicon_min,HESilicon_max+1) ], ncols=7) -_Occupancy_HE_Scintillator_zplus = PlotGroup("Occupancy_HE_Scintillator_zplus", [Plot("HitOccupancy_Plus_layer_{:02d}".format(i), title="Occupancy_HE_Scintillator_zplus", +_Occupancy_HE_Scintillator_zplus = PlotGroup("Occupancy_HE_Scintillator_zplus", [Plot("HitOccupancy_Plus_layer_{:02d}".format(i), title="Occupancy_HE_Scintillator_zplus", xtitle="Layer {}".format(i), **_common) for i in range(HEScintillator_min,HEScintillator_max+1) ], ncols=7) -_Occupancy_EE_zminus = PlotGroup("Occupancy_EE_zminus", [Plot("HitOccupancy_Minus_layer_{:02d}".format(i), title="Occupancy_EE_zminus", +_Occupancy_EE_zminus = PlotGroup("Occupancy_EE_zminus", [Plot("HitOccupancy_Minus_layer_{:02d}".format(i), title="Occupancy_EE_zminus", xtitle="Layer {}".format(i), **_common) for i in range(EE_min,EE_max+1) ], ncols=7) -_Occupancy_HE_Silicon_zminus = PlotGroup("Occupancy_HE_Silicon_zminus", [Plot("HitOccupancy_Minus_layer_{:02d}".format(i), title="Occupancy_HE_Silicon_zminus", +_Occupancy_HE_Silicon_zminus = PlotGroup("Occupancy_HE_Silicon_zminus", [Plot("HitOccupancy_Minus_layer_{:02d}".format(i), title="Occupancy_HE_Silicon_zminus", xtitle="Layer {}".format(i), **_common) for i in range(HESilicon_min,HESilicon_max+1) ], ncols=7) -_Occupancy_HE_Scintillator_zminus = PlotGroup("Occupancy_HE_Scintillator_zminus", [Plot("HitOccupancy_Minus_layer_{:02d}".format(i), title="Occupancy_HE_Scintillator_zminus", +_Occupancy_HE_Scintillator_zminus = PlotGroup("Occupancy_HE_Scintillator_zminus", [Plot("HitOccupancy_Minus_layer_{:02d}".format(i), title="Occupancy_HE_Scintillator_zminus", xtitle="Layer {}".format(i), **_common) for i in range(HEScintillator_min,HEScintillator_max+1) ], ncols=7) _common_etaphi = dict(removeEmptyBins=False, xbinlabelsize=10, xbinlabeloption="d", ymin=None) -_EtaPhi_EE_zplus = PlotGroup("EtaPhi_EE_zplus", [Plot("EtaPhi_Plus_layer_{:02d}".format(i), title="EtaPhi_EE_zplus", +_EtaPhi_EE_zplus = PlotGroup("EtaPhi_EE_zplus", [Plot("EtaPhi_Plus_layer_{:02d}".format(i), title="EtaPhi_EE_zplus", xtitle="Layer {}".format(i), drawStyle="COLZ", adjustMarginRight=0.1, **_common_etaphi) for i in range(EE_min,EE_max+1) ], ncols=7) -_EtaPhi_HE_Silicon_zplus = PlotGroup("EtaPhi_HE_Silicon_zplus", [Plot("EtaPhi_Plus_layer_{:02d}".format(i), title="EtaPhi_HE_Silicon_zplus", +_EtaPhi_HE_Silicon_zplus = PlotGroup("EtaPhi_HE_Silicon_zplus", [Plot("EtaPhi_Plus_layer_{:02d}".format(i), title="EtaPhi_HE_Silicon_zplus", xtitle="Layer {}".format(i), drawStyle="COLZ", adjustMarginRight=0.1, **_common_etaphi) for i in range(HESilicon_min,HESilicon_max+1) ], ncols=7) -_EtaPhi_HE_Scintillator_zplus = PlotGroup("EtaPhi_HE_Scintillator_zplus", [Plot("EtaPhi_Plus_layer_{:02d}".format(i), title="EtaPhi_HE_Scintillator_zplus", +_EtaPhi_HE_Scintillator_zplus = PlotGroup("EtaPhi_HE_Scintillator_zplus", [Plot("EtaPhi_Plus_layer_{:02d}".format(i), title="EtaPhi_HE_Scintillator_zplus", xtitle="Layer {}".format(i), drawStyle="COLZ", adjustMarginRight=0.1, **_common_etaphi) for i in range(HEScintillator_min,HEScintillator_max+1) ], ncols=7) -_EtaPhi_EE_zminus = PlotGroup("EtaPhi_EE_zminus", [Plot("EtaPhi_Minus_layer_{:02d}".format(i), title="EtaPhi_EE_zminus", +_EtaPhi_EE_zminus = PlotGroup("EtaPhi_EE_zminus", [Plot("EtaPhi_Minus_layer_{:02d}".format(i), title="EtaPhi_EE_zminus", xtitle="Layer {}".format(i), drawStyle="COLZ", adjustMarginRight=0.1, **_common_etaphi) for i in range(EE_min,EE_max+1) ], ncols=7) -_EtaPhi_HE_Silicon_zminus = PlotGroup("EtaPhi_HE_Silicon_zminus", [Plot("EtaPhi_Minus_layer_{:02d}".format(i), title="EtaPhi_HE_Silicon_zminus", +_EtaPhi_HE_Silicon_zminus = PlotGroup("EtaPhi_HE_Silicon_zminus", [Plot("EtaPhi_Minus_layer_{:02d}".format(i), title="EtaPhi_HE_Silicon_zminus", xtitle="Layer {}".format(i), drawStyle="COLZ", adjustMarginRight=0.1, **_common_etaphi) for i in range(HESilicon_min,HESilicon_max+1) ], ncols=7) -_EtaPhi_HE_Scintillator_zminus = PlotGroup("EtaPhi_HE_Scintillator_zminus", [Plot("EtaPhi_Minus_layer_{:02d}".format(i), title="EtaPhi_HE_Scintillator_zminus", +_EtaPhi_HE_Scintillator_zminus = PlotGroup("EtaPhi_HE_Scintillator_zminus", [Plot("EtaPhi_Minus_layer_{:02d}".format(i), title="EtaPhi_HE_Scintillator_zminus", xtitle="Layer {}".format(i), drawStyle="COLZ", adjustMarginRight=0.1, **_common_etaphi) for i in range(HEScintillator_min,HEScintillator_max+1) ], ncols=7) _common = {"stat": True, "drawStyle": "hist", "staty": 0.65, "ymin": 0.1, "ylog": True} -_Energy_EE_0 = PlotGroup("Energy_Time_0_EE", [Plot("energy_time_0_layer_{:02d}".format(i), title="Energy_Time_0_EE", +_Energy_EE_0 = PlotGroup("Energy_Time_0_EE", [Plot("energy_time_0_layer_{:02d}".format(i), title="Energy_Time_0_EE", xtitle="Layer {}".format(i), **_common) for i in range(EE_min,EE_max+1) ], ncols=7) -_Energy_HE_Silicon_0 = PlotGroup("Energy_Time_0_HE_Silicon", [Plot("energy_time_0_layer_{:02d}".format(i), title="Energy_Time_0_HE_Silicon", +_Energy_HE_Silicon_0 = PlotGroup("Energy_Time_0_HE_Silicon", [Plot("energy_time_0_layer_{:02d}".format(i), title="Energy_Time_0_HE_Silicon", xtitle="Layer {}".format(i), **_common) for i in range(HESilicon_min,HESilicon_max+1) ], ncols=7) -_Energy_HE_Scintillator_0 = PlotGroup("Energy_Time_0_HE_Scintillator", [Plot("energy_time_0_layer_{:02d}".format(i), title="Energy_Time_0_HE_Scintillator", +_Energy_HE_Scintillator_0 = PlotGroup("Energy_Time_0_HE_Scintillator", [Plot("energy_time_0_layer_{:02d}".format(i), title="Energy_Time_0_HE_Scintillator", xtitle="Layer {}".format(i), **_common) for i in range(HEScintillator_min,HEScintillator_max+1) ], ncols=7) -_Energy_EE_1 = PlotGroup("Energy_Time_1_EE", [Plot("energy_time_1_layer_{:02d}".format(i), title="Energy_Time_1_EE", +_Energy_EE_1 = PlotGroup("Energy_Time_1_EE", [Plot("energy_time_1_layer_{:02d}".format(i), title="Energy_Time_1_EE", xtitle="Layer {}".format(i), **_common) for i in range(EE_min,EE_max+1) ], ncols=7) -_Energy_HE_Silicon_1 = PlotGroup("Energy_Time_1_HE_Silicon", [Plot("energy_time_1_layer_{:02d}".format(i), title="Energy_Time_1_HE_Silicon", +_Energy_HE_Silicon_1 = PlotGroup("Energy_Time_1_HE_Silicon", [Plot("energy_time_1_layer_{:02d}".format(i), title="Energy_Time_1_HE_Silicon", xtitle="Layer {}".format(i), **_common) for i in range(HESilicon_min,HESilicon_max+1) ], ncols=7) -_Energy_HE_Scintillator_1 = PlotGroup("Energy_Time_1_HE_Scintillator", [Plot("energy_time_1_layer_{:02d}".format(i), title="Energy_Time_1_HE_Scintillator", +_Energy_HE_Scintillator_1 = PlotGroup("Energy_Time_1_HE_Scintillator", [Plot("energy_time_1_layer_{:02d}".format(i), title="Energy_Time_1_HE_Scintillator", xtitle="Layer {}".format(i), **_common) for i in range(HEScintillator_min,HEScintillator_max+1) ], ncols=7) -_Energy_EE = PlotGroup("Energy_EE", [Plot("energy_layer_{:02d}".format(i), title="Energy_EE", +_Energy_EE = PlotGroup("Energy_EE", [Plot("energy_layer_{:02d}".format(i), title="Energy_EE", xtitle="Layer {}".format(i), **_common) for i in range(EE_min,EE_max+1) ], ncols=7) -_Energy_HE_Silicon = PlotGroup("Energy_HE_Silicon", [Plot("energy_layer_{:02d}".format(i), title="Energy_HE_Silicon", +_Energy_HE_Silicon = PlotGroup("Energy_HE_Silicon", [Plot("energy_layer_{:02d}".format(i), title="Energy_HE_Silicon", xtitle="Layer {}".format(i), **_common) for i in range(HESilicon_min,HESilicon_max+1) ], ncols=7) -_Energy_HE_Scintillator = PlotGroup("Energy_HE_Scintillator", [Plot("energy_layer_{:02d}".format(i), title="Energy_HE_Scintillator", +_Energy_HE_Scintillator = PlotGroup("Energy_HE_Scintillator", [Plot("energy_layer_{:02d}".format(i), title="Energy_HE_Scintillator", xtitle="Layer {}".format(i), **_common) for i in range(HEScintillator_min,HEScintillator_max+1) ], ncols=7) -_DigiHits_ADC_EE = PlotGroup("ADC_EE", [Plot("ADC_layer_{:02d}".format(i), title="DigiHits_ADC_EE", +_DigiHits_ADC_EE = PlotGroup("ADC_EE", [Plot("ADC_layer_{:02d}".format(i), title="DigiHits_ADC_EE", xtitle="Layer {}".format(i), **_common) for i in range(EE_min,EE_max+1) ], ncols=7) -_DigiHits_ADC_HE_Silicon = PlotGroup("ADC_HE_Silicon", [Plot("ADC_layer_{:02d}".format(i), title="DigiHits_ADC_HE_Silicon", +_DigiHits_ADC_HE_Silicon = PlotGroup("ADC_HE_Silicon", [Plot("ADC_layer_{:02d}".format(i), title="DigiHits_ADC_HE_Silicon", xtitle="Layer {}".format(i), **_common) for i in range(HESilicon_min,HESilicon_max+1) ], ncols=7) -_DigiHits_ADC_HE_Scintillator = PlotGroup("ADC_HE_Scintillator", [Plot("ADC_layer_{:02d}".format(i), title="DigiHits_ADC_HE_Scintillator", +_DigiHits_ADC_HE_Scintillator = PlotGroup("ADC_HE_Scintillator", [Plot("ADC_layer_{:02d}".format(i), title="DigiHits_ADC_HE_Scintillator", xtitle="Layer {}".format(i), **_common) for i in range(HEScintillator_min,HEScintillator_max+1) ], ncols=7) _common = {"stat": True, "drawStyle": "hist", "staty": 0.65} -_DigiHits_Occupancy_EE_zplus = PlotGroup("Occupancy_EE_zplus", [Plot("DigiOccupancy_Plus_layer_{:02d}".format(i), title="DigiHits_Occupancy_EE_zplus", +_DigiHits_Occupancy_EE_zplus = PlotGroup("Occupancy_EE_zplus", [Plot("DigiOccupancy_Plus_layer_{:02d}".format(i), title="DigiHits_Occupancy_EE_zplus", xtitle="Layer {}".format(i), **_common) for i in range(EE_min,EE_max+1) ], ncols=7) -_DigiHits_Occupancy_HE_Silicon_zplus = PlotGroup("Occupancy_HE_Silicon_zplus", [Plot("DigiOccupancy_Plus_layer_{:02d}".format(i), title="DigiHits_Occupancy_HE_Silicon_zplus", +_DigiHits_Occupancy_HE_Silicon_zplus = PlotGroup("Occupancy_HE_Silicon_zplus", [Plot("DigiOccupancy_Plus_layer_{:02d}".format(i), title="DigiHits_Occupancy_HE_Silicon_zplus", xtitle="Layer {}".format(i), **_common) for i in range(HESilicon_min,HESilicon_max+1) ], ncols=7) -_DigiHits_Occupancy_HE_Scintillator_zplus = PlotGroup("Occupancy_HE_Scintillator_zplus", [Plot("DigiOccupancy_Plus_layer_{:02d}".format(i), title="DigiHits_Occupancy_HE_Scintillator_zplus", +_DigiHits_Occupancy_HE_Scintillator_zplus = PlotGroup("Occupancy_HE_Scintillator_zplus", [Plot("DigiOccupancy_Plus_layer_{:02d}".format(i), title="DigiHits_Occupancy_HE_Scintillator_zplus", xtitle="Layer {}".format(i), **_common) for i in range(HEScintillator_min,HEScintillator_max+1) ], ncols=7) -_DigiHits_Occupancy_EE_zminus = PlotGroup("Occupancy_EE_zminus", [Plot("DigiOccupancy_Minus_layer_{:02d}".format(i), title="DigiHits_Occupancy_EE_zminus", +_DigiHits_Occupancy_EE_zminus = PlotGroup("Occupancy_EE_zminus", [Plot("DigiOccupancy_Minus_layer_{:02d}".format(i), title="DigiHits_Occupancy_EE_zminus", xtitle="Layer {}".format(i), **_common) for i in range(EE_min,EE_max+1) ], ncols=7) -_DigiHits_Occupancy_HE_Silicon_zminus = PlotGroup("Occupancy_HE_Silicon_zminus", [Plot("DigiOccupancy_Minus_layer_{:02d}".format(i), title="DigiHits_Occupancy_HE_Silicon_zminus", +_DigiHits_Occupancy_HE_Silicon_zminus = PlotGroup("Occupancy_HE_Silicon_zminus", [Plot("DigiOccupancy_Minus_layer_{:02d}".format(i), title="DigiHits_Occupancy_HE_Silicon_zminus", xtitle="Layer {}".format(i), **_common) for i in range(HESilicon_min,HESilicon_max+1) ], ncols=7) -_DigiHits_Occupancy_HE_Scintillator_zminus = PlotGroup("Occupancy_HE_Scintillator_zminus", [Plot("DigiOccupancy_Minus_layer_{:02d}".format(i), title="DigiHits_Occupancy_HE_Scintillator_zminus", +_DigiHits_Occupancy_HE_Scintillator_zminus = PlotGroup("Occupancy_HE_Scintillator_zminus", [Plot("DigiOccupancy_Minus_layer_{:02d}".format(i), title="DigiHits_Occupancy_HE_Scintillator_zminus", xtitle="Layer {}".format(i), **_common) for i in range(HEScintillator_min,HEScintillator_max+1) ], ncols=7) _common_XY = dict(removeEmptyBins=True, xbinlabelsize=10, xbinlabeloption="d", ymin=None) -_DigiHits_Occupancy_XY_EE = PlotGroup("Occupancy_XY_EE", [Plot("DigiOccupancy_XY_layer_{:02d}".format(i), title="DigiHits_Occupancy_XY_EE", +_DigiHits_Occupancy_XY_EE = PlotGroup("Occupancy_XY_EE", [Plot("DigiOccupancy_XY_layer_{:02d}".format(i), title="DigiHits_Occupancy_XY_EE", xtitle="Layer {}".format(i), drawStyle="COLZ", adjustMarginRight=0.1, **_common_XY) for i in range(EE_min,EE_max+1) ], ncols=7) -_DigiHits_Occupancy_XY_HE_Silicon = PlotGroup("Occupancy_XY_HE_Silicon", [Plot("DigiOccupancy_XY_layer_{:02d}".format(i), title="DigiHits_Occupancy_XY_HE_Silicon", +_DigiHits_Occupancy_XY_HE_Silicon = PlotGroup("Occupancy_XY_HE_Silicon", [Plot("DigiOccupancy_XY_layer_{:02d}".format(i), title="DigiHits_Occupancy_XY_HE_Silicon", xtitle="Layer {}".format(i), drawStyle="COLZ", adjustMarginRight=0.1, **_common_XY) for i in range(HESilicon_min,HESilicon_max+1) ], ncols=7) -_DigiHits_Occupancy_XY_HE_Scintillator = PlotGroup("Occupancy_XY_HE_Scintillator", [Plot("DigiOccupancy_XY_layer_{:02d}".format(i), title="DigiHits_Occupancy_XY_HE_Scintillator", +_DigiHits_Occupancy_XY_HE_Scintillator = PlotGroup("Occupancy_XY_HE_Scintillator", [Plot("DigiOccupancy_XY_layer_{:02d}".format(i), title="DigiHits_Occupancy_XY_HE_Scintillator", xtitle="Layer {}".format(i), drawStyle="COLZ", adjustMarginRight=0.1, **_common_XY) for i in range(HEScintillator_min,HEScintillator_max+1) ], ncols=7) @@ -2186,7 +2247,7 @@ # Merge Rate Plots _merges_zplus, _merges_zplus_eta, - _merges_zplus_phi, + _merges_zplus_phi, # Score of CaloParticles wrt Layer Clusters _score_caloparticle_to_layerclusters_zplus, # Score of LayerClusters wrt CaloParticles @@ -2280,22 +2341,22 @@ def append_hgcalLayerClustersPlots(collection = hgcalValidator.label_layerCluste regions_ClusterLevel = ["General: Cluster Level", "Z-minus: Cluster Level", "Z-plus: Cluster Level"] regions_CellLevel = ["Z-minus: Cell Level", "Z-plus: Cell Level"] regions_LCtoCP_association = ["Z-minus: LC_CP association", "Z-plus: LC_CP association"] - + plots_lc_general_clusterlevel = lc_general_clusterlevel - plots_lc_clusterlevel_zminus = lc_clusterlevel_zminus - plots_lc_cellevel_zminus = lc_cellevel_zminus + plots_lc_clusterlevel_zminus = lc_clusterlevel_zminus + plots_lc_cellevel_zminus = lc_cellevel_zminus plots_lc_clusterlevel_zplus = lc_clusterlevel_zplus plots_lc_cellevel_zplus = lc_cellevel_zplus plots_lc_cp_association_zminus = lc_cp_association_zminus plots_lc_cp_association_zplus = lc_cp_association_zplus if extended : - #plots_lc_clusterlevel_zminus = lc_clusterlevel_zminus - #plots_lc_clusterlevel_zplus = lc_clusterlevel_zplus + #plots_lc_clusterlevel_zminus = lc_clusterlevel_zminus + #plots_lc_clusterlevel_zplus = lc_clusterlevel_zplus plots_lc_cellevel_zminus = lc_cellevel_zminus + lc_zminus_extended plots_lc_cellevel_zplus = lc_cellevel_zplus + lc_zplus_extended - #plots_lc_cp_association_zminus = lc_cp_association_zminus - #plots_lc_cp_association_zplus = lc_cp_association_zplus + #plots_lc_cp_association_zminus = lc_cp_association_zminus + #plots_lc_cp_association_zplus = lc_cp_association_zplus setPlots_ClusterLevel = [plots_lc_general_clusterlevel, plots_lc_clusterlevel_zminus, plots_lc_clusterlevel_zplus] setPlots_CellLevel = [plots_lc_cellevel_zminus, plots_lc_cellevel_zplus] @@ -2718,7 +2779,7 @@ def _hgcalHitFolders(dirName="HGCalSimHitsV/HGCalEESensitive"): def append_hgcalHitsPlots(collection = "HGCalSimHitsV", name_collection = "Simulated Hits"): _hitsCommonPlots_EE = [ _Occupancy_EE_zplus, - _Occupancy_EE_zminus, + _Occupancy_EE_zminus, _EtaPhi_EE_zminus, _EtaPhi_EE_zplus ] @@ -2840,3 +2901,20 @@ def append_hgcalDigisPlots(collection = "HGCalDigisV", name_collection = "Digis" loopSubFolders=False, purpose=PlotPurpose.Timing, page=hitCalibrationLabel, section=hitCalibrationLabel )) + +hgcalTICLCandPlotter = Plotter() + +hgcalTICLCandPlotter.append('ticlCandidates', [ + "DQMData/Run 1/HGCAL/Run summary/HGCalValidator/"+hgcalValidator.ticlCandidates.value(), + ], PlotFolder( + *_candidatesPlots, + loopSubFolders=False, + purpose=PlotPurpose.Timing, page="General", section="Candidates")) + +for i in range(6): + hgcalTICLCandPlotter.append('ticlCandidates', [ + "DQMData/Run 1/HGCAL/Run summary/HGCalValidator/"+hgcalValidator.ticlCandidates.value()+"/"+cand_type[i], + ], PlotFolder( + *_allCandidatesPlots[i], + loopSubFolders=False, + purpose=PlotPurpose.Timing, page=cand_type[i], section="Candidates")) diff --git a/Validation/HGCalValidation/scripts/makeHGCalValidationPlots.py b/Validation/HGCalValidation/scripts/makeHGCalValidationPlots.py index a6546e63e2728..795366a7d8c50 100755 --- a/Validation/HGCalValidation/scripts/makeHGCalValidationPlots.py +++ b/Validation/HGCalValidation/scripts/makeHGCalValidationPlots.py @@ -19,11 +19,12 @@ layerClustersLabel = 'layerClusters' trackstersLabel = 'tracksters' trackstersWithEdgesLabel = 'trackstersWithEdges' +candidatesLabel = 'candidates' simLabel = 'simulation' allLabel = 'all' collection_choices = [allLabel] -collection_choices.extend([hitCalLabel]+[hitValLabel]+[layerClustersLabel]+[trackstersLabel]+[trackstersWithEdgesLabel]+[simLabel]) +collection_choices.extend([hitCalLabel]+[hitValLabel]+[layerClustersLabel]+[trackstersLabel]+[trackstersWithEdgesLabel]+[candidatesLabel]+[simLabel]) def main(opts): @@ -42,11 +43,11 @@ def main(opts): filenames = [(f, f.replace(".root", "")) for f in opts.files] sample = SimpleSample(opts.subdirprefix[0], opts.html_sample, filenames) - + val = SimpleValidation([sample], opts.outputDir[0], nProc=opts.jobs) if opts.separate: val = SeparateValidation([sample], opts.outputDir[0]) - htmlReport = val.createHtmlReport(validationName=opts.html_validation_name[0]) + htmlReport = val.createHtmlReport(validationName=opts.html_validation_name[0]) #layerClusters def plot_LC(): @@ -78,8 +79,8 @@ def plot_TstEdges(): #caloParticles def plot_CP(): particletypes = {"pion-":"-211", "pion+":"211", "pion0": "111", - "muon-": "-13", "muon+":"13", - "electron-": "-11", "electron+": "11", "photon": "22", + "muon-": "-13", "muon+":"13", + "electron-": "-11", "electron+": "11", "photon": "22", "kaon0L": "310", "kaon0S": "130", "kaon-": "-321", "kaon+": "321"} hgcaloPart = [hgcalPlots.hgcalCaloParticlesPlotter] @@ -100,8 +101,11 @@ def plot_hitCal(): hgchitcalib = [hgcalPlots.hgcalHitCalibPlotter] val.doPlots(hgchitcalib, plotterDrawArgs=drawArgs) + def plotCand(): + ticlcand = [hgcalPlots.hgcalTICLCandPlotter] + val.doPlots(ticlcand, plotterDrawArgs=drawArgs) - plotDict = {hitCalLabel:[plot_hitCal], hitValLabel:[plot_hitVal], layerClustersLabel:[plot_LC], trackstersLabel:[plot_Tst], trackstersWithEdgesLabel:[plot_TstEdges], simLabel:[plot_SC, plot_CP]} + plotDict = {hitCalLabel:[plot_hitCal], hitValLabel:[plot_hitVal], layerClustersLabel:[plot_LC], trackstersLabel:[plot_Tst], trackstersWithEdgesLabel:[plot_TstEdges], simLabel:[plot_SC, plot_CP], candidatesLabel:[plotCand]} if (opts.collection != allLabel): for task in plotDict[opts.collection]: @@ -121,7 +125,7 @@ def plot_hitCal(): if __name__ == "__main__": parser = argparse.ArgumentParser(description="Create set of HGCal validation plots from one or more DQM files.") - parser.add_argument("files", metavar="file", type=str, nargs="+", + parser.add_argument("files", metavar="file", type=str, nargs="+", default = "DQM_V0001_R000000001__Global__CMSSW_X_Y_Z__RECO.root", help="DQM file to plot the validation plots from") parser.add_argument("-o", "--outputDir", type=str, default=["plots1","plots2"], nargs="+", @@ -141,7 +145,7 @@ def plot_hitCal(): parser.add_argument("--html-validation-name", type=str, default=["",""], nargs="+", help="Validation name for HTML page generation (enters to element) (default '')") parser.add_argument("--collection", choices=collection_choices, default=layerClustersLabel, - help="Choose output plots collections among possible choices") + help="Choose output plots collections among possible choices") parser.add_argument("--extended", action="store_true", default = False, help="Include extended set of plots (e.g. bunch of distributions; default off)") parser.add_argument("--jobs", default=0, type=int, diff --git a/Validation/HGCalValidation/src/TICLCandidateValidator.cc b/Validation/HGCalValidation/src/TICLCandidateValidator.cc index f69e9f4ada559..f7de90869af21 100644 --- a/Validation/HGCalValidation/src/TICLCandidateValidator.cc +++ b/Validation/HGCalValidation/src/TICLCandidateValidator.cc @@ -11,13 +11,17 @@ TICLCandidateValidator::TICLCandidateValidator( edm::EDGetTokenT<std::vector<reco::Track>> recoTracksToken, edm::EDGetTokenT<std::vector<ticl::Trackster>> trackstersToken, edm::EDGetTokenT<hgcal::RecoToSimCollectionSimTracksters> associatorMapRtSToken, - edm::EDGetTokenT<hgcal::SimToRecoCollectionSimTracksters> associatorMapStRToken) + edm::EDGetTokenT<hgcal::SimToRecoCollectionSimTracksters> associatorMapStRToken, + edm::EDGetTokenT<hgcal::RecoToSimCollectionSimTracksters> associatorMapRtSPUToken, + bool isTICLv5) : TICLCandidatesToken_(ticlCandidates), simTICLCandidatesToken_(simTICLCandidatesToken), recoTracksToken_(recoTracksToken), trackstersToken_(trackstersToken), associatorMapRtSToken_(associatorMapRtSToken), - associatorMapStRToken_(associatorMapStRToken) {} + associatorMapStRToken_(associatorMapStRToken), + associatorMapRtSPUToken_(associatorMapRtSPUToken), + isTICLv5_(isTICLv5) {} TICLCandidateValidator::~TICLCandidateValidator() {} @@ -37,89 +41,103 @@ void TICLCandidateValidator::bookCandidatesHistos(DQMStore::IBooker& ibook, std: for (long unsigned int i = 0; i < neutrals.size(); i++) { ibook.setCurrentFolder(baseDir + "/" + neutrals[i]); + h_neut_tracksters_in_candidate.push_back(ibook.book1D("N of tracksters in candidate for " + neutrals[i], + "N of tracksters in candidate for " + neutrals[i], + 100, + 0, + 99)); + h_neut_candidate_regressed_energy.push_back(ibook.book1D( + neutrals[i] + "candidates regressed energy", neutrals[i] + " candidates regressed energy;E (GeV)", 250, 0, 250)); + h_neut_candidate_charge.push_back( + ibook.book1D(neutrals[i] + " candidates charge", neutrals[i] + " candidates charge;Charge", 3, -1.5, 1.5)); + h_neut_candidate_pdgId.push_back( + ibook.book1D(neutrals[i] + " candidates PDG Id", neutrals[i] + " candidates PDG ID", 100, -220, 220)); + h_neut_candidate_partType.push_back( + ibook.book1D(neutrals[i] + " candidates type", neutrals[i] + " candidates type", 9, -0.5, 8.5)); + h_den_fake_neut_energy_candidate.push_back( - ibook.book1D("den_fake_cand_vs_energy_" + neutrals[i], neutrals[i] + " vs energy;E (GeV)", 250, 0, 250)); + ibook.book1D("den_fake_cand_vs_energy_" + neutrals[i], neutrals[i] + " candidates energy;E (GeV)", 50, 0, 250)); h_num_fake_neut_energy_candidate_pdgId.push_back(ibook.book1D( - "num_fake_pid_cand_vs_energy_" + neutrals[i], neutrals[i] + " PID fake vs energy;E (GeV)", 250, 0, 250)); + "num_fake_pid_cand_vs_energy_" + neutrals[i], neutrals[i] + " PID fake vs energy;E (GeV)", 50, 0, 250)); h_num_fake_neut_energy_candidate_energy.push_back( ibook.book1D("num_fake_energy_cand_vs_energy_" + neutrals[i], neutrals[i] + " PID and energy fake vs energy;E (GeV)", - 250, + 50, 0, 250)); h_den_fake_neut_pt_candidate.push_back( - ibook.book1D("den_fake_cand_vs_pt_" + neutrals[i], neutrals[i] + " vs pT;p_{T} (GeV)", 250, 0, 250)); + ibook.book1D("den_fake_cand_vs_pt_" + neutrals[i], neutrals[i] + " candidates pT;p_{T} (GeV)", 50, 0, 250)); h_num_fake_neut_pt_candidate_pdgId.push_back(ibook.book1D( - "num_fake_pid_cand_vs_pt_" + neutrals[i], neutrals[i] + " PID fake vs pT;p_{T} (GeV)", 250, 0, 250)); + "num_fake_pid_cand_vs_pt_" + neutrals[i], neutrals[i] + " PID fake vs pT;p_{T} (GeV)", 50, 0, 250)); h_num_fake_neut_pt_candidate_energy.push_back(ibook.book1D("num_fake_energy_cand_vs_pt_" + neutrals[i], neutrals[i] + " PID and energy fake vs pT;p_{T} (GeV)", - 250, + 50, 0, 250)); h_den_fake_neut_eta_candidate.push_back( - ibook.book1D("den_fake_cand_vs_eta_" + neutrals[i], neutrals[i] + " vs eta;#eta (GeV)", 100, -3, 3)); + ibook.book1D("den_fake_cand_vs_eta_" + neutrals[i], neutrals[i] + " candidates eta;#eta (GeV)", 50, -3, 3)); h_num_fake_neut_eta_candidate_pdgId.push_back(ibook.book1D( - "num_fake_pid_cand_vs_eta_" + neutrals[i], neutrals[i] + " PID fake vs eta;#eta (GeV)", 100, -3, 3)); + "num_fake_pid_cand_vs_eta_" + neutrals[i], neutrals[i] + " PID fake vs eta;#eta (GeV)", 50, -3, 3)); h_num_fake_neut_eta_candidate_energy.push_back(ibook.book1D("num_fake_energy_cand_vs_eta_" + neutrals[i], neutrals[i] + " PID and energy fake vs eta;#eta (GeV)", - 100, + 50, -3, 3)); h_den_fake_neut_phi_candidate.push_back(ibook.book1D( - "den_fake_cand_vs_phi_" + neutrals[i], neutrals[i] + " vs phi;#phi (GeV)", 100, -3.14159, 3.14159)); + "den_fake_cand_vs_phi_" + neutrals[i], neutrals[i] + " candidates phi;#phi (GeV)", 50, -3.14159, 3.14159)); h_num_fake_neut_phi_candidate_pdgId.push_back(ibook.book1D( - "num_fake_pid_cand_vs_phi_" + neutrals[i], neutrals[i] + " PID fake vs phi;#phi (GeV)", 100, -3.14159, 3.14159)); + "num_fake_pid_cand_vs_phi_" + neutrals[i], neutrals[i] + " PID fake vs phi;#phi (GeV)", 50, -3.14159, 3.14159)); h_num_fake_neut_phi_candidate_energy.push_back(ibook.book1D("num_fake_energy_cand_vs_phi_" + neutrals[i], neutrals[i] + " PID and energy fake vs phi;#phi (GeV)", - 100, + 50, -3.14159, 3.14159)); h_den_neut_energy_candidate.push_back( - ibook.book1D("den_cand_vs_energy_" + neutrals[i], neutrals[i] + " vs energy;E (GeV)", 250, 0, 250)); + ibook.book1D("den_cand_vs_energy_" + neutrals[i], neutrals[i] + " simCandidates energy;E (GeV)", 50, 0, 250)); h_num_neut_energy_candidate_pdgId.push_back( ibook.book1D("num_pid_cand_vs_energy_" + neutrals[i], neutrals[i] + " track and PID efficiency vs energy;E (GeV)", - 250, + 50, 0, 250)); h_num_neut_energy_candidate_energy.push_back( ibook.book1D("num_energy_cand_vs_energy_" + neutrals[i], neutrals[i] + " track, PID and energy efficiency vs energy;E (GeV)", - 250, + 50, 0, 250)); h_den_neut_pt_candidate.push_back( - ibook.book1D("den_cand_vs_pt_" + neutrals[i], neutrals[i] + " vs pT;p_{T} (GeV)", 250, 0, 250)); + ibook.book1D("den_cand_vs_pt_" + neutrals[i], neutrals[i] + " simCandidates pT;p_{T} (GeV)", 50, 0, 250)); h_num_neut_pt_candidate_pdgId.push_back(ibook.book1D( - "num_pid_cand_vs_pt_" + neutrals[i], neutrals[i] + " track and PID efficiency vs pT;p_{T} (GeV)", 250, 0, 250)); + "num_pid_cand_vs_pt_" + neutrals[i], neutrals[i] + " track and PID efficiency vs pT;p_{T} (GeV)", 50, 0, 250)); h_num_neut_pt_candidate_energy.push_back( ibook.book1D("num_energy_cand_vs_pt_" + neutrals[i], neutrals[i] + " track, PID and energy efficiency vs pT;p_{T} (GeV)", - 250, + 50, 0, 250)); h_den_neut_eta_candidate.push_back( - ibook.book1D("den_cand_vs_eta_" + neutrals[i], neutrals[i] + " vs eta;#eta (GeV)", 100, -3, 3)); + ibook.book1D("den_cand_vs_eta_" + neutrals[i], neutrals[i] + " simCandidates eta;#eta (GeV)", 50, -3, 3)); h_num_neut_eta_candidate_pdgId.push_back(ibook.book1D( - "num_pid_cand_vs_eta_" + neutrals[i], neutrals[i] + " track and PID efficiency vs eta;#eta (GeV)", 100, -3, 3)); + "num_pid_cand_vs_eta_" + neutrals[i], neutrals[i] + " track and PID efficiency vs eta;#eta (GeV)", 50, -3, 3)); h_num_neut_eta_candidate_energy.push_back( ibook.book1D("num_energy_cand_vs_eta_" + neutrals[i], neutrals[i] + " track, PID and energy efficiency vs eta;#eta (GeV)", - 100, + 50, -3, 3)); - h_den_neut_phi_candidate.push_back( - ibook.book1D("den_cand_vs_phi_" + neutrals[i], neutrals[i] + " vs phi;#phi (GeV)", 100, -3.14159, 3.14159)); + h_den_neut_phi_candidate.push_back(ibook.book1D( + "den_cand_vs_phi_" + neutrals[i], neutrals[i] + " simCandidates phi;#phi (GeV)", 50, -3.14159, 3.14159)); h_num_neut_phi_candidate_pdgId.push_back(ibook.book1D("num_pid_cand_vs_phi_" + neutrals[i], neutrals[i] + " track and PID efficiency vs phi;#phi (GeV)", - 100, + 50, -3.14159, 3.14159)); h_num_neut_phi_candidate_energy.push_back( ibook.book1D("num_energy_cand_vs_phi_" + neutrals[i], neutrals[i] + " track, PID and energy efficiency vs phi;#phi (GeV)", - 100, + 50, -3.14159, 3.14159)); } @@ -128,116 +146,124 @@ void TICLCandidateValidator::bookCandidatesHistos(DQMStore::IBooker& ibook, std: for (long unsigned int i = 0; i < charged.size(); i++) { ibook.setCurrentFolder(baseDir + "/" + charged[i]); + h_chg_tracksters_in_candidate.push_back(ibook.book1D( + "N of tracksters in candidate for " + charged[i], "N of tracksters in candidate for " + charged[i], 100, 0, 99)); + h_chg_candidate_regressed_energy.push_back(ibook.book1D( + charged[i] + "candidates regressed energy", charged[i] + " candidates regressed energy;E (GeV)", 250, 0, 250)); + h_chg_candidate_charge.push_back( + ibook.book1D(charged[i] + " candidates charge", charged[i] + " candidates charge;Charge", 3, -1.5, 1.5)); + h_chg_candidate_pdgId.push_back( + ibook.book1D(charged[i] + " candidates PDG Id", charged[i] + " candidates PDG ID", 100, -220, 220)); + h_chg_candidate_partType.push_back( + ibook.book1D(charged[i] + " candidates type", charged[i] + " candidates type", 9, -0.5, 8.5)); + h_den_fake_chg_energy_candidate.push_back( - ibook.book1D("den_fake_cand_vs_energy_" + charged[i], charged[i] + " vs energy;E (GeV)", 250, 0, 250)); + ibook.book1D("den_fake_cand_vs_energy_" + charged[i], charged[i] + " candidates energy;E (GeV)", 50, 0, 250)); h_num_fake_chg_energy_candidate_track.push_back(ibook.book1D( - "num_fake_track_cand_vs_energy_" + charged[i], charged[i] + " track fake vs energy;E (GeV)", 250, 0, 250)); + "num_fake_track_cand_vs_energy_" + charged[i], charged[i] + " track fake vs energy;E (GeV)", 50, 0, 250)); h_num_fake_chg_energy_candidate_pdgId.push_back(ibook.book1D( - "num_fake_pid_cand_vs_energy_" + charged[i], charged[i] + " track and PID fake vs energy;E (GeV)", 250, 0, 250)); + "num_fake_pid_cand_vs_energy_" + charged[i], charged[i] + " track and PID fake vs energy;E (GeV)", 50, 0, 250)); h_num_fake_chg_energy_candidate_energy.push_back( ibook.book1D("num_fake_energy_cand_vs_energy_" + charged[i], charged[i] + " track, PID and energy fake vs energy;E (GeV)", - 250, + 50, 0, 250)); h_den_fake_chg_pt_candidate.push_back( - ibook.book1D("den_fake_cand_vs_pt_" + charged[i], charged[i] + " vs pT;p_{T} (GeV)", 250, 0, 250)); + ibook.book1D("den_fake_cand_vs_pt_" + charged[i], charged[i] + " candidates pT;p_{T} (GeV)", 50, 0, 250)); h_num_fake_chg_pt_candidate_track.push_back(ibook.book1D( - "num_fake_track_cand_vs_pt_" + charged[i], charged[i] + " track fake vs pT;p_{T} (GeV)", 250, 0, 250)); + "num_fake_track_cand_vs_pt_" + charged[i], charged[i] + " track fake vs pT;p_{T} (GeV)", 50, 0, 250)); h_num_fake_chg_pt_candidate_pdgId.push_back(ibook.book1D( - "num_fake_pid_cand_vs_pt_" + charged[i], charged[i] + " track and PID fake vs pT;p_{T} (GeV)", 250, 0, 250)); + "num_fake_pid_cand_vs_pt_" + charged[i], charged[i] + " track and PID fake vs pT;p_{T} (GeV)", 50, 0, 250)); h_num_fake_chg_pt_candidate_energy.push_back( ibook.book1D("num_fake_energy_cand_vs_pt_" + charged[i], charged[i] + " track, PID and energy fake vs pT;p_{T} (GeV)", - 250, + 50, 0, 250)); h_den_fake_chg_eta_candidate.push_back( - ibook.book1D("den_fake_cand_vs_eta_" + charged[i], charged[i] + " vs eta;#eta (GeV)", 100, -3, 3)); + ibook.book1D("den_fake_cand_vs_eta_" + charged[i], charged[i] + " candidates eta;#eta (GeV)", 50, -3, 3)); h_num_fake_chg_eta_candidate_track.push_back(ibook.book1D( - "num_fake_track_cand_vs_eta_" + charged[i], charged[i] + " track fake vs eta;#eta (GeV)", 100, -3, 3)); + "num_fake_track_cand_vs_eta_" + charged[i], charged[i] + " track fake vs eta;#eta (GeV)", 50, -3, 3)); h_num_fake_chg_eta_candidate_pdgId.push_back(ibook.book1D( - "num_fake_pid_cand_vs_eta_" + charged[i], charged[i] + " track and PID fake vs eta;#eta (GeV)", 100, -3, 3)); + "num_fake_pid_cand_vs_eta_" + charged[i], charged[i] + " track and PID fake vs eta;#eta (GeV)", 50, -3, 3)); h_num_fake_chg_eta_candidate_energy.push_back( ibook.book1D("num_fake_energy_cand_vs_eta_" + charged[i], charged[i] + " track, PID and energy fake vs eta;#eta (GeV)", - 100, + 50, -3, 3)); - h_den_fake_chg_phi_candidate.push_back( - ibook.book1D("den_fake_cand_vs_phi_" + charged[i], charged[i] + " vs phi;#phi (GeV)", 100, -3.14159, 3.14159)); + h_den_fake_chg_phi_candidate.push_back(ibook.book1D( + "den_fake_cand_vs_phi_" + charged[i], charged[i] + " candidates phi;#phi (GeV)", 50, -3.14159, 3.14159)); h_num_fake_chg_phi_candidate_track.push_back(ibook.book1D("num_fake_track_cand_vs_phi_" + charged[i], charged[i] + " track fake vs phi;#phi (GeV)", - 100, + 50, -3.14159, 3.14159)); h_num_fake_chg_phi_candidate_pdgId.push_back(ibook.book1D("num_fake_pid_cand_vs_phi_" + charged[i], charged[i] + " track and PID fake vs phi;#phi (GeV)", - 100, + 50, -3.14159, 3.14159)); h_num_fake_chg_phi_candidate_energy.push_back( ibook.book1D("num_fake_energy_cand_vs_phi_" + charged[i], charged[i] + " track, PID and energy fake vs phi;#phi (GeV)", - 100, + 50, -3.14159, 3.14159)); h_den_chg_energy_candidate.push_back( - ibook.book1D("den_cand_vs_energy_" + charged[i], charged[i] + " vs energy;E (GeV)", 250, 0, 250)); + ibook.book1D("den_cand_vs_energy_" + charged[i], charged[i] + " simCandidates energy;E (GeV)", 50, 0, 250)); h_num_chg_energy_candidate_track.push_back(ibook.book1D( - "num_track_cand_vs_energy_" + charged[i], charged[i] + " track efficiency vs energy;E (GeV)", 250, 0, 250)); - h_num_chg_energy_candidate_pdgId.push_back(ibook.book1D("num_pid_cand_vs_energy_" + charged[i], - charged[i] + " track and PID efficiency vs energy;E (GeV)", - 250, - 0, - 250)); + "num_track_cand_vs_energy_" + charged[i], charged[i] + " track efficiency vs energy;E (GeV)", 50, 0, 250)); + h_num_chg_energy_candidate_pdgId.push_back(ibook.book1D( + "num_pid_cand_vs_energy_" + charged[i], charged[i] + " track and PID efficiency vs energy;E (GeV)", 50, 0, 250)); h_num_chg_energy_candidate_energy.push_back( ibook.book1D("num_energy_cand_vs_energy_" + charged[i], charged[i] + " track, PID and energy efficiency vs energy;E (GeV)", - 250, + 50, 0, 250)); h_den_chg_pt_candidate.push_back( - ibook.book1D("den_cand_vs_pt_" + charged[i], charged[i] + " vs pT;p_{T} (GeV)", 250, 0, 250)); + ibook.book1D("den_cand_vs_pt_" + charged[i], charged[i] + " simCandidates pT;p_{T} (GeV)", 50, 0, 250)); h_num_chg_pt_candidate_track.push_back(ibook.book1D( - "num_track_cand_vs_pt_" + charged[i], charged[i] + " track efficiency vs pT;p_{T} (GeV)", 250, 0, 250)); + "num_track_cand_vs_pt_" + charged[i], charged[i] + " track efficiency vs pT;p_{T} (GeV)", 50, 0, 250)); h_num_chg_pt_candidate_pdgId.push_back(ibook.book1D( - "num_pid_cand_vs_pt_" + charged[i], charged[i] + " track and PID efficiency vs pT;p_{T} (GeV)", 250, 0, 250)); + "num_pid_cand_vs_pt_" + charged[i], charged[i] + " track and PID efficiency vs pT;p_{T} (GeV)", 50, 0, 250)); h_num_chg_pt_candidate_energy.push_back( ibook.book1D("num_energy_cand_vs_pt_" + charged[i], charged[i] + " track, PID and energy efficiency vs pT;p_{T} (GeV)", - 250, + 50, 0, 250)); h_den_chg_eta_candidate.push_back( - ibook.book1D("den_cand_vs_eta_" + charged[i], charged[i] + " vs eta;#eta (GeV)", 100, -3, 3)); + ibook.book1D("den_cand_vs_eta_" + charged[i], charged[i] + " simCandidates eta;#eta (GeV)", 50, -3, 3)); h_num_chg_eta_candidate_track.push_back(ibook.book1D( - "num_track_cand_vs_eta_" + charged[i], charged[i] + " track efficiency vs eta;#eta (GeV)", 100, -3, 3)); + "num_track_cand_vs_eta_" + charged[i], charged[i] + " track efficiency vs eta;#eta (GeV)", 50, -3, 3)); h_num_chg_eta_candidate_pdgId.push_back(ibook.book1D( - "num_pid_cand_vs_eta_" + charged[i], charged[i] + " track and PID efficiency vs eta;#eta (GeV)", 100, -3, 3)); + "num_pid_cand_vs_eta_" + charged[i], charged[i] + " track and PID efficiency vs eta;#eta (GeV)", 50, -3, 3)); h_num_chg_eta_candidate_energy.push_back( ibook.book1D("num_energy_cand_vs_eta_" + charged[i], charged[i] + " track, PID and energy efficiency vs eta;#eta (GeV)", - 100, + 50, -3, 3)); - h_den_chg_phi_candidate.push_back( - ibook.book1D("den_cand_vs_phi_" + charged[i], charged[i] + " vs phi;#phi (GeV)", 100, -3.14159, 3.14159)); + h_den_chg_phi_candidate.push_back(ibook.book1D( + "den_cand_vs_phi_" + charged[i], charged[i] + " simCandidates phi;#phi (GeV)", 50, -3.14159, 3.14159)); h_num_chg_phi_candidate_track.push_back(ibook.book1D("num_track_cand_vs_phi_" + charged[i], charged[i] + " track efficiency vs phi;#phi (GeV)", - 100, + 50, -3.14159, 3.14159)); h_num_chg_phi_candidate_pdgId.push_back(ibook.book1D("num_pid_cand_vs_phi_" + charged[i], charged[i] + " track and PID efficiency vs phi;#phi (GeV)", - 100, + 50, -3.14159, 3.14159)); h_num_chg_phi_candidate_energy.push_back( ibook.book1D("num_energy_cand_vs_phi_" + charged[i], charged[i] + " track, PID and energy efficiency vs phi;#phi (GeV)", - 100, + 50, -3.14159, 3.14159)); } @@ -269,6 +295,10 @@ void TICLCandidateValidator::fillCandidateHistos(const edm::Event& event, event.getByToken(associatorMapStRToken_, mergeTsSimToReco_h); auto const& mergeTsSimToRecoMap = *mergeTsSimToReco_h; + edm::Handle<hgcal::RecoToSimCollectionSimTracksters> mergeTsRecoToSimPU_h; + event.getByToken(associatorMapRtSPUToken_, mergeTsRecoToSimPU_h); + auto const& mergeTsRecoToSimPUMap = *mergeTsRecoToSimPU_h; + // candidates plots for (const auto& cand : TICLCandidates) { h_tracksters_in_candidate->Fill(cand.tracksters().size()); @@ -357,7 +387,19 @@ void TICLCandidateValidator::fillCandidateHistos(const edm::Event& event, if (cand_idx == -1) continue; - const auto& recoCand = TICLCandidates[cand_idx]; + auto& recoCand = TICLCandidates[cand_idx]; + if (isTICLv5_) { + // cand_idx is the tsMerge index, find the ts in the candidates collection + auto const tsPtr = edm::Ptr<ticl::Trackster>(Tracksters_h, cand_idx); + auto cand_it = std::find_if(TICLCandidates.begin(), TICLCandidates.end(), [tsPtr](TICLCandidate const& cand) { + if (cand.tracksters().size()) + return cand.tracksters()[0] == tsPtr; + else + return false; + }); + recoCand = *cand_it; + } + if (recoCand.trackPtr().get() != nullptr) { const auto candTrackIdx = recoCand.trackPtr().get() - edm::Ptr<reco::Track>(recoTracks_h, 0).get(); if (simCandTrackIdx == candTrackIdx) { @@ -399,9 +441,6 @@ void TICLCandidateValidator::fillCandidateHistos(const edm::Event& event, * 111 (type 3) becomes 1 * 130 (type 5) becomes 2 */ - //if (simCand.trackPtr().get() != nullptr) - // std::cout << "ERROR: NEUTRAL WITH TRACK\n"; - h_den_neut_energy_candidate[index]->Fill(simCand.rawEnergy()); h_den_neut_pt_candidate[index]->Fill(simCand.pt()); h_den_neut_eta_candidate[index]->Fill(simCand.eta()); @@ -437,7 +476,19 @@ void TICLCandidateValidator::fillCandidateHistos(const edm::Event& event, if (cand_idx == -1) continue; - const auto& recoCand = TICLCandidates[cand_idx]; + auto& recoCand = TICLCandidates[cand_idx]; + if (isTICLv5_) { + // cand_idx is the tsMerge index, find the ts in the candidates collection + auto const tsPtr = edm::Ptr<ticl::Trackster>(Tracksters_h, cand_idx); + auto cand_it = std::find_if(TICLCandidates.begin(), TICLCandidates.end(), [tsPtr](TICLCandidate const& cand) { + if (cand.tracksters().size()) + return cand.tracksters()[0] == tsPtr; + else + return false; + }); + recoCand = *cand_it; + } + if (recoCand.trackPtr().get() != nullptr) continue; @@ -473,14 +524,6 @@ void TICLCandidateValidator::fillCandidateHistos(const edm::Event& event, for (size_t i = 0; i < TICLCandidates.size(); ++i) { const auto& cand = TICLCandidates[i]; - // const auto& arr = cand.idProbabilities(); - // const auto particleType = static_cast<ticl::Trackster::ParticleType>(std::max_element(arr.begin(), arr.end()) - arr.begin()); - // if (particleType == ticl::Trackster::ParticleType::electron or particleType == ticl::Trackster::ParticleType::muon or - // particleType == ticl::Trackster::ParticleType::charged_hadron) - // chargedCandidates.emplace_back(i); - // else if (particleType == ticl::Trackster::ParticleType::photon or particleType == ticl::Trackster::ParticleType::neutral_pion or - // particleType == ticl::Trackster::ParticleType::neutral_hadron) - // neutralCandidates.emplace_back(i); const auto& charged = isCharged(cand.pdgId()); if (charged) chargedCandidates.emplace_back(i); @@ -496,26 +539,45 @@ void TICLCandidateValidator::fillCandidateHistos(const edm::Event& event, // loop on charged for (const auto i : chargedCandidates) { const auto& cand = TICLCandidates[i]; - // const auto& arr = cand.idProbabilities(); - // auto index = std::log2(int(std::max_element(arr.begin(), arr.end()) - arr.begin())); auto index = std::log2(int(ticl::tracksterParticleTypeFromPdgId(cand.pdgId(), 1))); /* 11 (type 1) becomes 0 * 13 (type 2) becomes 1 * 211 (type 4) becomes 2 */ int32_t candTrackIdx = -1; - if (cand.trackPtr().get() != nullptr) - candTrackIdx = cand.trackPtr().get() - edm::Ptr<reco::Track>(recoTracks_h, 0).get(); - else + candTrackIdx = cand.trackPtr().get() - edm::Ptr<reco::Track>(recoTracks_h, 0).get(); + + if (cand.tracksters().empty()) continue; + + // i is the candidate idx == ts idx only in v4, find ts_idx in v5 + auto mergeTs_id = i; + if (isTICLv5_) { + mergeTs_id = cand.tracksters()[0].get() - edm::Ptr<ticl::Trackster>(Tracksters_h, 0).get(); + } + // remove PU tracksters + const edm::Ref<ticl::TracksterCollection> tsRef(Tracksters_h, mergeTs_id); + auto const sts_iterPU = mergeTsRecoToSimPUMap.find(tsRef); + if (sts_iterPU != mergeTsRecoToSimPUMap.end()) { + const auto& stsPUAssociated = sts_iterPU->val; + if (stsPUAssociated[0].second.first / (*Tracksters_h)[mergeTs_id].raw_energy() > 0.95) + continue; + } + // +1 to all denominators h_den_fake_chg_energy_candidate[index]->Fill(cand.rawEnergy()); h_den_fake_chg_pt_candidate[index]->Fill(cand.pt()); h_den_fake_chg_eta_candidate[index]->Fill(cand.eta()); h_den_fake_chg_phi_candidate[index]->Fill(cand.phi()); + h_chg_tracksters_in_candidate[index]->Fill(cand.tracksters().size()); + h_chg_candidate_regressed_energy[index]->Fill(cand.energy()); + h_chg_candidate_charge[index]->Fill(cand.charge()); + h_chg_candidate_pdgId[index]->Fill(cand.pdgId()); + const auto& arr = cand.idProbabilities(); + h_chg_candidate_partType[index]->Fill(std::max_element(arr.begin(), arr.end()) - arr.begin()); + int32_t simCand_idx = -1; - const edm::Ref<ticl::TracksterCollection> tsRef(Tracksters_h, i); const auto sts_iter = mergeTsRecoToSimMap.find(tsRef); float shared_energy = 0.; // search for reco cand associated @@ -585,24 +647,43 @@ void TICLCandidateValidator::fillCandidateHistos(const edm::Event& event, // loop on neutrals for (const auto i : neutralCandidates) { const auto& cand = TICLCandidates[i]; - // const auto& arr = cand.idProbabilities(); - // auto index = int(std::max_element(arr.begin(), arr.end()) - arr.begin()) / 2; auto index = int(ticl::tracksterParticleTypeFromPdgId(cand.pdgId(), 0)) / 2; /* 22 (type 0) becomes 0 * 111 (type 3) becomes 1 * 130 (type 5) becomes 2 */ - if (cand.trackPtr().get() != nullptr) + + if (cand.tracksters().empty()) continue; + // i is the candidate idx == ts idx only in v4, find ts_idx in v5 + auto mergeTs_id = i; + if (isTICLv5_) { + mergeTs_id = cand.tracksters()[0].get() - edm::Ptr<ticl::Trackster>(Tracksters_h, 0).get(); + } + // remove PU tracksters + const edm::Ref<ticl::TracksterCollection> tsRef(Tracksters_h, mergeTs_id); + auto const sts_iterPU = mergeTsRecoToSimPUMap.find(tsRef); + if (sts_iterPU != mergeTsRecoToSimPUMap.end()) { + const auto& stsPUAssociated = sts_iterPU->val; + if (stsPUAssociated[0].second.first / (*Tracksters_h)[mergeTs_id].raw_energy() > 0.95) + continue; + } + // +1 to all denominators h_den_fake_neut_energy_candidate[index]->Fill(cand.rawEnergy()); h_den_fake_neut_pt_candidate[index]->Fill(cand.pt()); h_den_fake_neut_eta_candidate[index]->Fill(cand.eta()); h_den_fake_neut_phi_candidate[index]->Fill(cand.phi()); + h_neut_tracksters_in_candidate[index]->Fill(cand.tracksters().size()); + h_neut_candidate_regressed_energy[index]->Fill(cand.energy()); + h_neut_candidate_charge[index]->Fill(cand.charge()); + h_neut_candidate_pdgId[index]->Fill(cand.pdgId()); + const auto& arr = cand.idProbabilities(); + h_neut_candidate_partType[index]->Fill(std::max_element(arr.begin(), arr.end()) - arr.begin()); + int32_t simCand_idx = -1; - const edm::Ref<ticl::TracksterCollection> tsRef(Tracksters_h, i); const auto sts_iter = mergeTsRecoToSimMap.find(tsRef); float shared_energy = 0.; // search for reco cand associated @@ -631,7 +712,6 @@ void TICLCandidateValidator::fillCandidateHistos(const edm::Event& event, continue; const auto& simCand = simTICLCandidates[simCand_idx]; - // check su simTICLCandidate track? //step 2: PID if (simCand.pdgId() != cand.pdgId()) {