CMS 3D CMS Logo

ElectronSeedProducer.cc
Go to the documentation of this file.
1 // -*- C++ -*-
2 //
3 // Package: ElectronProducers
4 // Class: ElectronSeedProducer
5 //
13 //
14 // Original Author: Ursula Berthon, Claude Charlot
15 // Created: Mon Mar 27 13:22:06 CEST 2006
16 //
17 //
18 
19 #include <vector>
20 
21 #include "ElectronSeedProducer.h"
22 
24 
30 
35 
42 
51 
54 
55 #include <string>
56 
57 using namespace reco ;
58 
60  : //conf_(iConfig),
61  applyHOverECut_(true), hcalHelper_(nullptr),
62  caloGeom_(nullptr), caloGeomCacheId_(0), caloTopo_(nullptr), caloTopoCacheId_(0)
63  {
64  conf_ = iConfig.getParameter<edm::ParameterSet>("SeedConfiguration") ;
65 
66  initialSeeds_ = consumes<TrajectorySeedCollection>(conf_.getParameter<edm::InputTag>("initialSeeds")) ;
67  SCEtCut_ = conf_.getParameter<double>("SCEtCut");
68  fromTrackerSeeds_ = conf_.getParameter<bool>("fromTrackerSeeds") ;
69  prefilteredSeeds_ = conf_.getParameter<bool>("preFilteredSeeds") ;
70 
71  auto theconsumes = consumesCollector();
72 
73  // new beamSpot tag
74  beamSpotTag_ = consumes<reco::BeamSpot>(conf_.getParameter<edm::InputTag>("beamSpot"));
75 
76  // for H/E
77  applyHOverECut_ = conf_.getParameter<bool>("applyHOverECut") ;
78  if (applyHOverECut_)
79  {
81  hcalCfg.hOverEConeSize = conf_.getParameter<double>("hOverEConeSize") ;
82  if (hcalCfg.hOverEConeSize>0)
83  {
84  hcalCfg.useTowers = true ;
85  hcalCfg.hcalTowers =
86  consumes<CaloTowerCollection>(conf_.getParameter<edm::InputTag>("hcalTowers")) ;
87  hcalCfg.hOverEPtMin = conf_.getParameter<double>("hOverEPtMin") ;
88  }
89  hcalHelper_ = new ElectronHcalHelper(hcalCfg) ;
90 
91  allowHGCal_ = conf_.getParameter<bool>("allowHGCal");
92  if( allowHGCal_ ) {
93  const edm::ParameterSet& hgcCfg = conf_.getParameterSet("HGCalConfig");
94  hgcClusterTools_.reset( new hgcal::ClusterTools(hgcCfg, theconsumes) );
95  }
96 
97  maxHOverEBarrel_=conf_.getParameter<double>("maxHOverEBarrel") ;
98  maxHOverEEndcaps_=conf_.getParameter<double>("maxHOverEEndcaps") ;
99  maxHBarrel_=conf_.getParameter<double>("maxHBarrel") ;
100  maxHEndcaps_=conf_.getParameter<double>("maxHEndcaps") ;
101  }
102 
103  applySigmaIEtaIEtaCut_ = conf_.getParameter<bool>("applySigmaIEtaIEtaCut");
104 
105  // apply sigma_ieta_ieta cut
106  if (applySigmaIEtaIEtaCut_ == true)
107  {
108  maxSigmaIEtaIEtaBarrel_ = conf_.getParameter<double>("maxSigmaIEtaIEtaBarrel");
109  maxSigmaIEtaIEtaEndcaps_ = conf_.getParameter<double>("maxSigmaIEtaIEtaEndcaps");
110  }
111 
112  edm::ParameterSet rpset = conf_.getParameter<edm::ParameterSet>("RegionPSet");
113  filterVtxTag_ = consumes<std::vector<reco::Vertex> >(rpset.getParameter<edm::InputTag> ("VertexProducer"));
114 
116  esg_tokens.token_bs = beamSpotTag_;
117  esg_tokens.token_vtx = mayConsume<reco::VertexCollection>(conf_.getParameter<edm::InputTag>("vertices"));
118  esg_tokens.token_measTrkEvt= consumes<MeasurementTrackerEvent>(conf_.getParameter<edm::InputTag>("measurementTrackerEvent"));
119 
120  matcher_ = new ElectronSeedGenerator(conf_,esg_tokens) ;
121 
122  // get collections from config
123  if (applySigmaIEtaIEtaCut_ == true) {
124  ebRecHitCollection_ = consumes<EcalRecHitCollection> (iConfig.getParameter<edm::InputTag>("ebRecHitCollection"));
125  eeRecHitCollection_ = consumes<EcalRecHitCollection> (iConfig.getParameter<edm::InputTag>("eeRecHitCollection"));
126  }
127 
128  superClusters_[0]=
129  consumes<reco::SuperClusterCollection>(iConfig.getParameter<edm::InputTag>("barrelSuperClusters")) ;
130  superClusters_[1]=
131  consumes<reco::SuperClusterCollection>(iConfig.getParameter<edm::InputTag>("endcapSuperClusters")) ;
132 
133  // Construction of SeedFilter was in beginRun() with the comment
134  // below, but it has to be done here because of ConsumesCollector
135  //
136  // FIXME: because of a bug presumably in tracker seeding,
137  // perhaps in CombinedHitPairGenerator, badly caching some EventSetup product,
138  // we must redo the SeedFilter for each run.
139  if (prefilteredSeeds_) {
140  SeedFilter::Tokens sf_tokens;
141  sf_tokens.token_bs = beamSpotTag_;
142  sf_tokens.token_vtx = filterVtxTag_;
143  edm::ConsumesCollector iC = consumesCollector();
144  seedFilter_.reset(new SeedFilter(conf_, sf_tokens, iC));
145  }
146 
147  //register your products
148  produces<ElectronSeedCollection>() ;
149 }
150 
152 {}
153 
155 {}
156 
158  {
159  delete hcalHelper_ ;
160  delete matcher_ ;
161  }
162 
164  {
165  LogDebug("ElectronSeedProducer") <<"[ElectronSeedProducer::produce] entering " ;
166 
167  edm::Handle<reco::BeamSpot> theBeamSpot ;
168  e.getByToken(beamSpotTag_,theBeamSpot) ;
169 
170  if (hcalHelper_)
171  {
172  hcalHelper_->checkSetup(iSetup) ;
173  hcalHelper_->readEvent(e) ;
174  if( allowHGCal_ ) {
175  hgcClusterTools_->getEventSetup(iSetup);
176  hgcClusterTools_->getEvent(e);
177  }
178  }
179 
180  // get calo geometry
182  iSetup.get<CaloGeometryRecord>().get(caloGeom_);
183  caloGeomCacheId_=iSetup.get<CaloGeometryRecord>().cacheIdentifier();
184  }
186  caloTopoCacheId_=iSetup.get<CaloTopologyRecord>().cacheIdentifier();
187  iSetup.get<CaloTopologyRecord>().get(caloTopo_);
188  }
189 
190  matcher_->setupES(iSetup);
191 
192  // get initial TrajectorySeeds if necessary
193  if (fromTrackerSeeds_)
194  {
195  if (!prefilteredSeeds_)
196  {
198  e.getByToken(initialSeeds_, hSeeds);
199  theInitialSeedColl = const_cast<TrajectorySeedCollection *> (hSeeds.product());
200  }
201  else
203  }
204  else
205  { theInitialSeedColl = nullptr ; } // not needed in this case
206 
208 
209  // loop over barrel + endcap
210  for (unsigned int i=0; i<2; i++) {
212  e.getByToken(superClusters_[i],clusters);
213  SuperClusterRefVector clusterRefs ;
214  std::vector<float> hoe1s, hoe2s ;
215  filterClusters(*theBeamSpot,clusters,/*mhbhe_,*/clusterRefs,hoe1s,hoe2s,e, iSetup);
217  { filterSeeds(e,iSetup,clusterRefs) ; }
218  matcher_->run(e,iSetup,clusterRefs,hoe1s,hoe2s,theInitialSeedColl,*seeds);
219  }
220 
221  // store the accumulated result
222  std::unique_ptr<ElectronSeedCollection> pSeeds(seeds);
223  ElectronSeedCollection::iterator is ;
224  for ( is=pSeeds->begin() ; is!=pSeeds->end() ; is++ ) {
225  edm::RefToBase<CaloCluster> caloCluster = is->caloCluster() ;
226  SuperClusterRef superCluster = caloCluster.castTo<SuperClusterRef>() ;
227  LogDebug("ElectronSeedProducer")
228  << "new seed with "
229  << (*is).nHits() << " hits"
230  << ", charge " << (*is).getCharge()
231  << " and cluster energy " << superCluster->energy()
232  << " PID "<<superCluster.id() ;
233  }
234  e.put(std::move(pSeeds));
236  }
237 
238 
239 //===============================
240 // Filter the superclusters
241 // - with EtCut
242 // - with HoE using calo cone
243 //===============================
244 
246  ( const reco::BeamSpot & bs,
247  const edm::Handle<reco::SuperClusterCollection> & superClusters,
248  SuperClusterRefVector & sclRefs,
249  std::vector<float> & hoe1s, std::vector<float> & hoe2s,
251  {
252 
253  std::vector<float> sigmaIEtaIEtaEB_;
254  std::vector<float> sigmaIEtaIEtaEE_;
255 
256  for (unsigned int i=0;i<superClusters->size();++i)
257  {
258  const SuperCluster & scl = (*superClusters)[i] ;
259  double sclEta = EleRelPoint(scl.position(),bs.position()).eta() ;
260  if (scl.energy()/cosh(sclEta)>SCEtCut_)
261  {
262 // if ((applyHOverECut_==true)&&((hcalHelper_->hcalESum(scl)/scl.energy()) > maxHOverE_))
263 // { continue ; }
264 // sclRefs.push_back(edm::Ref<reco::SuperClusterCollection>(superClusters,i)) ;
265  double had1, had2, had, scle ;
266 
267  bool HoeVeto = false ;
268  if (applyHOverECut_==true)
269  {
270  had1 = hcalHelper_->hcalESumDepth1(scl);
271  had2 = hcalHelper_->hcalESumDepth2(scl);
272  had = had1+had2 ;
273  scle = scl.energy() ;
274  int det_group = scl.seed()->hitsAndFractions()[0].first.det() ;
275  int detector = scl.seed()->hitsAndFractions()[0].first.subdetId() ;
276  if ( detector==EcalBarrel && (had<maxHBarrel_ || had/scle<maxHOverEBarrel_)) HoeVeto=true;
277  else if( !allowHGCal_ && detector==EcalEndcap && (had<maxHEndcaps_ || had/scle<maxHOverEEndcaps_) ) HoeVeto=true;
278  else if( allowHGCal_ && (detector==HcalEndcap || det_group == DetId::Forward) ) {
279  float had_fraction = hgcClusterTools_->getClusterHadronFraction(*(scl.seed()));
280  had1 = had_fraction*scl.seed()->energy();
281  had2 = 0.;
282  HoeVeto= ( had_fraction >= 0.f && had_fraction < maxHOverEEndcaps_ );
283  }
284  if (HoeVeto)
285  {
286  sclRefs.push_back(edm::Ref<reco::SuperClusterCollection>(superClusters,i)) ;
287  hoe1s.push_back(had1/scle) ;
288  hoe2s.push_back(had2/scle) ;
289  }
290  }
291  else
292  {
293  sclRefs.push_back(edm::Ref<reco::SuperClusterCollection>(superClusters,i)) ;
294  hoe1s.push_back(std::numeric_limits<float>::infinity()) ;
295  hoe2s.push_back(std::numeric_limits<float>::infinity()) ;
296  }
297  }
298 
299  if (applySigmaIEtaIEtaCut_ == true)
300  {
302  std::vector<float> vCov = lazyTool_noZS.localCovariances(*(scl.seed()));
303  int detector = scl.seed()->hitsAndFractions()[0].first.subdetId() ;
304  if (detector==EcalBarrel) sigmaIEtaIEtaEB_ .push_back(edm::isNotFinite(vCov[0]) ? 0. : sqrt(vCov[0]));
305  if (detector==EcalEndcap) sigmaIEtaIEtaEE_ .push_back(edm::isNotFinite(vCov[0]) ? 0. : sqrt(vCov[0]));
306  }
307  }
308  LogDebug("ElectronSeedProducer")<<"Filtered out "<<sclRefs.size()<<" superclusters from "<<superClusters->size() ;
309  }
310 
312  ( edm::Event & event, const edm::EventSetup & setup,
313  reco::SuperClusterRefVector & sclRefs )
314  {
315  for ( unsigned int i=0 ; i<sclRefs.size() ; ++i )
316  {
317  seedFilter_->seeds(event,setup,sclRefs[i],theInitialSeedColl) ;
318  LogDebug("ElectronSeedProducer")<<"Number of Seeds: "<<theInitialSeedColl->size() ;
319  }
320  }
321 
322 void
325  desc.add<edm::InputTag>("endcapSuperClusters",edm::InputTag("particleFlowSuperClusterECAL","particleFlowSuperClusterECALEndcapWithPreshower"));
326  {
327  edm::ParameterSetDescription psd0, psd1, psd2, psd3, psd4;
328  psd1.add<unsigned int>("maxElement", 0);
329  psd1.add<std::string>("ComponentName", std::string("StandardHitPairGenerator"));
330  psd1.addUntracked<int>("useOnDemandTracker", 0);
331  psd1.add<edm::InputTag>("SeedingLayers", edm::InputTag("hltMixedLayerPairs"));
332  psd0.add<edm::ParameterSetDescription>("OrderedHitsFactoryPSet", psd1);
333 
334  psd2.add<double>("deltaPhiRegion", 0.4);
335  psd2.add<double>("originHalfLength", 15.0);
336  psd2.add<bool>("useZInVertex", true);
337  psd2.add<double>("deltaEtaRegion", 0.1);
338  psd2.add<double>("ptMin", 1.5 );
339  psd2.add<double>("originRadius", 0.2);
340  psd2.add<edm::InputTag>("VertexProducer", edm::InputTag("dummyVertices"));
341  psd0.add<edm::ParameterSetDescription>("RegionPSet", psd2);
342 
343  psd0.add<double>("PhiMax2B",0.002);
344  psd0.add<double>("hOverEPtMin",0.0);
345  psd0.add<double>("PhiMax2F",0.003);
346  psd0.add<bool>("searchInTIDTEC",true);
347  psd0.add<double>("pPhiMax1",0.125);
348  psd0.add<double>("HighPtThreshold",35.0);
349  psd0.add<double>("r2MinF",-0.15);
350  psd0.add<double>("maxHBarrel",0.0);
351  psd0.add<double>("DeltaPhi1Low",0.23);
352  psd0.add<double>("DeltaPhi1High",0.08);
353  psd0.add<double>("ePhiMin1",-0.125);
354  psd0.add<edm::InputTag>("hcalTowers",edm::InputTag("towerMaker"));
355  psd0.add<double>("LowPtThreshold",5.0);
356  psd0.add<double>("maxHOverEBarrel",0.15);
357  psd0.add<double>("maxSigmaIEtaIEtaBarrel", 0.5);
358  psd0.add<double>("maxSigmaIEtaIEtaEndcaps", 0.5);
359  psd0.add<bool>("dynamicPhiRoad",true);
360  psd0.add<double>("ePhiMax1",0.075);
361  psd0.add<std::string>("measurementTrackerName","");
362  psd0.add<double>("SizeWindowENeg",0.675);
363  psd0.add<double>("nSigmasDeltaZ1",5.0);
364  psd0.add<double>("rMaxI",0.2);
365  psd0.add<double>("maxHEndcaps",0.0);
366  psd0.add<bool>("preFilteredSeeds",false);
367  psd0.add<double>("r2MaxF",0.15);
368  psd0.add<double>("hOverEConeSize",0.15);
369  psd0.add<double>("pPhiMin1",-0.075);
370  psd0.add<edm::InputTag>("initialSeeds",edm::InputTag("newCombinedSeeds"));
371  psd0.add<double>("deltaZ1WithVertex",25.0);
372  psd0.add<double>("SCEtCut",0.0);
373  psd0.add<double>("z2MaxB",0.09);
374  psd0.add<bool>("fromTrackerSeeds",true);
375  psd0.add<edm::InputTag>("hcalRecHits",edm::InputTag("hbhereco"));
376  psd0.add<double>("z2MinB",-0.09);
377  psd0.add<double>("rMinI",-0.2);
378  psd0.add<double>("maxHOverEEndcaps",0.15);
379  psd0.add<double>("hOverEHBMinE",0.7);
380  psd0.add<bool>("useRecoVertex",false);
381  psd0.add<edm::InputTag>("beamSpot",edm::InputTag("offlineBeamSpot"));
382  psd0.add<edm::InputTag>("measurementTrackerEvent",edm::InputTag("MeasurementTrackerEvent"));
383  psd0.add<edm::InputTag>("vertices",edm::InputTag("offlinePrimaryVerticesWithBS"));
384  psd0.add<bool>("applyHOverECut",true);
385  psd0.add<edm::InputTag>("ebRecHitCollection", edm::InputTag("ecalRecHit", "EcalRecHitsEB"));
386  psd0.add<edm::InputTag>("eeRecHitCollection", edm::InputTag("ecalRecHit", "EcalRecHitsEE"));
387  psd0.add<bool>("applySigmaIEtaIEtaCut", false);
388  psd0.add<double>("DeltaPhi2F",0.012);
389  psd0.add<double>("PhiMin2F",-0.003);
390  psd0.add<double>("hOverEHFMinE",0.8);
391  psd0.add<double>("DeltaPhi2B",0.008);
392  psd0.add<double>("PhiMin2B",-0.002);
393  psd0.add<bool>("allowHGCal",false);
394 
395  psd3.add<std::string>("ComponentName",std::string("SeedFromConsecutiveHitsCreator"));
396  psd3.add<std::string>("propagator",std::string("PropagatorWithMaterial"));
397  psd3.add<double>("SeedMomentumForBOFF",5.0);
398  psd3.add<double>("OriginTransverseErrorMultiplier",1.0);
399  psd3.add<double>("MinOneOverPtError",1.0);
400  psd3.add<std::string>("magneticField",std::string(""));
401  psd3.add<std::string>("TTRHBuilder",std::string("WithTrackAngle"));
402  psd3.add<bool>("forceKinematicWithRegionDirection",false);
403 
404  psd4.add<edm::InputTag>("HGCEEInput",edm::InputTag("HGCalRecHit","HGCEERecHits"));
405  psd4.add<edm::InputTag>("HGCFHInput",edm::InputTag("HGCalRecHit","HGCHEFRecHits"));
406  psd4.add<edm::InputTag>("HGCBHInput",edm::InputTag("HGCalRecHit","HGCHEBRecHits"));
407 
408  psd0.add<edm::ParameterSetDescription>("HGCalConfig",psd4);
409 
410  psd0.add<edm::ParameterSetDescription>("SeedCreatorPSet",psd3);
411 
412  desc.add<edm::ParameterSetDescription>("SeedConfiguration",psd0);
413  }
414  desc.add<edm::InputTag>("barrelSuperClusters",edm::InputTag("particleFlowSuperClusterECAL","particleFlowSuperClusterECALBarrel"));
415  descriptions.add("ecalDrivenElectronSeeds",desc);
416 }
#define LogDebug(id)
void filterClusters(const reco::BeamSpot &bs, const edm::Handle< reco::SuperClusterCollection > &superClusters, reco::SuperClusterRefVector &sclRefs, std::vector< float > &hoe1s, std::vector< float > &hoe2s, edm::Event &e, const edm::EventSetup &setup)
T getParameter(std::string const &) const
unsigned long long cacheIdentifier() const
const math::XYZPoint & position() const
cluster centroid position
Definition: CaloCluster.h:129
OrphanHandle< PROD > put(std::unique_ptr< PROD > product)
Put a new product.
Definition: Event.h:136
edm::EDGetTokenT< reco::BeamSpot > token_bs
void readEvent(const edm::Event &)
ParameterDescriptionBase * addUntracked(U const &iLabel, T const &value)
void setupES(const edm::EventSetup &setup)
bool getByToken(EDGetToken token, Handle< PROD > &result) const
Definition: Event.h:519
void beginRun(edm::Run const &, edm::EventSetup const &) final
unsigned long long caloGeomCacheId_
edm::EDGetTokenT< std::vector< reco::Vertex > > filterVtxTag_
def setup(process, global_tag, zero_tesla=False)
Definition: GeneralSetup.py:1
const std::vector< std::pair< DetId, float > > & hitsAndFractions() const
Definition: CaloCluster.h:195
void checkSetup(const edm::EventSetup &)
edm::EDGetTokenT< TrajectorySeedCollection > initialSeeds_
void run(edm::Event &, const edm::EventSetup &setup, const reco::SuperClusterRefVector &, const std::vector< float > &hoe1s, const std::vector< float > &hoe2s, TrajectorySeedCollection *seeds, reco::ElectronSeedCollection &)
#define nullptr
ProductID id() const
Accessor for product ID.
Definition: Ref.h:259
edm::EDGetTokenT< MeasurementTrackerEvent > token_measTrkEvt
edm::EDGetTokenT< EcalRecHitCollection > eeRecHitCollection_
bool isNotFinite(T x)
Definition: isFinite.h:10
edm::ESHandle< CaloTopology > caloTopo_
std::vector< TrajectorySeed > TrajectorySeedCollection
T sqrt(T t)
Definition: SSEVec.h:18
edm::EDGetTokenT< EcalRecHitCollection > ebRecHitCollection_
const double infinity
ElectronSeedProducer(const edm::ParameterSet &)
double hcalESumDepth2(const reco::SuperCluster &, const std::vector< CaloTowerDetId > *excludeTowers=0)
double energy() const
cluster energy
Definition: CaloCluster.h:124
std::vector< ElectronSeed > ElectronSeedCollection
collection of ElectronSeed objects
ParameterDescriptionBase * add(U const &iLabel, T const &value)
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
std::unique_ptr< SeedFilter > seedFilter_
edm::ParameterSet conf_
edm::ESHandle< CaloGeometry > caloGeom_
T const * product() const
Definition: Handle.h:81
ElectronSeedGenerator * matcher_
ParameterSet const & getParameterSet(std::string const &) const
TrajectorySeedCollection * theInitialSeedColl
std::vector< float > localCovariances(const reco::BasicCluster &cluster, float w0=4.7)
REF castTo() const
Definition: RefToBase.h:286
const T & get() const
Definition: EventSetup.h:59
void add(std::string const &label, ParameterSetDescription const &psetDescription)
edm::EDGetTokenT< reco::SuperClusterCollection > superClusters_[2]
unsigned long long caloTopoCacheId_
edm::EDGetTokenT< reco::BeamSpot > token_bs
Definition: SeedFilter.h:37
void filterSeeds(edm::Event &e, const edm::EventSetup &setup, reco::SuperClusterRefVector &sclRefs)
fixed size matrix
void produce(edm::Event &, const edm::EventSetup &) final
void endRun(edm::Run const &, edm::EventSetup const &) final
double hcalESumDepth1(const reco::SuperCluster &, const std::vector< CaloTowerDetId > *excludeTowers=0)
void push_back(value_type const &ref)
Add a Ref<C, T> to the RefVector.
Definition: RefVector.h:69
size_type size() const
Size of the RefVector.
Definition: RefVector.h:107
edm::EDGetTokenT< CaloTowerCollection > hcalTowers
const Point & position() const
position
Definition: BeamSpot.h:62
const CaloClusterPtr & seed() const
seed BasicCluster
Definition: SuperCluster.h:66
edm::EDGetTokenT< reco::BeamSpot > beamSpotTag_
edm::EDGetTokenT< std::vector< reco::Vertex > > token_vtx
ElectronHcalHelper * hcalHelper_
def move(src, dest)
Definition: eostools.py:510
edm::EDGetTokenT< std::vector< reco::Vertex > > token_vtx
Definition: SeedFilter.h:36
Definition: event.py:1
std::unique_ptr< hgcal::ClusterTools > hgcClusterTools_
Definition: Run.h:43