CMS 3D CMS Logo

LowPtGsfElectronSCProducer.cc
Go to the documentation of this file.
24 
25 #include <iostream>
26 
28 public:
30 
31  void produce(edm::Event&, const edm::EventSetup&) override;
32 
34 
35 private:
38  std::vector<int>& matched);
39 
42  const double dr2_;
43 };
44 
46 //
48  : gsfPfRecTracks_{consumes<reco::GsfPFRecTrackCollection>(cfg.getParameter<edm::InputTag>("gsfPfRecTracks"))},
49  ecalClusters_{consumes<reco::PFClusterCollection>(cfg.getParameter<edm::InputTag>("ecalClusters"))},
50  dr2_{cfg.getParameter<double>("MaxDeltaR2")} {
51  produces<reco::CaloClusterCollection>();
52  produces<reco::SuperClusterCollection>();
53  produces<edm::ValueMap<reco::SuperClusterRef> >();
54 }
55 
57 //
59  // Input GsfPFRecTracks collection
61 
62  // Input EcalClusters collection
64 
65  // Output SuperClusters collection and getRefBeforePut
66  auto superClusters = std::make_unique<reco::SuperClusterCollection>(reco::SuperClusterCollection());
67  superClusters->reserve(gsfPfRecTracks->size());
68  const reco::SuperClusterRefProd superClustersRefProd = event.getRefBeforePut<reco::SuperClusterCollection>();
69 
70  // Output ValueMap container of GsfPFRecTrackRef index to SuperClusterRef
71  std::vector<reco::SuperClusterRef> superClustersValueMap;
72 
73  // Output CaloClusters collection
74  auto caloClusters = std::make_unique<reco::CaloClusterCollection>(reco::CaloClusterCollection());
75  caloClusters->reserve(ecalClusters.size());
76 
77  // Index[GSF track][trajectory point] for "best" CaloCluster
78  std::vector<std::vector<int> > cluster_idx;
79  cluster_idx.reserve(gsfPfRecTracks->size());
80 
81  // Index[GSF track][trajectory point] for "best" PFCluster
82  std::vector<std::vector<int> > pfcluster_idx;
83  pfcluster_idx.reserve(gsfPfRecTracks->size());
84 
85  // dr2min[GSF track][trajectory point] for "best" CaloCluster
86  std::vector<std::vector<float> > cluster_dr2min;
87  cluster_dr2min.reserve(gsfPfRecTracks->size());
88 
89  // Construct list of trajectory points from the GSF track and electron brems
90  std::vector<std::vector<const reco::PFTrajectoryPoint*> > points;
91  points.reserve(gsfPfRecTracks->size());
92  for (auto const& trk : *gsfPfRecTracks) {
93  // Extrapolated track
94  std::vector<const reco::PFTrajectoryPoint*> traj;
95  traj.reserve(trk.PFRecBrem().size() + 1);
96  traj.push_back(&trk.extrapolatedPoint(reco::PFTrajectoryPoint::LayerType::ECALShowerMax));
97  // Extrapolated brem trajectories
98  for (auto const& brem : trk.PFRecBrem()) {
99  traj.push_back(&brem.extrapolatedPoint(reco::PFTrajectoryPoint::LayerType::ECALShowerMax));
100  }
101  auto size = traj.size();
102  points.push_back(std::move(traj));
103  // Size containers
104  cluster_idx.emplace_back(size, -1);
105  pfcluster_idx.emplace_back(size, -1);
106  cluster_dr2min.emplace_back(size, 1.e6);
107  }
108 
109  // For each cluster, find closest trajectory point ("global" arbitration at event level)
110  for (size_t iclu = 0; iclu < ecalClusters.size(); ++iclu) { // Cluster loop
111  std::pair<int, int> point = std::make_pair(-1, -1);
112  float dr2min = 1.e6;
113  for (size_t ipoint = 0; ipoint < points.size(); ++ipoint) { // GSF track loop
114  for (size_t jpoint = 0; jpoint < points[ipoint].size(); ++jpoint) { // Traj point loop
115  if (points[ipoint][jpoint]->isValid()) {
116  float dr2 = reco::deltaR2(ecalClusters[iclu], points[ipoint][jpoint]->positionREP());
117  if (dr2 < dr2min) {
118  // Store nearest point to this cluster
119  dr2min = dr2;
120  point = std::make_pair(ipoint, jpoint);
121  }
122  }
123  }
124  }
125  if (point.first >= 0 && point.second >= 0 && // if this cluster is matched to a point ...
126  dr2min < cluster_dr2min[point.first][point.second]) { // ... and cluster is closest to the same point
127  // Copy CaloCluster to new collection
128  caloClusters->push_back(ecalClusters[iclu]);
129  // Store cluster index for creation of SC later
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;
133  }
134  }
135 
136  // Put CaloClusters in event and get orphan handle
137  const edm::OrphanHandle<reco::CaloClusterCollection>& caloClustersH = event.put(std::move(caloClusters));
138 
139  // Loop through GSF tracks
140  for (size_t itrk = 0; itrk < gsfPfRecTracks->size(); ++itrk) {
141  // Used to create SC
142  float energy = 0.;
143  float X = 0., Y = 0., Z = 0.;
146  std::vector<const reco::PFCluster*> barePtrs;
147 
148  // Find closest match in dr2 from points associated to given track
149  int index = -1;
150  float dr2 = 1.e6;
151  for (size_t ipoint = 0; ipoint < cluster_idx[itrk].size(); ++ipoint) {
152  if (cluster_idx[itrk][ipoint] < 0) {
153  continue;
154  }
155  if (cluster_dr2min[itrk][ipoint] < dr2) {
156  dr2 = cluster_dr2min[itrk][ipoint];
157  index = cluster_idx[itrk][ipoint];
158  }
159  }
160 
161  // For each track, loop through points and use associated cluster
162  for (size_t ipoint = 0; ipoint < cluster_idx[itrk].size(); ++ipoint) {
163  if (cluster_idx[itrk][ipoint] < 0) {
164  continue;
165  }
166  reco::CaloClusterPtr clu(caloClustersH, cluster_idx[itrk][ipoint]);
167  if (clu.isNull()) {
168  continue;
169  }
170  if (!(cluster_dr2min[itrk][ipoint] < dr2_ || // Require cluster to be closer than dr2_ ...
171  index == cluster_idx[itrk][ipoint])) {
172  continue;
173  } // ... unless it is the closest one ...
174  if (seed.isNull()) {
175  seed = clu;
176  }
177  clusters.push_back(clu);
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]));
185  }
186  }
187  X /= energy;
188  Y /= energy;
189  Z /= energy;
190 
191  // Create SC
192  if (seed.isNonnull()) {
195  sc.setSeed(seed);
196  sc.setClusters(clusters);
197  PFClusterWidthAlgo pfwidth(barePtrs);
198  sc.setEtaWidth(pfwidth.pflowEtaWidth());
199  sc.setPhiWidth(pfwidth.pflowPhiWidth());
200  sc.rawEnergy(); // Cache the value of raw energy
201  superClusters->push_back(sc);
202 
203  // Populate ValueMap container
204  superClustersValueMap.push_back(reco::SuperClusterRef(superClustersRefProd, superClusters->size() - 1));
205  } else {
206  superClustersValueMap.push_back(reco::SuperClusterRef(superClustersRefProd.id()));
207  }
208 
209  } // GSF tracks
210 
211  // Put SuperClusters in event
212  event.put(std::move(superClusters));
213 
214  auto ptr = std::make_unique<edm::ValueMap<reco::SuperClusterRef> >(edm::ValueMap<reco::SuperClusterRef>());
216  filler.insert(gsfPfRecTracks, superClustersValueMap.begin(), superClustersValueMap.end());
217  filler.fill();
218  event.put(std::move(ptr));
219 }
220 
222 //
225  std::vector<int>& matched) {
226  reco::PFClusterRef closest;
227  if (point.isValid()) {
228  float dr2min = dr2_;
229  for (size_t ii = 0; ii < clusters->size(); ++ii) {
230  if (std::find(matched.begin(), matched.end(), ii) == matched.end()) {
231  float dr2 = reco::deltaR2(clusters->at(ii), point.positionREP());
232  if (dr2 < dr2min) {
233  closest = reco::PFClusterRef(clusters, ii);
234  dr2min = dr2;
235  }
236  }
237  }
238  if (dr2min < (dr2_ - 1.e-6)) {
239  matched.push_back(closest.index());
240  }
241  }
242  return closest;
243 }
244 
246 //
249  desc.add<edm::InputTag>("gsfPfRecTracks", edm::InputTag("lowPtGsfElePfGsfTracks"));
250  desc.add<edm::InputTag>("ecalClusters", edm::InputTag("particleFlowClusterECAL"));
251  desc.add<edm::InputTag>("hcalClusters", edm::InputTag("particleFlowClusterHCAL"));
252  desc.add<double>("MaxDeltaR2", 0.5);
253  descriptions.add("lowPtGsfElectronSuperClusters", desc);
254 }
255 
257 //
ConfigurationDescriptions.h
muonTagProbeFilters_cff.matched
matched
Definition: muonTagProbeFilters_cff.py:62
edm::RefProd
Definition: EDProductfwd.h:25
reco::PFClusterCollection
std::vector< PFCluster > PFClusterCollection
collection of PFCluster objects
Definition: PFClusterFwd.h:9
HLT_2018_cff.points
points
Definition: HLT_2018_cff.py:20125
edm::ParameterSetDescription::add
ParameterDescriptionBase * add(U const &iLabel, T const &value)
Definition: ParameterSetDescription.h:95
PFClusterWidthAlgo::pflowEtaWidth
double pflowEtaWidth() const
Definition: PFClusterWidthAlgo.h:15
LowPtGsfElectronSCProducer::closestCluster
reco::PFClusterRef closestCluster(const reco::PFTrajectoryPoint &point, const edm::Handle< reco::PFClusterCollection > &clusters, std::vector< int > &matched)
Definition: LowPtGsfElectronSCProducer.cc:223
MessageLogger.h
edm::RefProd::id
ProductID id() const
Accessor for product ID.
Definition: RefProd.h:124
LowPtGsfElectronSCProducer::gsfPfRecTracks_
const edm::EDGetTokenT< reco::GsfPFRecTrackCollection > gsfPfRecTracks_
Definition: LowPtGsfElectronSCProducer.cc:40
reco::SuperCluster
Definition: SuperCluster.h:18
X
#define X(str)
Definition: MuonsGrabber.cc:38
edm::EDGetTokenT< reco::GsfPFRecTrackCollection >
reco::CaloCluster::setCorrectedEnergy
void setCorrectedEnergy(double cenergy)
Definition: CaloCluster.h:137
reco::SuperCluster::setEtaWidth
void setEtaWidth(double ew)
Definition: SuperCluster.h:74
edm::ParameterSetDescription
Definition: ParameterSetDescription.h:52
EDProducer.h
spr::find
void find(edm::Handle< EcalRecHitCollection > &hits, DetId thisDet, std::vector< EcalRecHitCollection::const_iterator > &hit, bool debug=false)
Definition: FindCaloHit.cc:19
edm::Ref::index
key_type index() const
Definition: Ref.h:253
edm::Handle
Definition: AssociativeIterator.h:50
singleTopDQM_cfi.setup
setup
Definition: singleTopDQM_cfi.py:37
edm::Ref< PFClusterCollection >
PFClusterWidthAlgo::pflowPhiWidth
double pflowPhiWidth() const
Definition: PFClusterWidthAlgo.h:14
reco::PFClusterRef
edm::Ref< PFClusterCollection > PFClusterRef
persistent reference to PFCluster objects
Definition: PFClusterFwd.h:15
deltaR.h
reco::SuperCluster::setSeed
void setSeed(const CaloClusterPtr &r)
list of used xtals by DetId // now inherited by CaloCluster
Definition: SuperCluster.h:107
uncleanedOnlyElectronSequence_cff.gsfPfRecTracks
gsfPfRecTracks
Definition: uncleanedOnlyElectronSequence_cff.py:141
reco::SuperClusterCollection
std::vector< SuperCluster > SuperClusterCollection
collection of SuperCluser objectr
Definition: SuperClusterFwd.h:9
MakerMacros.h
DEFINE_FWK_MODULE
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:16
edm::ConfigurationDescriptions::add
void add(std::string const &label, ParameterSetDescription const &psetDescription)
Definition: ConfigurationDescriptions.cc:57
LowPtGsfElectronSCProducer::fillDescriptions
static void fillDescriptions(edm::ConfigurationDescriptions &)
Definition: LowPtGsfElectronSCProducer.cc:247
edm::PtrVector< CaloCluster >
reco::CaloClusterCollection
std::vector< CaloCluster > CaloClusterCollection
collection of CaloCluster objects
Definition: CaloClusterFwd.h:19
PFCluster.h
plotBeamSpotDB.ipoint
ipoint
Definition: plotBeamSpotDB.py:340
CaloClusterFwd.h
HCALHighEnergyHPDFilter_cfi.energy
energy
Definition: HCALHighEnergyHPDFilter_cfi.py:5
LowPtGsfElectronSCProducer::ecalClusters_
const edm::EDGetTokenT< reco::PFClusterCollection > ecalClusters_
Definition: LowPtGsfElectronSCProducer.cc:41
LowPtGsfElectronSCProducer::LowPtGsfElectronSCProducer
LowPtGsfElectronSCProducer(const edm::ParameterSet &)
Definition: LowPtGsfElectronSCProducer.cc:47
ParameterSetDescription.h
PFClusterWidthAlgo.h
HLT_2018_cff.superClusters
superClusters
Definition: HLT_2018_cff.py:13791
edm::ConfigurationDescriptions
Definition: ConfigurationDescriptions.h:28
ValidHandle.h
bsc_activity_cfg.clusters
clusters
Definition: bsc_activity_cfg.py:36
HLT_2018_cff.InputTag
InputTag
Definition: HLT_2018_cff.py:79016
edm::ParameterSet
Definition: ParameterSet.h:36
math::XYZPoint
XYZPointD XYZPoint
point in space with cartesian internal representation
Definition: Point3D.h:12
RecoEcal_cff.ecalClusters
ecalClusters
Definition: RecoEcal_cff.py:26
reco::SuperCluster::setClusters
void setClusters(const CaloClusterPtrVector &clusters)
Definition: SuperCluster.h:110
trigObjTnPSource_cfi.filler
filler
Definition: trigObjTnPSource_cfi.py:21
reco::deltaR2
constexpr auto deltaR2(const T1 &t1, const T2 &t2) -> decltype(t1.eta())
Definition: deltaR.h:16
RefToPtr.h
PFClusterFwd.h
GsfTrack.h
DOFs::Z
Definition: AlignPCLThresholdsWriter.cc:37
edm::stream::EDProducer
Definition: EDProducer.h:38
edm::EventSetup
Definition: EventSetup.h:57
edm::makeValid
auto makeValid(const U &iOtherHandleType) noexcept(false)
Definition: ValidHandle.h:52
PFRecTrack.h
edm::Ptr< CaloCluster >
looper.cfg
cfg
Definition: looper.py:297
ValueMap.h
LowPtGsfElectronSCProducer
Definition: LowPtGsfElectronSCProducer.cc:27
eostools.move
def move(src, dest)
Definition: eostools.py:511
edm::OrphanHandle
Definition: EDProductfwd.h:39
DOFs::Y
Definition: AlignPCLThresholdsWriter.cc:37
SuperClusterFwd.h
Frameworkfwd.h
edm::ValueMap
Definition: ValueMap.h:107
reco::SuperCluster::rawEnergy
double rawEnergy() const
raw uncorrected energy (sum of energies of component BasicClusters)
Definition: SuperCluster.h:58
reco::PFTrajectoryPoint
A PFTrack holds several trajectory points, which basically contain the position and momentum of a tra...
Definition: PFTrajectoryPoint.h:26
SuperCluster.h
PFClusterWidthAlgo
Definition: PFClusterWidthAlgo.h:6
reco::SuperCluster::setPhiWidth
void setPhiWidth(double pw)
Definition: SuperCluster.h:73
LowPtGsfElectronSCProducer::dr2_
const double dr2_
Definition: LowPtGsfElectronSCProducer.cc:42
AlignmentPI::index
index
Definition: AlignmentPayloadInspectorHelper.h:46
PFRecTrackFwd.h
GsfPFRecTrackFwd.h
edm::helper::Filler
Definition: ValueMap.h:22
ParameterSet.h
GsfPFRecTrack.h
point
*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
Definition: invegas.h:5
event
Definition: event.py:1
edm::Event
Definition: Event.h:73
cuy.ii
ii
Definition: cuy.py:590
edm::Ptr::isNull
bool isNull() const
Checks for null.
Definition: Ptr.h:142
LowPtGsfElectronSCProducer::produce
void produce(edm::Event &, const edm::EventSetup &) override
Definition: LowPtGsfElectronSCProducer.cc:58
edm::InputTag
Definition: InputTag.h:15
SurveyInfoScenario_cff.seed
seed
Definition: SurveyInfoScenario_cff.py:295
CaloCluster.h
PFTrajectoryPoint.h
findQualityFiles.size
size
Write out results.
Definition: findQualityFiles.py:443
MillePedeFileConverter_cfg.e
e
Definition: MillePedeFileConverter_cfg.py:37