53 void fillWithRecHits(std::unordered_map<DetId, const HGCRecHit*>&,
DetId,
unsigned int,
float,
int&,
float&);
86 debug_(iConfig.getParameter<int>(
"debug")),
87 filterOnEnergyAndCaloP_(iConfig.getParameter<bool>(
"filterOnEnergyAndCaloP")) {
90 hitMap_ = consumes<std::unordered_map<DetId, const HGCRecHit*>>(hitMapInputTag);
105 eta1_ = ibooker.
book1D(
"eta1",
"eta1", 80, 0., 4.);
106 eta2_ = ibooker.
book1D(
"eta2",
"eta2", 80, 0., 4.);
111 layerEnergy_ = ibooker.
book2D(
"LayerEnergy",
"LayerEnergy", 60, 0., 60., 50, 0., 0.1);
112 layerDistance_ = ibooker.
book2D(
"LayerDistance",
"LayerDistance", 60, 0., 60., 400, -400., 400.);
113 etaPhi_ = ibooker.
book2D(
"EtaPhi",
"EtaPhi", 800, -4., 4., 800, -4., 4.);
114 deltaEtaPhi_ = ibooker.
book2D(
"DeltaEtaPhi",
"DeltaEtaPhi", 100, -0.5, 0.5, 100, -0.5, 0.5);
125 std::string(
"GlobalProfileOnLayer_") + std::to_string(
i),
138 std::string(
"IdealDistanceOnLayer_") + std::to_string(
i),
168 const std::vector<CaloParticle>&
caloParticles = *caloParticleHandle;
172 const auto hitmap = *hitMapHandle;
179 auto theta1 = 2. * atan(
exp(-
eta1));
182 auto theta2 = 2. * atan(
exp(-
eta2));
191 float energy_tmp = 0.;
195 size += simClusterRefVector.
size();
196 for (
const auto& it_sc : simClusterRefVector) {
198 const std::vector<std::pair<uint32_t, float>>& hits_and_fractions = simCluster.
hits_and_fractions();
199 for (
const auto& it_haf : hits_and_fractions) {
200 if (hitmap.count(it_haf.first))
201 energy += hitmap.at(it_haf.first)->energy() * it_haf.second;
217 for (
const auto& it_caloPart : caloParticles) {
219 IfLogTrace(
debug_ > 0,
"HGCalShowerSeparation") <<
">>> " << simClusterRefVector.
size() << std::endl;
220 for (
const auto& it_sc : simClusterRefVector) {
222 if (simCluster.
energy() < 80 * 0.8)
226 <<
">>> SC.energy(): " << simCluster.
energy() <<
" SC.simEnergy(): " << simCluster.
simEnergy() << std::endl;
227 const std::vector<std::pair<uint32_t, float>>& hits_and_fractions = simCluster.
hits_and_fractions();
229 for (
const auto& it_haf : hits_and_fractions) {
230 if (!hitmap.count(it_haf.first))
234 float globalx = global.
x();
235 float globaly = global.y();
236 float globalz = global.z();
239 auto rho1 = globalz *
tan(theta1);
240 auto rho2 = globalz *
tan(theta2);
241 auto x1 = rho1 *
cos(phi1);
242 auto y1 = rho1 *
sin(phi1);
243 auto x2 = rho2 *
cos(phi2);
244 auto y2 = rho2 *
sin(phi2);
245 auto half_point_x = (x1 + x2) / 2.;
246 auto half_point_y = (y1 + y2) / 2.;
247 auto half_point =
sqrt((x1 - half_point_x) * (x1 - half_point_x) + (y1 - half_point_y) * (y1 - half_point_y));
248 auto d_len =
sqrt((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1));
249 auto dn_x = (x2 - x1) / d_len;
250 auto dn_y = (y2 - y1) / d_len;
251 auto distance = (globalx - x1) * dn_x + (globaly - y1) * dn_y;
253 auto idealDistance =
sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2));
254 if (hitmap.count(it_haf.first)) {
256 10. * (globaly - half_point_y),
257 hitmap.at(it_haf.first)->energy() * it_haf.second);
259 10. * (globaly - half_point_y),
260 hitmap.at(it_haf.first)->energy() * it_haf.second);
261 globalProfileOnLayer_[hitlayer]->Fill(globalx, globaly, hitmap.at(it_haf.first)->energy() * it_haf.second);
262 globalProfileOnLayer_[55]->Fill(globalx, globaly, hitmap.at(it_haf.first)->energy() * it_haf.second);
268 idealDeltaXY_[hitlayer]->Fill(10. * (x1 - x2), 10. * (y1 - y2));
269 centers_[hitlayer]->Fill(10. * half_point_x, 10. * half_point_y);
271 <<
">>> " <<
distance <<
" " << hitlayer <<
" " << hitmap.at(it_haf.first)->energy() * it_haf.second
285 desc.
add<
int>(
"debug", 1);
286 desc.
add<
bool>(
"filterOnEnergyAndCaloP",
false);
289 descriptions.
add(
"hgcalShowerSeparationDefault", desc);
MonitorElement * scEnergy_
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::EventIDconst &, edm::Timestampconst & > We also list in braces which AR_WATCH_USING_METHOD_ is used for those or
bool filterOnEnergyAndCaloP_
virtual void setCurrentFolder(std::string const &fullpath)
bool getByToken(EDGetToken token, Handle< PROD > &result) const
#define IfLogTrace(cond, cat)
MonitorElement * layerEnergy_
#define DEFINE_FWK_MODULE(type)
MonitorElement * deltaEtaPhi_
MonitorElement * energy1_
const edm::ESGetToken< CaloGeometry, CaloGeometryRecord > tok_geom_
Sin< T >::type sin(const T &t)
edm::EDGetTokenT< std::unordered_map< DetId, const HGCRecHit * > > hitMap_
static constexpr int layers_
MonitorElement * energy2_
std::vector< MonitorElement * > globalProfileOnLayer_
Exp< T >::type exp(const T &t)
std::vector< MonitorElement * > idealDeltaXY_
std::vector< MonitorElement * > profileOnLayer_
bool getData(T &iHolder) const
MonitorElement * energytot_
Monte Carlo truth information used for tracking validation.
edm::EDGetTokenT< std::vector< CaloParticle > > caloParticles_
void bookHistograms(DQMStore::IBooker &, edm::Run const &, edm::EventSetup const &) override
std::vector< MonitorElement * > distanceOnLayer_
Cos< T >::type cos(const T &t)
Tan< T >::type tan(const T &t)
Abs< T >::type abs(const T &t)
float energy() const
Energy. Note this is taken from the first SimTrack only.
ParameterDescriptionBase * add(U const &iLabel, T const &value)
float simEnergy() const
returns the accumulated sim energy in the cluster
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
void fillWithRecHits(std::unordered_map< DetId, const HGCRecHit * > &, DetId, unsigned int, float, int &, float &)
hgcal::RecHitTools recHitTools_
MonitorElement * layerDistance_
MonitorElement * book2D(TString const &name, TString const &title, int nchX, double lowX, double highX, int nchY, double lowY, double highY, FUNC onbooking=NOOP())
T getParameter(std::string const &) const
void add(std::string const &label, ParameterSetDescription const &psetDescription)
void analyze(const edm::Event &, const edm::EventSetup &) override
std::vector< MonitorElement * > centers_
size_type size() const
Size of the RefVector.
~HGCalShowerSeparation() override
MonitorElement * book1D(TString const &name, TString const &title, int const nchX, double const lowX, double const highX, FUNC onbooking=NOOP())
std::vector< MonitorElement * > idealDistanceOnLayer_
MonitorElement * showerProfile_
tuple size
Write out results.
std::vector< std::pair< uint32_t, float > > hits_and_fractions() const
Returns list of rechit IDs and fractions for this SimCluster.
tok_geom_(esConsumes< CaloGeometry, CaloGeometryRecord, edm::Transition::BeginRun >())
HGCalShowerSeparation(const edm::ParameterSet &)