CMS 3D CMS Logo

HGCalValidator.cc
Go to the documentation of this file.
2 
5 
6 using namespace std;
7 using namespace edm;
8 
10  : label_lcl(pset.getParameter<edm::InputTag>("label_lcl")),
11  label_mcl(pset.getParameter<std::vector<edm::InputTag>>("label_mcl")),
12  SaveGeneralInfo_(pset.getUntrackedParameter<bool>("SaveGeneralInfo")),
13  doCaloParticlePlots_(pset.getUntrackedParameter<bool>("doCaloParticlePlots")),
14  dolayerclustersPlots_(pset.getUntrackedParameter<bool>("dolayerclustersPlots")),
15  domulticlustersPlots_(pset.getUntrackedParameter<bool>("domulticlustersPlots")),
16  cummatbudinxo_(pset.getParameter<edm::FileInPath>("cummatbudinxo")) {
17  //In this way we can easily generalize to associations between other objects also.
18  const edm::InputTag& label_cp_effic_tag = pset.getParameter<edm::InputTag>("label_cp_effic");
19  const edm::InputTag& label_cp_fake_tag = pset.getParameter<edm::InputTag>("label_cp_fake");
20 
21  label_cp_effic = consumes<std::vector<CaloParticle>>(label_cp_effic_tag);
22  label_cp_fake = consumes<std::vector<CaloParticle>>(label_cp_fake_tag);
23 
24  simVertices_ = consumes<std::vector<SimVertex>>(pset.getParameter<edm::InputTag>("simVertices"));
25 
26  recHitsEE_ = consumes<HGCRecHitCollection>(edm::InputTag("HGCalRecHit", "HGCEERecHits"));
27  recHitsFH_ = consumes<HGCRecHitCollection>(edm::InputTag("HGCalRecHit", "HGCHEFRecHits"));
28  recHitsBH_ = consumes<HGCRecHitCollection>(edm::InputTag("HGCalRecHit", "HGCHEBRecHits"));
29 
30  density_ = consumes<Density>(edm::InputTag("hgcalLayerClusters"));
31 
32  layerclusters_ = consumes<reco::CaloClusterCollection>(label_lcl);
33 
34  for (auto& itag : label_mcl) {
35  label_mclTokens.push_back(consumes<std::vector<reco::HGCalMultiCluster>>(itag));
36  }
37 
38  cpSelector = CaloParticleSelector(pset.getParameter<double>("ptMinCP"),
39  pset.getParameter<double>("ptMaxCP"),
40  pset.getParameter<double>("minRapidityCP"),
41  pset.getParameter<double>("maxRapidityCP"),
42  pset.getParameter<int>("minHitCP"),
43  pset.getParameter<double>("tipCP"),
44  pset.getParameter<double>("lipCP"),
45  pset.getParameter<bool>("signalOnlyCP"),
46  pset.getParameter<bool>("intimeOnlyCP"),
47  pset.getParameter<bool>("chargedOnlyCP"),
48  pset.getParameter<bool>("stableOnlyCP"),
49  pset.getParameter<std::vector<int>>("pdgIdCP"));
50 
51  tools_.reset(new hgcal::RecHitTools());
52 
53  particles_to_monitor_ = pset.getParameter<std::vector<int>>("pdgIdCP");
54  totallayers_to_monitor_ = pset.getParameter<int>("totallayers_to_monitor");
55  thicknesses_to_monitor_ = pset.getParameter<std::vector<int>>("thicknesses_to_monitor");
56 
57  //For the material budget file here
58  std::ifstream fmb(cummatbudinxo_.fullPath().c_str());
59  double thelay = 0.;
60  double mbg = 0.;
61  for (unsigned ilayer = 1; ilayer <= totallayers_to_monitor_; ++ilayer) {
62  fmb >> thelay >> mbg;
63  cummatbudg.insert(std::pair<double, double>(thelay, mbg));
64  }
65 
66  fmb.close();
67 
68  ParameterSet psetForHistoProducerAlgo = pset.getParameter<ParameterSet>("histoProducerAlgoBlock");
69  histoProducerAlgo_ = std::make_unique<HGVHistoProducerAlgo>(psetForHistoProducerAlgo);
70 
71  dirName_ = pset.getParameter<std::string>("dirName");
72 }
73 
75 
77  edm::Run const&,
78  edm::EventSetup const& setup,
79  Histograms& histograms) const {
80  if (SaveGeneralInfo_) {
81  ibook.cd();
82  ibook.setCurrentFolder(dirName_ + "GeneralInfo");
83  histoProducerAlgo_->bookInfo(ibook, histograms.histoProducerAlgo);
84  }
85 
87  ibook.cd();
88 
89  for (auto const particle : particles_to_monitor_) {
90  ibook.setCurrentFolder(dirName_ + "SelectedCaloParticles/" + std::to_string(particle));
91  histoProducerAlgo_->bookCaloParticleHistos(ibook, histograms.histoProducerAlgo, particle);
92  }
93  ibook.cd();
95  }
96 
97  //Booking histograms concerning with hgcal layer clusters
99  ibook.cd();
100  ibook.setCurrentFolder(dirName_ + "hgcalLayerClusters");
101  histoProducerAlgo_->bookClusterHistos(ibook,
102  histograms.histoProducerAlgo,
106  }
107 
108  //Booking histograms for multiclusters
109  for (unsigned int www = 0; www < label_mcl.size(); www++) {
110  ibook.cd();
111  InputTag algo = label_mcl[www];
112  string dirName = dirName_;
113  if (!algo.process().empty())
114  dirName += algo.process() + "_";
115  LogDebug("HGCalValidator") << dirName << "\n";
116  if (!algo.label().empty())
117  dirName += algo.label() + "_";
118  LogDebug("HGCalValidator") << dirName << "\n";
119  if (!algo.instance().empty())
120  dirName += algo.instance() + "_";
121  LogDebug("HGCalValidator") << dirName << "\n";
122 
123  if (!dirName.empty()) {
124  dirName.resize(dirName.size() - 1);
125  }
126 
127  LogDebug("HGCalValidator") << dirName << "\n";
128 
129  ibook.setCurrentFolder(dirName);
130 
131  //Booking histograms concerning for hgcal multi clusters
132  if (domulticlustersPlots_) {
133  histoProducerAlgo_->bookMultiClusterHistos(ibook, histograms.histoProducerAlgo, totallayers_to_monitor_);
134  }
135  } //end of booking multiclusters loop
136 }
137 
139  std::vector<CaloParticle> const& cPeff,
140  std::vector<SimVertex> const& simVertices,
141  std::vector<size_t>& selected_cPeff) const {
142  selected_cPeff.reserve(cPeff.size());
143 
144  size_t j = 0;
145  for (auto const caloParticle : cPeff) {
146  int id = caloParticle.pdgId();
147 
148  if (cpSelector(caloParticle, simVertices)) {
149  selected_cPeff.push_back(j);
150  if (doCaloParticlePlots_) {
151  histoProducerAlgo_->fill_caloparticle_histos(histograms.histoProducerAlgo, id, caloParticle, simVertices);
152  }
153  }
154  ++j;
155  } //end of loop over caloparticles
156 }
157 
159  const edm::EventSetup& setup,
160  const Histograms& histograms) const {
161  using namespace reco;
162 
163  LogDebug("HGCalValidator") << "\n===================================================="
164  << "\n"
165  << "Analyzing new event"
166  << "\n"
167  << "====================================================\n"
168  << "\n";
169 
170  edm::Handle<std::vector<SimVertex>> simVerticesHandle;
171  event.getByToken(simVertices_, simVerticesHandle);
172  std::vector<SimVertex> const& simVertices = *simVerticesHandle;
173 
174  edm::Handle<std::vector<CaloParticle>> caloParticleHandle;
175  event.getByToken(label_cp_effic, caloParticleHandle);
176  std::vector<CaloParticle> const& caloParticles = *caloParticleHandle;
177 
178  tools_->getEventSetup(setup);
179  histoProducerAlgo_->setRecHitTools(tools_);
180 
181  edm::Handle<HGCRecHitCollection> recHitHandleEE;
182  event.getByToken(recHitsEE_, recHitHandleEE);
183  edm::Handle<HGCRecHitCollection> recHitHandleFH;
184  event.getByToken(recHitsFH_, recHitHandleFH);
185  edm::Handle<HGCRecHitCollection> recHitHandleBH;
186  event.getByToken(recHitsBH_, recHitHandleBH);
187 
188  std::map<DetId, const HGCRecHit*> hitMap;
189  fillHitMap(hitMap, *recHitHandleEE, *recHitHandleFH, *recHitHandleBH);
190 
191  //Some general info on layers etc.
192  if (SaveGeneralInfo_) {
193  histoProducerAlgo_->fill_info_histos(histograms.histoProducerAlgo, totallayers_to_monitor_);
194  }
195 
196  auto nCaloParticles = caloParticles.size();
197  std::vector<size_t> cPIndices;
198  //Consider CaloParticles coming from the hard scatterer
199  //excluding the PU contribution and save the indices.
200  for (unsigned int cpId = 0; cpId < nCaloParticles; ++cpId) {
201  if (caloParticles[cpId].g4Tracks()[0].eventId().event() != 0 or
202  caloParticles[cpId].g4Tracks()[0].eventId().bunchCrossing() != 0) {
203  LogDebug("HGCalValidator") << "Excluding CaloParticles from event: "
204  << caloParticles[cpId].g4Tracks()[0].eventId().event()
205  << " with BX: " << caloParticles[cpId].g4Tracks()[0].eventId().bunchCrossing()
206  << std::endl;
207  continue;
208  }
209  cPIndices.emplace_back(cpId);
210  }
211 
212  // ##############################################
213  // fill caloparticles histograms
214  // ##############################################
215  LogTrace("HGCalValidator") << "\n# of CaloParticles: " << caloParticles.size() << "\n";
216  std::vector<size_t> selected_cPeff;
217  cpParametersAndSelection(histograms, caloParticles, simVertices, selected_cPeff);
218 
219  //get collections from the event
220  //Layer clusters
222  event.getByToken(layerclusters_, clusterHandle);
223  const reco::CaloClusterCollection& clusters = *clusterHandle;
224 
225  //Density
226  edm::Handle<Density> densityHandle;
227  event.getByToken(density_, densityHandle);
228  const Density& densities = *densityHandle;
229 
230  // ##############################################
231  // fill layercluster histograms
232  // ##############################################
233  int w = 0; //counter counting the number of sets of histograms
234  if (dolayerclustersPlots_) {
235  histoProducerAlgo_->fill_generic_cluster_histos(histograms.histoProducerAlgo,
236  w,
237  clusters,
238  densities,
239  caloParticles,
240  cPIndices,
241  hitMap,
242  cummatbudg,
245 
246  for (unsigned int layerclusterIndex = 0; layerclusterIndex < clusters.size(); layerclusterIndex++) {
247  histoProducerAlgo_->fill_cluster_histos(histograms.histoProducerAlgo, w, clusters[layerclusterIndex]);
248  }
249 
250  //General Info on hgcalLayerClusters
251  LogTrace("HGCalValidator") << "\n# of layer clusters with " << label_lcl.process() << ":" << label_lcl.label()
252  << ":" << label_lcl.instance() << ": " << clusters.size() << "\n";
253  }
254 
255  // ##############################################
256  // fill multicluster histograms
257  // ##############################################
258  for (unsigned int wml = 0; wml < label_mclTokens.size(); wml++) {
259  if (domulticlustersPlots_) {
261  event.getByToken(label_mclTokens[wml], multiClusterHandle);
262  const std::vector<reco::HGCalMultiCluster>& multiClusters = *multiClusterHandle;
263 
264  histoProducerAlgo_->fill_multi_cluster_histos(
265  histograms.histoProducerAlgo, wml, multiClusters, caloParticles, cPIndices, hitMap, totallayers_to_monitor_);
266 
267  //General Info on multiclusters
268  LogTrace("HGCalValidator") << "\n# of multi clusters with " << label_mcl[wml].process() << ":"
269  << label_mcl[wml].label() << ":" << label_mcl[wml].instance() << ": "
270  << multiClusters.size() << "\n";
271  }
272  } //end of loop over multicluster input labels
273 }
274 
275 void HGCalValidator::fillHitMap(std::map<DetId, const HGCRecHit*>& hitMap,
276  const HGCRecHitCollection& rechitsEE,
277  const HGCRecHitCollection& rechitsFH,
278  const HGCRecHitCollection& rechitsBH) const {
279  hitMap.clear();
280  for (const auto& hit : rechitsEE) {
281  hitMap.emplace(hit.detid(), &hit);
282  }
283 
284  for (const auto& hit : rechitsFH) {
285  hitMap.emplace(hit.detid(), &hit);
286  }
287 
288  for (const auto& hit : rechitsBH) {
289  hitMap.emplace(hit.detid(), &hit);
290  }
291 }
#define LogDebug(id)
label_lcl
general settings ### selection of CP for evaluation of efficiency #
T getParameter(std::string const &) const
std::map< double, double > cummatbudg
const double w
Definition: UKUtility.cc:23
void setCurrentFolder(std::string const &fullpath)
Definition: DQMStore.cc:418
edm::EDGetTokenT< HGCRecHitCollection > recHitsBH_
std::unique_ptr< HGVHistoProducerAlgo > histoProducerAlgo_
~HGCalValidator() override
Destructor.
CaloParticleSelector cpSelector
const bool doCaloParticlePlots_
unsigned totallayers_to_monitor_
std::vector< int > thicknesses_to_monitor_
const bool domulticlustersPlots_
const bool SaveGeneralInfo_
EDGetTokenT< ProductType > consumes(edm::InputTag const &tag)
edm::EDGetTokenT< Density > density_
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
hgcal_clustering::Density Density
Definition: HGCalCLUEAlgo.h:27
std::string dirName_
HGVHistoProducerAlgoHistograms histoProducerAlgo
edm::EDGetTokenT< std::vector< SimVertex > > simVertices_
edm::EDGetTokenT< std::vector< CaloParticle > > label_cp_fake
edm::EDGetTokenT< std::vector< CaloParticle > > label_cp_effic
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::shared_ptr< hgcal::RecHitTools > tools_
std::vector< CaloCluster > CaloClusterCollection
collection of CaloCluster objects
void cpParametersAndSelection(const Histograms &histograms, std::vector< CaloParticle > const &cPeff, std::vector< SimVertex > const &simVertices, std::vector< size_t > &selected_cPeff) const
How EventSelector::AcceptEvent() decides whether to accept an event for output otherwise it is excluding the probing of A single or multiple positive and the trigger will pass if any such matching triggers are PASS or EXCEPTION[A criterion thatmatches no triggers at all is detected and causes a throw.] A single negative with an expectation of appropriate bit checking in the decision and the trigger will pass if any such matching triggers are FAIL or EXCEPTION A wildcarded negative criterion that matches more than one trigger in the trigger but the state exists so we define the behavior If all triggers are the negative crieriion will lead to accepting the event(this again matches the behavior of"!*"before the partial wildcard feature was incorporated).The per-event"cost"of each negative criterion with multiple relevant triggers is about the same as!*was in the past
#define LogTrace(id)
edm::EDGetTokenT< reco::CaloClusterCollection > layerclusters_
HGCalValidator(const edm::ParameterSet &pset)
Constructor.
const edm::FileInPath cummatbudinxo_
std::vector< edm::EDGetTokenT< std::vector< reco::HGCalMultiCluster > > > label_mclTokens
const bool dolayerclustersPlots_
std::vector< edm::InputTag > label_mcl
std::string const & label() const
Definition: InputTag.h:36
std::string const & process() const
Definition: InputTag.h:40
std::vector< int > particles_to_monitor_
fixed size matrix
HLT enums.
void dqmAnalyze(const edm::Event &, const edm::EventSetup &, const Histograms &) const override
Method called once per event.
edm::EDGetTokenT< HGCRecHitCollection > recHitsEE_
edm::EDGetTokenT< HGCRecHitCollection > recHitsFH_
void bookHistograms(DQMStore::IBooker &, edm::Run const &, edm::EventSetup const &, Histograms &) const override
Method called to book the DQM histograms.
std::string fullPath() const
Definition: FileInPath.cc:163
void fillHitMap(std::map< DetId, const HGCRecHit * > &, const HGCRecHitCollection &, const HGCRecHitCollection &, const HGCRecHitCollection &) const
edm::InputTag label_lcl
std::string const & instance() const
Definition: InputTag.h:37
Definition: event.py:1
Definition: Run.h:45