71 std::vector<reco::SuperClusterRef> superClustersValueMap;
75 caloClusters->reserve(ecalClusters.size());
78 std::vector<std::vector<int> > cluster_idx;
79 cluster_idx.reserve(gsfPfRecTracks->size());
82 std::vector<std::vector<int> > pfcluster_idx;
83 pfcluster_idx.reserve(gsfPfRecTracks->size());
86 std::vector<std::vector<float> > cluster_dr2min;
87 cluster_dr2min.reserve(gsfPfRecTracks->size());
90 std::vector<std::vector<const reco::PFTrajectoryPoint*> > points;
91 points.reserve(gsfPfRecTracks->size());
92 for (
auto const& trk : *gsfPfRecTracks) {
94 std::vector<const reco::PFTrajectoryPoint*> traj;
95 traj.reserve(trk.PFRecBrem().size() + 1);
96 traj.push_back(&trk.extrapolatedPoint(reco::PFTrajectoryPoint::LayerType::ECALShowerMax));
98 for (
auto const& brem : trk.PFRecBrem()) {
99 traj.push_back(&brem.extrapolatedPoint(reco::PFTrajectoryPoint::LayerType::ECALShowerMax));
101 auto size = traj.size();
104 cluster_idx.emplace_back(
size, -1);
105 pfcluster_idx.emplace_back(
size, -1);
106 cluster_dr2min.emplace_back(
size, 1.e6);
110 for (
size_t iclu = 0; iclu < ecalClusters.size(); ++iclu) {
111 std::pair<int, int>
point = std::make_pair(-1, -1);
114 for (
size_t jpoint = 0; jpoint < points[
ipoint].size(); ++jpoint) {
120 point = std::make_pair(
ipoint, jpoint);
125 if (point.first >= 0 && point.second >= 0 &&
126 dr2min < cluster_dr2min[point.first][point.second]) {
128 caloClusters->push_back(ecalClusters[iclu]);
130 cluster_idx[point.first][point.second] = caloClusters->size() - 1;
131 pfcluster_idx[point.first][point.second] = iclu;
132 cluster_dr2min[point.first][point.second] = dr2min;
140 for (
size_t itrk = 0; itrk < gsfPfRecTracks->size(); ++itrk) {
143 float X = 0.,
Y = 0.,
Z = 0.;
146 std::vector<const reco::PFCluster*> barePtrs;
152 if (cluster_idx[itrk][
ipoint] < 0) {
155 if (cluster_dr2min[itrk][
ipoint] < dr2) {
156 dr2 = cluster_dr2min[itrk][
ipoint];
157 index = cluster_idx[itrk][
ipoint];
163 if (cluster_idx[itrk][
ipoint] < 0) {
171 index == cluster_idx[itrk][
ipoint])) {
178 energy += clu->correctedEnergy();
179 X += clu->position().X() * clu->correctedEnergy();
180 Y += clu->position().Y() * clu->correctedEnergy();
181 Z += clu->position().Z() * clu->correctedEnergy();
182 auto index = pfcluster_idx[itrk][
ipoint];
183 if (index <
static_cast<decltype(index)
>(ecalClusters.size())) {
184 barePtrs.push_back(&(ecalClusters[index]));
194 sc.setCorrectedEnergy(energy);
196 sc.setClusters(clusters);
198 sc.setEtaWidth(pfwidth.pflowEtaWidth());
199 sc.setPhiWidth(pfwidth.pflowPhiWidth());
216 filler.insert(gsfPfRecTracks, superClustersValueMap.begin(), superClustersValueMap.end());
const bool isValid(const Frame &aFrame, const FrameQuality &aQuality, const uint16_t aExpectedPos)
const edm::EDGetTokenT< reco::PFClusterCollection > ecalClusters_
void push_back(Ptr< T > const &iPtr)
const edm::EDGetTokenT< reco::GsfPFRecTrackCollection > gsfPfRecTracks_
Handle< PROD > getHandle(EDGetTokenT< PROD > token) const
std::vector< SuperCluster > SuperClusterCollection
collection of SuperCluser objectr
bool isNull() const
Checks for null.
std::vector< CaloCluster > CaloClusterCollection
collection of CaloCluster objects
bool isNonnull() const
Checks for non-null.
constexpr auto deltaR2(const T1 &t1, const T2 &t2) -> decltype(t1.eta())
XYZPointD XYZPoint
point in space with cartesian internal representation
ProductID id() const
Accessor for product ID.
std::vector< PFCluster > PFClusterCollection
collection of PFCluster objects
auto makeValid(const U &iOtherHandleType) noexcept(false)
tuple size
Write out results.
*vegas h *****************************************************used in the default bin number in original ***version of VEGAS is ***a higher bin number might help to derive a more precise ***grade subtle point