CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
List of all members | Public Member Functions | Static Public Member Functions | Private Member Functions | Private Attributes
LowPtGsfElectronSCProducer Class Reference
Inheritance diagram for LowPtGsfElectronSCProducer:
edm::stream::EDProducer<>

Public Member Functions

 LowPtGsfElectronSCProducer (const edm::ParameterSet &)
 
void produce (edm::Event &, const edm::EventSetup &) override
 
- Public Member Functions inherited from edm::stream::EDProducer<>
 EDProducer ()=default
 
 EDProducer (const EDProducer &)=delete
 
bool hasAbilityToProduceInBeginLumis () const final
 
bool hasAbilityToProduceInBeginProcessBlocks () const final
 
bool hasAbilityToProduceInBeginRuns () const final
 
bool hasAbilityToProduceInEndLumis () const final
 
bool hasAbilityToProduceInEndProcessBlocks () const final
 
bool hasAbilityToProduceInEndRuns () const final
 
const EDProduceroperator= (const EDProducer &)=delete
 

Static Public Member Functions

static void fillDescriptions (edm::ConfigurationDescriptions &)
 

Private Member Functions

reco::PFClusterRef closestCluster (const reco::PFTrajectoryPoint &point, const edm::Handle< reco::PFClusterCollection > &clusters, std::vector< int > &matched)
 

Private Attributes

const double dr2_
 
const edm::EDGetTokenT
< reco::PFClusterCollection
ecalClusters_
 
const edm::EDGetTokenT
< reco::GsfPFRecTrackCollection
gsfPfRecTracks_
 

Additional Inherited Members

- Public Types inherited from edm::stream::EDProducer<>
using CacheTypes = CacheContexts< T...>
 
using GlobalCache = typename CacheTypes::GlobalCache
 
using HasAbility = AbilityChecker< T...>
 
using InputProcessBlockCache = typename CacheTypes::InputProcessBlockCache
 
using LuminosityBlockCache = typename CacheTypes::LuminosityBlockCache
 
using LuminosityBlockContext = LuminosityBlockContextT< LuminosityBlockCache, RunCache, GlobalCache >
 
using LuminosityBlockSummaryCache = typename CacheTypes::LuminosityBlockSummaryCache
 
using RunCache = typename CacheTypes::RunCache
 
using RunContext = RunContextT< RunCache, GlobalCache >
 
using RunSummaryCache = typename CacheTypes::RunSummaryCache
 

Detailed Description

Definition at line 27 of file LowPtGsfElectronSCProducer.cc.

Constructor & Destructor Documentation

LowPtGsfElectronSCProducer::LowPtGsfElectronSCProducer ( const edm::ParameterSet cfg)
explicit

Definition at line 47 of file LowPtGsfElectronSCProducer.cc.

References edm::ParameterSet::getParameter().

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 }
const edm::EDGetTokenT< reco::PFClusterCollection > ecalClusters_
const edm::EDGetTokenT< reco::GsfPFRecTrackCollection > gsfPfRecTracks_
T getParameter(std::string const &) const
Definition: ParameterSet.h:303

Member Function Documentation

reco::PFClusterRef LowPtGsfElectronSCProducer::closestCluster ( const reco::PFTrajectoryPoint point,
const edm::Handle< reco::PFClusterCollection > &  clusters,
std::vector< int > &  matched 
)
private

Definition at line 223 of file LowPtGsfElectronSCProducer.cc.

References reco::deltaR2(), dr2_, alignCSCRings::e, spr::find(), cuy::ii, edm::Ref< C, T, F >::index(), reco::PFTrajectoryPoint::isValid(), and reco::PFTrajectoryPoint::positionREP().

225  {
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 }
const REPPoint & positionREP() const
trajectory position in (rho, eta, phi) base
key_type index() const
Definition: Ref.h:253
int ii
Definition: cuy.py:589
void find(edm::Handle< EcalRecHitCollection > &hits, DetId thisDet, std::vector< EcalRecHitCollection::const_iterator > &hit, bool debug=false)
Definition: FindCaloHit.cc:19
edm::Ref< PFClusterCollection > PFClusterRef
persistent reference to PFCluster objects
Definition: PFClusterFwd.h:15
constexpr auto deltaR2(const T1 &t1, const T2 &t2) -> decltype(t1.eta())
Definition: deltaR.h:16
bool isValid() const
is this point valid ?
void LowPtGsfElectronSCProducer::fillDescriptions ( edm::ConfigurationDescriptions descriptions)
static

Definition at line 247 of file LowPtGsfElectronSCProducer.cc.

References edm::ConfigurationDescriptions::add(), edm::ParameterSetDescription::add(), submitPVResolutionJobs::desc, and HLT_FULL_cff::InputTag.

247  {
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 }
ParameterDescriptionBase * add(U const &iLabel, T const &value)
void add(std::string const &label, ParameterSetDescription const &psetDescription)
void LowPtGsfElectronSCProducer::produce ( edm::Event event,
const edm::EventSetup  
)
override

Definition at line 58 of file LowPtGsfElectronSCProducer.cc.

References HLT_FULL_cff::clusters, reco::deltaR2(), dr2_, RecoEcal_cff::ecalClusters, ecalClusters_, relval_parameters_module::energy, edm::helper::Filler< Map >::fill(), edm::Event::getHandle(), gsfPfRecTracks_, edm::RefProd< T >::id(), edm::helper::Filler< Map >::insert(), plotBeamSpotDB::ipoint, edm::Ptr< T >::isNonnull(), edm::Ptr< T >::isNull(), sistrip::SpyUtilities::isValid(), edm::makeValid(), eostools::move(), PFClusterWidthAlgo::pflowEtaWidth(), PFClusterWidthAlgo::pflowPhiWidth(), point, edm::PtrVector< T >::push_back(), reco::SuperCluster::rawEnergy(), fileCollector::seed, reco::SuperCluster::setClusters(), reco::CaloCluster::setCorrectedEnergy(), reco::SuperCluster::setEtaWidth(), reco::SuperCluster::setPhiWidth(), reco::SuperCluster::setSeed(), findQualityFiles::size, HLT_FULL_cff::superClusters, X, BeamSpotPI::Y, and BeamSpotPI::Z.

58  {
59  // Input GsfPFRecTracks collection
60  auto gsfPfRecTracks = edm::makeValid(event.getHandle(gsfPfRecTracks_));
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()) {
193  reco::SuperCluster sc(energy, math::XYZPoint(X, Y, Z));
194  sc.setCorrectedEnergy(energy);
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 }
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)
Definition: PtrVector.h:149
#define X(str)
Definition: MuonsGrabber.cc:38
const edm::EDGetTokenT< reco::GsfPFRecTrackCollection > gsfPfRecTracks_
Handle< PROD > getHandle(EDGetTokenT< PROD > token) const
Definition: Event.h:563
std::vector< SuperCluster > SuperClusterCollection
collection of SuperCluser objectr
def move
Definition: eostools.py:511
bool isNull() const
Checks for null.
Definition: Ptr.h:142
std::vector< CaloCluster > CaloClusterCollection
collection of CaloCluster objects
bool isNonnull() const
Checks for non-null.
Definition: Ptr.h:146
tuple ecalClusters
Definition: RecoEcal_cff.py:26
constexpr auto deltaR2(const T1 &t1, const T2 &t2) -> decltype(t1.eta())
Definition: deltaR.h:16
XYZPointD XYZPoint
point in space with cartesian internal representation
Definition: Point3D.h:12
ProductID id() const
Accessor for product ID.
Definition: RefProd.h:124
std::vector< PFCluster > PFClusterCollection
collection of PFCluster objects
Definition: PFClusterFwd.h:9
auto makeValid(const U &iOtherHandleType) noexcept(false)
Definition: ValidHandle.h:52
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
Definition: invegas.h:5

Member Data Documentation

const double LowPtGsfElectronSCProducer::dr2_
private

Definition at line 42 of file LowPtGsfElectronSCProducer.cc.

Referenced by closestCluster(), and produce().

const edm::EDGetTokenT<reco::PFClusterCollection> LowPtGsfElectronSCProducer::ecalClusters_
private

Definition at line 41 of file LowPtGsfElectronSCProducer.cc.

Referenced by produce().

const edm::EDGetTokenT<reco::GsfPFRecTrackCollection> LowPtGsfElectronSCProducer::gsfPfRecTracks_
private

Definition at line 40 of file LowPtGsfElectronSCProducer.cc.

Referenced by produce().