CMS 3D CMS Logo

CosmicClusterProducer.cc
Go to the documentation of this file.
30 
31 #include <ctime>
32 #include <iostream>
33 #include <memory>
34 #include <vector>
35 
37 public:
39 
40  ~CosmicClusterProducer() override;
41 
42  void produce(edm::Event&, const edm::EventSetup&) override;
43 
44 private:
45  int nMaxPrintout_; // max # of printouts
46  int nEvt_; // internal counter of events
47 
49 
52 
56 
59 
62 
63  //BasicClusterShape AssociationMap
66 
67  PositionCalc posCalculator_; // position calculation algorithm
68  ClusterShapeAlgo shapeAlgo_; // cluster shape algorithm
70 
71  bool counterExceeded() const { return ((nEvt_ > nMaxPrintout_) || (nMaxPrintout_ < 0)); }
72 
74  const edm::EventSetup& es,
78  const std::string& clusterShapeAssociation,
79  const CosmicClusterAlgo::EcalPart& ecalPart);
80 
81  void outputValidationInfo(reco::CaloClusterPtrVector& clusterPtrVector);
82 };
83 
86 
88  // The verbosity level
89  std::string verbosityString = ps.getParameter<std::string>("VerbosityLevel");
90  if (verbosityString == "DEBUG")
92  else if (verbosityString == "WARNING")
94  else if (verbosityString == "INFO")
96  else
98 
99  // Parameters to identify the hit collections
100  ebHitsToken_ = consumes<EcalRecHitCollection>(ps.getParameter<edm::InputTag>("barrelHits"));
101  eeHitsToken_ = consumes<EcalRecHitCollection>(ps.getParameter<edm::InputTag>("endcapHits"));
102 
103  ebUHitsToken_ = consumes<EcalUncalibratedRecHitCollection>(ps.getParameter<edm::InputTag>("barrelUncalibHits"));
104  eeUHitsToken_ = consumes<EcalUncalibratedRecHitCollection>(ps.getParameter<edm::InputTag>("endcapUncalibHits"));
105 
106  caloGeometryToken_ = esConsumes<CaloGeometry, CaloGeometryRecord>();
107 
108  // The names of the produced cluster collections
109  barrelClusterCollection_ = ps.getParameter<std::string>("barrelClusterCollection");
110  endcapClusterCollection_ = ps.getParameter<std::string>("endcapClusterCollection");
111 
112  // Island algorithm parameters
113  double barrelSeedThreshold = ps.getParameter<double>("BarrelSeedThr");
114  double barrelSingleThreshold = ps.getParameter<double>("BarrelSingleThr");
115  double barrelSecondThreshold = ps.getParameter<double>("BarrelSecondThr");
116  double barrelSupThreshold = ps.getParameter<double>("BarrelSupThr");
117  double endcapSeedThreshold = ps.getParameter<double>("EndcapSeedThr");
118  double endcapSingleThreshold = ps.getParameter<double>("EndcapSingleThr");
119  double endcapSecondThreshold = ps.getParameter<double>("EndcapSecondThr");
120  double endcapSupThreshold = ps.getParameter<double>("EndcapSupThr");
121 
122  // Parameters for the position calculation:
124 
127 
128  clustershapecollectionEB_ = ps.getParameter<std::string>("clustershapecollectionEB");
129  clustershapecollectionEE_ = ps.getParameter<std::string>("clustershapecollectionEE");
130 
131  //AssociationMap
132  barrelClusterShapeAssociation_ = ps.getParameter<std::string>("barrelShapeAssociation");
133  endcapClusterShapeAssociation_ = ps.getParameter<std::string>("endcapShapeAssociation");
134 
135  // Produces a collection of barrel and a collection of endcap clusters
136 
137  produces<reco::ClusterShapeCollection>(clustershapecollectionEE_);
138  produces<reco::BasicClusterCollection>(endcapClusterCollection_);
139  produces<reco::ClusterShapeCollection>(clustershapecollectionEB_);
140  produces<reco::BasicClusterCollection>(barrelClusterCollection_);
141  produces<reco::BasicClusterShapeAssociationCollection>(barrelClusterShapeAssociation_);
142  produces<reco::BasicClusterShapeAssociationCollection>(endcapClusterShapeAssociation_);
143 
144  island_p = new CosmicClusterAlgo(barrelSeedThreshold,
145  barrelSingleThreshold,
146  barrelSecondThreshold,
147  barrelSupThreshold,
148  endcapSeedThreshold,
149  endcapSingleThreshold,
150  endcapSecondThreshold,
151  endcapSupThreshold,
153  verbosity);
154 
155  nEvt_ = 0;
156 }
157 
159 
161  clusterizeECALPart(evt,
162  es,
163  eeHitsToken_,
168  clusterizeECALPart(evt,
169  es,
170  eeHitsToken_,
175  nEvt_++;
176 }
177 
179  const edm::EventSetup& es,
183  const std::string& clusterShapeAssociation,
184  const CosmicClusterAlgo::EcalPart& ecalPart) {
185  // get the hit collection from the event:
186 
189 
190  evt.getByToken(hitsToken, hits_h);
191  evt.getByToken(uhitsToken, uhits_h);
192 
193  const EcalRecHitCollection* hitCollection_p = hits_h.product();
194  const EcalUncalibratedRecHitCollection* uhitCollection_p = uhits_h.product();
195 
196  // get the geometry and topology from the event setup:
198 
199  const CaloSubdetectorGeometry* geometry_p;
200  std::unique_ptr<CaloSubdetectorTopology> topology_p;
201 
202  std::string clustershapetag;
203  if (ecalPart == CosmicClusterAlgo::barrel) {
204  geometry_p = geoHandle->getSubdetectorGeometry(DetId::Ecal, EcalBarrel);
205  topology_p = std::make_unique<EcalBarrelTopology>(*geoHandle);
206  } else {
207  geometry_p = geoHandle->getSubdetectorGeometry(DetId::Ecal, EcalEndcap);
208  topology_p = std::make_unique<EcalEndcapTopology>(*geoHandle);
209  }
210 
211  const CaloSubdetectorGeometry* geometryES_p;
212  geometryES_p = geoHandle->getSubdetectorGeometry(DetId::Ecal, EcalPreshower);
213 
214  // Run the clusterization algorithm:
216  clusters =
217  island_p->makeClusters(hitCollection_p, uhitCollection_p, geometry_p, topology_p.get(), geometryES_p, ecalPart);
218 
219  //Create associated ClusterShape objects.
220  std::vector<reco::ClusterShape> ClusVec;
221 
222  for (int erg = 0; erg < int(clusters.size()); ++erg) {
223  reco::ClusterShape TestShape = shapeAlgo_.Calculate(clusters[erg], hitCollection_p, geometry_p, topology_p.get());
224  ClusVec.push_back(TestShape);
225  }
226 
227  //Put clustershapes in event, but retain a Handle on them.
228  auto clustersshapes_p = std::make_unique<reco::ClusterShapeCollection>();
229  clustersshapes_p->assign(ClusVec.begin(), ClusVec.end());
231  if (ecalPart == CosmicClusterAlgo::barrel)
232  clusHandle = evt.put(std::move(clustersshapes_p), clustershapecollectionEB_);
233  else
234  clusHandle = evt.put(std::move(clustersshapes_p), clustershapecollectionEE_);
235 
236  // create a unique_ptr to a BasicClusterCollection, copy the barrel clusters into it and put in the Event:
237  auto clusters_p = std::make_unique<reco::BasicClusterCollection>();
238  clusters_p->assign(clusters.begin(), clusters.end());
240 
241  if (ecalPart == CosmicClusterAlgo::barrel)
242  bccHandle = evt.put(std::move(clusters_p), barrelClusterCollection_);
243  else
244  bccHandle = evt.put(std::move(clusters_p), endcapClusterCollection_);
245 
246  // BasicClusterShapeAssociationMap
247  auto shapeAssocs_p = std::make_unique<reco::BasicClusterShapeAssociationCollection>(bccHandle, clusHandle);
248 
249  for (unsigned int i = 0; i < clusHandle->size(); i++) {
250  shapeAssocs_p->insert(edm::Ref<reco::BasicClusterCollection>(bccHandle, i),
252  }
253  evt.put(std::move(shapeAssocs_p), clusterShapeAssociation);
254 }
T getParameter(std::string const &) const
Definition: ParameterSet.h:303
OrphanHandle< PROD > put(std::unique_ptr< PROD > product)
Put a new product.
Definition: Event.h:133
std::vector< reco::BasicCluster > makeClusters(const EcalRecHitCollection *hits, const EcalUncalibratedRecHitCollection *uncalibhits, const CaloSubdetectorGeometry *geometry, const CaloSubdetectorTopology *topology_p, const CaloSubdetectorGeometry *geometryES_p, EcalPart ecalPart, bool regional=false, const std::vector< RectangularEtaPhiRegion > &regions=std::vector< RectangularEtaPhiRegion >())
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:16
T const * product() const
Definition: Handle.h:70
void clusterizeECALPart(edm::Event &evt, const edm::EventSetup &es, const edm::EDGetTokenT< EcalRecHitCollection > &hitsToken, const edm::EDGetTokenT< EcalUncalibratedRecHitCollection > &uhitsToken, const std::string &clusterCollection, const std::string &clusterShapeAssociation, const CosmicClusterAlgo::EcalPart &ecalPart)
bool getByToken(EDGetToken token, Handle< PROD > &result) const
Definition: Event.h:539
CosmicClusterAlgo * island_p
void produce(edm::Event &, const edm::EventSetup &) override
edm::ESGetToken< CaloGeometry, CaloGeometryRecord > caloGeometryToken_
reco::ClusterShape Calculate(const reco::BasicCluster &passedCluster, const EcalRecHitCollection *hits, const CaloSubdetectorGeometry *geometry, const CaloSubdetectorTopology *topology)
CosmicClusterProducer(const edm::ParameterSet &ps)
edm::EDGetTokenT< EcalRecHitCollection > eeHitsToken_
ESHandle< T > getHandle(const ESGetToken< T, R > &iToken) const
Definition: EventSetup.h:151
CosmicClusterAlgo::VerbosityLevel verbosity
std::string endcapClusterShapeAssociation_
edm::EDGetTokenT< EcalRecHitCollection > ebHitsToken_
std::vector< BasicCluster > BasicClusterCollection
collection of BasicCluster objects
edm::EDGetTokenT< EcalUncalibratedRecHitCollection > eeUHitsToken_
edm::EDGetTokenT< EcalUncalibratedRecHitCollection > ebUHitsToken_
void outputValidationInfo(reco::CaloClusterPtrVector &clusterPtrVector)
const CaloSubdetectorGeometry * getSubdetectorGeometry(const DetId &id) const
access the subdetector geometry for the given subdetector directly
Definition: CaloGeometry.cc:34
def move(src, dest)
Definition: eostools.py:511
std::string barrelClusterShapeAssociation_