22 minEta_(pset.getParameter<double>(
"minEta")),
23 maxEta_(pset.getParameter<double>(
"maxEta")),
24 nintEta_(pset.getParameter<
int>(
"nintEta")),
25 useFabsEta_(pset.getParameter<
bool>(
"useFabsEta")),
28 minEne_(pset.getParameter<double>(
"minEne")),
29 maxEne_(pset.getParameter<double>(
"maxEne")),
30 nintEne_(pset.getParameter<
int>(
"nintEne")),
33 minPt_(pset.getParameter<double>(
"minPt")),
34 maxPt_(pset.getParameter<double>(
"maxPt")),
35 nintPt_(pset.getParameter<
int>(
"nintPt")),
38 minPhi_(pset.getParameter<double>(
"minPhi")),
39 maxPhi_(pset.getParameter<double>(
"maxPhi")),
40 nintPhi_(pset.getParameter<
int>(
"nintPhi")),
43 minMixedHitsCluster_(pset.getParameter<double>(
"minMixedHitsCluster")),
44 maxMixedHitsCluster_(pset.getParameter<double>(
"maxMixedHitsCluster")),
45 nintMixedHitsCluster_(pset.getParameter<
int>(
"nintMixedHitsCluster")),
48 minEneCl_(pset.getParameter<double>(
"minEneCl")),
49 maxEneCl_(pset.getParameter<double>(
"maxEneCl")),
50 nintEneCl_(pset.getParameter<
int>(
"nintEneCl")),
53 minLongDepBary_(pset.getParameter<double>(
"minLongDepBary")),
54 maxLongDepBary_(pset.getParameter<double>(
"maxLongDepBary")),
55 nintLongDepBary_(pset.getParameter<
int>(
"nintLongDepBary")),
58 minZpos_(pset.getParameter<double>(
"minZpos")),
59 maxZpos_(pset.getParameter<double>(
"maxZpos")),
60 nintZpos_(pset.getParameter<
int>(
"nintZpos")),
63 minTotNClsperlay_(pset.getParameter<double>(
"minTotNClsperlay")),
64 maxTotNClsperlay_(pset.getParameter<double>(
"maxTotNClsperlay")),
65 nintTotNClsperlay_(pset.getParameter<
int>(
"nintTotNClsperlay")),
68 minEneClperlay_(pset.getParameter<double>(
"minEneClperlay")),
69 maxEneClperlay_(pset.getParameter<double>(
"maxEneClperlay")),
70 nintEneClperlay_(pset.getParameter<
int>(
"nintEneClperlay")),
75 minScore_(pset.getParameter<double>(
"minScore")),
76 maxScore_(pset.getParameter<double>(
"maxScore")),
77 nintScore_(pset.getParameter<
int>(
"nintScore")),
84 minSharedEneFrac_(pset.getParameter<double>(
"minSharedEneFrac")),
85 maxSharedEneFrac_(pset.getParameter<double>(
"maxSharedEneFrac")),
86 nintSharedEneFrac_(pset.getParameter<
int>(
"nintSharedEneFrac")),
89 minMCLSharedEneFrac_(pset.getParameter<double>(
"minMCLSharedEneFrac")),
90 maxMCLSharedEneFrac_(pset.getParameter<double>(
"maxMCLSharedEneFrac")),
91 nintMCLSharedEneFrac_(pset.getParameter<
int>(
"nintMCLSharedEneFrac")),
94 minTotNClsperthick_(pset.getParameter<double>(
"minTotNClsperthick")),
95 maxTotNClsperthick_(pset.getParameter<double>(
"maxTotNClsperthick")),
96 nintTotNClsperthick_(pset.getParameter<
int>(
"nintTotNClsperthick")),
99 minTotNcellsperthickperlayer_(pset.getParameter<double>(
"minTotNcellsperthickperlayer")),
100 maxTotNcellsperthickperlayer_(pset.getParameter<double>(
"maxTotNcellsperthickperlayer")),
101 nintTotNcellsperthickperlayer_(pset.getParameter<
int>(
"nintTotNcellsperthickperlayer")),
104 minDisToSeedperthickperlayer_(pset.getParameter<double>(
"minDisToSeedperthickperlayer")),
105 maxDisToSeedperthickperlayer_(pset.getParameter<double>(
"maxDisToSeedperthickperlayer")),
106 nintDisToSeedperthickperlayer_(pset.getParameter<
int>(
"nintDisToSeedperthickperlayer")),
109 minDisToSeedperthickperlayerenewei_(pset.getParameter<double>(
"minDisToSeedperthickperlayerenewei")),
110 maxDisToSeedperthickperlayerenewei_(pset.getParameter<double>(
"maxDisToSeedperthickperlayerenewei")),
111 nintDisToSeedperthickperlayerenewei_(pset.getParameter<
int>(
"nintDisToSeedperthickperlayerenewei")),
114 minDisToMaxperthickperlayer_(pset.getParameter<double>(
"minDisToMaxperthickperlayer")),
115 maxDisToMaxperthickperlayer_(pset.getParameter<double>(
"maxDisToMaxperthickperlayer")),
116 nintDisToMaxperthickperlayer_(pset.getParameter<
int>(
"nintDisToMaxperthickperlayer")),
119 minDisToMaxperthickperlayerenewei_(pset.getParameter<double>(
"minDisToMaxperthickperlayerenewei")),
120 maxDisToMaxperthickperlayerenewei_(pset.getParameter<double>(
"maxDisToMaxperthickperlayerenewei")),
121 nintDisToMaxperthickperlayerenewei_(pset.getParameter<
int>(
"nintDisToMaxperthickperlayerenewei")),
124 minDisSeedToMaxperthickperlayer_(pset.getParameter<double>(
"minDisSeedToMaxperthickperlayer")),
125 maxDisSeedToMaxperthickperlayer_(pset.getParameter<double>(
"maxDisSeedToMaxperthickperlayer")),
126 nintDisSeedToMaxperthickperlayer_(pset.getParameter<
int>(
"nintDisSeedToMaxperthickperlayer")),
129 minClEneperthickperlayer_(pset.getParameter<double>(
"minClEneperthickperlayer")),
130 maxClEneperthickperlayer_(pset.getParameter<double>(
"maxClEneperthickperlayer")),
131 nintClEneperthickperlayer_(pset.getParameter<
int>(
"nintClEneperthickperlayer")),
134 minCellsEneDensperthick_(pset.getParameter<double>(
"minCellsEneDensperthick")),
135 maxCellsEneDensperthick_(pset.getParameter<double>(
"maxCellsEneDensperthick")),
136 nintCellsEneDensperthick_(pset.getParameter<
int>(
"nintCellsEneDensperthick")),
140 minTotNMCLs_(pset.getParameter<double>(
"minTotNMCLs")),
141 maxTotNMCLs_(pset.getParameter<double>(
"maxTotNMCLs")),
142 nintTotNMCLs_(pset.getParameter<
int>(
"nintTotNMCLs")),
145 minTotNClsinMCLs_(pset.getParameter<double>(
"minTotNClsinMCLs")),
146 maxTotNClsinMCLs_(pset.getParameter<double>(
"maxTotNClsinMCLs")),
147 nintTotNClsinMCLs_(pset.getParameter<
int>(
"nintTotNClsinMCLs")),
150 minTotNClsinMCLsperlayer_(pset.getParameter<double>(
"minTotNClsinMCLsperlayer")),
151 maxTotNClsinMCLsperlayer_(pset.getParameter<double>(
"maxTotNClsinMCLsperlayer")),
152 nintTotNClsinMCLsperlayer_(pset.getParameter<
int>(
"nintTotNClsinMCLsperlayer")),
155 minMplofLCs_(pset.getParameter<double>(
"minMplofLCs")),
156 maxMplofLCs_(pset.getParameter<double>(
"maxMplofLCs")),
157 nintMplofLCs_(pset.getParameter<
int>(
"nintMplofLCs")),
160 minSizeCLsinMCLs_(pset.getParameter<double>(
"minSizeCLsinMCLs")),
161 maxSizeCLsinMCLs_(pset.getParameter<double>(
"maxSizeCLsinMCLs")),
162 nintSizeCLsinMCLs_(pset.getParameter<
int>(
"nintSizeCLsinMCLs")),
165 minClEnepermultiplicity_(pset.getParameter<double>(
"minClEnepermultiplicity")),
166 maxClEnepermultiplicity_(pset.getParameter<double>(
"maxClEnepermultiplicity")),
167 nintClEnepermultiplicity_(pset.getParameter<
int>(
"nintClEnepermultiplicity")),
170 minX_(pset.getParameter<double>(
"minX")),
171 maxX_(pset.getParameter<double>(
"maxX")),
172 nintX_(pset.getParameter<
int>(
"nintX")),
175 minY_(pset.getParameter<double>(
"minY")),
176 maxY_(pset.getParameter<double>(
"maxY")),
177 nintY_(pset.getParameter<
int>(
"nintY")),
180 minZ_(pset.getParameter<double>(
"minZ")),
181 maxZ_(pset.getParameter<double>(
"maxZ")),
182 nintZ_(pset.getParameter<
int>(
"nintZ")) {}
211 std::vector<int> thicknesses,
220 ibook.
book1D(
"mixedhitscluster_zminus",
221 "N of reco clusters that contain hits of more than one kind in z-",
227 ibook.
book1D(
"mixedhitscluster_zplus",
228 "N of reco clusters that contain hits of more than one kind in z+",
236 ibook.
book1D(
"energyclustered_zminus",
237 "percent of total energy clustered by all layer clusters over caloparticles energy in z-",
243 ibook.
book1D(
"energyclustered_zplus",
244 "percent of total energy clustered by all layer clusters over caloparticles energy in z+",
251 std::string subpathtomat = pathtomatbudfile.substr(pathtomatbudfile.find(
"Validation"));
253 ibook.
book1D(
"longdepthbarycentre_zminus",
254 "The longitudinal depth barycentre in z- for " + subpathtomat,
260 ibook.
book1D(
"longdepthbarycentre_zplus",
261 "The longitudinal depth barycentre in z+ for " + subpathtomat,
267 for (
unsigned ilayer = 0; ilayer < 2 *
layers; ++ilayer) {
268 auto istr1 = std::to_string(ilayer);
269 while (istr1.size() < 2) {
270 istr1.insert(0,
"0");
275 if (ilayer < layers) {
276 istr2 = std::to_string(ilayer + 1) +
" in z-";
278 istr2 = std::to_string(ilayer - (layers - 1)) +
" in z+";
281 "total number of layer clusters for layer " + istr2,
286 ibook.
book1D(
"energyclustered_perlayer" + istr1,
287 "percent of total energy clustered by layer clusters over caloparticles energy for layer " + istr2,
292 ibook.
book1D(
"Score_layercl2caloparticle_perlayer" + istr1,
293 "Score of Layer Cluster per CaloParticle for layer " + istr2,
298 ibook.
book1D(
"Score_caloparticle2layercl_perlayer" + istr1,
299 "Score of CaloParticle per Layer Cluster for layer " + istr2,
304 ibook.
book2D(
"Energy_vs_Score_caloparticle2layer_perlayer" + istr1,
305 "Energy vs Score of CaloParticle per Layer Cluster for layer " + istr2,
313 ibook.
book2D(
"Energy_vs_Score_layer2caloparticle_perlayer" + istr1,
314 "Energy vs Score of Layer Cluster per CaloParticle Layer for layer " + istr2,
322 ibook.
book1D(
"SharedEnergy_caloparticle2layercl_perlayer" + istr1,
323 "Shared Energy of CaloParticle per Layer Cluster for layer " + istr2,
328 ibook.
bookProfile(
"SharedEnergy_caloparticle2layercl_vs_eta_perlayer" + istr1,
329 "Shared Energy of CaloParticle vs #eta per best Layer Cluster for layer " + istr2,
336 ibook.
bookProfile(
"SharedEnergy_caloparticle2layercl_vs_phi_perlayer" + istr1,
337 "Shared Energy of CaloParticle vs #phi per best Layer Cluster for layer " + istr2,
344 ibook.
book1D(
"SharedEnergy_layercluster2caloparticle_perlayer" + istr1,
345 "Shared Energy of Layer Cluster per Layer Calo Particle for layer " + istr2,
350 ibook.
bookProfile(
"SharedEnergy_layercl2caloparticle_vs_eta_perlayer" + istr1,
351 "Shared Energy of LayerCluster vs #eta per best Calo Particle for layer " + istr2,
358 ibook.
bookProfile(
"SharedEnergy_layercl2caloparticle_vs_phi_perlayer" + istr1,
359 "Shared Energy of LayerCluster vs #phi per best Calo Particle for layer " + istr2,
366 ibook.
book1D(
"Num_CaloParticle_Eta_perlayer" + istr1,
367 "Num CaloParticle Eta per Layer Cluster for layer " + istr2,
372 ibook.
book1D(
"NumDup_CaloParticle_Eta_perlayer" + istr1,
373 "Num Duplicate CaloParticle Eta per Layer Cluster for layer " + istr2,
378 ibook.
book1D(
"Denom_CaloParticle_Eta_perlayer" + istr1,
379 "Denom CaloParticle Eta per Layer Cluster for layer " + istr2,
384 ibook.
book1D(
"Num_CaloParticle_Phi_perlayer" + istr1,
385 "Num CaloParticle Phi per Layer Cluster for layer " + istr2,
390 ibook.
book1D(
"NumDup_CaloParticle_Phi_perlayer" + istr1,
391 "Num Duplicate CaloParticle Phi per Layer Cluster for layer " + istr2,
396 ibook.
book1D(
"Denom_CaloParticle_Phi_perlayer" + istr1,
397 "Denom CaloParticle Phi per Layer Cluster for layer " + istr2,
402 ibook.
book1D(
"Num_LayerCluster_Eta_perlayer" + istr1,
403 "Num LayerCluster Eta per Layer Cluster for layer " + istr2,
408 ibook.
book1D(
"NumMerge_LayerCluster_Eta_perlayer" + istr1,
409 "Num Merge LayerCluster Eta per Layer Cluster for layer " + istr2,
414 ibook.
book1D(
"Denom_LayerCluster_Eta_perlayer" + istr1,
415 "Denom LayerCluster Eta per Layer Cluster for layer " + istr2,
420 ibook.
book1D(
"Num_LayerCluster_Phi_perlayer" + istr1,
421 "Num LayerCluster Phi per Layer Cluster for layer " + istr2,
426 ibook.
book1D(
"NumMerge_LayerCluster_Phi_perlayer" + istr1,
427 "Num Merge LayerCluster Phi per Layer Cluster for layer " + istr2,
432 ibook.
book1D(
"Denom_LayerCluster_Phi_perlayer" + istr1,
433 "Denom LayerCluster Phi per Layer Cluster for layer " + istr2,
438 ibook.
book1D(
"cellAssociation_perlayer" + istr1,
"Cell Association for layer " + istr2, 5, -4., 1.);
446 for (std::vector<int>::iterator it = thicknesses.begin(); it != thicknesses.end(); ++it) {
447 auto istr = std::to_string(*it);
449 "total number of layer clusters for thickness " + istr,
455 "energy density of cluster cells for thickness " + istr,
463 for (std::vector<int>::iterator it = thicknesses.begin(); it != thicknesses.end(); ++it) {
464 for (
unsigned ilayer = 0; ilayer < 2 *
layers; ++ilayer) {
465 auto istr1 = std::to_string(*it);
466 auto istr2 = std::to_string(ilayer);
467 while (istr2.size() < 2)
468 istr2.insert(0,
"0");
469 auto istr = istr1 +
"_" + istr2;
473 if (ilayer < layers) {
474 istr3 = std::to_string(ilayer + 1) +
" in z- ";
476 istr3 = std::to_string(ilayer - (layers - 1)) +
" in z+ ";
480 ibook.
book1D(
"cellsnum_perthick_perlayer_" + istr,
481 "total number of cells for layer " + istr3 +
" for thickness " + istr1,
487 ibook.
book1D(
"distancetoseedcell_perthickperlayer_" + istr,
488 "distance of cluster cells to seed cell for layer " + istr3 +
" for thickness " + istr1,
494 "distancetoseedcell_perthickperlayer_eneweighted_" + istr,
495 "energy weighted distance of cluster cells to seed cell for layer " + istr3 +
" for thickness " + istr1,
501 ibook.
book1D(
"distancetomaxcell_perthickperlayer_" + istr,
502 "distance of cluster cells to max cell for layer " + istr3 +
" for thickness " + istr1,
508 "distancetomaxcell_perthickperlayer_eneweighted_" + istr,
509 "energy weighted distance of cluster cells to max cell for layer " + istr3 +
" for thickness " + istr1,
515 ibook.
book1D(
"distancebetseedandmaxcell_perthickperlayer_" + istr,
516 "distance of seed cell to max cell for layer " + istr3 +
" for thickness " + istr1,
522 "distancebetseedandmaxcellvsclusterenergy_perthickperlayer_" + istr,
523 "distance of seed cell to max cell vs cluster energy for layer " + istr3 +
" for thickness " + istr1,
541 ibook.
book2D(
"Energy_vs_Score_multi2caloparticle",
542 "Energy vs Score of Multi Cluster per CaloParticle",
550 ibook.
book2D(
"Energy_vs_Score_caloparticle2multi",
551 "Energy vs Score of CaloParticle per Multi Cluster",
563 "NumMerge_MultiCluster_Eta",
"Num Merge MultiCluster Eta per Multi Cluster ",
nintEta_,
minEta_,
maxEta_));
569 "NumMerge_MultiCluster_Phi",
"Num Merge MultiCluster Phi per Multi Cluster",
nintPhi_,
minPhi_,
maxPhi_));
573 ibook.
book1D(
"SharedEnergy_multicluster2caloparticle",
574 "Shared Energy of Multi Cluster per Calo Particle in each layer",
579 ibook.
bookProfile(
"SharedEnergy_multicl2caloparticle_vs_eta",
580 "Shared Energy of MultiCluster vs #eta per best Calo Particle in each layer",
587 ibook.
bookProfile(
"SharedEnergy_multicl2caloparticle_vs_phi",
588 "Shared Energy of MultiCluster vs #phi per best Calo Particle in each layer",
595 ibook.
book1D(
"SharedEnergy_caloparticle2multicl",
596 "Shared Energy of CaloParticle per Multi Cluster",
601 ibook.
bookProfile(
"SharedEnergy_caloparticle2multicl_vs_eta",
602 "Shared Energy of CaloParticle vs #eta per best Multi Cluster",
609 ibook.
bookProfile(
"SharedEnergy_caloparticle2multicl_vs_phi",
610 "Shared Energy of CaloParticle vs #phi per best Multi Cluster",
629 std::unordered_map<int, dqm::reco::MonitorElement*> clusternum_in_multicluster_perlayer;
630 clusternum_in_multicluster_perlayer.clear();
632 for (
unsigned ilayer = 0; ilayer < 2 *
layers; ++ilayer) {
633 auto istr1 = std::to_string(ilayer);
634 while (istr1.size() < 2) {
635 istr1.insert(0,
"0");
640 if (ilayer < layers) {
641 istr2 = std::to_string(ilayer + 1) +
" in z-";
643 istr2 = std::to_string(ilayer - (layers - 1)) +
" in z+";
646 clusternum_in_multicluster_perlayer[ilayer] =
647 ibook.
book1D(
"clusternum_in_multicluster_perlayer" + istr1,
648 "Number of layer clusters in multicluster for layer " + istr2,
660 "number of multiclusters with 3 contiguous layers",
666 "number of multiclusters without 3 contiguous layers",
672 "total number of layer clusters in multicluster",
678 ibook.
bookProfile(
"clusternum_in_multicluster_vs_layer",
679 "Profile of 2d layer clusters in multicluster vs layer number",
687 "Multiplicity vs Layer cluster size in Multiclusters",
696 "multiplicity numberOfEventsHistogram",
702 ibook.
book1D(
"multiplicity_zminus_numberOfEventsHistogram",
703 "multiplicity numberOfEventsHistogram in z-",
709 ibook.
book1D(
"multiplicity_zplus_numberOfEventsHistogram",
710 "multiplicity numberOfEventsHistogram in z+",
716 ibook.
book2D(
"multiplicityOfLCinMCL_vs_layercluster_zminus",
717 "Multiplicity vs Layer number in z-",
726 ibook.
book2D(
"multiplicityOfLCinMCL_vs_layercluster_zplus",
727 "Multiplicity vs Layer number in z+",
736 ibook.
book2D(
"multiplicityOfLCinMCL_vs_layerclusterenergy",
737 "Multiplicity vs Layer cluster energy",
760 ibook.
book1D(
"multicluster_firstlayer",
"First layer of the multicluster", 2 * layers, 0., (
float)2 * layers));
762 ibook.
book1D(
"multicluster_lastlayer",
"Last layer of the multicluster", 2 * layers, 0., (
float)2 * layers));
764 "multicluster_layersnum",
"Number of layers of the multicluster", 2 * layers, 0., (
float)2 * layers));
813 std::vector<CaloParticle>
const& cP,
814 std::vector<size_t>
const& cPIndices,
815 std::map<DetId, const HGCRecHit*>
const& hitMap,
817 auto nLayerClusters = clusters.size();
819 auto nCaloParticles = cPIndices.size();
821 std::unordered_map<DetId, std::vector<HGVHistoProducerAlgo::detIdInfoInCluster>> detIdToCaloParticleId_Map;
822 std::unordered_map<DetId, std::vector<HGVHistoProducerAlgo::detIdInfoInCluster>> detIdToLayerClusterId_Map;
825 std::vector<std::vector<std::pair<unsigned int, float>>> cpsInLayerCluster;
826 cpsInLayerCluster.resize(nLayerClusters);
828 std::vector<std::vector<caloParticleOnLayer>> cPOnLayer;
829 cPOnLayer.resize(nCaloParticles);
830 for (
unsigned int i = 0;
i < nCaloParticles; ++
i) {
831 cPOnLayer[
i].resize(layers * 2);
832 for (
unsigned int j = 0;
j < layers * 2; ++
j) {
833 cPOnLayer[
i][
j].caloParticleId =
i;
834 cPOnLayer[
i][
j].energy = 0.f;
835 cPOnLayer[
i][
j].hits_and_fractions.clear();
839 for (
const auto& cpId : cPIndices) {
841 for (
const auto& it_sc : simClusterRefVector) {
844 for (
const auto& it_haf : hits_and_fractions) {
845 DetId hitid = (it_haf.first);
847 std::map<DetId, const HGCRecHit*>::const_iterator itcheck = hitMap.find(hitid);
848 if (itcheck != hitMap.end()) {
850 auto hit_find_it = detIdToCaloParticleId_Map.find(hitid);
851 if (hit_find_it == detIdToCaloParticleId_Map.end()) {
852 detIdToCaloParticleId_Map[hitid] = std::vector<HGVHistoProducerAlgo::detIdInfoInCluster>();
853 detIdToCaloParticleId_Map[hitid].emplace_back(
856 auto findHitIt =
std::find(detIdToCaloParticleId_Map[hitid].
begin(),
857 detIdToCaloParticleId_Map[hitid].
end(),
859 if (findHitIt != detIdToCaloParticleId_Map[hitid].
end()) {
860 findHitIt->fraction += it_haf.second;
862 detIdToCaloParticleId_Map[hitid].emplace_back(
866 cPOnLayer[cpId][cpLayerId].energy += it_haf.second * hit->
energy();
873 auto& haf = cPOnLayer[cpId][cpLayerId].hits_and_fractions;
874 auto found = std::find_if(
875 std::begin(haf),
std::end(haf), [&hitid](
const std::pair<DetId, float>&
v) {
return v.first == hitid; });
876 if (
found != haf.end()) {
877 found->second += it_haf.second;
879 cPOnLayer[cpId][cpLayerId].hits_and_fractions.emplace_back(hitid, it_haf.second);
886 LogDebug(
"HGCalValidator") <<
"cPOnLayer INFO" << std::endl;
887 for (
size_t cp = 0;
cp < cPOnLayer.size(); ++
cp) {
888 LogDebug(
"HGCalValidator") <<
"For CaloParticle Idx: " <<
cp <<
" we have: " << std::endl;
889 for (
size_t cpp = 0; cpp < cPOnLayer[
cp].size(); ++cpp) {
890 LogDebug(
"HGCalValidator") <<
" On Layer: " << cpp <<
" we have:" << std::endl;
891 LogDebug(
"HGCalValidator") <<
" CaloParticleIdx: " << cPOnLayer[
cp][cpp].caloParticleId << std::endl;
892 LogDebug(
"HGCalValidator") <<
" Energy: " << cPOnLayer[
cp][cpp].energy << std::endl;
893 double tot_energy = 0.;
894 for (
auto const& haf : cPOnLayer[
cp][cpp].hits_and_fractions) {
895 LogDebug(
"HGCalValidator") <<
" Hits/fraction/energy: " << (uint32_t)haf.first <<
"/" << haf.second <<
"/" 896 << haf.second * hitMap.at(haf.first)->energy() << std::endl;
897 tot_energy += haf.second * hitMap.at(haf.first)->energy();
899 LogDebug(
"HGCalValidator") <<
" Tot Sum haf: " << tot_energy << std::endl;
900 for (
auto const& lc : cPOnLayer[
cp][cpp].layerClusterIdToEnergyAndScore) {
901 LogDebug(
"HGCalValidator") <<
" lcIdx/energy/score: " << lc.first <<
"/" << lc.second.first <<
"/" 902 << lc.second.second << std::endl;
907 LogDebug(
"HGCalValidator") <<
"detIdToCaloParticleId_Map INFO" << std::endl;
908 for (
auto const&
cp : detIdToCaloParticleId_Map) {
909 LogDebug(
"HGCalValidator") <<
"For detId: " << (uint32_t)
cp.first
910 <<
" we have found the following connections with CaloParticles:" << std::endl;
911 for (
auto const& cpp :
cp.second) {
912 LogDebug(
"HGCalValidator") <<
" CaloParticle Id: " << cpp.clusterId <<
" with fraction: " << cpp.fraction
913 <<
" and energy: " << cpp.fraction * hitMap.at(
cp.first)->energy() << std::endl;
917 for (
unsigned int lcId = 0; lcId < nLayerClusters; ++lcId) {
918 const std::vector<std::pair<DetId, float>>& hits_and_fractions = clusters[lcId].hitsAndFractions();
919 unsigned int numberOfHitsInLC = hits_and_fractions.size();
929 std::vector<int> hitsToCaloParticleId(numberOfHitsInLC);
930 const auto firstHitDetId = hits_and_fractions[0].first;
935 int maxCPId_byNumberOfHits = -1;
937 unsigned int maxCPNumberOfHitsInLC = 0;
940 int maxCPId_byEnergy = -1;
942 float maxEnergySharedLCandCP = 0.f;
944 float energyFractionOfLCinCP = 0.f;
946 float energyFractionOfCPinLC = 0.f;
947 std::unordered_map<unsigned, unsigned> occurrencesCPinLC;
948 std::unordered_map<unsigned, float> CPEnergyInLC;
949 unsigned int numberOfNoiseHitsInLC = 0;
950 unsigned int numberOfHaloHitsInLC = 0;
952 for (
unsigned int hitId = 0; hitId < numberOfHitsInLC; hitId++) {
953 DetId rh_detid = hits_and_fractions[hitId].first;
954 auto rhFraction = hits_and_fractions[hitId].second;
956 std::map<DetId, const HGCRecHit*>::const_iterator itcheck = hitMap.find(rh_detid);
959 auto hit_find_in_LC = detIdToLayerClusterId_Map.find(rh_detid);
960 if (hit_find_in_LC == detIdToLayerClusterId_Map.end()) {
961 detIdToLayerClusterId_Map[rh_detid] = std::vector<HGVHistoProducerAlgo::detIdInfoInCluster>();
965 auto hit_find_in_CP = detIdToCaloParticleId_Map.find(rh_detid);
973 if (rhFraction == 0.) {
974 hitsToCaloParticleId[hitId] = -2;
975 numberOfHaloHitsInLC++;
977 if (hit_find_in_CP == detIdToCaloParticleId_Map.end()) {
978 hitsToCaloParticleId[hitId] -= 1;
980 auto maxCPEnergyInLC = 0.f;
982 for (
auto&
h : hit_find_in_CP->second) {
983 CPEnergyInLC[
h.clusterId] +=
h.fraction * hit->
energy();
984 cPOnLayer[
h.clusterId][lcLayerId].layerClusterIdToEnergyAndScore[lcId].first +=
h.fraction * hit->
energy();
985 cpsInLayerCluster[lcId].emplace_back(std::make_pair<int, float>(
h.clusterId, 0.f));
988 if (CPEnergyInLC[
h.clusterId] > maxCPEnergyInLC) {
989 maxCPEnergyInLC = CPEnergyInLC[
h.clusterId];
990 maxCPId =
h.clusterId;
993 hitsToCaloParticleId[hitId] = maxCPId;
996 hitsToCaloParticleId[hitId] > 0. ? 0. : hitsToCaloParticleId[hitId]);
999 for (
auto&
c : hitsToCaloParticleId) {
1001 numberOfNoiseHitsInLC++;
1003 occurrencesCPinLC[
c]++;
1007 for (
auto&
c : occurrencesCPinLC) {
1008 if (
c.second > maxCPNumberOfHitsInLC) {
1009 maxCPId_byNumberOfHits =
c.first;
1010 maxCPNumberOfHitsInLC =
c.second;
1014 for (
auto&
c : CPEnergyInLC) {
1015 if (
c.second > maxEnergySharedLCandCP) {
1016 maxCPId_byEnergy =
c.first;
1017 maxEnergySharedLCandCP =
c.second;
1020 float totalCPEnergyOnLayer = 0.f;
1021 if (maxCPId_byEnergy >= 0) {
1022 totalCPEnergyOnLayer = cPOnLayer[maxCPId_byEnergy][lcLayerId].energy;
1023 energyFractionOfCPinLC = maxEnergySharedLCandCP / totalCPEnergyOnLayer;
1024 if (clusters[lcId].
energy() > 0.
f) {
1025 energyFractionOfLCinCP = maxEnergySharedLCandCP / clusters[lcId].energy();
1028 LogDebug(
"HGCalValidator") << std::setw(10) <<
"LayerId:" 1029 <<
"\t" << std::setw(12) <<
"layerCluster" 1030 <<
"\t" << std::setw(10) <<
"lc energy" 1031 <<
"\t" << std::setw(5) <<
"nhits" 1032 <<
"\t" << std::setw(12) <<
"noise hits" 1033 <<
"\t" << std::setw(22) <<
"maxCPId_byNumberOfHits" 1034 <<
"\t" << std::setw(8) <<
"nhitsCP" 1035 <<
"\t" << std::setw(13) <<
"maxCPId_byEnergy" 1036 <<
"\t" << std::setw(20) <<
"maxEnergySharedLCandCP" 1037 <<
"\t" << std::setw(22) <<
"totalCPEnergyOnLayer" 1038 <<
"\t" << std::setw(22) <<
"energyFractionOfLCinCP" 1039 <<
"\t" << std::setw(25) <<
"energyFractionOfCPinLC" 1042 LogDebug(
"HGCalValidator") << std::setw(10) << lcLayerId <<
"\t" << std::setw(12) << lcId <<
"\t" << std::setw(10)
1043 << clusters[lcId].energy() <<
"\t" << std::setw(5) << numberOfHitsInLC <<
"\t" 1044 << std::setw(12) << numberOfNoiseHitsInLC <<
"\t" << std::setw(22)
1045 << maxCPId_byNumberOfHits <<
"\t" << std::setw(8) << maxCPNumberOfHitsInLC <<
"\t" 1046 << std::setw(13) << maxCPId_byEnergy <<
"\t" << std::setw(20) << maxEnergySharedLCandCP
1047 <<
"\t" << std::setw(22) << totalCPEnergyOnLayer <<
"\t" << std::setw(22)
1048 << energyFractionOfLCinCP <<
"\t" << std::setw(25) << energyFractionOfCPinLC <<
"\n";
1051 LogDebug(
"HGCalValidator") <<
"Improved cPOnLayer INFO" << std::endl;
1052 for (
size_t cp = 0;
cp < cPOnLayer.size(); ++
cp) {
1053 LogDebug(
"HGCalValidator") <<
"For CaloParticle Idx: " <<
cp <<
" we have: " << std::endl;
1054 for (
size_t cpp = 0; cpp < cPOnLayer[
cp].size(); ++cpp) {
1055 LogDebug(
"HGCalValidator") <<
" On Layer: " << cpp <<
" we have:" << std::endl;
1056 LogDebug(
"HGCalValidator") <<
" CaloParticleIdx: " << cPOnLayer[
cp][cpp].caloParticleId << std::endl;
1057 LogDebug(
"HGCalValidator") <<
" Energy: " << cPOnLayer[
cp][cpp].energy << std::endl;
1058 double tot_energy = 0.;
1059 for (
auto const& haf : cPOnLayer[
cp][cpp].hits_and_fractions) {
1060 LogDebug(
"HGCalValidator") <<
" Hits/fraction/energy: " << (uint32_t)haf.first <<
"/" << haf.second <<
"/" 1061 << haf.second * hitMap.at(haf.first)->energy() << std::endl;
1062 tot_energy += haf.second * hitMap.at(haf.first)->energy();
1064 LogDebug(
"HGCalValidator") <<
" Tot Sum haf: " << tot_energy << std::endl;
1065 for (
auto const& lc : cPOnLayer[
cp][cpp].layerClusterIdToEnergyAndScore) {
1066 LogDebug(
"HGCalValidator") <<
" lcIdx/energy/score: " << lc.first <<
"/" << lc.second.first <<
"/" 1067 << lc.second.second << std::endl;
1072 LogDebug(
"HGCalValidator") <<
"Improved detIdToCaloParticleId_Map INFO" << std::endl;
1073 for (
auto const&
cp : detIdToCaloParticleId_Map) {
1074 LogDebug(
"HGCalValidator") <<
"For detId: " << (uint32_t)
cp.first
1075 <<
" we have found the following connections with CaloParticles:" << std::endl;
1076 for (
auto const& cpp :
cp.second) {
1077 LogDebug(
"HGCalValidator") <<
" CaloParticle Id: " << cpp.clusterId <<
" with fraction: " << cpp.fraction
1078 <<
" and energy: " << cpp.fraction * hitMap.at(
cp.first)->energy() << std::endl;
1082 for (
unsigned int lcId = 0; lcId < nLayerClusters; ++lcId) {
1084 std::sort(cpsInLayerCluster[lcId].
begin(), cpsInLayerCluster[lcId].
end());
1086 cpsInLayerCluster[lcId].erase(
last, cpsInLayerCluster[lcId].
end());
1087 const std::vector<std::pair<DetId, float>>& hits_and_fractions = clusters[lcId].hitsAndFractions();
1088 unsigned int numberOfHitsInLC = hits_and_fractions.size();
1089 auto firstHitDetId = hits_and_fractions[0].first;
1093 if (clusters[lcId].
energy() == 0. && !cpsInLayerCluster[lcId].empty()) {
1094 for (
auto& cpPair : cpsInLayerCluster[lcId]) {
1096 LogDebug(
"HGCalValidator") <<
"layerCluster Id: \t" << lcId <<
"\t CP id: \t" << cpPair.first <<
"\t score \t" 1097 << cpPair.second <<
"\n";
1104 float invLayerClusterEnergyWeight = 0.f;
1105 for (
auto const& haf : clusters[lcId].hitsAndFractions()) {
1106 invLayerClusterEnergyWeight +=
1107 (haf.second * hitMap.at(haf.first)->energy()) * (haf.second * hitMap.at(haf.first)->energy());
1109 invLayerClusterEnergyWeight = 1.f / invLayerClusterEnergyWeight;
1111 for (
unsigned int i = 0;
i < numberOfHitsInLC; ++
i) {
1112 DetId rh_detid = hits_and_fractions[
i].first;
1113 float rhFraction = hits_and_fractions[
i].second;
1114 bool hitWithNoCP =
false;
1116 auto hit_find_in_CP = detIdToCaloParticleId_Map.find(rh_detid);
1117 if (hit_find_in_CP == detIdToCaloParticleId_Map.end())
1119 auto itcheck = hitMap.find(rh_detid);
1123 for (
auto& cpPair : cpsInLayerCluster[lcId]) {
1124 float cpFraction = 0.f;
1126 auto findHitIt =
std::find(detIdToCaloParticleId_Map[rh_detid].
begin(),
1127 detIdToCaloParticleId_Map[rh_detid].
end(),
1129 if (findHitIt != detIdToCaloParticleId_Map[rh_detid].
end())
1130 cpFraction = findHitIt->fraction;
1133 (rhFraction - cpFraction) * (rhFraction - cpFraction) * hitEnergyWeight * invLayerClusterEnergyWeight;
1137 if (cpsInLayerCluster[lcId].
empty())
1138 LogDebug(
"HGCalValidator") <<
"layerCluster Id: \t" << lcId <<
"\tCP id:\t-1 " 1142 for (
auto& cpPair : cpsInLayerCluster[lcId]) {
1143 LogDebug(
"HGCalValidator") <<
"layerCluster Id: \t" << lcId <<
"\t CP id: \t" << cpPair.first <<
"\t score \t" 1144 << cpPair.second <<
"\n";
1146 auto const& cp_linked = cPOnLayer[cpPair.first][lcLayerId].layerClusterIdToEnergyAndScore[lcId];
1148 cp_linked.first / clusters[lcId].energy(), clusters[lcId].energy());
1150 cpPair.second, cp_linked.first / clusters[lcId].energy());
1163 auto best = std::min_element(
std::begin(cpsInLayerCluster[lcId]),
1165 [](
const auto& obj1,
const auto& obj2) {
return obj1.second < obj2.second; });
1166 auto const& best_cp_linked = cPOnLayer[best->first][lcLayerId].layerClusterIdToEnergyAndScore[lcId];
1168 clusters[lcId].
eta(), best_cp_linked.first / clusters[lcId].energy());
1170 clusters[lcId].
phi(), best_cp_linked.first / clusters[lcId].energy());
1176 for (
const auto& cpId : cPIndices) {
1177 for (
unsigned int layerId = 0; layerId < layers * 2; ++layerId) {
1178 unsigned int CPNumberOfHits = cPOnLayer[cpId][layerId].hits_and_fractions.size();
1179 float CPenergy = cPOnLayer[cpId][layerId].energy;
1180 if (CPNumberOfHits == 0)
1182 int lcWithMaxEnergyInCP = -1;
1183 float maxEnergyLCinCP = 0.f;
1184 float CPEnergyFractionInLC = 0.f;
1185 for (
auto& lc : cPOnLayer[cpId][layerId].layerClusterIdToEnergyAndScore) {
1186 if (lc.second.first > maxEnergyLCinCP) {
1187 maxEnergyLCinCP = lc.second.first;
1188 lcWithMaxEnergyInCP = lc.first;
1192 CPEnergyFractionInLC = maxEnergyLCinCP / CPenergy;
1194 LogDebug(
"HGCalValidator") << std::setw(8) <<
"LayerId:\t" << std::setw(12) <<
"caloparticle\t" << std::setw(15)
1195 <<
"cp total energy\t" << std::setw(15) <<
"cpEnergyOnLayer\t" << std::setw(14)
1196 <<
"CPNhitsOnLayer\t" << std::setw(18) <<
"lcWithMaxEnergyInCP\t" << std::setw(15)
1197 <<
"maxEnergyLCinCP\t" << std::setw(20) <<
"CPEnergyFractionInLC" 1199 LogDebug(
"HGCalValidator") << std::setw(8) << layerId <<
"\t" << std::setw(12) << cpId <<
"\t" << std::setw(15)
1200 << cP[cpId].energy() <<
"\t" << std::setw(15) << CPenergy <<
"\t" << std::setw(14)
1201 << CPNumberOfHits <<
"\t" << std::setw(18) << lcWithMaxEnergyInCP <<
"\t" 1202 << std::setw(15) << maxEnergyLCinCP <<
"\t" << std::setw(20) << CPEnergyFractionInLC
1206 float invCPEnergyWeight = 0.f;
1207 for (
auto const& haf : cPOnLayer[cpId][layerId].hits_and_fractions) {
1208 invCPEnergyWeight +=
1209 (haf.second * hitMap.at(haf.first)->energy()) * (haf.second * hitMap.at(haf.first)->energy());
1211 invCPEnergyWeight = 1.f / invCPEnergyWeight;
1213 for (
unsigned int i = 0;
i < CPNumberOfHits; ++
i) {
1214 auto& cp_hitDetId = cPOnLayer[cpId][layerId].hits_and_fractions[
i].first;
1215 auto& cpFraction = cPOnLayer[cpId][layerId].hits_and_fractions[
i].second;
1217 bool hitWithNoLC =
false;
1218 if (cpFraction == 0.
f)
1220 auto hit_find_in_LC = detIdToLayerClusterId_Map.find(cp_hitDetId);
1221 if (hit_find_in_LC == detIdToLayerClusterId_Map.end())
1223 auto itcheck = hitMap.find(cp_hitDetId);
1226 for (
auto& lcPair : cPOnLayer[cpId][layerId].layerClusterIdToEnergyAndScore) {
1227 unsigned int layerClusterId = lcPair.first;
1228 float lcFraction = 0.f;
1231 auto findHitIt =
std::find(detIdToLayerClusterId_Map[cp_hitDetId].
begin(),
1232 detIdToLayerClusterId_Map[cp_hitDetId].
end(),
1234 if (findHitIt != detIdToLayerClusterId_Map[cp_hitDetId].
end())
1235 lcFraction = findHitIt->fraction;
1240 lcPair.second.second +=
1241 (lcFraction - cpFraction) * (lcFraction - cpFraction) * hitEnergyWeight * invCPEnergyWeight;
1242 LogDebug(
"HGCalValidator") <<
"cpDetId:\t" << (uint32_t)cp_hitDetId <<
"\tlayerClusterId:\t" << layerClusterId
1244 <<
"lcfraction,cpfraction:\t" << lcFraction <<
", " << cpFraction <<
"\t" 1245 <<
"hitEnergyWeight:\t" << hitEnergyWeight <<
"\t" 1246 <<
"current score:\t" << lcPair.second.second <<
"\t" 1247 <<
"invCPEnergyWeight:\t" << invCPEnergyWeight <<
"\n";
1251 if (cPOnLayer[cpId][layerId].layerClusterIdToEnergyAndScore.empty())
1252 LogDebug(
"HGCalValidator") <<
"CP Id: \t" << cpId <<
"\tLC id:\t-1 " 1256 for (
auto& lcPair : cPOnLayer[cpId][layerId].layerClusterIdToEnergyAndScore) {
1257 LogDebug(
"HGCalValidator") <<
"CP Id: \t" << cpId <<
"\t LC id: \t" << lcPair.first <<
"\t score \t" 1258 << lcPair.second.second <<
"\t" 1259 <<
"shared energy:\t" << lcPair.second.first <<
"\t" 1260 <<
"shared energy fraction:\t" << (lcPair.second.first / CPenergy) <<
"\n";
1265 lcPair.second.first / CPenergy);
1267 auto assoc = std::count_if(
std::begin(cPOnLayer[cpId][layerId].layerClusterIdToEnergyAndScore),
1268 std::end(cPOnLayer[cpId][layerId].layerClusterIdToEnergyAndScore),
1277 auto best = std::min_element(
1278 std::begin(cPOnLayer[cpId][layerId].layerClusterIdToEnergyAndScore),
1279 std::end(cPOnLayer[cpId][layerId].layerClusterIdToEnergyAndScore),
1280 [](
const auto& obj1,
const auto& obj2) {
return obj1.second.second < obj2.second.second; });
1282 cP[cpId].g4Tracks()[0].momentum().
eta(), best->second.first / CPenergy);
1284 cP[cpId].g4Tracks()[0].momentum().
phi(), best->second.first / CPenergy);
1296 std::vector<CaloParticle>
const& cP,
1297 std::vector<size_t>
const& cPIndices,
1298 std::map<DetId, const HGCRecHit*>
const& hitMap,
1299 std::map<double, double> cummatbudg,
1301 std::vector<int> thicknesses)
const {
1310 std::vector<int> tnlcpl(1000, 0);
1313 std::map<std::string, int> tnlcpthplus;
1314 tnlcpthplus.clear();
1315 std::map<std::string, int> tnlcpthminus;
1316 tnlcpthminus.clear();
1318 for (std::vector<int>::iterator it = thicknesses.begin(); it != thicknesses.end(); ++it) {
1319 tnlcpthplus.insert(std::pair<std::string, int>(std::to_string(*it), 0));
1320 tnlcpthminus.insert(std::pair<std::string, int>(std::to_string(*it), 0));
1323 tnlcpthplus.insert(std::pair<std::string, int>(
"mixed", 0));
1324 tnlcpthminus.insert(std::pair<std::string, int>(
"mixed", 0));
1330 std::vector<double> tecpl(1000, 0.0);
1332 std::vector<double> ldbar(1000, 0.0);
1335 double caloparteneplus = 0.;
1336 double caloparteneminus = 0.;
1337 for (
const auto& cpId : cPIndices) {
1338 if (cP[cpId].
eta() >= 0.) {
1339 caloparteneplus = caloparteneplus + cP[cpId].energy();
1341 if (cP[cpId].
eta() < 0.) {
1342 caloparteneminus = caloparteneminus + cP[cpId].energy();
1347 for (
unsigned int layerclusterIndex = 0; layerclusterIndex < clusters.size(); layerclusterIndex++) {
1348 const std::vector<std::pair<DetId, float>> hits_and_fractions = clusters[layerclusterIndex].hitsAndFractions();
1350 const DetId seedid = clusters[layerclusterIndex].seed();
1351 const double seedx =
recHitTools_->getPosition(seedid).x();
1352 const double seedy =
recHitTools_->getPosition(seedid).y();
1360 int nthhits120p = 0;
1361 int nthhits200p = 0;
1362 int nthhits300p = 0;
1363 int nthhitsscintp = 0;
1364 int nthhits120m = 0;
1365 int nthhits200m = 0;
1366 int nthhits300m = 0;
1367 int nthhitsscintm = 0;
1378 bool cluslay =
true;
1382 for (std::vector<std::pair<DetId, float>>::const_iterator it_haf = hits_and_fractions.begin();
1383 it_haf != hits_and_fractions.end();
1385 const DetId rh_detid = it_haf->first;
1395 LogDebug(
"HGCalValidator") <<
"These are HGCal layer clusters, you shouldn't be here !!! " << layerid <<
"\n";
1400 std::string curistr = std::to_string((
int)thickness);
1402 while (lay_string.size() < 2)
1403 lay_string.insert(0,
"0");
1404 curistr +=
"_" + lay_string;
1411 if ((thickness == 120.) && (
recHitTools_->zside(rh_detid) > 0.)) {
1413 }
else if ((thickness == 120.) && (
recHitTools_->zside(rh_detid) < 0.)) {
1415 }
else if ((thickness == 200.) && (
recHitTools_->zside(rh_detid) > 0.)) {
1417 }
else if ((thickness == 200.) && (
recHitTools_->zside(rh_detid) < 0.)) {
1419 }
else if ((thickness == 300.) && (
recHitTools_->zside(rh_detid) > 0.)) {
1421 }
else if ((thickness == 300.) && (
recHitTools_->zside(rh_detid) < 0.)) {
1423 }
else if ((thickness == -1) && (
recHitTools_->zside(rh_detid) > 0.)) {
1425 }
else if ((thickness == -1) && (
recHitTools_->zside(rh_detid) < 0.)) {
1429 <<
" You are running a geometry that contains thicknesses different than the normal ones. " 1433 std::map<DetId, const HGCRecHit*>::const_iterator itcheck = hitMap.find(rh_detid);
1434 if (itcheck == hitMap.end()) {
1435 LogDebug(
"HGCalValidator") <<
" You shouldn't be here - Unable to find a hit " << rh_detid.
rawId() <<
" " 1444 const double hit_x =
recHitTools_->getPosition(rh_detid).x();
1445 const double hit_y =
recHitTools_->getPosition(rh_detid).y();
1446 double distancetoseed =
distance(seedx, seedy, hit_x, hit_y);
1447 double distancetomax =
distance(maxx, maxy, hit_x, hit_y);
1465 std::map<DetId, float>::const_iterator dit = densities.find(rh_detid);
1466 if (dit == densities.end()) {
1467 LogDebug(
"HGCalValidator") <<
" You shouldn't be here - Unable to find a density " << rh_detid.
rawId() <<
" " 1479 if ((nthhits120p != 0 && nthhits200p != 0) || (nthhits120p != 0 && nthhits300p != 0) ||
1480 (nthhits120p != 0 && nthhitsscintp != 0) || (nthhits200p != 0 && nthhits300p != 0) ||
1481 (nthhits200p != 0 && nthhitsscintp != 0) || (nthhits300p != 0 && nthhitsscintp != 0)) {
1482 tnlcpthplus[
"mixed"]++;
1483 }
else if ((nthhits120p != 0 || nthhits200p != 0 || nthhits300p != 0 || nthhitsscintp != 0)) {
1485 tnlcpthplus[std::to_string((
int)thickness)]++;
1487 if ((nthhits120m != 0 && nthhits200m != 0) || (nthhits120m != 0 && nthhits300m != 0) ||
1488 (nthhits120m != 0 && nthhitsscintm != 0) || (nthhits200m != 0 && nthhits300m != 0) ||
1489 (nthhits200m != 0 && nthhitsscintm != 0) || (nthhits300m != 0 && nthhitsscintm != 0)) {
1490 tnlcpthminus[
"mixed"]++;
1491 }
else if ((nthhits120m != 0 || nthhits200m != 0 || nthhits300m != 0 || nthhitsscintm != 0)) {
1493 tnlcpthminus[std::to_string((
int)thickness)]++;
1497 std::vector<int> bigamoth;
1500 bigamoth.push_back(nthhits120p);
1501 bigamoth.push_back(nthhits200p);
1502 bigamoth.push_back(nthhits300p);
1503 bigamoth.push_back(nthhitsscintp);
1506 bigamoth.push_back(nthhits120m);
1507 bigamoth.push_back(nthhits200m);
1508 bigamoth.push_back(nthhits300m);
1509 bigamoth.push_back(nthhitsscintm);
1511 auto bgth = std::max_element(bigamoth.begin(), bigamoth.end());
1512 istr = std::to_string(thicknesses[
std::distance(bigamoth.begin(), bgth)]);
1514 while (lay_string.size() < 2)
1515 lay_string.insert(0,
"0");
1516 istr +=
"_" + lay_string;
1524 double distancebetseedandmax =
distance(seedx, seedy, maxx, maxy);
1526 std::string seedstr = std::to_string((
int)
recHitTools_->getSiThickness(seedid)) +
"_" + std::to_string(layerid);
1527 seedstr +=
"_" + lay_string;
1533 distancebetseedandmax, clusters[layerclusterIndex].
energy());
1537 tecpl[layerid] = tecpl[layerid] + clusters[layerclusterIndex].energy();
1538 ldbar[layerid] = ldbar[layerid] + clusters[layerclusterIndex].energy() * cummatbudg[(double)lay];
1544 double sumeneallcluspl = 0.;
1545 double sumeneallclusmi = 0.;
1547 double sumldbarpl = 0.;
1548 double sumldbarmi = 0.;
1550 for (
unsigned ilayer = 0; ilayer < layers * 2; ++ilayer) {
1556 if (ilayer < layers) {
1558 if (caloparteneminus != 0.) {
1563 sumeneallclusmi = sumeneallclusmi + tecpl[ilayer];
1565 sumldbarmi = sumldbarmi + ldbar[ilayer];
1568 if (caloparteneplus != 0.) {
1573 sumeneallcluspl = sumeneallcluspl + tecpl[ilayer];
1575 sumldbarpl = sumldbarpl + ldbar[ilayer];
1581 for (std::vector<int>::iterator it = thicknesses.begin(); it != thicknesses.end(); ++it) {
1592 if (caloparteneplus != 0.) {
1595 if (caloparteneminus != 0.) {
1606 const std::vector<reco::HGCalMultiCluster>& multiClusters,
1607 std::vector<CaloParticle>
const& cP,
1608 std::vector<size_t>
const& cPIndices,
1609 std::map<DetId, const HGCRecHit*>
const& hitMap,
1611 auto nMultiClusters = multiClusters.size();
1613 auto nCaloParticles = cPIndices.size();
1615 std::unordered_map<DetId, std::vector<HGVHistoProducerAlgo::detIdInfoInCluster>> detIdToCaloParticleId_Map;
1616 std::unordered_map<DetId, std::vector<HGVHistoProducerAlgo::detIdInfoInMultiCluster>> detIdToMultiClusterId_Map;
1617 std::vector<int> tracksters_fakemerge(nMultiClusters, 0);
1618 std::vector<int> tracksters_duplicate(nMultiClusters, 0);
1623 std::vector<std::vector<std::pair<unsigned int, float>>> cpsInMultiCluster;
1624 cpsInMultiCluster.resize(nMultiClusters);
1633 std::vector<std::vector<caloParticleOnLayer>> cPOnLayer;
1634 cPOnLayer.resize(nCaloParticles);
1635 for (
unsigned int i = 0;
i < nCaloParticles; ++
i) {
1636 cPOnLayer[
i].resize(layers * 2);
1637 for (
unsigned int j = 0;
j < layers * 2; ++
j) {
1638 cPOnLayer[
i][
j].caloParticleId =
i;
1639 cPOnLayer[
i][
j].energy = 0.f;
1640 cPOnLayer[
i][
j].hits_and_fractions.clear();
1644 for (
const auto& cpId : cPIndices) {
1648 for (
const auto& it_sc : simClusterRefVector) {
1651 for (
const auto& it_haf : hits_and_fractions) {
1652 DetId hitid = (it_haf.first);
1656 std::map<DetId, const HGCRecHit*>::const_iterator itcheck = hitMap.find(hitid);
1658 if (itcheck != hitMap.end()) {
1667 auto hit_find_it = detIdToCaloParticleId_Map.find(hitid);
1668 if (hit_find_it == detIdToCaloParticleId_Map.end()) {
1669 detIdToCaloParticleId_Map[hitid] = std::vector<HGVHistoProducerAlgo::detIdInfoInCluster>();
1670 detIdToCaloParticleId_Map[hitid].emplace_back(
1673 auto findHitIt =
std::find(detIdToCaloParticleId_Map[hitid].
begin(),
1674 detIdToCaloParticleId_Map[hitid].
end(),
1676 if (findHitIt != detIdToCaloParticleId_Map[hitid].
end()) {
1677 findHitIt->fraction += it_haf.second;
1679 detIdToCaloParticleId_Map[hitid].emplace_back(
1686 cPOnLayer[cpId][cpLayerId].energy += it_haf.second * hit->
energy();
1693 auto& haf = cPOnLayer[cpId][cpLayerId].hits_and_fractions;
1694 auto found = std::find_if(
1695 std::begin(haf),
std::end(haf), [&hitid](
const std::pair<DetId, float>&
v) {
return v.first == hitid; });
1696 if (
found != haf.end()) {
1697 found->second += it_haf.second;
1699 cPOnLayer[cpId][cpLayerId].hits_and_fractions.emplace_back(hitid, it_haf.second);
1707 for (
unsigned int mclId = 0; mclId < nMultiClusters; ++mclId) {
1708 const auto& hits_and_fractions = multiClusters[mclId].hitsAndFractions();
1710 std::unordered_map<unsigned, float> CPEnergyInMCL;
1711 int maxCPId_byNumberOfHits = -1;
1712 unsigned int maxCPNumberOfHitsInMCL = 0;
1713 int maxCPId_byEnergy = -1;
1714 float maxEnergySharedMCLandCP = 0.f;
1715 float energyFractionOfMCLinCP = 0.f;
1716 float energyFractionOfCPinMCL = 0.f;
1723 std::unordered_map<unsigned, unsigned> occurrencesCPinMCL;
1724 unsigned int numberOfNoiseHitsInMCL = 0;
1725 unsigned int numberOfHaloHitsInMCL = 0;
1726 unsigned int numberOfHitsInMCL = 0;
1729 unsigned int numberOfHitsInLC = hits_and_fractions.size();
1730 numberOfHitsInMCL += numberOfHitsInLC;
1731 std::unordered_map<unsigned, float> CPEnergyInLC;
1750 std::vector<int> hitsToCaloParticleId(numberOfHitsInLC);
1753 const auto firstHitDetId = hits_and_fractions[0].first;
1758 for (
unsigned int hitId = 0; hitId < numberOfHitsInLC; hitId++) {
1759 DetId rh_detid = hits_and_fractions[hitId].first;
1760 auto rhFraction = hits_and_fractions[hitId].second;
1763 std::map<DetId, const HGCRecHit*>::const_iterator itcheck = hitMap.find(rh_detid);
1773 auto hit_find_in_LC = detIdToMultiClusterId_Map.find(rh_detid);
1774 if (hit_find_in_LC == detIdToMultiClusterId_Map.end()) {
1775 detIdToMultiClusterId_Map[rh_detid] = std::vector<HGVHistoProducerAlgo::detIdInfoInMultiCluster>();
1777 detIdToMultiClusterId_Map[rh_detid].emplace_back(
1781 auto hit_find_in_CP = detIdToCaloParticleId_Map.find(rh_detid);
1789 if (rhFraction == 0.) {
1790 hitsToCaloParticleId[hitId] = -2;
1791 numberOfHaloHitsInMCL++;
1793 if (hit_find_in_CP == detIdToCaloParticleId_Map.end()) {
1794 hitsToCaloParticleId[hitId] -= 1;
1796 auto maxCPEnergyInLC = 0.f;
1798 for (
auto&
h : hit_find_in_CP->second) {
1799 auto shared_fraction =
std::min(rhFraction,
h.fraction);
1804 CPEnergyInMCL[
h.clusterId] += shared_fraction * hit->
energy();
1806 CPEnergyInLC[
h.clusterId] += shared_fraction * hit->
energy();
1809 cPOnLayer[
h.clusterId][lcLayerId].layerClusterIdToEnergyAndScore[mclId].first +=
1810 shared_fraction * hit->
energy();
1813 cpsInMultiCluster[mclId].emplace_back(std::make_pair<int, float>(
h.clusterId, 0.f));
1816 if (shared_fraction > maxCPEnergyInLC) {
1818 maxCPEnergyInLC = CPEnergyInLC[
h.clusterId];
1819 maxCPId =
h.clusterId;
1823 hitsToCaloParticleId[hitId] = maxCPId;
1830 for (
auto&
c : hitsToCaloParticleId) {
1832 numberOfNoiseHitsInMCL++;
1834 occurrencesCPinMCL[
c]++;
1840 for (
auto&
c : occurrencesCPinMCL) {
1841 if (
c.second > maxCPNumberOfHitsInMCL) {
1842 maxCPId_byNumberOfHits =
c.first;
1843 maxCPNumberOfHitsInMCL =
c.second;
1848 for (
auto&
c : CPEnergyInMCL) {
1849 if (
c.second > maxEnergySharedMCLandCP) {
1850 maxCPId_byEnergy =
c.first;
1851 maxEnergySharedMCLandCP =
c.second;
1855 float totalCPEnergyFromLayerCP = 0.f;
1856 if (maxCPId_byEnergy >= 0) {
1858 for (
unsigned int j = 0;
j < layers * 2; ++
j) {
1859 totalCPEnergyFromLayerCP = totalCPEnergyFromLayerCP + cPOnLayer[maxCPId_byEnergy][
j].energy;
1861 energyFractionOfCPinMCL = maxEnergySharedMCLandCP / totalCPEnergyFromLayerCP;
1862 if (multiClusters[mclId].
energy() > 0.
f) {
1863 energyFractionOfMCLinCP = maxEnergySharedMCLandCP / multiClusters[mclId].energy();
1867 LogDebug(
"HGCalValidator") << std::setw(12) <<
"multiCluster" 1869 << std::setw(10) <<
"mulcl energy" 1870 <<
"\t" << std::setw(5) <<
"nhits" 1871 <<
"\t" << std::setw(12) <<
"noise hits" 1872 <<
"\t" << std::setw(22) <<
"maxCPId_byNumberOfHits" 1873 <<
"\t" << std::setw(8) <<
"nhitsCP" 1874 <<
"\t" << std::setw(16) <<
"maxCPId_byEnergy" 1875 <<
"\t" << std::setw(23) <<
"maxEnergySharedMCLandCP" 1876 <<
"\t" << std::setw(22) <<
"totalCPEnergyFromAllLayerCP" 1877 <<
"\t" << std::setw(22) <<
"energyFractionOfMCLinCP" 1878 <<
"\t" << std::setw(25) <<
"energyFractionOfCPinMCL" 1879 <<
"\t" << std::endl;
1880 LogDebug(
"HGCalValidator") << std::setw(12) << mclId <<
"\t" 1881 << std::setw(10) << multiClusters[mclId].energy() <<
"\t" << std::setw(5)
1882 << numberOfHitsInMCL <<
"\t" << std::setw(12) << numberOfNoiseHitsInMCL <<
"\t" 1883 << std::setw(22) << maxCPId_byNumberOfHits <<
"\t" << std::setw(8)
1884 << maxCPNumberOfHitsInMCL <<
"\t" << std::setw(16) << maxCPId_byEnergy <<
"\t" 1885 << std::setw(23) << maxEnergySharedMCLandCP <<
"\t" << std::setw(22)
1886 << totalCPEnergyFromLayerCP <<
"\t" << std::setw(22) << energyFractionOfMCLinCP <<
"\t" 1887 << std::setw(25) << energyFractionOfCPinMCL << std::endl;
1892 for (
unsigned int mclId = 0; mclId < nMultiClusters; ++mclId) {
1893 const auto& hits_and_fractions = multiClusters[mclId].hitsAndFractions();
1897 std::sort(cpsInMultiCluster[mclId].
begin(), cpsInMultiCluster[mclId].
end());
1899 cpsInMultiCluster[mclId].erase(
last, cpsInMultiCluster[mclId].
end());
1901 if (multiClusters[mclId].
energy() == 0. && !cpsInMultiCluster[mclId].
empty()) {
1903 for (
auto& cpPair : cpsInMultiCluster[mclId]) {
1910 LogDebug(
"HGCalValidator") <<
"multiCluster Id: \t" << mclId <<
"\t CP id: \t" << cpPair.first <<
"\t score \t" 1911 << cpPair.second << std::endl;
1918 float invMultiClusterEnergyWeight = 0.f;
1919 for (
auto const& haf : multiClusters[mclId].hitsAndFractions()) {
1920 invMultiClusterEnergyWeight +=
1921 (haf.second * hitMap.at(haf.first)->energy()) * (haf.second * hitMap.at(haf.first)->energy());
1923 invMultiClusterEnergyWeight = 1.f / invMultiClusterEnergyWeight;
1925 unsigned int numberOfHitsInLC = hits_and_fractions.size();
1926 for (
unsigned int i = 0;
i < numberOfHitsInLC; ++
i) {
1927 DetId rh_detid = hits_and_fractions[
i].first;
1928 float rhFraction = hits_and_fractions[
i].second;
1929 bool hitWithNoCP =
false;
1931 auto hit_find_in_CP = detIdToCaloParticleId_Map.find(rh_detid);
1932 if (hit_find_in_CP == detIdToCaloParticleId_Map.end())
1934 auto itcheck = hitMap.find(rh_detid);
1938 for (
auto& cpPair : cpsInMultiCluster[mclId]) {
1939 float cpFraction = 0.f;
1941 auto findHitIt =
std::find(detIdToCaloParticleId_Map[rh_detid].
begin(),
1942 detIdToCaloParticleId_Map[rh_detid].
end(),
1944 if (findHitIt != detIdToCaloParticleId_Map[rh_detid].
end()) {
1945 cpFraction = findHitIt->fraction;
1949 (rhFraction - cpFraction) * (rhFraction - cpFraction) * hitEnergyWeight * invMultiClusterEnergyWeight;
1954 if (cpsInMultiCluster[mclId].
empty())
1955 LogDebug(
"HGCalValidator") <<
"multiCluster Id: \t" << mclId <<
"\tCP id:\t-1 " 1960 std::end(cpsInMultiCluster[mclId]),
1961 [](
const auto& obj1,
const auto& obj2) {
return obj1.second < obj2.second; });
1962 for (
auto& cpPair : cpsInMultiCluster[mclId]) {
1967 LogDebug(
"HGCalValidator") <<
"multiCluster Id: \t" << mclId <<
"\t CP id: \t" << cpPair.first <<
"\t score \t" 1968 << cpPair.second << std::endl;
1969 if (cpPair.first ==
score->first) {
1972 float sharedeneCPallLayers = 0.;
1974 for (
unsigned int j = 0;
j < layers * 2; ++
j) {
1975 auto const& cp_linked = cPOnLayer[cpPair.first][
j].layerClusterIdToEnergyAndScore[mclId];
1976 sharedeneCPallLayers += cp_linked.first;
1978 LogDebug(
"HGCalValidator") <<
"sharedeneCPallLayers " << sharedeneCPallLayers << std::endl;
1979 if (cpPair.first ==
score->first) {
1981 multiClusters[mclId].
energy());
1983 score->second, sharedeneCPallLayers / multiClusters[mclId].energy());
1987 auto assocFakeMerge = std::count_if(
std::begin(cpsInMultiCluster[mclId]),
1988 std::end(cpsInMultiCluster[mclId]),
1990 tracksters_fakemerge[mclId] = assocFakeMerge;
1995 std::vector<std::vector<float>> score3d;
1996 score3d.resize(nCaloParticles);
1997 std::vector<std::vector<float>> mclsharedenergy;
1998 mclsharedenergy.resize(nCaloParticles);
1999 std::vector<std::vector<float>> mclsharedenergyfrac;
2000 mclsharedenergyfrac.resize(nCaloParticles);
2002 for (
unsigned int i = 0;
i < nCaloParticles; ++
i) {
2003 score3d[
i].resize(nMultiClusters);
2004 mclsharedenergy[
i].resize(nMultiClusters);
2005 mclsharedenergyfrac[
i].resize(nMultiClusters);
2006 for (
unsigned int j = 0;
j < nMultiClusters; ++
j) {
2007 score3d[
i][
j] = 0.f;
2008 mclsharedenergy[
i][
j] = 0.f;
2009 mclsharedenergyfrac[
i][
j] = 0.f;
2014 for (
const auto& cpId : cPIndices) {
2017 std::vector<unsigned int> cpId_mclId_related;
2018 cpId_mclId_related.clear();
2020 float CPenergy = 0.f;
2021 for (
unsigned int layerId = 0; layerId < layers * 2; ++layerId) {
2022 unsigned int CPNumberOfHits = cPOnLayer[cpId][layerId].hits_and_fractions.size();
2024 CPenergy += cPOnLayer[cpId][layerId].energy;
2025 if (CPNumberOfHits == 0)
2027 int mclWithMaxEnergyInCP = -1;
2029 float maxEnergyMCLperlayerinCP = 0.f;
2030 float CPEnergyFractionInMCLperlayer = 0.f;
2032 for (
auto& mcl : cPOnLayer[cpId][layerId].layerClusterIdToEnergyAndScore) {
2033 if (mcl.second.first > maxEnergyMCLperlayerinCP) {
2034 maxEnergyMCLperlayerinCP = mcl.second.first;
2035 mclWithMaxEnergyInCP = mcl.first;
2039 CPEnergyFractionInMCLperlayer = maxEnergyMCLperlayerinCP / CPenergy;
2041 LogDebug(
"HGCalValidator") << std::setw(8) <<
"LayerId:\t" << std::setw(12) <<
"caloparticle\t" << std::setw(15)
2042 <<
"cp total energy\t" << std::setw(15) <<
"cpEnergyOnLayer\t" << std::setw(14)
2043 <<
"CPNhitsOnLayer\t" << std::setw(18) <<
"mclWithMaxEnergyInCP\t" << std::setw(15)
2044 <<
"maxEnergyMCLinCP\t" << std::setw(20) <<
"CPEnergyFractionInMCL" 2046 LogDebug(
"HGCalValidator") << std::setw(8) << layerId <<
"\t" << std::setw(12) << cpId <<
"\t" << std::setw(15)
2047 << cP[cpId].energy() <<
"\t" << std::setw(15) << CPenergy <<
"\t" << std::setw(14)
2048 << CPNumberOfHits <<
"\t" << std::setw(18) << mclWithMaxEnergyInCP <<
"\t" 2049 << std::setw(15) << maxEnergyMCLperlayerinCP <<
"\t" << std::setw(20)
2050 << CPEnergyFractionInMCLperlayer <<
"\n";
2052 for (
unsigned int i = 0;
i < CPNumberOfHits; ++
i) {
2053 auto& cp_hitDetId = cPOnLayer[cpId][layerId].hits_and_fractions[
i].first;
2054 auto& cpFraction = cPOnLayer[cpId][layerId].hits_and_fractions[
i].second;
2056 bool hitWithNoMCL =
false;
2057 if (cpFraction == 0.
f)
2059 auto hit_find_in_MCL = detIdToMultiClusterId_Map.find(cp_hitDetId);
2060 if (hit_find_in_MCL == detIdToMultiClusterId_Map.end())
2061 hitWithNoMCL =
true;
2062 auto itcheck = hitMap.find(cp_hitDetId);
2065 for (
auto& lcPair : cPOnLayer[cpId][layerId].layerClusterIdToEnergyAndScore) {
2066 unsigned int multiClusterId = lcPair.first;
2069 cpId_mclId_related.push_back(multiClusterId);
2071 float mclFraction = 0.f;
2073 if (!hitWithNoMCL) {
2074 auto findHitIt =
std::find(detIdToMultiClusterId_Map[cp_hitDetId].
begin(),
2075 detIdToMultiClusterId_Map[cp_hitDetId].
end(),
2077 if (findHitIt != detIdToMultiClusterId_Map[cp_hitDetId].
end())
2078 mclFraction = findHitIt->fraction;
2086 lcPair.second.second += fabs(mclFraction - cpFraction) * (hit->
energy());
2087 LogDebug(
"HGCalValidator") <<
"multiClusterId:\t" << multiClusterId <<
"\t" 2088 <<
"mclfraction,cpfraction:\t" << mclFraction <<
", " << cpFraction <<
"\t" 2089 <<
"hitEnergyWeight:\t" << hitEnergyWeight <<
"\t" 2090 <<
"currect score numerator:\t" << lcPair.second.second <<
"\n";
2094 if (cPOnLayer[cpId][layerId].layerClusterIdToEnergyAndScore.empty())
2095 LogDebug(
"HGCalValidator") <<
"CP Id: \t" << cpId <<
"\t MCL id:\t-1 " 2096 <<
"\t layer \t " << layerId <<
" Sub score in \t -1" 2099 for (
auto& lcPair : cPOnLayer[cpId][layerId].layerClusterIdToEnergyAndScore) {
2101 score3d[cpId][lcPair.first] += lcPair.second.second;
2102 mclsharedenergy[cpId][lcPair.first] += lcPair.second.first;
2110 float invCPEnergyWeight = 0.f;
2111 for (
const auto& layer : cPOnLayer[cpId]) {
2112 for (
const auto& haf : layer.hits_and_fractions) {
2113 invCPEnergyWeight +=
2114 (haf.second * hitMap.at(haf.first)->energy()) * (haf.second * hitMap.at(haf.first)->energy());
2117 invCPEnergyWeight = 1.f / invCPEnergyWeight;
2121 std::vector<int> cpId_mclId_related_vec(cpId_mclId_related.begin(), cpId_mclId_related.end());
2122 for (
unsigned int i = 0;
i < cpId_mclId_related_vec.size(); ++
i) {
2123 auto mclId = cpId_mclId_related_vec[
i];
2125 score3d[cpId][mclId] = score3d[cpId][mclId] * invCPEnergyWeight;
2126 mclsharedenergyfrac[cpId][mclId] = (mclsharedenergy[cpId][mclId] / CPenergy);
2128 LogDebug(
"HGCalValidator") <<
"CP Id: \t" << cpId <<
"\t MCL id: \t" << mclId <<
"\t score \t" 2129 << score3d[cpId][mclId] <<
"\t" 2130 <<
"invCPEnergyWeight \t" << invCPEnergyWeight <<
"\t" 2131 <<
"shared energy:\t" << mclsharedenergy[cpId][mclId] <<
"\t" 2132 <<
"shared energy fraction:\t" << mclsharedenergyfrac[cpId][mclId] <<
"\n";
2138 mclsharedenergyfrac[cpId][mclId]);
2143 auto assocDup = std::count_if(
std::begin(score3d[cpId]),
std::end(score3d[cpId]), is_assoc);
2152 multiClusters[bestmclId].
energy() / CPenergy);
2154 multiClusters[bestmclId].
energy() / CPenergy);
2156 if (assocDup >= 2) {
2158 while (
match != score3d[cpId].
end()) {
2168 for (
unsigned int mclId = 0; mclId < nMultiClusters; ++mclId) {
2169 auto assocFakeMerge = tracksters_fakemerge[mclId];
2170 auto assocDuplicate = tracksters_duplicate[mclId];
2171 if (assocDuplicate) {
2175 if (assocFakeMerge > 0) {
2178 auto best = std::min_element(
std::begin(cpsInMultiCluster[mclId]),
2179 std::end(cpsInMultiCluster[mclId]),
2180 [](
const auto& obj1,
const auto& obj2) {
return obj1.second < obj2.second; });
2183 float sharedeneCPallLayers = 0.;
2185 for (
unsigned int j = 0;
j < layers * 2; ++
j) {
2186 auto const& best_cp_linked = cPOnLayer[best->first][
j].layerClusterIdToEnergyAndScore[mclId];
2187 sharedeneCPallLayers += best_cp_linked.first;
2190 multiClusters[mclId].
eta(), sharedeneCPallLayers / multiClusters[mclId].
energy());
2192 multiClusters[mclId].
phi(), sharedeneCPallLayers / multiClusters[mclId].
energy());
2194 if (assocFakeMerge >= 2) {
2206 const std::vector<reco::HGCalMultiCluster>& multiClusters,
2207 std::vector<CaloParticle>
const& cP,
2208 std::vector<size_t>
const& cPIndices,
2209 std::map<DetId, const HGCRecHit*>
const& hitMap,
2218 int tncontmclpz = 0;
2219 int tncontmclmz = 0;
2221 int tnnoncontmclpz = 0;
2222 int tnnoncontmclmz = 0;
2224 std::vector<bool> contmulti;
2228 std::unordered_map<unsigned int, std::vector<unsigned int>> multiplicity;
2230 std::unordered_map<unsigned int, std::vector<unsigned int>> multiplicity_vs_layer;
2237 auto nMultiClusters = multiClusters.size();
2239 for (
unsigned int mclId = 0; mclId < nMultiClusters; ++mclId) {
2240 const auto layerClusters = multiClusters[mclId].clusters();
2241 auto nLayerClusters = layerClusters.size();
2242 if (multiClusters[mclId].
z() < 0.) {
2245 if (multiClusters[mclId].
z() > 0.) {
2254 std::vector<int> tnlcinmclperlay(1000, 0);
2258 std::set<int> multicluster_layers;
2260 bool multiclusterInZplus =
false;
2261 bool multiclusterInZminus =
false;
2264 for (
unsigned int lcId = 0; lcId < nLayerClusters; ++lcId) {
2266 const std::vector<std::pair<DetId, float>>& hits_and_fractions = layerClusters[lcId]->hitsAndFractions();
2269 multiplicity[mclId].emplace_back(hits_and_fractions.size());
2271 const auto firstHitDetId = hits_and_fractions[0].first;
2273 int layerid =
recHitTools_->getLayerWithOffset(firstHitDetId) +
2274 layers * ((
recHitTools_->zside(firstHitDetId) + 1) >> 1) - 1;
2275 multicluster_layers.insert(layerid);
2276 multiplicity_vs_layer[mclId].emplace_back(layerid);
2278 tnlcinmclperlay[layerid]++;
2282 multiclusterInZplus =
true;
2285 multiclusterInZminus =
true;
2291 for (
unsigned ilayer = 0; ilayer < layers * 2; ++ilayer) {
2296 if (tnlcinmclperlay[ilayer] != 0) {
2302 std::vector<int> multicluster_layers_vec(multicluster_layers.begin(), multicluster_layers.end());
2304 bool contimulti =
false;
2306 for (
unsigned int i = 1;
i < multicluster_layers_vec.size() - 1; ++
i) {
2307 if ((multicluster_layers_vec[
i - 1] + 1 == multicluster_layers_vec[
i]) &&
2308 (multicluster_layers_vec[i + 1] - 1 == multicluster_layers_vec[
i])) {
2310 if (multiclusterInZplus) {
2313 if (multiclusterInZminus) {
2322 if (multiclusterInZplus) {
2325 if (multiclusterInZminus) {
2331 contmulti.push_back(contimulti);
2335 for (
unsigned int lc = 0; lc < multiplicity[mclId].size(); ++lc) {
2346 if (multiplicity_vs_layer[mclId][lc] < layers) {
2351 mlp, multiplicity_vs_layer[mclId][lc] - layers);
2379 if (tncontmclpz != 0) {
2383 if (tncontmclmz != 0) {
2387 if (tnnoncontmclpz != 0) {
2391 if (tnnoncontmclmz != 0) {
2401 const double y2)
const {
2402 const double dx = x1 -
x2;
2403 const double dy = y1 -
y2;
2404 return (dx * dx + dy * dy);
2409 const double y2)
const {
2418 std::map<DetId, const HGCRecHit*>
const& hitMap)
const {
2420 const std::vector<std::pair<DetId, float>>& hits_and_fractions = cluster.
hitsAndFractions();
2423 for (std::vector<std::pair<DetId, float>>::const_iterator it_haf = hits_and_fractions.begin();
2424 it_haf != hits_and_fractions.end();
2426 DetId rh_detid = it_haf->first;
2428 std::map<DetId, const HGCRecHit*>::const_iterator itcheck = hitMap.find(rh_detid);
2431 if (maxene < hit->
energy()) {
2433 themaxid = rh_detid;
constexpr float energy() const
std::vector< dqm::reco::MonitorElement * > h_longdepthbarycentre_zplus
std::vector< dqm::reco::MonitorElement * > h_sharedenergy_caloparticle2multicl_vs_phi
MonitorElement * book1D(TString const &name, TString const &title, int const nchX, double const lowX, double const highX)
std::vector< dqm::reco::MonitorElement * > h_numMerge_multicl_eta
std::vector< dqm::reco::MonitorElement * > h_energyclustered_zminus
FWCore Framework interface EventSetupRecordImplementation h
Helper function to determine trigger accepts.
dqm::reco::MonitorElement * lastLayerEEzm
std::unordered_map< int, dqm::reco::MonitorElement * > h_clusternum_perlayer
std::vector< dqm::reco::MonitorElement * > h_multiplicityOfLCinMCL_vs_layercluster_zplus
std::vector< dqm::reco::MonitorElement * > h_sharedenergy_multicl2caloparticle_vs_phi
std::vector< dqm::reco::MonitorElement * > h_sharedenergy_caloparticle2multicl
std::unordered_map< int, dqm::reco::MonitorElement * > h_denom_caloparticle_eta_perlayer
std::vector< dqm::reco::MonitorElement * > h_energy_vs_score_multicl2caloparticle
std::vector< dqm::reco::MonitorElement * > h_multicluster_x
std::vector< dqm::reco::MonitorElement * > h_multicluster_phi
double minDisToSeedperthickperlayerenewei_
std::vector< dqm::reco::MonitorElement * > h_denom_multicl_phi
std::unordered_map< int, dqm::reco::MonitorElement * > h_energy_vs_score_layercl2caloparticle_perlayer
double maxMCLSharedEneFrac_
std::unordered_map< std::string, dqm::reco::MonitorElement * > h_distancetomaxcell_perthickperlayer_eneweighted
int nintCellsEneDensperthick_
int nintClEneperthickperlayer_
std::vector< dqm::reco::MonitorElement * > h_multiplicity_zplus_numberOfEventsHistogram
std::vector< std::unordered_map< int, dqm::reco::MonitorElement * > > h_clusternum_in_multicluster_perlayer
void bookClusterHistos(DQMStore::IBooker &ibook, Histograms &histograms, unsigned layers, std::vector< int > thicknesses, std::string pathtomatbudfile)
std::unordered_map< int, dqm::reco::MonitorElement * > h_caloparticle_energy
std::vector< dqm::reco::MonitorElement * > h_num_multicl_eta
dqm::reco::MonitorElement * maxlayerzp
void setRecHitTools(std::shared_ptr< hgcal::RecHitTools > recHitTools)
std::vector< dqm::reco::MonitorElement * > h_multiplicity_numberOfEventsHistogram
std::unordered_map< int, dqm::reco::MonitorElement * > h_denom_layercl_eta_perlayer
std::vector< dqm::reco::MonitorElement * > h_denom_caloparticle_phi
std::vector< dqm::reco::MonitorElement * > h_mixedhitscluster_zplus
constexpr uint32_t rawId() const
get the raw id
std::unordered_map< int, dqm::reco::MonitorElement * > h_num_caloparticle_eta_perlayer
std::unordered_map< int, dqm::reco::MonitorElement * > h_sharedenergy_layercl2caloparticle_perlayer
std::vector< dqm::reco::MonitorElement * > h_multiplicity_zminus_numberOfEventsHistogram
std::unordered_map< int, dqm::reco::MonitorElement * > h_sharedenergy_layercl2caloparticle_vs_eta_perlayer
std::unordered_map< int, dqm::reco::MonitorElement * > h_energy_vs_score_caloparticle2layercl_perlayer
int nintDisToMaxperthickperlayerenewei_
std::unordered_map< int, dqm::reco::MonitorElement * > h_sharedenergy_caloparticle2layercl_vs_phi_perlayer
std::unordered_map< int, dqm::reco::MonitorElement * > h_caloparticle_pt
const std::vector< SimTrack > & g4Tracks() const
std::vector< dqm::reco::MonitorElement * > h_sharedenergy_multicl2caloparticle_vs_eta
float eta() const
Momentum pseudorapidity. Note this is taken from the simtrack before the calorimeter.
std::unordered_map< int, dqm::reco::MonitorElement * > h_numDup_caloparticle_eta_perlayer
void find(edm::Handle< EcalRecHitCollection > &hits, DetId thisDet, std::vector< EcalRecHitCollection::const_iterator > &hit, bool debug=false)
std::unordered_map< int, dqm::reco::MonitorElement * > h_cellsenedens_perthick
std::unordered_map< int, dqm::reco::MonitorElement * > h_sharedenergy_layercl2caloparticle_vs_phi_perlayer
void fill_info_histos(const Histograms &histograms, unsigned layers) const
void bookMultiClusterHistos(DQMStore::IBooker &ibook, Histograms &histograms, unsigned layers)
std::vector< dqm::reco::MonitorElement * > h_multiplicityOfLCinMCL_vs_layerclusterenergy
int nintDisToMaxperthickperlayer_
std::vector< dqm::reco::MonitorElement * > h_numDup_multicl_eta
std::vector< dqm::reco::MonitorElement * > h_cluster_eta
void bookInfo(DQMStore::IBooker &ibook, Histograms &histograms)
double eta() const
pseudorapidity of cluster centroid
std::vector< dqm::reco::MonitorElement * > h_energyclustered_zplus
void layerClusters_to_CaloParticles(const Histograms &histograms, const reco::CaloClusterCollection &clusters, std::vector< CaloParticle > const &cP, std::vector< size_t > const &cPIndices, std::map< DetId, const HGCRecHit * > const &, unsigned layers) const
void fill_multi_cluster_histos(const Histograms &histograms, int count, const std::vector< reco::HGCalMultiCluster > &multiClusters, std::vector< CaloParticle > const &cP, std::vector< size_t > const &cPIndices, std::map< DetId, const HGCRecHit * > const &, unsigned layers) const
std::unordered_map< std::string, dqm::reco::MonitorElement * > h_cellsnum_perthickperlayer
std::vector< dqm::reco::MonitorElement * > h_multiplicityOfLCinMCL_vs_layercluster_zminus
std::vector< dqm::reco::MonitorElement * > h_multicluster_firstlayer
double distance(const double x1, const double y1, const double x2, const double y2) const
std::vector< dqm::reco::MonitorElement * > h_denom_multicl_eta
double maxTotNClsinMCLsperlayer_
std::unordered_map< std::string, dqm::reco::MonitorElement * > h_distancebetseedandmaxcell_perthickperlayer
hgcal_clustering::Density Density
const std::vector< std::pair< DetId, float > > & hitsAndFractions() const
std::vector< dqm::reco::MonitorElement * > h_longdepthbarycentre_zminus
std::unordered_map< std::string, dqm::reco::MonitorElement * > h_distancebetseedandmaxcellvsclusterenergy_perthickperlayer
void fill_caloparticle_histos(const Histograms &histograms, int pdgid, const CaloParticle &caloparticle, std::vector< SimVertex > const &simVertices) const
std::unordered_map< int, dqm::reco::MonitorElement * > h_energyclustered_perlayer
std::vector< dqm::reco::MonitorElement * > h_mixedhitscluster_zminus
const double ScoreCutCPtoMCLDup_
Monte Carlo truth information used for tracking validation.
std::vector< dqm::reco::MonitorElement * > h_contmulticlusternum
std::unordered_map< int, dqm::reco::MonitorElement * > h_clusternum_perthick
std::unordered_map< int, dqm::reco::MonitorElement * > h_sharedenergy_caloparticle2layercl_perlayer
double minClEnepermultiplicity_
def unique(seq, keepstr=True)
double maxMixedHitsCluster_
MonitorElement * bookProfile(TString const &name, TString const &title, int nchX, double lowX, double highX, int nchY, double lowY, double highY, char const *option="s")
void bookCaloParticleHistos(DQMStore::IBooker &ibook, Histograms &histograms, int pdgid)
std::unordered_map< int, dqm::reco::MonitorElement * > h_caloparticle_phi
float energy() const
Energy. Note this is taken from the first SimTrack only.
double minDisSeedToMaxperthickperlayer_
std::vector< dqm::reco::MonitorElement * > h_multiplicityOfLCinMCL
int nintDisToSeedperthickperlayerenewei_
dqm::reco::MonitorElement * maxlayerzm
std::vector< CaloCluster > CaloClusterCollection
collection of CaloCluster objects
double minDisToMaxperthickperlayer_
std::vector< dqm::reco::MonitorElement * > h_num_caloparticle_phi
double getEta(double eta) const
dqm::reco::MonitorElement * lastLayerEEzp
double maxDisToMaxperthickperlayer_
std::vector< dqm::reco::MonitorElement * > h_multicluster_z
const double ScoreCutLCtoCP_
std::unordered_map< std::string, dqm::reco::MonitorElement * > h_distancetomaxcell_perthickperlayer
DetId findmaxhit(const reco::CaloCluster &cluster, std::map< DetId, const HGCRecHit * > const &) const
double maxDisToSeedperthickperlayer_
std::vector< dqm::reco::MonitorElement * > h_clusternum_in_multicluster
std::unordered_map< int, dqm::reco::MonitorElement * > h_num_layercl_eta_perlayer
std::vector< dqm::reco::MonitorElement * > h_numMerge_multicl_phi
std::vector< dqm::reco::MonitorElement * > h_sharedenergy_caloparticle2multicl_vs_eta
double distance2(const double x1, const double y1, const double x2, const double y2) const
void multiClusters_to_CaloParticles(const Histograms &histograms, int count, const std::vector< reco::HGCalMultiCluster > &multiClusters, std::vector< CaloParticle > const &cP, std::vector< size_t > const &cPIndices, std::map< DetId, const HGCRecHit * > const &, unsigned layers) const
std::vector< dqm::reco::MonitorElement * > h_multicluster_y
std::vector< dqm::reco::MonitorElement * > h_clusternum_in_multicluster_vs_layer
double maxTotNcellsperthickperlayer_
const double ScoreCutMCLtoCPFakeMerge_
double maxDisSeedToMaxperthickperlayer_
double minDisToSeedperthickperlayer_
std::unordered_map< int, dqm::reco::MonitorElement * > h_numDup_caloparticle_phi_perlayer
std::vector< dqm::reco::MonitorElement * > h_denom_caloparticle_eta
std::unordered_map< int, dqm::reco::MonitorElement * > h_num_layercl_phi_perlayer
double maxDisToSeedperthickperlayerenewei_
std::shared_ptr< hgcal::RecHitTools > recHitTools_
int nintTotNClsinMCLsperlayer_
std::vector< dqm::reco::MonitorElement * > h_sharedenergy_multicl2caloparticle
std::unordered_map< int, dqm::reco::MonitorElement * > h_num_caloparticle_phi_perlayer
double minTotNClsperthick_
std::vector< dqm::reco::MonitorElement * > h_multiclusternum
std::unordered_map< int, dqm::reco::MonitorElement * > h_caloparticle_eta_Zorigin
void fill_cluster_histos(const Histograms &histograms, int count, const reco::CaloCluster &cluster) const
float pt() const
Transverse momentum. Note this is taken from the first SimTrack only.
dqm::reco::MonitorElement * lastLayerFHzm
void fill_generic_cluster_histos(const Histograms &histograms, int count, const reco::CaloClusterCollection &clusters, const Density &densities, std::vector< CaloParticle > const &cP, std::vector< size_t > const &cPIndices, std::map< DetId, const HGCRecHit * > const &, std::map< double, double > cummatbudg, unsigned layers, std::vector< int > thicknesses) const
dqm::reco::MonitorElement * lastLayerFHzp
std::vector< dqm::reco::MonitorElement * > h_multicluster_layersnum
std::unordered_map< std::string, dqm::reco::MonitorElement * > h_distancetoseedcell_perthickperlayer_eneweighted
float phi() const
Momentum azimuthal angle. Note this is taken from the first SimTrack only.
int nintDisSeedToMaxperthickperlayer_
std::unordered_map< int, dqm::reco::MonitorElement * > h_denom_caloparticle_phi_perlayer
std::vector< dqm::reco::MonitorElement * > h_score_multicl2caloparticle
double minTotNcellsperthickperlayer_
std::unordered_map< int, dqm::reco::MonitorElement * > h_sharedenergy_caloparticle2layercl_vs_eta_perlayer
double minClEneperthickperlayer_
std::vector< dqm::reco::MonitorElement * > h_num_multicl_phi
MonitorElement * book2D(TString const &name, TString const &title, int nchX, double lowX, double highX, int nchY, double lowY, double highY)
static int position[264][3]
std::vector< dqm::reco::MonitorElement * > h_noncontmulticlusternum
double minDisToMaxperthickperlayerenewei_
std::vector< dqm::reco::MonitorElement * > h_numDup_multicl_phi
int nintClEnepermultiplicity_
std::vector< dqm::reco::MonitorElement * > h_score_caloparticle2multicl
double maxTotNClsperthick_
double maxClEnepermultiplicity_
std::pair< typename Association::data_type::first_type, double > match(Reference key, Association association, bool bestMatchByMaxValue)
Generic matching function.
std::unordered_map< int, dqm::reco::MonitorElement * > h_cellAssociation_perlayer
double minMCLSharedEneFrac_
std::vector< dqm::reco::MonitorElement * > h_multicluster_energy
std::unordered_map< std::string, dqm::reco::MonitorElement * > h_distancetoseedcell_perthickperlayer
std::unordered_map< int, dqm::reco::MonitorElement * > h_denom_layercl_phi_perlayer
std::unordered_map< int, dqm::reco::MonitorElement * > h_caloparticle_eta
std::vector< dqm::reco::MonitorElement * > h_multicluster_eta
double minTotNClsinMCLsperlayer_
double maxCellsEneDensperthick_
std::vector< dqm::reco::MonitorElement * > h_multicluster_pt
double maxDisToMaxperthickperlayerenewei_
const double ScoreCutCPtoLC_
int nintMixedHitsCluster_
double minMixedHitsCluster_
double maxClEneperthickperlayer_
int nintDisToSeedperthickperlayer_
std::unordered_map< int, dqm::reco::MonitorElement * > h_score_layercl2caloparticle_perlayer
std::vector< dqm::reco::MonitorElement * > h_energy_vs_score_caloparticle2multicl
std::unordered_map< int, dqm::reco::MonitorElement * > h_score_caloparticle2layercl_perlayer
int nintTotNcellsperthickperlayer_
MonitorElement * bookInt(TString const &name)
HGVHistoProducerAlgo(const edm::ParameterSet &pset)
std::unordered_map< int, dqm::reco::MonitorElement * > h_numMerge_layercl_eta_perlayer
std::vector< std::pair< uint32_t, float > > hits_and_fractions() const
Returns list of rechit IDs and fractions for this SimCluster.
std::unordered_map< int, dqm::reco::MonitorElement * > h_numMerge_layercl_phi_perlayer
std::vector< dqm::reco::MonitorElement * > h_num_caloparticle_eta
constexpr Detector det() const
get the detector field from this detid
double minCellsEneDensperthick_
std::vector< dqm::reco::MonitorElement * > h_multicluster_lastlayer