CMS 3D CMS Logo

HGCalValidator.cc
Go to the documentation of this file.
2 
4 
7 
8 using namespace std;
9 using namespace edm;
10 
12  : caloGeomToken_(esConsumes<CaloGeometry, CaloGeometryRecord>()),
13  label_lcl(pset.getParameter<edm::InputTag>("label_lcl")),
14  label_tst(pset.getParameter<std::vector<edm::InputTag>>("label_tst")),
15  label_simTS(pset.getParameter<edm::InputTag>("label_simTS")),
16  label_simTSFromCP(pset.getParameter<edm::InputTag>("label_simTSFromCP")),
17  associator_(pset.getUntrackedParameter<edm::InputTag>("associator")),
18  associatorSim_(pset.getUntrackedParameter<edm::InputTag>("associatorSim")),
19  SaveGeneralInfo_(pset.getUntrackedParameter<bool>("SaveGeneralInfo")),
20  doCaloParticlePlots_(pset.getUntrackedParameter<bool>("doCaloParticlePlots")),
21  doCaloParticleSelection_(pset.getUntrackedParameter<bool>("doCaloParticleSelection")),
22  doSimClustersPlots_(pset.getUntrackedParameter<bool>("doSimClustersPlots")),
23  label_SimClustersPlots_(pset.getParameter<edm::InputTag>("label_SimClusters")),
24  label_SimClustersLevel_(pset.getParameter<edm::InputTag>("label_SimClustersLevel")),
25  doLayerClustersPlots_(pset.getUntrackedParameter<bool>("doLayerClustersPlots")),
26  label_layerClustersPlots_(pset.getParameter<edm::InputTag>("label_layerClusterPlots")),
27  label_LCToCPLinking_(pset.getParameter<edm::InputTag>("label_LCToCPLinking")),
28  doTrackstersPlots_(pset.getUntrackedParameter<bool>("doTrackstersPlots")),
29  label_TS_(pset.getParameter<std::string>("label_TS")),
30  label_TSToCPLinking_(pset.getParameter<std::string>("label_TSToCPLinking")),
31  label_TSToSTSPR_(pset.getParameter<std::string>("label_TSToSTSPR")),
32  label_clustersmask(pset.getParameter<std::vector<edm::InputTag>>("LayerClustersInputMask")),
33  cummatbudinxo_(pset.getParameter<edm::FileInPath>("cummatbudinxo")) {
34  //In this way we can easily generalize to associations between other objects also.
35  const edm::InputTag& label_cp_effic_tag = pset.getParameter<edm::InputTag>("label_cp_effic");
36  const edm::InputTag& label_cp_fake_tag = pset.getParameter<edm::InputTag>("label_cp_fake");
37 
38  label_cp_effic = consumes<std::vector<CaloParticle>>(label_cp_effic_tag);
39  label_cp_fake = consumes<std::vector<CaloParticle>>(label_cp_fake_tag);
40 
41  simVertices_ = consumes<std::vector<SimVertex>>(pset.getParameter<edm::InputTag>("simVertices"));
42 
43  for (auto& itag : label_clustersmask) {
44  clustersMaskTokens_.push_back(consumes<std::vector<float>>(itag));
45  }
46 
47  associatorMapSimtR = consumes<hgcal::SimToRecoCollectionWithSimClusters>(associatorSim_);
48  associatorMapRtSim = consumes<hgcal::RecoToSimCollectionWithSimClusters>(associatorSim_);
49 
50  simTrackstersMap_ = consumes<std::map<uint, std::vector<uint>>>(edm::InputTag("ticlSimTracksters"));
51 
52  hitMap_ = consumes<std::unordered_map<DetId, const HGCRecHit*>>(edm::InputTag("hgcalRecHitMapProducer"));
53 
54  simClusters_ = consumes<std::vector<SimCluster>>(pset.getParameter<edm::InputTag>("label_scl"));
55 
56  layerclusters_ = consumes<reco::CaloClusterCollection>(label_lcl);
57 
58  for (auto& itag : label_tst) {
59  label_tstTokens.push_back(consumes<ticl::TracksterCollection>(itag));
60  }
61 
62  simTracksters_ = consumes<ticl::TracksterCollection>(label_simTS);
63  simTracksters_fromCPs_ = consumes<ticl::TracksterCollection>(label_simTSFromCP);
64 
65  associatorMapRtS = consumes<hgcal::RecoToSimCollection>(associator_);
66  associatorMapStR = consumes<hgcal::SimToRecoCollection>(associator_);
67 
68  cpSelector = CaloParticleSelector(pset.getParameter<double>("ptMinCP"),
69  pset.getParameter<double>("ptMaxCP"),
70  pset.getParameter<double>("minRapidityCP"),
71  pset.getParameter<double>("maxRapidityCP"),
72  pset.getParameter<double>("lipCP"),
73  pset.getParameter<double>("tipCP"),
74  pset.getParameter<int>("minHitCP"),
75  pset.getParameter<int>("maxSimClustersCP"),
76  pset.getParameter<bool>("signalOnlyCP"),
77  pset.getParameter<bool>("intimeOnlyCP"),
78  pset.getParameter<bool>("chargedOnlyCP"),
79  pset.getParameter<bool>("stableOnlyCP"),
80  pset.getParameter<bool>("notConvertedOnlyCP"),
81  pset.getParameter<std::vector<int>>("pdgIdCP"));
82 
83  tools_.reset(new hgcal::RecHitTools());
84 
85  particles_to_monitor_ = pset.getParameter<std::vector<int>>("pdgIdCP");
86  totallayers_to_monitor_ = pset.getParameter<int>("totallayers_to_monitor");
87  thicknesses_to_monitor_ = pset.getParameter<std::vector<int>>("thicknesses_to_monitor");
88 
89  //For the material budget file here
90  std::ifstream fmb(cummatbudinxo_.fullPath().c_str());
91  double thelay = 0.;
92  double mbg = 0.;
93  for (unsigned ilayer = 1; ilayer <= totallayers_to_monitor_; ++ilayer) {
94  fmb >> thelay >> mbg;
95  cummatbudg.insert(std::pair<double, double>(thelay, mbg));
96  }
97 
98  fmb.close();
99 
100  ParameterSet psetForHistoProducerAlgo = pset.getParameter<ParameterSet>("histoProducerAlgoBlock");
101  histoProducerAlgo_ = std::make_unique<HGVHistoProducerAlgo>(psetForHistoProducerAlgo);
102 
103  dirName_ = pset.getParameter<std::string>("dirName");
104 }
105 
107 
109  edm::Run const&,
110  edm::EventSetup const& setup,
111  Histograms& histograms) const {
112  if (SaveGeneralInfo_) {
113  ibook.cd();
114  ibook.setCurrentFolder(dirName_ + "GeneralInfo");
115  histoProducerAlgo_->bookInfo(ibook, histograms.histoProducerAlgo);
116  }
117 
118  if (doCaloParticlePlots_) {
119  ibook.cd();
120 
121  for (auto const particle : particles_to_monitor_) {
122  ibook.setCurrentFolder(dirName_ + "SelectedCaloParticles/" + std::to_string(particle));
123  histoProducerAlgo_->bookCaloParticleHistos(
124  ibook, histograms.histoProducerAlgo, particle, totallayers_to_monitor_);
125  }
126  ibook.cd();
127  ibook.setCurrentFolder(dirName_);
128  }
129 
130  //Booking histograms concerning with simClusters
131  if (doSimClustersPlots_) {
132  ibook.cd();
134  histoProducerAlgo_->bookSimClusterHistos(
135  ibook, histograms.histoProducerAlgo, totallayers_to_monitor_, thicknesses_to_monitor_);
136 
137  for (unsigned int ws = 0; ws < label_clustersmask.size(); ws++) {
138  ibook.cd();
140  string dirName = dirName_ + label_SimClustersPlots_.label() + "/";
141  if (!algo.process().empty())
142  dirName += algo.process() + "_";
143  LogDebug("HGCalValidator") << dirName << "\n";
144  if (!algo.label().empty())
145  dirName += algo.label() + "_";
146  LogDebug("HGCalValidator") << dirName << "\n";
147  if (!algo.instance().empty())
148  dirName += algo.instance() + "_";
149  LogDebug("HGCalValidator") << dirName << "\n";
150 
151  if (!dirName.empty()) {
152  dirName.resize(dirName.size() - 1);
153  }
154 
155  LogDebug("HGCalValidator") << dirName << "\n";
156 
157  ibook.setCurrentFolder(dirName);
158 
159  histoProducerAlgo_->bookSimClusterAssociationHistos(
160  ibook, histograms.histoProducerAlgo, totallayers_to_monitor_, thicknesses_to_monitor_);
161  } //end of loop over masks
162  } //if for simCluster plots
163 
164  //Booking histograms concerning with hgcal layer clusters
165  if (doLayerClustersPlots_) {
166  ibook.cd();
167  ibook.setCurrentFolder(dirName_ + label_layerClustersPlots_.label() + "/ClusterLevel");
168  histoProducerAlgo_->bookClusterHistos_ClusterLevel(ibook,
169  histograms.histoProducerAlgo,
173  ibook.cd();
175  histoProducerAlgo_->bookClusterHistos_LCtoCP_association(
176  ibook, histograms.histoProducerAlgo, totallayers_to_monitor_);
177 
178  ibook.cd();
179  ibook.setCurrentFolder(dirName_ + label_layerClustersPlots_.label() + "/CellLevel");
180  histoProducerAlgo_->bookClusterHistos_CellLevel(
181  ibook, histograms.histoProducerAlgo, totallayers_to_monitor_, thicknesses_to_monitor_);
182  }
183 
184  //Booking histograms for Tracksters
185  for (unsigned int www = 0; www < label_tst.size(); www++) {
186  ibook.cd();
187  InputTag algo = label_tst[www];
188  string dirName = dirName_;
189  if (!algo.process().empty())
190  dirName += algo.process() + "_";
191  LogDebug("HGCalValidator") << dirName << "\n";
192  if (!algo.label().empty())
193  dirName += algo.label() + "_";
194  LogDebug("HGCalValidator") << dirName << "\n";
195  if (!algo.instance().empty())
196  dirName += algo.instance() + "_";
197  LogDebug("HGCalValidator") << dirName << "\n";
198 
199  if (!dirName.empty()) {
200  dirName.resize(dirName.size() - 1);
201  }
202 
203  LogDebug("HGCalValidator") << dirName << "\n";
204 
205  ibook.setCurrentFolder(dirName);
206 
207  // Booking histograms concerning HGCal tracksters
208  if (doTrackstersPlots_) {
209  // Generic histos
210  ibook.setCurrentFolder(dirName + "/" + label_TS_);
211  histoProducerAlgo_->bookTracksterHistos(ibook, histograms.histoProducerAlgo, totallayers_to_monitor_);
212  // CP Linking
214  histoProducerAlgo_->bookTracksterSTSHistos(
216  // SimTracksters Pattern Recognition
218  histoProducerAlgo_->bookTracksterSTSHistos(
220  }
221  } //end of booking Tracksters loop
222 }
223 
225  std::vector<CaloParticle> const& cPeff,
226  std::vector<SimVertex> const& simVertices,
227  std::vector<size_t>& selected_cPeff,
228  unsigned int layers,
229  std::unordered_map<DetId, const HGCRecHit*> const& hitMap) const {
230  selected_cPeff.reserve(cPeff.size());
231 
232  size_t j = 0;
233  for (auto const& caloParticle : cPeff) {
234  int id = caloParticle.pdgId();
235 
237  selected_cPeff.push_back(j);
238  if (doCaloParticlePlots_) {
239  histoProducerAlgo_->fill_caloparticle_histos(
240  histograms.histoProducerAlgo, id, caloParticle, simVertices, layers, hitMap);
241  }
242  }
243  ++j;
244  } //end of loop over caloparticles
245 }
246 
248  const edm::EventSetup& setup,
249  const Histograms& histograms) const {
250  using namespace reco;
251 
252  LogDebug("HGCalValidator") << "\n===================================================="
253  << "\n"
254  << "Analyzing new event"
255  << "\n"
256  << "====================================================\n"
257  << "\n";
258 
259  edm::Handle<std::vector<SimVertex>> simVerticesHandle;
260  event.getByToken(simVertices_, simVerticesHandle);
261  std::vector<SimVertex> const& simVertices = *simVerticesHandle;
262 
263  edm::Handle<std::vector<CaloParticle>> caloParticleHandle;
264  event.getByToken(label_cp_effic, caloParticleHandle);
265  std::vector<CaloParticle> const& caloParticles = *caloParticleHandle;
266 
267  edm::Handle<ticl::TracksterCollection> simTracksterHandle;
268  event.getByToken(simTracksters_, simTracksterHandle);
269  ticl::TracksterCollection const& simTracksters = *simTracksterHandle;
270 
271  edm::Handle<ticl::TracksterCollection> simTracksterFromCPHandle;
272  event.getByToken(simTracksters_fromCPs_, simTracksterFromCPHandle);
273  ticl::TracksterCollection const& simTrackstersFromCPs = *simTracksterFromCPHandle;
274 
275  edm::Handle<std::map<uint, std::vector<uint>>> simTrackstersMapHandle;
276  event.getByToken(simTrackstersMap_, simTrackstersMapHandle);
277  const std::map<uint, std::vector<uint>> cpToSc_SimTrackstersMap = *simTrackstersMapHandle;
278 
280  tools_->setGeometry(*geom);
281  histoProducerAlgo_->setRecHitTools(tools_);
282 
283  edm::Handle<hgcal::SimToRecoCollection> simtorecoCollectionH;
284  event.getByToken(associatorMapStR, simtorecoCollectionH);
285  auto simRecColl = *simtorecoCollectionH;
286  edm::Handle<hgcal::RecoToSimCollection> recotosimCollectionH;
287  event.getByToken(associatorMapRtS, recotosimCollectionH);
288  auto recSimColl = *recotosimCollectionH;
289 
291  event.getByToken(hitMap_, hitMapHandle);
292  const std::unordered_map<DetId, const HGCRecHit*>* hitMap = &*hitMapHandle;
293 
294  //Some general info on layers etc.
295  if (SaveGeneralInfo_) {
296  histoProducerAlgo_->fill_info_histos(histograms.histoProducerAlgo, totallayers_to_monitor_);
297  }
298 
299  std::vector<size_t> cPIndices;
300  //Consider CaloParticles coming from the hard scatterer
301  //excluding the PU contribution and save the indices.
302  removeCPFromPU(caloParticles, cPIndices);
303 
304  // ##############################################
305  // Fill caloparticles histograms
306  // ##############################################
307  // HGCRecHit are given to select the SimHits which are also reconstructed
308  LogTrace("HGCalValidator") << "\n# of CaloParticles: " << caloParticles.size() << "\n" << std::endl;
309  std::vector<size_t> selected_cPeff;
311 
312  //get collections from the event
313  //simClusters
314  edm::Handle<std::vector<SimCluster>> simClustersHandle;
315  event.getByToken(simClusters_, simClustersHandle);
316  std::vector<SimCluster> const& simClusters = *simClustersHandle;
317 
318  //Layer clusters
320  event.getByToken(layerclusters_, clusterHandle);
321  const reco::CaloClusterCollection& clusters = *clusterHandle;
322 
323  auto nSimClusters = simClusters.size();
324  std::vector<size_t> sCIndices;
325  //There shouldn't be any SimTracks from different crossings, but maybe they will be added later.
326  //At the moment there should be one SimTrack in each SimCluster.
327  for (unsigned int scId = 0; scId < nSimClusters; ++scId) {
328  if (simClusters[scId].g4Tracks()[0].eventId().event() != 0 or
329  simClusters[scId].g4Tracks()[0].eventId().bunchCrossing() != 0) {
330  LogDebug("HGCalValidator") << "Excluding SimClusters from event: "
331  << simClusters[scId].g4Tracks()[0].eventId().event()
332  << " with BX: " << simClusters[scId].g4Tracks()[0].eventId().bunchCrossing()
333  << std::endl;
334  continue;
335  }
336  sCIndices.emplace_back(scId);
337  }
338 
339  // ##############################################
340  // Fill simCluster histograms
341  // ##############################################
342  if (doSimClustersPlots_) {
343  histoProducerAlgo_->fill_simCluster_histos(
344  histograms.histoProducerAlgo, simClusters, totallayers_to_monitor_, thicknesses_to_monitor_);
345 
346  for (unsigned int ws = 0; ws < label_clustersmask.size(); ws++) {
347  const auto& inputClusterMask = event.get(clustersMaskTokens_[ws]);
348 
350  event.getByToken(associatorMapSimtR, simtorecoCollectionH);
351  auto simRecColl = *simtorecoCollectionH;
353  event.getByToken(associatorMapRtSim, recotosimCollectionH);
354  auto recSimColl = *recotosimCollectionH;
355 
356  histoProducerAlgo_->fill_simClusterAssociation_histos(histograms.histoProducerAlgo,
357  ws,
358  clusterHandle,
359  clusters,
360  simClustersHandle,
361  simClusters,
362  sCIndices,
363  inputClusterMask,
364  *hitMap,
366  recSimColl,
367  simRecColl);
368 
369  //General Info on simClusters
370  LogTrace("HGCalValidator") << "\n# of SimClusters: " << nSimClusters
371  << ", layerClusters mask label: " << label_clustersmask[ws].label() << "\n";
372  } //end of loop overs masks
373  }
374 
375  // ##############################################
376  // Fill layercluster histograms
377  // ##############################################
378  int w = 0; //counter counting the number of sets of histograms
379  if (doLayerClustersPlots_) {
380  histoProducerAlgo_->fill_generic_cluster_histos(histograms.histoProducerAlgo,
381  w,
382  clusterHandle,
383  clusters,
384  caloParticleHandle,
386  cPIndices,
387  selected_cPeff,
388  *hitMap,
389  cummatbudg,
392  recSimColl,
393  simRecColl);
394 
395  for (unsigned int layerclusterIndex = 0; layerclusterIndex < clusters.size(); layerclusterIndex++) {
396  histoProducerAlgo_->fill_cluster_histos(histograms.histoProducerAlgo, w, clusters[layerclusterIndex]);
397  }
398 
399  //General Info on hgcalLayerClusters
400  LogTrace("HGCalValidator") << "\n# of layer clusters with " << label_lcl.process() << ":" << label_lcl.label()
401  << ":" << label_lcl.instance() << ": " << clusters.size() << "\n";
402  }
403 
404  // ##############################################
405  // Fill Trackster histograms
406  // ##############################################
407  for (unsigned int wml = 0; wml < label_tstTokens.size(); wml++) {
408  if (doTrackstersPlots_) {
410  event.getByToken(label_tstTokens[wml], tracksterHandle);
411  const ticl::TracksterCollection& tracksters = *tracksterHandle;
412 
413  //General Info on Tracksters
414  LogTrace("HGCalValidator") << "\n# of Tracksters from " << label_tst[wml].process() << ":"
415  << label_tst[wml].label() << ":" << label_tst[wml].instance() << ": "
416  << tracksters.size() << "\n"
417  << std::endl;
418 
419  histoProducerAlgo_->fill_trackster_histos(histograms.histoProducerAlgo,
420  wml,
421  tracksters,
422  clusters,
423  simTracksters,
424  simTrackstersFromCPs,
425  cpToSc_SimTrackstersMap,
426  simClusters,
427  caloParticleHandle.id(),
429  cPIndices,
430  selected_cPeff,
431  *hitMap,
433  }
434  } //end of loop over Trackster input labels
435 }
std::map< double, double > cummatbudg
ESGetTokenH3DDVariant esConsumes(std::string const &Record, edm::ConsumesCollector &)
Definition: DeDxTools.cc:283
edm::EDGetTokenT< std::unordered_map< DetId, const HGCRecHit * > > hitMap_
void cpParametersAndSelection(const Histograms &histograms, std::vector< CaloParticle > const &cPeff, std::vector< SimVertex > const &simVertices, std::vector< size_t > &selected_cPeff, unsigned int layers, std::unordered_map< DetId, const HGCRecHit *> const &) const
ProductID id() const
Definition: HandleBase.cc:29
std::string fullPath() const
Definition: FileInPath.cc:161
virtual void setCurrentFolder(std::string const &fullpath)
Definition: DQMStore.cc:36
void dqmAnalyze(const edm::Event &, const edm::EventSetup &, const Histograms &) const override
Method called once per event.
edm::InputTag associator_
T w() const
std::string const & instance() const
Definition: InputTag.h:37
std::vector< edm::InputTag > label_tst
edm::EDGetTokenT< hgcal::SimToRecoCollectionWithSimClusters > associatorMapSimtR
std::unique_ptr< HGVHistoProducerAlgo > histoProducerAlgo_
~HGCalValidator() override
Destructor.
edm::EDGetTokenT< hgcal::RecoToSimCollectionWithSimClusters > associatorMapRtSim
CaloParticleSelector cpSelector
const bool doCaloParticlePlots_
std::string const & label() const
Definition: InputTag.h:36
unsigned totallayers_to_monitor_
std::vector< int > thicknesses_to_monitor_
void bookHistograms(DQMStore::IBooker &, edm::Run const &, edm::EventSetup const &, Histograms &) const override
Method called to book the DQM histograms.
static std::string to_string(const XMLCh *ch)
edm::InputTag label_simTS
#define LogTrace(id)
const bool SaveGeneralInfo_
const bool doLayerClustersPlots_
EDGetTokenT< ProductType > consumes(edm::InputTag const &tag)
std::string label_TSToSTSPR_
cc *****************************************************cc the common blocks pinput and cwdidth are for input parameters cc these parameters needed to be interfaced to other program common pinput fmb
Definition: inclcon.h:4
edm::ESGetToken< CaloGeometry, CaloGeometryRecord > caloGeomToken_
edm::EDGetTokenT< hgcal::RecoToSimCollection > associatorMapRtS
std::string dirName_
edm::EDGetTokenT< std::vector< SimVertex > > simVertices_
edm::EDGetTokenT< std::vector< CaloParticle > > label_cp_fake
edm::EDGetTokenT< std::vector< CaloParticle > > label_cp_effic
const bool doCaloParticleSelection_
The Signals That Services Can Subscribe To This is based on ActivityRegistry and is current per Services can connect to the signals distributed by the ActivityRegistry in order to monitor the activity of the application Each possible callback has some defined which we here list in angle e< void, edm::EventID const &, edm::Timestamp const & > We also list in braces which AR_WATCH_USING_METHOD_ is used for those or
Definition: Activities.doc:12
std::vector< edm::EDGetTokenT< ticl::TracksterCollection > > label_tstTokens
std::shared_ptr< hgcal::RecHitTools > tools_
std::string label_TSToCPLinking_
std::vector< CaloCluster > CaloClusterCollection
collection of CaloCluster objects
edm::InputTag label_LCToCPLinking_
edm::InputTag label_simTSFromCP
edm::EDGetTokenT< reco::CaloClusterCollection > layerclusters_
HGCalValidator(const edm::ParameterSet &pset)
Constructor.
const bool doTrackstersPlots_
const edm::FileInPath cummatbudinxo_
edm::EDGetTokenT< ticl::TracksterCollection > simTracksters_
static void removeCPFromPU(const std::vector< CaloParticle > &caloParticles, std::vector< size_t > &cPIndices, bool hardScatterOnly=true)
std::vector< edm::InputTag > label_clustersmask
std::vector< edm::EDGetTokenT< std::vector< float > > > clustersMaskTokens_
edm::EDGetTokenT< std::vector< SimCluster > > simClusters_
edm::InputTag label_SimClustersPlots_
edm::InputTag label_SimClustersLevel_
std::vector< int > particles_to_monitor_
fixed size matrix
HLT enums.
edm::EDGetTokenT< hgcal::SimToRecoCollection > associatorMapStR
const bool doSimClustersPlots_
std::vector< Trackster > TracksterCollection
Definition: Trackster.h:199
edm::InputTag label_lcl
std::string const & process() const
Definition: InputTag.h:40
edm::EDGetTokenT< std::map< uint, std::vector< uint > > > simTrackstersMap_
edm::EDGetTokenT< ticl::TracksterCollection > simTracksters_fromCPs_
std::string label_TS_
edm::InputTag associatorSim_
Definition: event.py:1
Definition: Run.h:45
edm::InputTag label_layerClustersPlots_
#define LogDebug(id)