CMS 3D CMS Logo

IslandClusterProducer.cc
Go to the documentation of this file.
1 // C/C++ headers
2 #include <iostream>
3 #include <vector>
4 #include <memory>
5 
6 // Framework
13 
14 // Reconstruction Classes
20 
21 // Geometry
28 
29 // EgammaCoreTools
34 
35 // Class header file
37 
38 
40 {
41  // The verbosity level
42  std::string verbosityString = ps.getParameter<std::string>("VerbosityLevel");
43  if (verbosityString == "DEBUG") verbosity = IslandClusterAlgo::pDEBUG;
44  else if (verbosityString == "WARNING") verbosity = IslandClusterAlgo::pWARNING;
45  else if (verbosityString == "INFO") verbosity = IslandClusterAlgo::pINFO;
47 
48  // Parameters to identify the hit collections
50  consumes<EcalRecHitCollection>(ps.getParameter<edm::InputTag>("barrelHits"));
52  consumes<EcalRecHitCollection>(ps.getParameter<edm::InputTag>("endcapHits"));
53 
54  // The names of the produced cluster collections
55  barrelClusterCollection_ = ps.getParameter<std::string>("barrelClusterCollection");
56  endcapClusterCollection_ = ps.getParameter<std::string>("endcapClusterCollection");
57 
58  // Island algorithm parameters
59  double barrelSeedThreshold = ps.getParameter<double>("IslandBarrelSeedThr");
60  double endcapSeedThreshold = ps.getParameter<double>("IslandEndcapSeedThr");
61 
62  // Parameters for the position calculation:
64  ps.getParameter<edm::ParameterSet>("posCalcParameters");
65  posCalculator_ = PositionCalc(posCalcParameters);
66  shapeAlgo_ = ClusterShapeAlgo(posCalcParameters);
67 
68  clustershapecollectionEB_ = ps.getParameter<std::string>("clustershapecollectionEB");
69  clustershapecollectionEE_ = ps.getParameter<std::string>("clustershapecollectionEE");
70 
71  //AssociationMap
72  barrelClusterShapeAssociation_ = ps.getParameter<std::string>("barrelShapeAssociation");
73  endcapClusterShapeAssociation_ = ps.getParameter<std::string>("endcapShapeAssociation");
74 
75  // Produces a collection of barrel and a collection of endcap clusters
76 
77  produces< reco::ClusterShapeCollection>(clustershapecollectionEE_);
78  produces< reco::BasicClusterCollection >(endcapClusterCollection_);
79  produces< reco::ClusterShapeCollection>(clustershapecollectionEB_);
80  produces< reco::BasicClusterCollection >(barrelClusterCollection_);
81  produces< reco::BasicClusterShapeAssociationCollection >(barrelClusterShapeAssociation_);
82  produces< reco::BasicClusterShapeAssociationCollection >(endcapClusterShapeAssociation_);
83 
84  island_p = new IslandClusterAlgo(barrelSeedThreshold, endcapSeedThreshold, posCalculator_,verbosity);
85 
86  nEvt_ = 0;
87 }
88 
89 
91 {
92  delete island_p;
93 }
94 
95 
97 {
100  nEvt_++;
101 }
102 
103 
105 {
107  evt.getByToken(token, rhcHandle);
108  return rhcHandle.product();
109 
110 }
111 
113  const std::string& clusterShapeAssociation,
114  const IslandClusterAlgo::EcalPart& ecalPart)
115 {
116  // get the hit collection from the event:
117  const EcalRecHitCollection *hitCollection_p = getCollection(evt,token);
118 
119  // get the geometry and topology from the event setup:
120  edm::ESHandle<CaloGeometry> geoHandle;
121  es.get<CaloGeometryRecord>().get(geoHandle);
122 
123  const CaloSubdetectorGeometry *geometry_p;
124  CaloSubdetectorTopology *topology_p;
125 
126  std::string clustershapetag;
127  if (ecalPart == IslandClusterAlgo::barrel)
128  {
129  geometry_p = geoHandle->getSubdetectorGeometry(DetId::Ecal, EcalBarrel);
130  topology_p = new EcalBarrelTopology(geoHandle);
131  }
132  else
133  {
134  geometry_p = geoHandle->getSubdetectorGeometry(DetId::Ecal, EcalEndcap);
135  topology_p = new EcalEndcapTopology(geoHandle);
136  }
137 
138  const CaloSubdetectorGeometry *geometryES_p;
139  geometryES_p = geoHandle->getSubdetectorGeometry(DetId::Ecal, EcalPreshower);
140 
141  // Run the clusterization algorithm:
143  clusters = island_p->makeClusters(hitCollection_p, geometry_p, topology_p, geometryES_p, ecalPart);
144 
145  //Create associated ClusterShape objects.
146  std::vector <reco::ClusterShape> ClusVec;
147  for (int erg=0;erg<int(clusters.size());++erg){
148  reco::ClusterShape TestShape = shapeAlgo_.Calculate(clusters[erg],hitCollection_p,geometry_p,topology_p);
149  ClusVec.push_back(TestShape);
150  }
151 
152  //Put clustershapes in event, but retain a Handle on them.
153  auto clustersshapes_p = std::make_unique<reco::ClusterShapeCollection>();
154  clustersshapes_p->assign(ClusVec.begin(), ClusVec.end());
156  if (ecalPart == IslandClusterAlgo::barrel)
157  clusHandle= evt.put(std::move(clustersshapes_p), clustershapecollectionEB_);
158  else
159  clusHandle= evt.put(std::move(clustersshapes_p), clustershapecollectionEE_);
160 
161  // create a unique_ptr to a BasicClusterCollection, copy the barrel clusters into it and put in the Event:
162  auto clusters_p = std::make_unique<reco::BasicClusterCollection>();
163  clusters_p->assign(clusters.begin(), clusters.end());
165  if (ecalPart == IslandClusterAlgo::barrel)
166  bccHandle = evt.put(std::move(clusters_p), barrelClusterCollection_);
167  else
168  bccHandle = evt.put(std::move(clusters_p), endcapClusterCollection_);
169 
170 
171  // BasicClusterShapeAssociationMap
172  auto shapeAssocs_p = std::make_unique<reco::BasicClusterShapeAssociationCollection>(bccHandle, clusHandle);
173  for (unsigned int i = 0; i < clusHandle->size(); i++){
174  shapeAssocs_p->insert(edm::Ref<reco::BasicClusterCollection>(bccHandle,i),edm::Ref<reco::ClusterShapeCollection>(clusHandle,i));
175  }
176  evt.put(std::move(shapeAssocs_p),clusterShapeAssociation);
177 
178  delete topology_p;
179 }
T getParameter(std::string const &) const
const CaloSubdetectorGeometry * getSubdetectorGeometry(const DetId &id) const
access the subdetector geometry for the given subdetector directly
Definition: CaloGeometry.cc:44
OrphanHandle< PROD > put(std::unique_ptr< PROD > product)
Put a new product.
Definition: Event.h:136
IslandClusterProducer(const edm::ParameterSet &ps)
bool getByToken(EDGetToken token, Handle< PROD > &result) const
Definition: Event.h:519
reco::ClusterShape Calculate(const reco::BasicCluster &passedCluster, const EcalRecHitCollection *hits, const CaloSubdetectorGeometry *geometry, const CaloSubdetectorTopology *topology)
edm::EDGetTokenT< EcalRecHitCollection > barrelRecHits_
edm::EDGetTokenT< EcalRecHitCollection > endcapRecHits_
std::string barrelClusterShapeAssociation_
IslandClusterAlgo * island_p
std::vector< reco::BasicCluster > makeClusters(const EcalRecHitCollection *hits, const CaloSubdetectorGeometry *geometry, const CaloSubdetectorTopology *topology_p, const CaloSubdetectorGeometry *geometryES_p, EcalPart ecalPart, bool regional=false, const std::vector< RectangularEtaPhiRegion > &regions=std::vector< RectangularEtaPhiRegion >())
T const * product() const
Definition: Handle.h:81
const T & get() const
Definition: EventSetup.h:59
std::string endcapClusterShapeAssociation_
std::vector< BasicCluster > BasicClusterCollection
collection of BasicCluster objects
const EcalRecHitCollection * getCollection(edm::Event &evt, const edm::EDGetTokenT< EcalRecHitCollection > &token)
void clusterizeECALPart(edm::Event &evt, const edm::EventSetup &es, const edm::EDGetTokenT< EcalRecHitCollection > &token, const std::string &clusterCollection, const std::string &clusterShapeAssociation, const IslandClusterAlgo::EcalPart &ecalPart)
IslandClusterAlgo::VerbosityLevel verbosity
void produce(edm::Event &, const edm::EventSetup &) override
def move(src, dest)
Definition: eostools.py:510