Back to home page

Project CMSSW displayed by LXR

 
 

    


File indexing completed on 2023-06-02 00:51:02

0001 #ifndef Validation_HGCalValidation_HGVHistoProducerAlgo_h
0002 #define Validation_HGCalValidation_HGVHistoProducerAlgo_h
0003 
0004 /* \author HGCal
0005  */
0006 
0007 #include <iostream>
0008 #include <fstream>
0009 #include <vector>
0010 #include <unordered_map>
0011 
0012 #include "FWCore/Framework/interface/ConsumesCollector.h"
0013 #include "FWCore/ParameterSet/interface/ParameterSet.h"
0014 #include "FWCore/Framework/interface/EventSetup.h"
0015 
0016 #include "DataFormats/CaloRecHit/interface/CaloClusterFwd.h"
0017 #include "DataFormats/HGCRecHit/interface/HGCRecHitCollections.h"
0018 #include "DataFormats/ForwardDetId/interface/HFNoseDetId.h"
0019 #include "DataFormats/ForwardDetId/interface/HGCSiliconDetId.h"
0020 #include "DataFormats/ForwardDetId/interface/HGCScintillatorDetId.h"
0021 #include "DataFormats/HGCRecHit/interface/HGCRecHit.h"
0022 #include "DataFormats/HGCalReco/interface/Trackster.h"
0023 
0024 #include "RecoLocalCalo/HGCalRecAlgos/interface/RecHitTools.h"
0025 #include "SimDataFormats/CaloAnalysis/interface/CaloParticle.h"
0026 #include "SimDataFormats/Vertex/interface/SimVertex.h"
0027 #include "RecoLocalCalo/HGCalRecProducers/interface/HGCalClusteringAlgoBase.h"
0028 #include "SimDataFormats/Associations/interface/LayerClusterToCaloParticleAssociatorBaseImpl.h"
0029 #include "SimDataFormats/Associations/interface/LayerClusterToSimClusterAssociatorBaseImpl.h"
0030 
0031 #include "DQMServices/Core/interface/DQMStore.h"
0032 
0033 struct HGVHistoProducerAlgoHistograms {
0034   //Info
0035   //To be able to spot any issues both in -z and +z a layer id was introduced
0036   //that spans from 0 to 103 for hgcal_v9 geometry. The mapping for hgcal_v9 is:
0037   //-z: 0->51
0038   //+z: 52->103
0039   //We will pick the numbers below from RecHitTools just to avoid future problems
0040   dqm::reco::MonitorElement* lastLayerEEzm;  // last layer of EE -z
0041   dqm::reco::MonitorElement* lastLayerFHzm;  // last layer of FH -z
0042   dqm::reco::MonitorElement* maxlayerzm;     // last layer of BH -z
0043   dqm::reco::MonitorElement* lastLayerEEzp;  // last layer of EE +z
0044   dqm::reco::MonitorElement* lastLayerFHzp;  // last layer of FH +z
0045   dqm::reco::MonitorElement* maxlayerzp;     // last layer of BH +z
0046 
0047   //1D
0048   std::vector<dqm::reco::MonitorElement*> h_cluster_eta;
0049   std::vector<dqm::reco::MonitorElement*> h_mixedhitscluster_zminus;
0050   std::vector<dqm::reco::MonitorElement*> h_mixedhitscluster_zplus;
0051   std::vector<dqm::reco::MonitorElement*> h_energyclustered_zminus;
0052   std::vector<dqm::reco::MonitorElement*> h_energyclustered_zplus;
0053   std::vector<dqm::reco::MonitorElement*> h_longdepthbarycentre_zminus;
0054   std::vector<dqm::reco::MonitorElement*> h_longdepthbarycentre_zplus;
0055 
0056   std::unordered_map<int, dqm::reco::MonitorElement*> h_clusternum_perlayer;
0057   std::unordered_map<int, dqm::reco::MonitorElement*> h_energyclustered_perlayer;
0058   std::unordered_map<int, dqm::reco::MonitorElement*> h_score_layercl2caloparticle_perlayer;
0059   std::unordered_map<int, dqm::reco::MonitorElement*> h_score_caloparticle2layercl_perlayer;
0060   std::unordered_map<int, dqm::reco::MonitorElement*> h_energy_vs_score_caloparticle2layercl_perlayer;
0061   std::unordered_map<int, dqm::reco::MonitorElement*> h_energy_vs_score_layercl2caloparticle_perlayer;
0062   std::unordered_map<int, dqm::reco::MonitorElement*> h_sharedenergy_caloparticle2layercl_perlayer;
0063   std::unordered_map<int, dqm::reco::MonitorElement*> h_sharedenergy_caloparticle2layercl_vs_eta_perlayer;
0064   std::unordered_map<int, dqm::reco::MonitorElement*> h_sharedenergy_caloparticle2layercl_vs_phi_perlayer;
0065   std::unordered_map<int, dqm::reco::MonitorElement*> h_sharedenergy_layercl2caloparticle_perlayer;
0066   std::unordered_map<int, dqm::reco::MonitorElement*> h_sharedenergy_layercl2caloparticle_vs_eta_perlayer;
0067   std::unordered_map<int, dqm::reco::MonitorElement*> h_sharedenergy_layercl2caloparticle_vs_phi_perlayer;
0068   std::unordered_map<int, dqm::reco::MonitorElement*> h_num_caloparticle_eta_perlayer;
0069   std::unordered_map<int, dqm::reco::MonitorElement*> h_numDup_caloparticle_eta_perlayer;
0070   std::unordered_map<int, dqm::reco::MonitorElement*> h_denom_caloparticle_eta_perlayer;
0071   std::unordered_map<int, dqm::reco::MonitorElement*> h_num_caloparticle_phi_perlayer;
0072   std::unordered_map<int, dqm::reco::MonitorElement*> h_numDup_caloparticle_phi_perlayer;
0073   std::unordered_map<int, dqm::reco::MonitorElement*> h_denom_caloparticle_phi_perlayer;
0074   std::unordered_map<int, dqm::reco::MonitorElement*> h_num_layercl_eta_perlayer;
0075   std::unordered_map<int, dqm::reco::MonitorElement*> h_numMerge_layercl_eta_perlayer;
0076   std::unordered_map<int, dqm::reco::MonitorElement*> h_denom_layercl_eta_perlayer;
0077   std::unordered_map<int, dqm::reco::MonitorElement*> h_num_layercl_phi_perlayer;
0078   std::unordered_map<int, dqm::reco::MonitorElement*> h_numMerge_layercl_phi_perlayer;
0079   std::unordered_map<int, dqm::reco::MonitorElement*> h_denom_layercl_phi_perlayer;
0080   std::unordered_map<int, dqm::reco::MonitorElement*> h_cellAssociation_perlayer;
0081   std::unordered_map<int, dqm::reco::MonitorElement*> h_clusternum_perthick;
0082   std::unordered_map<int, dqm::reco::MonitorElement*> h_cellsenedens_perthick;
0083 
0084   std::unordered_map<std::string, dqm::reco::MonitorElement*> h_cellsnum_perthickperlayer;
0085   std::unordered_map<std::string, dqm::reco::MonitorElement*> h_distancetoseedcell_perthickperlayer;
0086   std::unordered_map<std::string, dqm::reco::MonitorElement*> h_distancetoseedcell_perthickperlayer_eneweighted;
0087   std::unordered_map<std::string, dqm::reco::MonitorElement*> h_distancetomaxcell_perthickperlayer;
0088   std::unordered_map<std::string, dqm::reco::MonitorElement*> h_distancetomaxcell_perthickperlayer_eneweighted;
0089   std::unordered_map<std::string, dqm::reco::MonitorElement*> h_distancebetseedandmaxcell_perthickperlayer;
0090   std::unordered_map<std::string, dqm::reco::MonitorElement*>
0091       h_distancebetseedandmaxcellvsclusterenergy_perthickperlayer;
0092 
0093   std::unordered_map<int, dqm::reco::MonitorElement*> h_caloparticle_eta;
0094   std::unordered_map<int, dqm::reco::MonitorElement*> h_caloparticle_eta_Zorigin;
0095   std::unordered_map<int, dqm::reco::MonitorElement*> h_caloparticle_energy;
0096   std::unordered_map<int, dqm::reco::MonitorElement*> h_caloparticle_selfenergy;
0097   std::unordered_map<int, dqm::reco::MonitorElement*> h_caloparticle_energyDifference;
0098   std::unordered_map<int, dqm::reco::MonitorElement*> h_caloparticle_pt;
0099   std::unordered_map<int, dqm::reco::MonitorElement*> h_caloparticle_phi;
0100   std::unordered_map<int, dqm::reco::MonitorElement*> h_caloparticle_nSimClusters;
0101   std::unordered_map<int, dqm::reco::MonitorElement*> h_caloparticle_nHitsInSimClusters;
0102   std::unordered_map<int, dqm::reco::MonitorElement*> h_caloparticle_firstlayer;
0103   std::unordered_map<int, dqm::reco::MonitorElement*> h_caloparticle_lastlayer;
0104   std::unordered_map<int, dqm::reco::MonitorElement*> h_caloparticle_layersnum;
0105   std::unordered_map<int, dqm::reco::MonitorElement*> h_caloparticle_nHitsInSimClusters_matchedtoRecHit;
0106   std::unordered_map<int, dqm::reco::MonitorElement*> h_caloparticle_nHits_matched_energy;
0107   std::unordered_map<int, dqm::reco::MonitorElement*> h_caloparticle_nHits_matched_energy_layer;
0108   std::unordered_map<int, dqm::reco::MonitorElement*> h_caloparticle_nHits_matched_energy_layer_1SimCl;
0109   std::unordered_map<int, dqm::reco::MonitorElement*> h_caloparticle_sum_energy_layer;
0110   std::unordered_map<int, dqm::reco::MonitorElement*> h_caloparticle_firstlayer_matchedtoRecHit;
0111   std::unordered_map<int, dqm::reco::MonitorElement*> h_caloparticle_lastlayer_matchedtoRecHit;
0112   std::unordered_map<int, dqm::reco::MonitorElement*> h_caloparticle_layersnum_matchedtoRecHit;
0113   std::unordered_map<int, dqm::reco::MonitorElement*> h_caloparticle_fractions, h_caloparticle_fractions_weight;
0114 
0115   //For SimClusters
0116   std::unordered_map<int, dqm::reco::MonitorElement*> h_simclusternum_perlayer;
0117   std::unordered_map<int, dqm::reco::MonitorElement*> h_simclusternum_perthick;
0118   dqm::reco::MonitorElement* h_mixedhitssimcluster_zminus;
0119   dqm::reco::MonitorElement* h_mixedhitssimcluster_zplus;
0120 
0121   std::vector<std::unordered_map<int, dqm::reco::MonitorElement*>> h_denom_layercl_in_simcl_eta_perlayer;
0122   std::vector<std::unordered_map<int, dqm::reco::MonitorElement*>> h_denom_layercl_in_simcl_phi_perlayer;
0123   std::vector<std::unordered_map<int, dqm::reco::MonitorElement*>> h_score_layercl2simcluster_perlayer;
0124   std::vector<std::unordered_map<int, dqm::reco::MonitorElement*>> h_sharedenergy_layercl2simcluster_perlayer;
0125   std::vector<std::unordered_map<int, dqm::reco::MonitorElement*>> h_energy_vs_score_layercl2simcluster_perlayer;
0126   std::vector<std::unordered_map<int, dqm::reco::MonitorElement*>> h_num_layercl_in_simcl_eta_perlayer;
0127   std::vector<std::unordered_map<int, dqm::reco::MonitorElement*>> h_num_layercl_in_simcl_phi_perlayer;
0128   std::vector<std::unordered_map<int, dqm::reco::MonitorElement*>> h_numMerge_layercl_in_simcl_eta_perlayer;
0129   std::vector<std::unordered_map<int, dqm::reco::MonitorElement*>> h_numMerge_layercl_in_simcl_phi_perlayer;
0130   std::vector<std::unordered_map<int, dqm::reco::MonitorElement*>> h_sharedenergy_layercl2simcluster_vs_eta_perlayer;
0131   std::vector<std::unordered_map<int, dqm::reco::MonitorElement*>> h_sharedenergy_layercl2simcluster_vs_phi_perlayer;
0132   std::vector<std::unordered_map<int, dqm::reco::MonitorElement*>> h_denom_simcluster_eta_perlayer;
0133   std::vector<std::unordered_map<int, dqm::reco::MonitorElement*>> h_denom_simcluster_phi_perlayer;
0134   std::vector<std::unordered_map<int, dqm::reco::MonitorElement*>> h_score_simcluster2layercl_perlayer;
0135   std::vector<std::unordered_map<int, dqm::reco::MonitorElement*>> h_sharedenergy_simcluster2layercl_perlayer;
0136   std::vector<std::unordered_map<int, dqm::reco::MonitorElement*>> h_energy_vs_score_simcluster2layercl_perlayer;
0137   std::vector<std::unordered_map<int, dqm::reco::MonitorElement*>> h_num_simcluster_eta_perlayer;
0138   std::vector<std::unordered_map<int, dqm::reco::MonitorElement*>> h_num_simcluster_phi_perlayer;
0139   std::vector<std::unordered_map<int, dqm::reco::MonitorElement*>> h_numDup_simcluster_eta_perlayer;
0140   std::vector<std::unordered_map<int, dqm::reco::MonitorElement*>> h_numDup_simcluster_phi_perlayer;
0141   std::vector<std::unordered_map<int, dqm::reco::MonitorElement*>> h_sharedenergy_simcluster2layercl_vs_eta_perlayer;
0142   std::vector<std::unordered_map<int, dqm::reco::MonitorElement*>> h_sharedenergy_simcluster2layercl_vs_phi_perlayer;
0143 
0144   // For Tracksters
0145   // Linking and Pattern Recognition
0146   std::vector<dqm::reco::MonitorElement*> h_score_trackster2caloparticle[2];
0147   std::vector<dqm::reco::MonitorElement*> h_score_trackster2bestCaloparticle[2];
0148   std::vector<dqm::reco::MonitorElement*> h_score_trackster2bestCaloparticle2[2];
0149   std::vector<dqm::reco::MonitorElement*> h_score_caloparticle2trackster[2];
0150   std::vector<dqm::reco::MonitorElement*> h_scorePur_caloparticle2trackster[2];
0151   std::vector<dqm::reco::MonitorElement*> h_scoreDupl_caloparticle2trackster[2];
0152   std::vector<dqm::reco::MonitorElement*> h_energy_vs_score_trackster2caloparticle[2];
0153   std::vector<dqm::reco::MonitorElement*> h_energy_vs_score_trackster2bestCaloparticle[2];
0154   std::vector<dqm::reco::MonitorElement*> h_energy_vs_score_trackster2bestCaloparticle2[2];
0155   std::vector<dqm::reco::MonitorElement*> h_energy_vs_score_caloparticle2trackster[2];
0156   std::vector<dqm::reco::MonitorElement*> h_energy_vs_score_caloparticle2bestTrackster[2];
0157   std::vector<dqm::reco::MonitorElement*> h_energy_vs_score_caloparticle2bestTrackster2[2];
0158   std::vector<dqm::reco::MonitorElement*> h_num_trackster_eta[2];
0159   std::vector<dqm::reco::MonitorElement*> h_num_trackster_phi[2];
0160   std::vector<dqm::reco::MonitorElement*> h_num_trackster_en[2];
0161   std::vector<dqm::reco::MonitorElement*> h_num_trackster_pt[2];
0162   std::vector<dqm::reco::MonitorElement*> h_numMerge_trackster_eta[2];
0163   std::vector<dqm::reco::MonitorElement*> h_numMerge_trackster_phi[2];
0164   std::vector<dqm::reco::MonitorElement*> h_numMerge_trackster_en[2];
0165   std::vector<dqm::reco::MonitorElement*> h_numMerge_trackster_pt[2];
0166   std::vector<dqm::reco::MonitorElement*> h_sharedenergy_trackster2caloparticle[2];
0167   std::vector<dqm::reco::MonitorElement*> h_sharedenergy_trackster2bestCaloparticle[2];
0168   std::vector<dqm::reco::MonitorElement*> h_sharedenergy_trackster2bestCaloparticle2[2];
0169   std::vector<dqm::reco::MonitorElement*> h_sharedenergy_caloparticle2trackster[2];
0170   std::vector<dqm::reco::MonitorElement*> h_sharedenergy_caloparticle2trackster_assoc[2];
0171   std::vector<dqm::reco::MonitorElement*> h_sharedenergy_caloparticle2trackster_assoc2[2];
0172   std::vector<dqm::reco::MonitorElement*> h_sharedenergy_trackster2bestCaloparticle_vs_eta[2];
0173   std::vector<dqm::reco::MonitorElement*> h_sharedenergy_trackster2bestCaloparticle_vs_phi[2];
0174   std::vector<dqm::reco::MonitorElement*> h_sharedenergy_caloparticle2trackster_assoc_vs_eta[2];
0175   std::vector<dqm::reco::MonitorElement*> h_sharedenergy_caloparticle2trackster_assoc_vs_phi[2];
0176   std::vector<dqm::reco::MonitorElement*> h_denom_trackster_eta[2];
0177   std::vector<dqm::reco::MonitorElement*> h_denom_trackster_phi[2];
0178   std::vector<dqm::reco::MonitorElement*> h_denom_trackster_en[2];
0179   std::vector<dqm::reco::MonitorElement*> h_denom_trackster_pt[2];
0180   std::vector<dqm::reco::MonitorElement*> h_numEff_caloparticle_eta[2];
0181   std::vector<dqm::reco::MonitorElement*> h_numEff_caloparticle_phi[2];
0182   std::vector<dqm::reco::MonitorElement*> h_numEff_caloparticle_en[2];
0183   std::vector<dqm::reco::MonitorElement*> h_numEff_caloparticle_pt[2];
0184   std::vector<dqm::reco::MonitorElement*> h_num_caloparticle_eta[2];
0185   std::vector<dqm::reco::MonitorElement*> h_num_caloparticle_phi[2];
0186   std::vector<dqm::reco::MonitorElement*> h_num_caloparticle_en[2];
0187   std::vector<dqm::reco::MonitorElement*> h_num_caloparticle_pt[2];
0188   std::vector<dqm::reco::MonitorElement*> h_numDup_trackster_eta[2];
0189   std::vector<dqm::reco::MonitorElement*> h_numDup_trackster_phi[2];
0190   std::vector<dqm::reco::MonitorElement*> h_numDup_trackster_en[2];
0191   std::vector<dqm::reco::MonitorElement*> h_numDup_trackster_pt[2];
0192   std::vector<dqm::reco::MonitorElement*> h_denom_caloparticle_eta[2];
0193   std::vector<dqm::reco::MonitorElement*> h_denom_caloparticle_phi[2];
0194   std::vector<dqm::reco::MonitorElement*> h_denom_caloparticle_en[2];
0195   std::vector<dqm::reco::MonitorElement*> h_denom_caloparticle_pt[2];
0196   // Generic histograms
0197   std::vector<dqm::reco::MonitorElement*> h_tracksternum;
0198   std::vector<dqm::reco::MonitorElement*> h_conttracksternum;
0199   std::vector<dqm::reco::MonitorElement*> h_nonconttracksternum;
0200   std::vector<dqm::reco::MonitorElement*> h_clusternum_in_trackster;
0201   std::vector<std::unordered_map<int, dqm::reco::MonitorElement*>> h_clusternum_in_trackster_perlayer;
0202   std::vector<dqm::reco::MonitorElement*> h_multiplicityOfLCinTST;
0203   std::vector<dqm::reco::MonitorElement*> h_multiplicity_numberOfEventsHistogram;
0204   std::vector<dqm::reco::MonitorElement*> h_multiplicity_zminus_numberOfEventsHistogram;
0205   std::vector<dqm::reco::MonitorElement*> h_multiplicity_zplus_numberOfEventsHistogram;
0206   std::vector<dqm::reco::MonitorElement*> h_multiplicityOfLCinTST_vs_layercluster;
0207   std::vector<dqm::reco::MonitorElement*> h_multiplicityOfLCinTST_vs_layercluster_zminus;
0208   std::vector<dqm::reco::MonitorElement*> h_multiplicityOfLCinTST_vs_layercluster_zplus;
0209   std::vector<dqm::reco::MonitorElement*> h_multiplicityOfLCinTST_vs_layerclusterenergy;
0210   std::vector<dqm::reco::MonitorElement*> h_clusternum_in_trackster_vs_layer;
0211   std::vector<dqm::reco::MonitorElement*> h_trackster_pt;
0212   std::vector<dqm::reco::MonitorElement*> h_trackster_eta;
0213   std::vector<dqm::reco::MonitorElement*> h_trackster_phi;
0214   std::vector<dqm::reco::MonitorElement*> h_trackster_energy;
0215   std::vector<dqm::reco::MonitorElement*> h_trackster_x;
0216   std::vector<dqm::reco::MonitorElement*> h_trackster_y;
0217   std::vector<dqm::reco::MonitorElement*> h_trackster_z;
0218   std::vector<dqm::reco::MonitorElement*> h_trackster_firstlayer;
0219   std::vector<dqm::reco::MonitorElement*> h_trackster_lastlayer;
0220   std::vector<dqm::reco::MonitorElement*> h_trackster_layersnum;
0221 };
0222 
0223 using Density = hgcal_clustering::Density;
0224 
0225 class HGVHistoProducerAlgo {
0226 public:
0227   typedef dqm::legacy::DQMStore DQMStore;
0228   typedef dqm::legacy::MonitorElement MonitorElement;
0229 
0230   HGVHistoProducerAlgo(const edm::ParameterSet& pset);
0231   ~HGVHistoProducerAlgo();
0232 
0233   using Histograms = HGVHistoProducerAlgoHistograms;
0234 
0235   void bookInfo(DQMStore::IBooker& ibook, Histograms& histograms);
0236   void bookCaloParticleHistos(DQMStore::IBooker& ibook, Histograms& histograms, int pdgid, unsigned int layers);
0237 
0238   void bookSimClusterHistos(DQMStore::IBooker& ibook,
0239                             Histograms& histograms,
0240                             unsigned int layers,
0241                             std::vector<int> thicknesses);
0242 
0243   void bookSimClusterAssociationHistos(DQMStore::IBooker& ibook,
0244                                        Histograms& histograms,
0245                                        unsigned int layers,
0246                                        std::vector<int> thicknesses);
0247 
0248   void bookClusterHistos_ClusterLevel(DQMStore::IBooker& ibook,
0249                                       Histograms& histograms,
0250                                       unsigned int layers,
0251                                       std::vector<int> thicknesses,
0252                                       std::string pathtomatbudfile);
0253 
0254   void bookClusterHistos_LCtoCP_association(DQMStore::IBooker& ibook, Histograms& histograms, unsigned int layers);
0255 
0256   void bookClusterHistos_CellLevel(DQMStore::IBooker& ibook,
0257                                    Histograms& histograms,
0258                                    unsigned int layers,
0259                                    std::vector<int> thicknesses);
0260 
0261   void bookTracksterHistos(DQMStore::IBooker& ibook, Histograms& histograms, unsigned int layers);
0262   enum validationType { Linking = 0, PatternRecognition, PatternRecognition_CP };
0263   void bookTracksterSTSHistos(DQMStore::IBooker& ibook, Histograms& histograms, const validationType valType);
0264 
0265   void layerClusters_to_CaloParticles(const Histograms& histograms,
0266                                       edm::Handle<reco::CaloClusterCollection> clusterHandle,
0267                                       const reco::CaloClusterCollection& clusters,
0268                                       edm::Handle<std::vector<CaloParticle>> caloParticleHandle,
0269                                       std::vector<CaloParticle> const& cP,
0270                                       std::vector<size_t> const& cPIndices,
0271                                       std::vector<size_t> const& cPSelectedIndices,
0272                                       std::unordered_map<DetId, const HGCRecHit*> const&,
0273                                       unsigned int layers,
0274                                       const hgcal::RecoToSimCollection& recSimColl,
0275                                       const hgcal::SimToRecoCollection& simRecColl) const;
0276   void layerClusters_to_SimClusters(const Histograms& histograms,
0277                                     const int count,
0278                                     edm::Handle<reco::CaloClusterCollection> clusterHandle,
0279                                     const reco::CaloClusterCollection& clusters,
0280                                     edm::Handle<std::vector<SimCluster>> simClusterHandle,
0281                                     std::vector<SimCluster> const& simClusters,
0282                                     std::vector<size_t> const& sCIndices,
0283                                     const std::vector<float>& mask,
0284                                     std::unordered_map<DetId, const HGCRecHit*> const&,
0285                                     unsigned int layers,
0286                                     const hgcal::RecoToSimCollectionWithSimClusters& recSimColl,
0287                                     const hgcal::SimToRecoCollectionWithSimClusters& simRecColl) const;
0288   void tracksters_to_SimTracksters(const Histograms& histograms,
0289                                    const int count,
0290                                    const ticl::TracksterCollection& Tracksters,
0291                                    const reco::CaloClusterCollection& layerClusters,
0292                                    const ticl::TracksterCollection& simTS,
0293                                    const validationType valType,
0294                                    const ticl::TracksterCollection& simTS_fromCP,
0295                                    std::map<uint, std::vector<uint>> const& simTrackstersMap,
0296                                    std::vector<SimCluster> const& sC,
0297                                    const edm::ProductID& cPHandle_id,
0298                                    std::vector<CaloParticle> const& cP,
0299                                    std::vector<size_t> const& cPIndices,
0300                                    std::vector<size_t> const& cPSelectedIndices,
0301                                    std::unordered_map<DetId, const HGCRecHit*> const&,
0302                                    unsigned int layers) const;
0303   void fill_info_histos(const Histograms& histograms, unsigned int layers) const;
0304   void fill_caloparticle_histos(const Histograms& histograms,
0305                                 int pdgid,
0306                                 const CaloParticle& caloparticle,
0307                                 std::vector<SimVertex> const& simVertices,
0308                                 unsigned int layers,
0309                                 std::unordered_map<DetId, const HGCRecHit*> const&) const;
0310   void fill_generic_cluster_histos(const Histograms& histograms,
0311                                    const int count,
0312                                    edm::Handle<reco::CaloClusterCollection> clusterHandle,
0313                                    const reco::CaloClusterCollection& clusters,
0314                                    edm::Handle<std::vector<CaloParticle>> caloParticleHandle,
0315                                    std::vector<CaloParticle> const& cP,
0316                                    std::vector<size_t> const& cPIndices,
0317                                    std::vector<size_t> const& cPSelectedIndices,
0318                                    std::unordered_map<DetId, const HGCRecHit*> const&,
0319                                    std::map<double, double> cummatbudg,
0320                                    unsigned int layers,
0321                                    std::vector<int> thicknesses,
0322                                    const hgcal::RecoToSimCollection& recSimColl,
0323                                    const hgcal::SimToRecoCollection& simRecColl) const;
0324   void fill_simCluster_histos(const Histograms& histograms,
0325                               std::vector<SimCluster> const& simClusters,
0326                               unsigned int layers,
0327                               std::vector<int> thicknesses) const;
0328   void fill_simClusterAssociation_histos(const Histograms& histograms,
0329                                          const int count,
0330                                          edm::Handle<reco::CaloClusterCollection> clusterHandle,
0331                                          const reco::CaloClusterCollection& clusters,
0332                                          edm::Handle<std::vector<SimCluster>> simClusterHandle,
0333                                          std::vector<SimCluster> const& simClusters,
0334                                          std::vector<size_t> const& sCIndices,
0335                                          const std::vector<float>& mask,
0336                                          std::unordered_map<DetId, const HGCRecHit*> const& hitMap,
0337                                          unsigned int layers,
0338                                          const hgcal::RecoToSimCollectionWithSimClusters& recSimColl,
0339                                          const hgcal::SimToRecoCollectionWithSimClusters& simRecColl) const;
0340   void fill_cluster_histos(const Histograms& histograms, const int count, const reco::CaloCluster& cluster) const;
0341   void fill_trackster_histos(const Histograms& histograms,
0342                              const int count,
0343                              const ticl::TracksterCollection& Tracksters,
0344                              const reco::CaloClusterCollection& layerClusters,
0345                              const ticl::TracksterCollection& simTS,
0346                              const ticl::TracksterCollection& simTS_fromCP,
0347                              std::map<uint, std::vector<uint>> const& simTrackstersMap,
0348                              std::vector<SimCluster> const& sC,
0349                              const edm::ProductID& cPHandle_id,
0350                              std::vector<CaloParticle> const& cP,
0351                              std::vector<size_t> const& cPIndices,
0352                              std::vector<size_t> const& cPSelectedIndices,
0353                              std::unordered_map<DetId, const HGCRecHit*> const&,
0354                              unsigned int layers) const;
0355   double distance2(const double x1, const double y1, const double x2, const double y2) const;
0356   double distance(const double x1, const double y1, const double x2, const double y2) const;
0357 
0358   void setRecHitTools(std::shared_ptr<hgcal::RecHitTools> recHitTools);
0359 
0360   DetId findmaxhit(const reco::CaloCluster& cluster, std::unordered_map<DetId, const HGCRecHit*> const&) const;
0361 
0362   struct detIdInfoInCluster {
0363     bool operator==(const detIdInfoInCluster& o) const { return clusterId == o.clusterId; };
0364     long unsigned int clusterId;
0365     float fraction;
0366   };
0367 
0368   struct detIdInfoInTrackster {
0369     bool operator==(const detIdInfoInTrackster& o) const { return tracksterId == o.tracksterId; };
0370     unsigned int tracksterId;
0371     long unsigned int clusterId;
0372     float fraction;
0373   };
0374 
0375   struct caloParticleOnLayer {
0376     unsigned int caloParticleId;
0377     float energy = 0;
0378     std::vector<std::pair<DetId, float>> hits_and_fractions;
0379     std::unordered_map<unsigned int, std::pair<float, float>> layerClusterIdToEnergyAndScore;
0380   };
0381 
0382 private:
0383   double getEta(double eta) const;
0384 
0385   std::shared_ptr<hgcal::RecHitTools> recHitTools_;
0386 
0387   //private data members
0388   double minEta_, maxEta_;
0389   int nintEta_;
0390   bool useFabsEta_;
0391   double minEne_, maxEne_;
0392   int nintEne_;
0393   double minPt_, maxPt_;
0394   int nintPt_;
0395   double minPhi_, maxPhi_;
0396   int nintPhi_;
0397   double minMixedHitsSimCluster_, maxMixedHitsSimCluster_;
0398   int nintMixedHitsSimCluster_;
0399   double minMixedHitsCluster_, maxMixedHitsCluster_;
0400   int nintMixedHitsCluster_;
0401   double minEneCl_, maxEneCl_;
0402   int nintEneCl_;
0403   double minLongDepBary_, maxLongDepBary_;
0404   int nintLongDepBary_;
0405   double minZpos_, maxZpos_;
0406   int nintZpos_;
0407   double minTotNsimClsperlay_, maxTotNsimClsperlay_;
0408   int nintTotNsimClsperlay_;
0409   double minTotNClsperlay_, maxTotNClsperlay_;
0410   int nintTotNClsperlay_;
0411   double minEneClperlay_, maxEneClperlay_;
0412   int nintEneClperlay_;
0413   double minScore_, maxScore_;
0414   int nintScore_;
0415   double minSharedEneFrac_, maxSharedEneFrac_;
0416   int nintSharedEneFrac_;
0417   double minTSTSharedEneFracEfficiency_;
0418   double minTSTSharedEneFrac_, maxTSTSharedEneFrac_;
0419   int nintTSTSharedEneFrac_;
0420   double minTotNsimClsperthick_, maxTotNsimClsperthick_;
0421   int nintTotNsimClsperthick_;
0422   double minTotNClsperthick_, maxTotNClsperthick_;
0423   int nintTotNClsperthick_;
0424   double minTotNcellsperthickperlayer_, maxTotNcellsperthickperlayer_;
0425   int nintTotNcellsperthickperlayer_;
0426   double minDisToSeedperthickperlayer_, maxDisToSeedperthickperlayer_;
0427   int nintDisToSeedperthickperlayer_;
0428   double minDisToSeedperthickperlayerenewei_, maxDisToSeedperthickperlayerenewei_;
0429   int nintDisToSeedperthickperlayerenewei_;
0430   double minDisToMaxperthickperlayer_, maxDisToMaxperthickperlayer_;
0431   int nintDisToMaxperthickperlayer_;
0432   double minDisToMaxperthickperlayerenewei_, maxDisToMaxperthickperlayerenewei_;
0433   int nintDisToMaxperthickperlayerenewei_;
0434   double minDisSeedToMaxperthickperlayer_, maxDisSeedToMaxperthickperlayer_;
0435   int nintDisSeedToMaxperthickperlayer_;
0436   double minClEneperthickperlayer_, maxClEneperthickperlayer_;
0437   int nintClEneperthickperlayer_;
0438   double minCellsEneDensperthick_, maxCellsEneDensperthick_;
0439   int nintCellsEneDensperthick_;
0440   double minTotNTSTs_, maxTotNTSTs_;
0441   int nintTotNTSTs_;
0442   double minTotNClsinTSTs_, maxTotNClsinTSTs_;
0443   int nintTotNClsinTSTs_;
0444   double minTotNClsinTSTsperlayer_, maxTotNClsinTSTsperlayer_;
0445   int nintTotNClsinTSTsperlayer_;
0446   double minMplofLCs_, maxMplofLCs_;
0447   int nintMplofLCs_;
0448   double minSizeCLsinTSTs_, maxSizeCLsinTSTs_;
0449   int nintSizeCLsinTSTs_;
0450   double minClEnepermultiplicity_, maxClEnepermultiplicity_;
0451   int nintClEnepermultiplicity_;
0452   double minX_, maxX_;
0453   int nintX_;
0454   double minY_, maxY_;
0455   int nintY_;
0456   double minZ_, maxZ_;
0457   int nintZ_;
0458 };
0459 
0460 #endif