CMS 3D CMS Logo

HGCClusterAlgo.cc
Go to the documentation of this file.
12 
13 using namespace HGCalTriggerBackend;
14 
15 
16 template<typename FECODEC, typename DATA>
17 class HGCClusterAlgo : public Algorithm<FECODEC>
18 {
19  public:
21 
22  protected:
24 
25  private:
28  NNC2d
29  };
30 
31  public:
32 
34  Algorithm<FECODEC>(conf, cc),
35  trgcell_product_( new l1t::HGCalTriggerCellBxCollection ),
36  cluster_product_( new l1t::HGCalClusterBxCollection ),
37  multicluster_product_( new l1t::HGCalMulticlusterBxCollection ),
38  HGCalEESensitive_( conf.getParameter<std::string>("HGCalEESensitive_tag") ),
39  HGCalHESiliconSensitive_( conf.getParameter<std::string>("HGCalHESiliconSensitive_tag") ),
40  calibration_( conf.getParameterSet("calib_parameters") ),
41  clustering_( conf.getParameterSet("C2d_parameters") ),
42  multiclustering_( conf.getParameterSet("C3d_parameters" ) )
43  {
44  std::string type(conf.getParameterSet("C2d_parameters").getParameter<std::string>("clusterType"));
45  if(type=="dRC2d"){
46  clusteringAlgorithmType_ = dRC2d;
47  }else if(type=="NNC2d"){
48  clusteringAlgorithmType_ = NNC2d;
49  }else {
50  edm::LogWarning("ParameterError") << "Unknown clustering type '" << type
51  << "'. Using nearest neighbor NNC2d instead.\n";
52  clusteringAlgorithmType_ = NNC2d;
53  }
54 
55  }
56 
57  virtual void setProduces(edm::stream::EDProducer<>& prod) const override final
58  {
59  prod.produces<l1t::HGCalTriggerCellBxCollection>( "calibratedTriggerCells" );
60  prod.produces<l1t::HGCalClusterBxCollection>( "cluster2D" );
61  prod.produces<l1t::HGCalMulticlusterBxCollection>( "cluster3D" );
62  }
63 
64  virtual void run(const l1t::HGCFETriggerDigiCollection& coll, const edm::EventSetup& es, edm::Event&evt ) override final;
65 
66 
67  virtual void putInEvent(edm::Event& evt) override final
68  {
69 
70  }
71 
72 
73  virtual void reset() override final
74  {
75  trgcell_product_.reset( new l1t::HGCalTriggerCellBxCollection );
76  cluster_product_.reset( new l1t::HGCalClusterBxCollection );
77  multicluster_product_.reset( new l1t::HGCalMulticlusterBxCollection );
78  }
79 
80 
81  private:
82 
83  /* pointers to collections of trigger-cells, clusters and multiclusters */
84  std::unique_ptr<l1t::HGCalTriggerCellBxCollection> trgcell_product_;
85  std::unique_ptr<l1t::HGCalClusterBxCollection> cluster_product_;
86  std::unique_ptr<l1t::HGCalMulticlusterBxCollection> multicluster_product_;
87 
88  /* lables of sensitive detector (geometry record) */
91 
92  /* handles to the detector topologies */
96 
97  /* algorithms instances */
101 
102  /* algorithm type */
104 };
105 
106 
107 template<typename FECODEC, typename DATA>
109  const edm::EventSetup & es,
110  edm::Event & evt )
111 {
112 
113  es.get<IdealGeometryRecord>().get( HGCalEESensitive_, hgceeTopoHandle_ );
114  es.get<IdealGeometryRecord>().get( HGCalHESiliconSensitive_, hgchefTopoHandle_ );
115  es.get<IdealGeometryRecord>().get("", triggerGeometry_);
116 
117  for( const auto& digi : coll ){
118 
119  HGCalDetId module_id( digi.id() );
120 
121  DATA data;
122  data.reset();
123  digi.decode(codec_, data);
124 
125  for(const auto& triggercell : data.payload)
126  {
127 
128  if( triggercell.hwPt() > 0 )
129  {
130 
131  HGCalDetId detid(triggercell.detId());
132  int subdet = detid.subdetId();
133  int cellThickness = 0;
134 
135  if( subdet == HGCEE ){
136  cellThickness = hgceeTopoHandle_->dddConstants().waferTypeL( (unsigned int)detid.wafer() );
137  }
138  else if( subdet == HGCHEF ){
139  cellThickness = hgchefTopoHandle_->dddConstants().waferTypeL( (unsigned int)detid.wafer() );
140  }
141  else if( subdet == HGCHEB ){
142  edm::LogWarning("DataNotFound") << "ATTENTION: the BH trigger cells are not yet implemented";
143  }
144 
145  l1t::HGCalTriggerCell calibratedtriggercell( triggercell );
146  calibration_.calibrateInGeV( calibratedtriggercell, cellThickness );
147  trgcell_product_->push_back( 0, calibratedtriggercell );
148 
149  }
150 
151  }
152 
153  }
154 
155  /* orphan handles to the collections of trigger-cells, clusters and multiclusters */
159 
160  /* retrieve the orphan handle to the trigger-cells collection and put the collection in the event */
161  triggerCellsHandle = evt.put( std::move( trgcell_product_ ), "calibratedTriggerCells");
162 
163  /* create a persistent vector of pointers to the trigger-cells */
164  edm::PtrVector<l1t::HGCalTriggerCell> triggerCellsPtrs;
165  for( unsigned i = 0; i < triggerCellsHandle->size(); ++i ) {
166  edm::Ptr<l1t::HGCalTriggerCell> ptr(triggerCellsHandle,i);
167  triggerCellsPtrs.push_back(ptr);
168  }
169 
170  /* call to C2d clustering */
171  switch(clusteringAlgorithmType_){
172  case dRC2d :
173  clustering_.clusterizeDR( triggerCellsPtrs, *cluster_product_);
174  break;
175  case NNC2d:
176  clustering_.clusterizeNN( triggerCellsPtrs, *cluster_product_, *triggerGeometry_ );
177  break;
178  default:
179  // Should not happen, clustering type checked in constructor
180  break;
181  }
182 
183  /* retrieve the orphan handle to the clusters collection and put the collection in the event */
184  clustersHandle = evt.put( std::move( cluster_product_ ), "cluster2D");
185 
186  /* create a persistent vector of pointers to the trigger-cells */
188  for( unsigned i = 0; i < clustersHandle->size(); ++i ) {
189  edm::Ptr<l1t::HGCalCluster> ptr(clustersHandle,i);
190  clustersPtrs.push_back(ptr);
191  }
192 
193  /* call to multiclustering */
194  multiclustering_.clusterize( clustersPtrs, *multicluster_product_ );
195 
196  /* retrieve the orphan handle to the multiclusters collection and put the collection in the event */
197  multiclustersHandle = evt.put( std::move( multicluster_product_ ), "cluster3D");
198 
199 }
200 
203 
204 
207  "HGCClusterAlgoBestChoice");
208 
211  "HGCClusterAlgoThreshold");
type
Definition: HCALResponse.h:21
T getParameter(std::string const &) const
ClusterType clusteringAlgorithmType_
OrphanHandle< PROD > put(std::unique_ptr< PROD > product)
Put a new product.
Definition: Event.h:122
HGCalTriggerCellCalibration calibration_
unsigned size(int bx) const
BXVector< HGCalTriggerCell > HGCalTriggerCellBxCollection
virtual void setProduces(edm::stream::EDProducer<> &prod) const override final
void push_back(Ptr< T > const &iPtr)
Definition: PtrVector.h:141
virtual void putInEvent(edm::Event &evt) override final
ParameterSet const & getParameterSet(ParameterSetID const &id)
edm::ESHandle< HGCalTopology > hgchefTopoHandle_
std::string HGCalEESensitive_
HGCClusterAlgo< HGCalTriggerCellThresholdCodec, HGCalTriggerCellThresholdCodec::data_type > HGCClusterAlgoThreshold
delete x;
Definition: CaloConfig.h:22
HGCClusterAlgo(const edm::ParameterSet &conf, edm::ConsumesCollector &cc)
std::unique_ptr< l1t::HGCalTriggerCellBxCollection > trgcell_product_
virtual void run(const l1t::HGCFETriggerDigiCollection &coll, const edm::EventSetup &es, edm::Event &evt) override final
HGCClusterAlgo< HGCalTriggerCellBestChoiceCodec, HGCalTriggerCellBestChoiceCodec::data_type > HGCClusterAlgoBestChoice
BXVector< HGCalMulticluster > HGCalMulticlusterBxCollection
HGCalMulticlusteringImpl multiclustering_
int subdetId() const
get the contents of the subdetector field (not cast into any detector&#39;s numbering enum) ...
Definition: DetId.h:37
HGCalClusteringImpl clustering_
JetCorrectorParametersCollection coll
Definition: classes.h:10
std::string HGCalHESiliconSensitive_
ParameterSet const & getParameterSet(std::string const &) const
virtual void reset() override final
const T & get() const
Definition: EventSetup.h:56
std::unique_ptr< l1t::HGCalMulticlusterBxCollection > multicluster_product_
BXVector< HGCalCluster > HGCalClusterBxCollection
Definition: HGCalCluster.h:36
char data[epos_bytes_allocation]
Definition: EPOS_Wrapper.h:82
#define DEFINE_EDM_PLUGIN(factory, type, name)
std::unique_ptr< l1t::HGCalClusterBxCollection > cluster_product_
edm::ESHandle< HGCalTopology > hgceeTopoHandle_
edm::ESHandle< HGCalTriggerGeometryBase > triggerGeometry_
def move(src, dest)
Definition: eostools.py:510