CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
PFECALSuperClusterProducer.cc
Go to the documentation of this file.
2 
3 #include <memory>
4 
6 
8 
10 
15 
19 
22 
25 
28 
30 
31 #include "TVector2.h"
33 
34 using namespace std;
35 using namespace edm;
36 
37 namespace {
38  const std::string ClusterType__BOX("Box");
39  const std::string ClusterType__Mustache("Mustache");
40 
41  const std::string EnergyWeight__Raw("Raw");
42  const std::string EnergyWeight__CalibratedNoPS("CalibratedNoPS");
43  const std::string EnergyWeight__CalibratedTotal("CalibratedTotal");
44 }
45 
47 {
48 
49  verbose_ =
50  iConfig.getUntrackedParameter<bool>("verbose",false);
51 
52  superClusterAlgo_.setUseRegression(iConfig.getParameter<bool>("useRegression"));
53 
54  superClusterAlgo_.setTokens(iConfig,consumesCollector());
55 
56  std::string _typename = iConfig.getParameter<std::string>("ClusteringType");
57  if( _typename == ClusterType__BOX ) {
58  _theclusteringtype = PFECALSuperClusterAlgo::kBOX;
59  } else if ( _typename == ClusterType__Mustache ) {
60  _theclusteringtype = PFECALSuperClusterAlgo::kMustache;
61  } else {
62  throw cms::Exception("InvalidClusteringType")
63  << "You have not chosen a valid clustering type,"
64  << " please choose from \"Box\" or \"Mustache\"!";
65  }
66 
67  std::string _weightname = iConfig.getParameter<std::string>("EnergyWeight");
68  if( _weightname == EnergyWeight__Raw ) {
69  _theenergyweight = PFECALSuperClusterAlgo::kRaw;
70  } else if ( _weightname == EnergyWeight__CalibratedNoPS ) {
71  _theenergyweight = PFECALSuperClusterAlgo::kCalibratedNoPS;
72  } else if ( _weightname == EnergyWeight__CalibratedTotal) {
74  } else {
75  throw cms::Exception("InvalidClusteringType")
76  << "You have not chosen a valid energy weighting scheme,"
77  << " please choose from \"Raw\", \"CalibratedNoPS\", or"
78  << " \"CalibratedTotal\"!";
79  }
80 
81 
82  // parameters for clustering
83  bool seedThresholdIsET = iConfig.getParameter<bool>("seedThresholdIsET");
84 
85  bool useDynamicDPhi = iConfig.getParameter<bool>("useDynamicDPhiWindow");
86 
87  double threshPFClusterSeedBarrel = iConfig.getParameter<double>("thresh_PFClusterSeedBarrel");
88  double threshPFClusterBarrel = iConfig.getParameter<double>("thresh_PFClusterBarrel");
89 
90  double threshPFClusterSeedEndcap = iConfig.getParameter<double>("thresh_PFClusterSeedEndcap");
91  double threshPFClusterEndcap = iConfig.getParameter<double>("thresh_PFClusterEndcap");
92 
93  double phiwidthSuperClusterBarrel = iConfig.getParameter<double>("phiwidth_SuperClusterBarrel");
94  double etawidthSuperClusterBarrel = iConfig.getParameter<double>("etawidth_SuperClusterBarrel");
95 
96  double phiwidthSuperClusterEndcap = iConfig.getParameter<double>("phiwidth_SuperClusterEndcap");
97  double etawidthSuperClusterEndcap = iConfig.getParameter<double>("etawidth_SuperClusterEndcap");
98 
99  double threshPFClusterES = iConfig.getParameter<double>("thresh_PFClusterES");
100 
101  //double threshPFClusterMustacheOutBarrel = iConfig.getParameter<double>("thresh_PFClusterMustacheOutBarrel");
102  //double threshPFClusterMustacheOutEndcap = iConfig.getParameter<double>("thresh_PFClusterMustacheOutEndcap");
103 
104  double doSatelliteClusterMerge =
105  iConfig.getParameter<bool>("doSatelliteClusterMerge");
107  iConfig.getParameter<double>("satelliteClusterSeedThreshold");
108  double satelliteMajorityFraction =
109  iConfig.getParameter<double>("satelliteMajorityFraction");
110 
111  superClusterAlgo_.setVerbosityLevel(verbose_);
112  superClusterAlgo_.setClusteringType(_theclusteringtype);
113  superClusterAlgo_.setEnergyWeighting(_theenergyweight);
114  superClusterAlgo_.setUseETForSeeding(seedThresholdIsET);
115  superClusterAlgo_.setUseDynamicDPhi(useDynamicDPhi);
116 
117  superClusterAlgo_.setThreshSuperClusterEt( iConfig.getParameter<double>("thresh_SCEt") );
118 
119  superClusterAlgo_.setThreshPFClusterSeedBarrel( threshPFClusterSeedBarrel );
120  superClusterAlgo_.setThreshPFClusterBarrel( threshPFClusterBarrel );
121 
122  superClusterAlgo_.setThreshPFClusterSeedEndcap( threshPFClusterSeedEndcap );
123  superClusterAlgo_.setThreshPFClusterEndcap( threshPFClusterEndcap );
124 
125  superClusterAlgo_.setPhiwidthSuperClusterBarrel( phiwidthSuperClusterBarrel );
126  superClusterAlgo_.setEtawidthSuperClusterBarrel( etawidthSuperClusterBarrel );
127 
128  superClusterAlgo_.setPhiwidthSuperClusterEndcap( phiwidthSuperClusterEndcap );
129  superClusterAlgo_.setEtawidthSuperClusterEndcap( etawidthSuperClusterEndcap );
130 
131  superClusterAlgo_.setThreshPFClusterES( threshPFClusterES );
132 
133  superClusterAlgo_.setSatelliteMerging( doSatelliteClusterMerge );
134  superClusterAlgo_.setSatelliteThreshold( satelliteClusterSeedThreshold );
135  superClusterAlgo_.setMajorityFraction( satelliteMajorityFraction );
136  //superClusterAlgo_.setThreshPFClusterMustacheOutBarrel( threshPFClusterMustacheOutBarrel );
137  //superClusterAlgo_.setThreshPFClusterMustacheOutEndcap( threshPFClusterMustacheOutEndcap );
138 
139  //Load the ECAL energy calibration
140  thePFEnergyCalibration_ =
141  std::shared_ptr<PFEnergyCalibration>(new PFEnergyCalibration());
142  superClusterAlgo_.setPFClusterCalibration(thePFEnergyCalibration_);
143  superClusterAlgo_.setUsePS(iConfig.getParameter<bool>("use_preshower"));
144 
145  bool applyCrackCorrections_ = iConfig.getParameter<bool>("applyCrackCorrections");
146  superClusterAlgo_.setCrackCorrections(applyCrackCorrections_);
147 
148  PFBasicClusterCollectionBarrel_ = iConfig.getParameter<string>("PFBasicClusterCollectionBarrel");
149  PFSuperClusterCollectionBarrel_ = iConfig.getParameter<string>("PFSuperClusterCollectionBarrel");
150 
151  PFBasicClusterCollectionEndcap_ = iConfig.getParameter<string>("PFBasicClusterCollectionEndcap");
152  PFSuperClusterCollectionEndcap_ = iConfig.getParameter<string>("PFSuperClusterCollectionEndcap");
153 
154  PFBasicClusterCollectionPreshower_ = iConfig.getParameter<string>("PFBasicClusterCollectionPreshower");
155  PFSuperClusterCollectionEndcapWithPreshower_ = iConfig.getParameter<string>("PFSuperClusterCollectionEndcapWithPreshower");
156 
157  PFClusterAssociationEBEE_ = "PFClusterAssociationEBEE";
158  PFClusterAssociationES_ = "PFClusterAssociationES";
159 
160  produces<reco::SuperClusterCollection>(PFSuperClusterCollectionBarrel_);
161  produces<reco::SuperClusterCollection>(PFSuperClusterCollectionEndcapWithPreshower_);
162  produces<reco::CaloClusterCollection>(PFBasicClusterCollectionBarrel_);
163  produces<reco::CaloClusterCollection>(PFBasicClusterCollectionEndcap_);
164  produces<reco::CaloClusterCollection>(PFBasicClusterCollectionPreshower_);
165  produces<edm::ValueMap<reco::CaloClusterPtr> >(PFClusterAssociationEBEE_);
166  produces<edm::ValueMap<reco::CaloClusterPtr> >(PFClusterAssociationES_);
167 }
168 
169 
170 
172 
175  superClusterAlgo_.update(iE);
176 }
177 
178 
180  const edm::EventSetup& iSetup) {
181 
182  // do clustering
183  superClusterAlgo_.loadAndSortPFClusters(iEvent);
184  superClusterAlgo_.run();
185 
186  //build collections of output CaloClusters from the used PFClusters
187  std::auto_ptr<reco::CaloClusterCollection> caloClustersEB(new reco::CaloClusterCollection);
188  std::auto_ptr<reco::CaloClusterCollection> caloClustersEE(new reco::CaloClusterCollection);
189  std::auto_ptr<reco::CaloClusterCollection> caloClustersES(new reco::CaloClusterCollection);
190 
191  std::map<reco::CaloClusterPtr, unsigned int> pfClusterMapEB; //maps of pfclusters to caloclusters
192  std::map<reco::CaloClusterPtr, unsigned int> pfClusterMapEE;
193  std::map<reco::CaloClusterPtr, unsigned int> pfClusterMapES;
194 
195  //fill calocluster collections and maps
196  for( const auto& ebsc : *(superClusterAlgo_.getEBOutputSCCollection()) ) {
197  for (reco::CaloCluster_iterator pfclus = ebsc.clustersBegin(); pfclus!=ebsc.clustersEnd(); ++pfclus) {
198  if (!pfClusterMapEB.count(*pfclus)) {
199  reco::CaloCluster caloclus(**pfclus);
200  caloClustersEB->push_back(caloclus);
201  pfClusterMapEB[*pfclus] = caloClustersEB->size() - 1;
202  }
203  else {
204  throw cms::Exception("PFECALSuperClusterProducer::produce")
205  << "Found an EB pfcluster matched to more than one EB supercluster!"
206  << std::dec << std::endl;
207  }
208  }
209  }
210  for( const auto& eesc : *(superClusterAlgo_.getEEOutputSCCollection()) ) {
211  for (reco::CaloCluster_iterator pfclus = eesc.clustersBegin(); pfclus!=eesc.clustersEnd(); ++pfclus) {
212  if (!pfClusterMapEE.count(*pfclus)) {
213  reco::CaloCluster caloclus(**pfclus);
214  caloClustersEE->push_back(caloclus);
215  pfClusterMapEE[*pfclus] = caloClustersEE->size() - 1;
216  }
217  else {
218  throw cms::Exception("PFECALSuperClusterProducer::produce")
219  << "Found an EE pfcluster matched to more than one EE supercluster!"
220  << std::dec << std::endl;
221  }
222  }
223  for (reco::CaloCluster_iterator pfclus = eesc.preshowerClustersBegin(); pfclus!=eesc.preshowerClustersEnd(); ++pfclus) {
224  if (!pfClusterMapES.count(*pfclus)) {
225  reco::CaloCluster caloclus(**pfclus);
226  caloClustersES->push_back(caloclus);
227  pfClusterMapES[*pfclus] = caloClustersES->size() - 1;
228  }
229  else {
230  throw cms::Exception("PFECALSuperClusterProducer::produce")
231  << "Found an ES pfcluster matched to more than one EE supercluster!"
232  << std::dec << std::endl;
233  }
234  }
235  }
236 
237  //create ValueMaps from output CaloClusters back to original PFClusters
238  std::auto_ptr<edm::ValueMap<reco::CaloClusterPtr> > pfClusterAssociationEBEE(new edm::ValueMap<reco::CaloClusterPtr>);
239  std::auto_ptr<edm::ValueMap<reco::CaloClusterPtr> > pfClusterAssociationES(new edm::ValueMap<reco::CaloClusterPtr>);
240 
241  //vectors to fill ValueMaps
242  std::vector<reco::CaloClusterPtr> clusptrsEB(caloClustersEB->size());
243  std::vector<reco::CaloClusterPtr> clusptrsEE(caloClustersEE->size());
244  std::vector<reco::CaloClusterPtr> clusptrsES(caloClustersES->size());
245 
246  //put calocluster output collections in event and get orphan handles to create ptrs
247  const edm::OrphanHandle<reco::CaloClusterCollection> &caloClusHandleEB = iEvent.put(caloClustersEB,PFBasicClusterCollectionBarrel_);
248  const edm::OrphanHandle<reco::CaloClusterCollection> &caloClusHandleEE = iEvent.put(caloClustersEE,PFBasicClusterCollectionEndcap_);
249  const edm::OrphanHandle<reco::CaloClusterCollection> &caloClusHandleES = iEvent.put(caloClustersES,PFBasicClusterCollectionPreshower_);
250 
251  //relink superclusters to output caloclusters and fill vectors for ValueMaps
252  for( auto& ebsc : *(superClusterAlgo_.getEBOutputSCCollection()) ) {
253  reco::CaloClusterPtr seedptr(caloClusHandleEB,pfClusterMapEB[ebsc.seed()]);
254  ebsc.setSeed(seedptr);
255 
257  for (reco::CaloCluster_iterator pfclus = ebsc.clustersBegin(); pfclus!=ebsc.clustersEnd(); ++pfclus) {
258  int caloclusidx = pfClusterMapEB[*pfclus];
259  reco::CaloClusterPtr clusptr(caloClusHandleEB,caloclusidx);
260  clusters.push_back(clusptr);
261  clusptrsEB[caloclusidx] = *pfclus;
262  }
263  ebsc.setClusters(clusters);
264  }
265  for( auto& eesc : *(superClusterAlgo_.getEEOutputSCCollection()) ) {
266  reco::CaloClusterPtr seedptr(caloClusHandleEE,pfClusterMapEE[eesc.seed()]);
267  eesc.setSeed(seedptr);
268 
270  for (reco::CaloCluster_iterator pfclus = eesc.clustersBegin(); pfclus!=eesc.clustersEnd(); ++pfclus) {
271  int caloclusidx = pfClusterMapEE[*pfclus];
272  reco::CaloClusterPtr clusptr(caloClusHandleEE,caloclusidx);
273  clusters.push_back(clusptr);
274  clusptrsEE[caloclusidx] = *pfclus;
275  }
276  eesc.setClusters(clusters);
277 
278  reco::CaloClusterPtrVector psclusters;
279  for (reco::CaloCluster_iterator pfclus = eesc.preshowerClustersBegin(); pfclus!=eesc.preshowerClustersEnd(); ++pfclus) {
280  int caloclusidx = pfClusterMapES[*pfclus];
281  reco::CaloClusterPtr clusptr(caloClusHandleES,caloclusidx);
282  psclusters.push_back(clusptr);
283  clusptrsES[caloclusidx] = *pfclus;
284  }
285  eesc.setPreshowerClusters(psclusters);
286  }
287 
288  //fill association maps from output CaloClusters back to original PFClusters
289  edm::ValueMap<reco::CaloClusterPtr>::Filler fillerEBEE(*pfClusterAssociationEBEE);
290  fillerEBEE.insert(caloClusHandleEB, clusptrsEB.begin(), clusptrsEB.end());
291  fillerEBEE.insert(caloClusHandleEE, clusptrsEE.begin(), clusptrsEE.end());
292  fillerEBEE.fill();
293 
294  edm::ValueMap<reco::CaloClusterPtr>::Filler fillerES(*pfClusterAssociationES);
295  fillerES.insert(caloClusHandleES, clusptrsES.begin(), clusptrsES.end());
296  fillerES.fill();
297 
298  //store in the event
299  iEvent.put(pfClusterAssociationEBEE,PFClusterAssociationEBEE_);
300  iEvent.put(pfClusterAssociationES,PFClusterAssociationES_);
301  iEvent.put(superClusterAlgo_.getEBOutputSCCollection(),
302  PFSuperClusterCollectionBarrel_);
303  iEvent.put(superClusterAlgo_.getEEOutputSCCollection(),
304  PFSuperClusterCollectionEndcapWithPreshower_);
305 }
306 
309  desc.add<std::string>("PFSuperClusterCollectionEndcap","particleFlowSuperClusterECALEndcap");
310  desc.add<bool>("doSatelliteClusterMerge",false);
311  desc.add<double>("thresh_PFClusterBarrel",0.0);
312  desc.add<std::string>("PFBasicClusterCollectionBarrel","particleFlowBasicClusterECALBarrel");
313  desc.add<bool>("useRegression",true);
314  desc.add<double>("satelliteMajorityFraction",0.5);
315  desc.add<double>("thresh_PFClusterEndcap",0.0);
316  desc.add<edm::InputTag>("ESAssociation",edm::InputTag("particleFlowClusterECAL"));
317  desc.add<std::string>("PFBasicClusterCollectionPreshower","particleFlowBasicClusterECALPreshower");
318  desc.add<bool>("use_preshower",true);
319  desc.addUntracked<bool>("verbose",false);
320  desc.add<double>("thresh_SCEt",4.0);
321  desc.add<double>("etawidth_SuperClusterEndcap",0.04);
322  desc.add<double>("phiwidth_SuperClusterEndcap",0.6);
323  desc.add<bool>("useDynamicDPhiWindow",true);
324  desc.add<std::string>("PFSuperClusterCollectionBarrel","particleFlowSuperClusterECALBarrel");
325  {
327  psd0.add<std::string>("regressionKeyEE","pfscecal_EECorrection_offline_v1");
328  psd0.add<edm::InputTag>("ecalRecHitsEE",edm::InputTag("ecalRecHit","EcalRecHitsEE"));
329  psd0.add<edm::InputTag>("ecalRecHitsEB",edm::InputTag("ecalRecHit","EcalRecHitsEB"));
330  psd0.add<std::string>("regressionKeyEB","pfscecal_EBCorrection_offline_v1");
331  psd0.add<edm::InputTag>("vertexCollection",edm::InputTag("offlinePrimaryVertices"));
332  desc.add<edm::ParameterSetDescription>("regressionConfig",psd0);
333  }
334  desc.add<bool>("applyCrackCorrections",false);
335  desc.add<double>("satelliteClusterSeedThreshold",50.0);
336  desc.add<double>("etawidth_SuperClusterBarrel",0.04);
337  desc.add<std::string>("PFBasicClusterCollectionEndcap","particleFlowBasicClusterECALEndcap");
338  desc.add<edm::InputTag>("PFClusters",edm::InputTag("particleFlowClusterECAL"));
339  desc.add<double>("thresh_PFClusterSeedBarrel",1.0);
340  desc.add<std::string>("ClusteringType","Mustache");
341  desc.add<std::string>("EnergyWeight","Raw");
342  desc.add<edm::InputTag>("BeamSpot",edm::InputTag("offlineBeamSpot"));
343  desc.add<double>("thresh_PFClusterSeedEndcap",1.0);
344  desc.add<double>("phiwidth_SuperClusterBarrel",0.6);
345  desc.add<double>("thresh_PFClusterES",0.0);
346  desc.add<bool>("seedThresholdIsET",true);
347  desc.add<std::string>("PFSuperClusterCollectionEndcapWithPreshower","particleFlowSuperClusterECALEndcapWithPreshower");
348  descriptions.add("particleFlowSuperClusterECALMustache",desc);
349 }
T getParameter(std::string const &) const
T getUntrackedParameter(std::string const &, T const &) const
ParameterDescriptionBase * addUntracked(U const &iLabel, T const &value)
void push_back(Ptr< T > const &iPtr)
Definition: PtrVector.h:141
void insert(const H &h, I begin, I end)
Definition: ValueMap.h:52
int iEvent
Definition: GenABIO.cc:230
PFECALSuperClusterProducer(const edm::ParameterSet &)
OrphanHandle< PROD > put(std::auto_ptr< PROD > product)
Put a new product.
Definition: Event.h:120
std::vector< CaloCluster > CaloClusterCollection
collection of CaloCluster objects
ParameterDescriptionBase * add(U const &iLabel, T const &value)
virtual void produce(edm::Event &, const edm::EventSetup &) override
void add(std::string const &label, ParameterSetDescription const &psetDescription)
virtual void beginLuminosityBlock(const edm::LuminosityBlock &, const edm::EventSetup &) override
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)