CMS 3D CMS Logo

HybridClusterProducer.cc
Go to the documentation of this file.
28 
29 #include <iostream>
30 #include <memory>
31 #include <vector>
32 
34 public:
36 
37  ~HybridClusterProducer() override;
38 
39  void produce(edm::Event&, const edm::EventSetup&) override;
40 
41 private:
42  int nEvt_; // internal counter of events
43 
46 
50 
51  HybridClusterAlgo* hybrid_p; // clustering algorithm
52  PositionCalc posCalculator_; // position calculation algorithm
53 };
54 
57 
59  basicclusterCollection_ = ps.getParameter<std::string>("basicclusterCollection");
60  superclusterCollection_ = ps.getParameter<std::string>("superclusterCollection");
61  hitsToken_ = consumes<EcalRecHitCollection>(ps.getParameter<edm::InputTag>("recHitsCollection"));
62  geoToken_ = esConsumes<CaloGeometry, CaloGeometryRecord>();
63  sevLvToken_ = esConsumes<EcalSeverityLevelAlgo, EcalSeverityLevelAlgoRcd>();
64 
65  //Setup for core tools objects.
67 
69 
70  const std::vector<std::string> flagnames = ps.getParameter<std::vector<std::string> >("RecHitFlagToBeExcluded");
71 
72  const std::vector<int> flagsexcl = StringToEnumValue<EcalRecHit::Flags>(flagnames);
73 
74  const std::vector<std::string> severitynames =
75  ps.getParameter<std::vector<std::string> >("RecHitSeverityToBeExcluded");
76 
77  const std::vector<int> severitiesexcl = StringToEnumValue<EcalSeverityLevel::SeverityLevel>(severitynames);
78 
79  hybrid_p = new HybridClusterAlgo(ps.getParameter<double>("HybridBarrelSeedThr"),
80  ps.getParameter<int>("step"),
81  ps.getParameter<double>("ethresh"),
82  ps.getParameter<double>("eseed"),
83  ps.getParameter<double>("xi"),
84  ps.getParameter<bool>("useEtForXi"),
85  ps.getParameter<double>("ewing"),
86  flagsexcl,
88  ps.getParameter<bool>("dynamicEThresh"),
89  ps.getParameter<double>("eThreshA"),
90  ps.getParameter<double>("eThreshB"),
91  severitiesexcl,
92  ps.getParameter<bool>("excludeFlagged"));
93  //bremRecoveryPset,
94 
95  // get brem recovery parameters
96  bool dynamicPhiRoad = ps.getParameter<bool>("dynamicPhiRoad");
97  if (dynamicPhiRoad) {
100  }
101 
102  produces<reco::BasicClusterCollection>(basicclusterCollection_);
103  produces<reco::SuperClusterCollection>(superclusterCollection_);
104  nEvt_ = 0;
105 }
106 
108 
110  // get the hit collection from the event:
112 
113  evt.getByToken(hitsToken_, rhcHandle);
114  if (!(rhcHandle.isValid())) {
115  edm::LogError("MissingProduct") << "could not get a handle on the EcalRecHitCollection!";
116  return;
117  }
118  const EcalRecHitCollection* hit_collection = rhcHandle.product();
119 
120  // get the collection geometry:
122  const CaloGeometry& geometry = *geoHandle;
123  const CaloSubdetectorGeometry* geometry_p;
124  std::unique_ptr<const CaloSubdetectorTopology> topology;
125 
127 
128  geometry_p = geometry.getSubdetectorGeometry(DetId::Ecal, EcalBarrel);
129  topology = std::make_unique<EcalBarrelTopology>(*geoHandle);
130 
131  // make the Basic clusters!
132  reco::BasicClusterCollection basicClusters;
134  hit_collection, geometry_p, basicClusters, sevLv.product(), false, std::vector<RectangularEtaPhiRegion>());
135 
136  LogTrace("EcalClusters") << "Finished clustering - BasicClusterCollection returned to producer...";
137 
138  // create a unique_ptr to a BasicClusterCollection, copy the clusters into it and put in the Event:
139  auto basicclusters_p = std::make_unique<reco::BasicClusterCollection>();
140  basicclusters_p->assign(basicClusters.begin(), basicClusters.end());
142  evt.put(std::move(basicclusters_p), basicclusterCollection_);
143 
144  //Basic clusters now in the event.
145  LogTrace("EcalClusters") << "Basic Clusters now put into event.";
146 
147  //Weird though it is, get the BasicClusters back out of the event. We need the
148  //edm::Ref to these guys to make our superclusters for Hybrid.
149 
150  if (!(bccHandle.isValid())) {
151  edm::LogError("Missing Product") << "could not get a handle on the BasicClusterCollection!";
152  return;
153  }
154 
156 
157  LogTrace("EcalClusters") << "Got the BasicClusterCollection" << std::endl;
158 
159  reco::CaloClusterPtrVector clusterPtrVector;
160  for (unsigned int i = 0; i < clusterCollection.size(); i++) {
161  clusterPtrVector.push_back(reco::CaloClusterPtr(bccHandle, i));
162  }
163 
165  LogTrace("EcalClusters") << "Found: " << superClusters.size() << " superclusters.";
166 
167  auto superclusters_p = std::make_unique<reco::SuperClusterCollection>();
168  superclusters_p->assign(superClusters.begin(), superClusters.end());
169 
170  evt.put(std::move(superclusters_p), superclusterCollection_);
171  LogTrace("EcalClusters") << "Hybrid Clusters (Basic/Super) added to the Event! :-)";
172 
173  nEvt_++;
174 }
HybridClusterProducer(const edm::ParameterSet &ps)
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
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:16
void push_back(Ptr< T > const &iPtr)
Definition: PtrVector.h:149
T const * product() const
Definition: Handle.h:70
edm::EDGetTokenT< EcalRecHitCollection > hitsToken_
bool getByToken(EDGetToken token, Handle< PROD > &result) const
Definition: Event.h:539
edm::ESGetToken< EcalSeverityLevelAlgo, EcalSeverityLevelAlgoRcd > sevLvToken_
Log< level::Error, false > LogError
#define LogTrace(id)
void produce(edm::Event &, const edm::EventSetup &) override
T const * product() const
Definition: ESHandle.h:86
std::vector< SuperCluster > SuperClusterCollection
collection of SuperCluser objectr
reco::SuperClusterCollection makeSuperClusters(const reco::CaloClusterPtrVector &)
void setDynamicPhiRoad(const edm::ParameterSet &bremRecoveryPset)
ESHandle< T > getHandle(const ESGetToken< T, R > &iToken) const
Definition: EventSetup.h:151
std::vector< BasicCluster > BasicClusterCollection
collection of BasicCluster objects
bool isValid() const
Definition: HandleBase.h:70
HybridClusterAlgo * hybrid_p
void makeClusters(const EcalRecHitCollection *, const CaloSubdetectorGeometry *geometry, reco::BasicClusterCollection &basicClusters, const EcalSeverityLevelAlgo *sevLv, bool regional=false, const std::vector< RectangularEtaPhiRegion > &regions=std::vector< RectangularEtaPhiRegion >())
edm::ESGetToken< CaloGeometry, CaloGeometryRecord > geoToken_
def move(src, dest)
Definition: eostools.py:511