CMS 3D CMS Logo

All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
HGCClusterAlgo.cc
Go to the documentation of this file.
13 
14 using namespace HGCalTriggerBackend;
15 
16 
17 template<typename FECODEC, typename DATA>
18 class HGCClusterAlgo : public Algorithm<FECODEC>
19 {
20  public:
22 
23  protected:
25 
26  private:
29  NNC2d
30  };
31 
32  public:
33 
35  Algorithm<FECODEC>(conf, cc),
36  trgcell_product_( new l1t::HGCalTriggerCellBxCollection ),
37  cluster_product_( new l1t::HGCalClusterBxCollection ),
38  multicluster_product_( new l1t::HGCalMulticlusterBxCollection ),
39  calibration_( conf.getParameterSet("calib_parameters") ),
40  clustering_( conf.getParameterSet("C2d_parameters") ),
41  multiclustering_( conf.getParameterSet("C3d_parameters" ) )
42  {
43  clustering_threshold_silicon_ = conf.getParameterSet("C2d_parameters").getParameter<double>("clustering_threshold_silicon");
44  clustering_threshold_scintillator_ = conf.getParameterSet("C2d_parameters").getParameter<double>("clustering_threshold_scintillator");
45  std::string type(conf.getParameterSet("C2d_parameters").getParameter<std::string>("clusterType"));
46  if(type=="dRC2d"){
47  clusteringAlgorithmType_ = dRC2d;
48  }else if(type=="NNC2d"){
49  clusteringAlgorithmType_ = NNC2d;
50  }else {
51  edm::LogWarning("ParameterError") << "Unknown clustering type '" << type
52  << "'. Using nearest neighbor NNC2d instead.\n";
53  clusteringAlgorithmType_ = NNC2d;
54  }
55 
56  }
57 
58  virtual void setProduces(edm::stream::EDProducer<>& prod) const override final
59  {
60  prod.produces<l1t::HGCalTriggerCellBxCollection>( "calibratedTriggerCells" );
61  prod.produces<l1t::HGCalClusterBxCollection>( "cluster2D" );
62  prod.produces<l1t::HGCalMulticlusterBxCollection>( "cluster3D" );
63  }
64 
65  virtual void run(const l1t::HGCFETriggerDigiCollection& coll, const edm::EventSetup& es, edm::Event&evt ) override final;
66 
67 
68  virtual void putInEvent(edm::Event& evt) override final
69  {
70 
71  }
72 
73 
74  virtual void reset() override final
75  {
76  trgcell_product_.reset( new l1t::HGCalTriggerCellBxCollection );
77  cluster_product_.reset( new l1t::HGCalClusterBxCollection );
78  multicluster_product_.reset( new l1t::HGCalMulticlusterBxCollection );
79  }
80 
81 
82  private:
83 
84  /* pointers to collections of trigger-cells, clusters and multiclusters */
85  std::unique_ptr<l1t::HGCalTriggerCellBxCollection> trgcell_product_;
86  std::unique_ptr<l1t::HGCalClusterBxCollection> cluster_product_;
87  std::unique_ptr<l1t::HGCalMulticlusterBxCollection> multicluster_product_;
88 
90 
91  /* algorithms instances */
95 
96  /* algorithm type */
100 };
101 
102 
103 template<typename FECODEC, typename DATA>
105  const edm::EventSetup & es,
106  edm::Event & evt )
107 {
108  es.get<CaloGeometryRecord>().get("", triggerGeometry_);
109 
110  for( const auto& digi : coll ){
111 
112  HGCalDetId module_id( digi.id() );
113 
114  DATA data;
115  data.reset();
116  digi.decode(codec_, data);
117 
118  for(const auto& triggercell : data.payload)
119  {
120 
121  if( triggercell.hwPt() > 0 )
122  {
123  l1t::HGCalTriggerCell calibratedtriggercell( triggercell );
124  calibration_.calibrateInGeV( calibratedtriggercell);
125  double clustering_threshold = (triggercell.subdetId()==HGCHEB ? clustering_threshold_scintillator_ : clustering_threshold_silicon_);
126  if(calibratedtriggercell.mipPt()<clustering_threshold) continue;
127  trgcell_product_->push_back( 0, calibratedtriggercell );
128  }
129 
130  }
131 
132  }
133 
134  /* orphan handles to the collections of trigger-cells, clusters and multiclusters */
138 
139  /* retrieve the orphan handle to the trigger-cells collection and put the collection in the event */
140  triggerCellsHandle = evt.put( std::move( trgcell_product_ ), "calibratedTriggerCells");
141 
142  /* create a persistent vector of pointers to the trigger-cells */
143  edm::PtrVector<l1t::HGCalTriggerCell> triggerCellsPtrs;
144  for( unsigned i = 0; i < triggerCellsHandle->size(); ++i ) {
145  edm::Ptr<l1t::HGCalTriggerCell> ptr(triggerCellsHandle,i);
146  triggerCellsPtrs.push_back(ptr);
147  }
148 
149  /* call to C2d clustering */
150  switch(clusteringAlgorithmType_){
151  case dRC2d :
152  clustering_.clusterizeDR( triggerCellsPtrs, *cluster_product_);
153  break;
154  case NNC2d:
155  clustering_.clusterizeNN( triggerCellsPtrs, *cluster_product_, *triggerGeometry_ );
156  break;
157  default:
158  // Should not happen, clustering type checked in constructor
159  break;
160  }
161 
162  /* retrieve the orphan handle to the clusters collection and put the collection in the event */
163  clustersHandle = evt.put( std::move( cluster_product_ ), "cluster2D");
164 
165  /* create a persistent vector of pointers to the trigger-cells */
167  for( unsigned i = 0; i < clustersHandle->size(); ++i ) {
168  edm::Ptr<l1t::HGCalCluster> ptr(clustersHandle,i);
169  clustersPtrs.push_back(ptr);
170  }
171 
172  /* call to multiclustering */
173  multiclustering_.clusterize( clustersPtrs, *multicluster_product_ );
174 
175  /* retrieve the orphan handle to the multiclusters collection and put the collection in the event */
176  multiclustersHandle = evt.put( std::move( multicluster_product_ ), "cluster3D");
177 
178 }
179 
182 
183 
186  "HGCClusterAlgoBestChoice");
187 
190  "HGCClusterAlgoThreshold");
type
Definition: HCALResponse.h:21
T getParameter(std::string const &) const
ClusterType clusteringAlgorithmType_
double clustering_threshold_silicon_
OrphanHandle< PROD > put(std::unique_ptr< PROD > product)
Put a new product.
Definition: Event.h:127
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:140
virtual void putInEvent(edm::Event &evt) override final
ParameterSet const & getParameterSet(ParameterSetID const &id)
HGCClusterAlgo< HGCalTriggerCellThresholdCodec, HGCalTriggerCellThresholdCodec::data_type > HGCClusterAlgoThreshold
delete x;
Definition: CaloConfig.h:22
double mipPt() const
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_
HGCalClusteringImpl clustering_
JetCorrectorParametersCollection coll
Definition: classes.h:10
ParameterSet const & getParameterSet(std::string const &) const
virtual void reset() override final
const T & get() const
Definition: EventSetup.h:55
std::unique_ptr< l1t::HGCalMulticlusterBxCollection > multicluster_product_
BXVector< HGCalCluster > HGCalClusterBxCollection
Definition: HGCalCluster.h:36
double clustering_threshold_scintillator_
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< HGCalTriggerGeometryBase > triggerGeometry_
def move(src, dest)
Definition: eostools.py:510