54 void fillWithRecHits(std::map<DetId, const HGCRecHit*>&,
DetId,
unsigned int,
float,
int&,
float&);
86 rawRecHits_(iConfig.getParameter<
bool>(
"rawRecHits")),
87 debug_(iConfig.getParameter<
int>(
"debug")) {
98 recHitsFH_ = consumes<HGCRecHitCollection>(recHitsFH);
99 recHitsBH_ = consumes<HGCRecHitCollection>(recHitsBH);
105 recHitsFH_ = consumes<HGCRecHitCollection>(recHitsFH);
106 recHitsBH_ = consumes<HGCRecHitCollection>(recHitsBH);
135 ibooker.
book1D(
"hgcal_EoP_CPene_100_calib_fraction",
"", 1000, -0.5, 2.5);
137 ibooker.
book1D(
"hgcal_EoP_CPene_200_calib_fraction",
"", 1000, -0.5, 2.5);
139 ibooker.
book1D(
"hgcal_EoP_CPene_300_calib_fraction",
"", 1000, -0.5, 2.5);
142 ibooker.
book1D(
"hgcal_ele_EoP_CPene_100_calib_fraction",
"", 1000, -0.5, 2.5);
144 ibooker.
book1D(
"hgcal_ele_EoP_CPene_200_calib_fraction",
"", 1000, -0.5, 2.5);
146 ibooker.
book1D(
"hgcal_ele_EoP_CPene_300_calib_fraction",
"", 1000, -0.5, 2.5);
148 ibooker.
book1D(
"hgcal_ele_EoP_CPene_scint_calib_fraction",
"", 1000, -0.5, 2.5);
150 ibooker.
book1D(
"hgcal_photon_EoP_CPene_100_calib_fraction",
"", 1000, -0.5, 2.5);
152 ibooker.
book1D(
"hgcal_photon_EoP_CPene_200_calib_fraction",
"", 1000, -0.5, 2.5);
154 ibooker.
book1D(
"hgcal_photon_EoP_CPene_300_calib_fraction",
"", 1000, -0.5, 2.5);
156 ibooker.
book1D(
"hgcal_photon_EoP_CPene_scint_calib_fraction",
"", 1000, -0.5, 2.5);
162 const unsigned int hitlayer,
166 if (hitmap.find(hitid) == hitmap.end()) {
169 <<
">>> Failed to find detid " << std::hex << hitid.
rawId() <<
std::dec <<
" Det " << hitid.
det() <<
" Subdet " 176 <<
">>> Wrong type of detid " << std::hex << hitid.
rawId() <<
std::dec <<
" Det " << hitid.
det() <<
" Subdet " 185 if (seedEnergy < hitmap[hitid]->
energy()) {
186 seedEnergy = hitmap[hitid]->energy();
206 const std::vector<CaloParticle>&
caloParticles = *caloParticleHandle;
218 std::map<DetId, const HGCRecHit*> hitmap;
224 const auto& rechitsEE = *recHitHandleEE;
225 const auto& rechitsFH = *recHitHandleFH;
226 const auto& rechitsBH = *recHitHandleBH;
227 for (
unsigned int i = 0;
i < rechitsEE.size(); ++
i) {
228 hitmap[rechitsEE[
i].detid()] = &rechitsEE[
i];
230 for (
unsigned int i = 0;
i < rechitsFH.size(); ++
i) {
231 hitmap[rechitsFH[
i].detid()] = &rechitsFH[
i];
233 for (
unsigned int i = 0;
i < rechitsBH.size(); ++
i) {
234 hitmap[rechitsBH[
i].detid()] = &rechitsBH[
i];
241 for (
unsigned int i = 0;
i < rechitsEE.
size();
i++) {
242 hitmap[rechitsEE[
i].detid()] = &rechitsEE[
i];
249 const auto& rechitsFH = *recHitHandleFH;
250 const auto& rechitsBH = *recHitHandleBH;
251 for (
unsigned int i = 0;
i < rechitsFH.size();
i++) {
252 hitmap[rechitsFH[
i].detid()] = &rechitsFH[
i];
254 for (
unsigned int i = 0;
i < rechitsBH.size();
i++) {
255 hitmap[rechitsBH[
i].detid()] = &rechitsBH[
i];
266 float seedEnergy = 0.;
269 if (it_caloPart.g4Tracks()[0].eventId().event() != 0
or it_caloPart.g4Tracks()[0].eventId().bunchCrossing() != 0) {
270 LogDebug(
"HGCalHitCalibration") <<
"Excluding CaloParticles from event: " 271 << it_caloPart.g4Tracks()[0].eventId().event()
272 <<
" with BX: " << it_caloPart.g4Tracks()[0].eventId().bunchCrossing()
283 for (
const auto& it_sc : simClusterRefVector) {
286 <<
">>> SC.energy(): " << simCluster.
energy() <<
" SC.simEnergy(): " << simCluster.
simEnergy() << std::endl;
287 const std::vector<std::pair<uint32_t, float> >& hits_and_fractions = simCluster.
hits_and_fractions();
290 for (
const auto& it_haf : hits_and_fractions) {
292 DetId hitid = (it_haf.first);
299 fillWithRecHits(hitmap, hitid, hitlayer, it_haf.second, seedDet, seedEnergy);
304 auto sumCalibRecHitCalib_fraction =
307 <<
">>> MC Energy: " << it_caloPart.energy() <<
" reco energy: " << sumCalibRecHitCalib_fraction << std::endl;
312 const auto&
clusters = *hgcalMultiClustersHandle;
313 float total_energy = 0.;
314 float max_dR2 = 0.0025;
319 auto ERatio_a =
a.correctedEnergy() / it_caloPart.energy();
320 auto ERatio_b =
b.correctedEnergy() / it_caloPart.energy();
323 if (dR2_a < max_dR2 && dR2_b < max_dR2)
324 return ERatio_a > ERatio_b;
325 return dR2_a < dR2_b;
328 total_energy = closest->correctedEnergy();
338 auto closest_fcn = [&](
auto const&
a,
auto const&
b) {
341 auto ERatio_a =
a.energy() / it_caloPart.energy();
342 auto ERatio_b =
b.energy() / it_caloPart.energy();
345 if (dR2_a < max_dR2 && dR2_b < max_dR2)
346 return ERatio_a > ERatio_b;
347 return dR2_a < dR2_b;
350 if (PFElectronHandle.
isValid()) {
351 auto const& ele = (*PFElectronHandle);
352 auto closest = std::min_element(ele.begin(), ele.end(), closest_fcn);
353 if (closest != ele.end() &&
354 (closest->superCluster()->seed()->seed().det() ==
DetId::Forward ||
355 closest->superCluster()->seed()->seed().det() ==
DetId::HGCalEE) &&
358 if (closest->superCluster()->seed()->seed().det() ==
DetId::HGCalHSc) {
368 if (PFPhotonHandle.
isValid()) {
369 auto const&
photon = (*PFPhotonHandle);
370 auto closest = std::min_element(
photon.begin(),
photon.end(), closest_fcn);
371 if (closest !=
photon.end() &&
372 (closest->superCluster()->seed()->seed().det() ==
DetId::Forward ||
373 closest->superCluster()->seed()->seed().det() ==
DetId::HGCalEE) &&
388 desc.add<
int>(
"debug", 0);
389 desc.add<
bool>(
"rawRecHits",
true);
391 desc.add<
int>(
"depletionFine", 120);
399 descriptions.
add(
"hgcalHitCalibrationDefault",
desc);
static constexpr int layers_
edm::EDGetTokenT< std::vector< CaloParticle > > caloParticles_
static constexpr int depletion2_
static constexpr int scint_
edm::EDGetTokenT< std::vector< reco::Photon > > photons_
T getParameter(std::string const &) const
std::array< float, layers_ > Energy_layer_calib_fraction_
edm::EDGetTokenT< std::vector< reco::PFCluster > > hgcalMultiClusters_
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
std::map< int, MonitorElement * > hgcal_EoP_CPene_calib_fraction_
edm::EDGetTokenT< HGCRecHitCollection > recHitsFH_
Particle flow cluster, see clustering algorithm in PFClusterAlgo.
virtual void setCurrentFolder(std::string const &fullpath)
edm::EDGetTokenT< HGCRecHitCollection > recHitsEE_
#define IfLogTrace(cond, cat)
std::map< int, MonitorElement * > hgcal_ele_EoP_CPene_calib_fraction_
#define DEFINE_FWK_MODULE(type)
HGCalHitCalibration(const edm::ParameterSet &)
constexpr Detector det() const
get the detector field from this detid
std::map< int, MonitorElement * > hgcal_photon_EoP_CPene_calib_fraction_
std::vector< std::pair< uint32_t, float > > hits_and_fractions() const
Returns list of rechit IDs and fractions for this SimCluster.
float simEnergy() const
returns the accumulated sim energy in the cluster
constexpr std::array< uint8_t, layerIndexSize > layer
MonitorElement * LayerOccupancy_
~HGCalHitCalibration() override
edm::EDGetTokenT< HGCRecHitCollection > recHitsBH_
Monte Carlo truth information used for tracking validation.
void Fill(HcalDetId &id, double val, std::vector< TH2F > &depth)
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
void fillWithRecHits(std::map< DetId, const HGCRecHit *> &, DetId, unsigned int, float, int &, float &)
constexpr int subdetId() const
get the contents of the subdetector field (not cast into any detector's numbering enum) ...
ESHandle< T > getHandle(const ESGetToken< T, R > &iToken) const
hgcal::RecHitTools recHitTools_
void bookHistograms(DQMStore::IBooker &, edm::Run const &, edm::EventSetup const &) override
constexpr auto deltaR2(const T1 &t1, const T2 &t2) -> decltype(t1.eta())
constexpr uint32_t rawId() const
get the raw id
edm::EDGetTokenT< std::vector< reco::GsfElectron > > electrons_
std::map< int, MonitorElement * > h_EoP_CPene_calib_fraction_
void add(std::string const &label, ParameterSetDescription const &psetDescription)
void analyze(const edm::Event &, const edm::EventSetup &) override
float energy() const
Energy. Note this is taken from the first SimTrack only.
std::array< float, layers_ > Energy_layer_calib_
edm::ESGetToken< CaloGeometry, CaloGeometryRecord > caloGeomToken_
MonitorElement * book1D(TString const &name, TString const &title, int const nchX, double const lowX, double const highX, FUNC onbooking=NOOP())
static constexpr int depletion1_