10 #include "vdt/vdtMath.h"
12 #include <boost/iterator/function_output_iterator.hpp>
27 std::vector<double> logWeightDenom;
28 std::vector<float> logWeightDenomInv;
30 if (conf.
exists(
"logWeightDenominatorByDetector")) {
31 const std::vector<edm::ParameterSet>& logWeightDenominatorByDetectorPSet =
34 for (
const auto&
pset : logWeightDenominatorByDetectorPSet) {
35 if (!
pset.exists(
"detector")) {
36 throw cms::Exception(
"logWeightDenominatorByDetectorPSet") <<
"logWeightDenominator : detector not specified";
42 std::vector<int> depthsT =
pset.getParameter<std::vector<int> >(
"depths");
43 std::vector<double> logWeightDenomT =
pset.getParameter<std::vector<double> >(
"logWeightDenominator");
44 if (logWeightDenomT.size() != depthsT.size()) {
45 throw cms::Exception(
"logWeightDenominator") <<
"logWeightDenominator mismatch with the numbers of depths";
47 for (
unsigned int i = 0;
i < depthsT.size(); ++
i) {
53 logWeightDenom.push_back(logWeightDenomT[
i]);
60 logWeightDenom.push_back(conf.
getParameter<
double>(
"logWeightDenominator"));
63 for (
unsigned int i = 0;
i <
depths.size(); ++
i) {
64 logWeightDenomInv.push_back(1. / logWeightDenom[
i]);
71 if (conf.
exists(
"timeResolutionCalcBarrel")) {
76 if (conf.
exists(
"timeResolutionCalcEndcap")) {
87 edm::LogError(
"Basic2DGenericPFlowPositionCalc") <<
"posCalcNCrystals not valid";
112 inline bool isBarrel(
int cell_layer) {
129 if (!cluster.
seed()) {
130 throw cms::Exception(
"ClusterWithNoSeed") <<
" Found a cluster with no seed: " << cluster;
132 double cl_energy = 0;
134 double cl_timeweight = 0.0;
144 auto const recHitCollection =
155 auto k =
hf.recHitRef().key();
156 auto p = recHitCollection +
k;
162 for (
auto const& rhf :
hits) {
166 const auto rh_fraction = rhf.fraction;
167 const auto rh_rawenergy = rhf.energy;
168 const auto rh_energy = rh_rawenergy * rh_fraction;
171 throw cms::Exception(
"PFClusterAlgo") <<
"rechit " << refhit.
detId() <<
" has a NaN energy... "
172 <<
"The input of the particle flow clustering seems to be corrupted.";
175 cl_energy += rh_energy;
179 int cell_layer = (
int)refhit.
layer();
182 cl_time += rh_fraction * refhit.
time() * res2;
183 cl_timeweight += rh_fraction * res2;
185 const double rh_rawenergy2 = rh_rawenergy * rh_rawenergy;
186 cl_timeweight += rh_rawenergy2 * rh_fraction;
187 cl_time += rh_rawenergy2 * rh_fraction * refhit.
time();
190 if (rh_energy > max_e) {
192 max_e_layer = refhit.
layer();
197 cluster.
setTime(cl_time / cl_timeweight);
205 double position_norm = 0.0;
206 double x(0.0),
y(0.0),
z(0.0);
207 if (
nullptr !=
mySeed.hit) {
208 auto seedNeighbours =
mySeed.hit->neighbours();
211 seedNeighbours =
mySeed.hit->neighbours4();
214 seedNeighbours =
mySeed.hit->neighbours8();
220 auto compute = [&](LHit
const& rhf) {
223 int cell_layer = (
int)refhit.
layer();
236 const auto rh_energy = rhf.energy * rhf.fraction;
239 const auto rhpos_xyz = refhit.
position() * norm;
244 position_norm += norm;
251 for (
auto const& rhf :
hits)
257 for (
auto k : seedNeighbours) {
258 nei.push_back(recHitCollection +
k);
265 std::set_intersection(
266 hits.begin(),
hits.end(), nei.begin(), nei.end(), boost::make_function_output_iterator(
compute), LHitLess());
270 <<
"Cluster seed hit is null, something is wrong with PFlow RecHit!";
274 edm::LogError(
"WeirdClusterNormalization") <<
"PFCluster too far from seeding cell: set position to (0,0,0).";
278 const double norm_inverse = 1.0 / position_norm;
282 depth *= norm_inverse;