CMS 3D CMS Logo

List of all members | Public Member Functions | Private Member Functions | Private Attributes
HGCalTriggerGeometryHexImp1 Class Reference
Inheritance diagram for HGCalTriggerGeometryHexImp1:
HGCalTriggerGeometryGenericMapping HGCalTriggerGeometryBase

Public Member Functions

 HGCalTriggerGeometryHexImp1 (const edm::ParameterSet &conf)
 
void initialize (const edm::ESHandle< CaloGeometry > &) final
 
- Public Member Functions inherited from HGCalTriggerGeometryGenericMapping
bool disconnectedModule (const unsigned module_id) const final
 
geom_set getCellsFromModule (const unsigned cell_det_id) const final
 
geom_set getCellsFromTriggerCell (const unsigned cell_det_id) const final
 
unsigned getModuleFromCell (const unsigned cell_det_id) const final
 
unsigned getModuleFromTriggerCell (const unsigned trigger_cell_det_id) const final
 
GlobalPoint getModulePosition (const unsigned module_det_id) const final
 
geom_set getNeighborsFromTriggerCell (const unsigned trigger_cell_det_id) const final
 
geom_ordered_set getOrderedCellsFromModule (const unsigned cell_det_id) const final
 
geom_ordered_set getOrderedTriggerCellsFromModule (const unsigned trigger_cell_det_id) const final
 
unsigned getTriggerCellFromCell (const unsigned cell_det_id) const final
 
GlobalPoint getTriggerCellPosition (const unsigned trigger_cell_det_id) const final
 
geom_set getTriggerCellsFromModule (const unsigned trigger_cell_det_id) const final
 
 HGCalTriggerGeometryGenericMapping (const edm::ParameterSet &conf)
 
void reset () final
 
bool validTriggerCell (const unsigned trigger_cell_det_id) const final
 
 ~HGCalTriggerGeometryGenericMapping () override
 
- Public Member Functions inherited from HGCalTriggerGeometryBase
const HcalGeometrybhGeometry () const
 
const HcalTopologybhTopology () const
 
const edm::ESHandle< CaloGeometry > & caloGeometry () const
 
const HGCalGeometryeeGeometry () const
 
const HGCalTopologyeeTopology () const
 
const HGCalGeometryfhGeometry () const
 
const HGCalTopologyfhTopology () const
 
 HGCalTriggerGeometryBase (const edm::ParameterSet &conf)
 
const std::string & name () const
 
virtual ~HGCalTriggerGeometryBase ()
 

Private Member Functions

void buildTriggerCellsAndModules ()
 
void fillMaps ()
 

Private Attributes

edm::FileInPath l1tCellsMapping_
 
edm::FileInPath l1tModulesMapping_
 

Additional Inherited Members

- Public Types inherited from HGCalTriggerGeometryGenericMapping
typedef std::unordered_map< unsigned, std::unique_ptr< const HGCalTriggerGeometry::Module > > module_map
 
typedef std::unordered_map< unsigned, std::unique_ptr< const HGCalTriggerGeometry::TriggerCell > > trigger_cell_map
 
- Public Types inherited from HGCalTriggerGeometryBase
typedef std::unordered_map< unsigned, unsigned > geom_map
 
typedef std::set< unsigned > geom_ordered_set
 
typedef std::unordered_set< unsigned > geom_set
 
- Protected Member Functions inherited from HGCalTriggerGeometryBase
void setCaloGeometry (const edm::ESHandle< CaloGeometry > &geom)
 
- Protected Attributes inherited from HGCalTriggerGeometryGenericMapping
geom_map cells_to_trigger_cells_
 
module_map modules_
 
trigger_cell_map trigger_cells_
 
geom_map trigger_cells_to_modules_
 

Detailed Description

Definition at line 12 of file HGCalTriggerGeometryHexImp1.cc.

Constructor & Destructor Documentation

HGCalTriggerGeometryHexImp1::HGCalTriggerGeometryHexImp1 ( const edm::ParameterSet conf)

Definition at line 29 of file HGCalTriggerGeometryHexImp1.cc.

29  :
31  l1tCellsMapping_(conf.getParameter<edm::FileInPath>("L1TCellsMapping")),
32  l1tModulesMapping_(conf.getParameter<edm::FileInPath>("L1TModulesMapping"))
33 /*****************************************************************/
34 {
35 }
T getParameter(std::string const &) const
HGCalTriggerGeometryGenericMapping(const edm::ParameterSet &conf)

Member Function Documentation

void HGCalTriggerGeometryHexImp1::buildTriggerCellsAndModules ( )
private

Definition at line 179 of file HGCalTriggerGeometryHexImp1.cc.

References HGCalTriggerGeometryGenericMapping::cells_to_trigger_cells_, DEFINE_EDM_PLUGIN, HGCalTriggerGeometryBase::eeGeometry(), HGCalTriggerGeometryBase::fhGeometry(), HGCalGeometry::getPosition(), HGCEE, HGCalTriggerGeometryGenericMapping::modules_, DetId::subdetId(), HGCalTriggerGeometryGenericMapping::trigger_cells_, and HGCalTriggerGeometryGenericMapping::trigger_cells_to_modules_.

Referenced by initialize().

181 {
182  //
183  // Build trigger cells and fill map
185  // make list of cells in trigger cells
186  std::unordered_map<unsigned, list_cells> trigger_cells_to_cells;
187  for(const auto& cell_triggerCell : cells_to_trigger_cells_)
188  {
189  unsigned cell = cell_triggerCell.first;
190  unsigned triggerCell = cell_triggerCell.second;
191  auto itr_exist = trigger_cells_to_cells.emplace(triggerCell, list_cells());
192  itr_exist.first->second.emplace(cell);
193  //trigger_cells_to_cells.at(triggerCell).emplace(cell);
194  }
195  for(const auto& triggerCell_cells : trigger_cells_to_cells)
196  {
197  unsigned triggerCellId = triggerCell_cells.first;
198  list_cells cellIds = triggerCell_cells.second;
199  // Position: barycenter of the trigger cell.
200  Basic3DVector<float> triggerCellVector(0.,0.,0.);
201  for(const auto& cell : cellIds)
202  {
203  HGCalDetId cellDetId(cell);
204  triggerCellVector += (cellDetId.subdetId()==ForwardSubdetector::HGCEE ? eeGeometry()->getPosition(cellDetId) : fhGeometry()->getPosition(cellDetId)).basicVector();
205  }
206  GlobalPoint triggerCellPoint( triggerCellVector/cellIds.size() );
207  const auto& triggerCellToModuleItr = trigger_cells_to_modules_.find(triggerCellId);
208  unsigned moduleId = (triggerCellToModuleItr!=trigger_cells_to_modules_.end() ? triggerCellToModuleItr->second : 0); // 0 if the trigger cell doesn't belong to a module
209  //unsigned moduleId = trigger_cells_to_modules_.at(triggercellId);
210  // FIXME: empty neighbours
211  trigger_cells_.emplace(triggerCellId, std::make_unique<const HGCalTriggerGeometry::TriggerCell>(triggerCellId, moduleId, triggerCellPoint, list_cells(), cellIds));
212  }
213  //
214  // Build modules and fill map
215  typedef HGCalTriggerGeometry::Module::list_type list_triggerCells;
216  typedef HGCalTriggerGeometry::Module::tc_map_type tc_map_to_cells;
217  // make list of trigger cells in modules
218  std::unordered_map<unsigned, list_triggerCells> modules_to_trigger_cells;
219  for(const auto& triggerCell_module : trigger_cells_to_modules_)
220  {
221  unsigned triggerCell = triggerCell_module.first;
222  unsigned module = triggerCell_module.second;
223  auto itr_exist = modules_to_trigger_cells.emplace(module, list_triggerCells());
224  itr_exist.first->second.emplace(triggerCell);
225  //modules_to_trigger_cells.at(module).emplace(triggerCell);
226  }
227  for(const auto& module_triggerCell : modules_to_trigger_cells)
228  {
229  unsigned moduleId = module_triggerCell.first;
230  list_triggerCells triggerCellIds = module_triggerCell.second;
231  tc_map_to_cells cellsInTriggerCells;
232  // Position: barycenter of the module, from trigger cell positions
233  Basic3DVector<float> moduleVector(0.,0.,0.);
234  for(const auto& triggerCell : triggerCellIds)
235  {
236  const auto& cells_in_tc = trigger_cells_to_cells.at(triggerCell);
237  for( const unsigned cell : cells_in_tc )
238  {
239  cellsInTriggerCells.emplace(triggerCell,cell);
240  }
241  moduleVector += trigger_cells_.at(triggerCell)->position().basicVector();
242  }
243  GlobalPoint modulePoint( moduleVector/triggerCellIds.size() );
244  // FIXME: empty neighbours
245  modules_.emplace(moduleId, std::make_unique<const HGCalTriggerGeometry::Module>(moduleId, modulePoint, list_triggerCells(), triggerCellIds, cellsInTriggerCells));
246  }
247 }
std::unordered_set< unsigned > list_type
const HGCalGeometry * eeGeometry() const
GlobalPoint getPosition(const DetId &id) const
const HGCalGeometry * fhGeometry() const
std::unordered_multimap< unsigned, unsigned > tc_map_type
Definition: vlib.h:208
void HGCalTriggerGeometryHexImp1::fillMaps ( )
private

Definition at line 54 of file HGCalTriggerGeometryHexImp1.cc.

References EnergyCorrector::c, HGCalTriggerGeometryGenericMapping::cells_to_trigger_cells_, HGCalTopology::dddConstants(), HGCalTriggerGeometryBase::eeGeometry(), HGCalTriggerGeometryBase::eeTopology(), HGCalTriggerGeometryBase::fhGeometry(), HGCalTriggerGeometryBase::fhTopology(), edm::FileInPath::fullPath(), HGCalDetId::kHGCalCellMask, l1tCellsMapping_, l1tModulesMapping_, HGCalDetId::layer(), python.rootplot.argparse::module, HGCalDDDConstants::numberCellsHexagon(), PFRecoTauDiscriminationByIsolation_cfi::offset, DetId::subdetId(), HGCalTriggerGeometryGenericMapping::trigger_cells_to_modules_, HGCalDetId::wafer(), HGCalDetId::waferType(), HGCalDDDConstants::waferTypeT(), and HGCalDetId::zside().

Referenced by initialize().

56 {
57  //
58  // read module mapping file
59  std::unordered_map<short, short> wafer_to_module_ee;
60  std::unordered_map<short, short> wafer_to_module_fh;
61  std::unordered_map<short, std::map<short,short>> module_to_wafers_ee;
62  std::unordered_map<short, std::map<short,short>> module_to_wafers_fh;
63  std::ifstream l1tModulesMappingStream(l1tModulesMapping_.fullPath());
64  if(!l1tModulesMappingStream.is_open()) edm::LogError("HGCalTriggerGeometry") << "Cannot open L1TModulesMapping file\n";
65  short subdet = 0;
66  short wafer = 0;
67  short module = 0;
68  for(; l1tModulesMappingStream>>subdet>>wafer>>module; )
69  {
70  if(subdet==3)
71  {
72  wafer_to_module_ee.emplace(wafer,module);
73  auto itr_insert = module_to_wafers_ee.emplace(module, std::map<short,short>());
74  itr_insert.first->second.emplace(wafer, 0);
75  }
76  else if(subdet==4)
77  {
78  wafer_to_module_fh.emplace(wafer,module);
79  auto itr_insert = module_to_wafers_fh.emplace(module, std::map<short,short>());
80  itr_insert.first->second.emplace(wafer, 0);
81  }
82  else edm::LogWarning("HGCalTriggerGeometry") << "Unsupported subdetector number ("<<subdet<<") in L1TModulesMapping file\n";
83  }
84  if(!l1tModulesMappingStream.eof()) edm::LogWarning("HGCalTriggerGeometry") << "Error reading L1TModulesMapping '"<<wafer<<" "<<module<<"' \n";
85  l1tModulesMappingStream.close();
86  // read trigger cell mapping file
87  std::map<std::pair<short,short>, short> cells_to_trigger_cells;
88  std::unordered_map<short, short> number_trigger_cells_in_wafers; // the map key is the wafer type
89  std::ifstream l1tCellsMappingStream(l1tCellsMapping_.fullPath());
90  if(!l1tCellsMappingStream.is_open()) edm::LogError("HGCalTriggerGeometry") << "Cannot open L1TCellsMapping file\n";
91  short waferType = 0;
92  short cell = 0;
93  short triggerCell = 0;
94  for(; l1tCellsMappingStream>>waferType>>cell>>triggerCell; )
95  {
96  cells_to_trigger_cells.emplace(std::make_pair((waferType?1:-1),cell), triggerCell);
97  auto itr_insert = number_trigger_cells_in_wafers.emplace((waferType?1:-1), 0);
98  if(triggerCell+1 > itr_insert.first->second) itr_insert.first->second = triggerCell+1;
99  }
100  if(!l1tCellsMappingStream.eof()) edm::LogWarning("HGCalTriggerGeometry") << "Error reading L1TCellsMapping'"<<waferType<<" "<<cell<<" "<<triggerCell<<"' \n";
101  l1tCellsMappingStream.close();
102  // For each wafer compute the trigger cell offset according to the wafer position inside
103  // the module. The first wafer will have an offset equal to 0, the second an offset equal to the
104  // number of trigger cells in the first wafer, etc.
105  short offset = 0;
106  for(auto& module_wafers : module_to_wafers_ee)
107  {
108  offset = 0;
109  for(auto& wafer_offset : module_wafers.second)
110  {
111  wafer_offset.second = offset;
112  int wafer_type = (eeTopology().dddConstants().waferTypeT(wafer_offset.first)==1?1:-1);
113  offset += number_trigger_cells_in_wafers.at(wafer_type);
114  }
115  }
116  for(auto& module_wafers : module_to_wafers_fh)
117  {
118  offset = 0;
119  for(auto& wafer_offset : module_wafers.second)
120  {
121  wafer_offset.second = offset;
122  int wafer_type = (fhTopology().dddConstants().waferTypeT(wafer_offset.first)==1?1:-1);
123  offset += number_trigger_cells_in_wafers.at(wafer_type);
124  }
125  }
126  //
127  // Loop over HGC cells
128  // EE
129  for(const auto& id : eeGeometry()->getValidGeomDetIds())
130  {
131  if(id.rawId()==0) continue;
132  HGCalDetId waferDetId(id);
133  short module = wafer_to_module_ee[waferDetId.wafer()];
134  short triggercell_offset = module_to_wafers_ee.at(module).at(waferDetId.wafer());
135  int nCells = eeTopology().dddConstants().numberCellsHexagon(waferDetId.wafer());
136  for(int c=0;c<nCells;c++)
137  {
138  short triggerCellId = cells_to_trigger_cells[std::make_pair(waferDetId.waferType(),c)];
139  // Fill cell -> trigger cell mapping
140  HGCalDetId cellDetId(ForwardSubdetector(waferDetId.subdetId()), waferDetId.zside(), waferDetId.layer(), waferDetId.waferType(), waferDetId.wafer(), c);
141  // The module id is used instead of the wafer id for the trigger cells
142  // Since there are several wafers per module, an offset is applied on the HGCalDetId::cell field
143  if(triggercell_offset+triggerCellId >= HGCalDetId::kHGCalCellMask) edm::LogError("HGCalTriggerGeometry") << "Trigger cell id requested with a cell field larger than available in HGCalDetId (" << triggercell_offset+triggerCellId << " >= " << HGCalDetId::kHGCalCellMask << ")\n";
144  HGCalDetId triggerCellDetId(ForwardSubdetector(waferDetId.subdetId()), waferDetId.zside(), waferDetId.layer(), waferDetId.waferType(), module, triggercell_offset + triggerCellId);
145  cells_to_trigger_cells_.emplace(cellDetId, triggerCellDetId);
146  // Fill trigger cell -> module mapping
147  HGCalDetId moduleDetId(ForwardSubdetector(waferDetId.subdetId()), waferDetId.zside(), waferDetId.layer(), waferDetId.waferType(), module, HGCalDetId::kHGCalCellMask);
148  trigger_cells_to_modules_.emplace(triggerCellDetId, moduleDetId);
149  }
150  }
151  // FH
152  for(const auto& id : fhGeometry()->getValidGeomDetIds())
153  {
154  if(id.rawId()==0) continue;
155  HGCalDetId waferDetId(id);
156  short module = wafer_to_module_fh[waferDetId.wafer()];
157  short triggercell_offset = module_to_wafers_fh.at(module).at(waferDetId.wafer());
158  int nCells = fhTopology().dddConstants().numberCellsHexagon(waferDetId.wafer());
159  for(int c=0;c<nCells;c++)
160  {
161  short triggerCellId = cells_to_trigger_cells[std::make_pair(waferDetId.waferType(),c)];
162  // Fill cell -> trigger cell mapping
163  HGCalDetId cellDetId(ForwardSubdetector(waferDetId.subdetId()), waferDetId.zside(), waferDetId.layer(), waferDetId.waferType(), waferDetId.wafer(), c);
164  // The module id is used instead of the wafer id for the trigger cells
165  // Since there are several wafers per module, an offset is applied on the HGCalDetId::cell field
166  if(triggercell_offset+triggerCellId >= HGCalDetId::kHGCalCellMask) edm::LogError("HGCalTriggerGeometry") << "Trigger cell id requested with a cell field larger than available in HGCalDetId (" << triggercell_offset+triggerCellId << " >= " << HGCalDetId::kHGCalCellMask << ")\n";
167  HGCalDetId triggerCellDetId(ForwardSubdetector(waferDetId.subdetId()), waferDetId.zside(), waferDetId.layer(), waferDetId.waferType(), module, triggercell_offset + triggerCellId);
168  cells_to_trigger_cells_.emplace(cellDetId, triggerCellDetId);
169  // Fill trigger cell -> module mapping
170  HGCalDetId moduleDetId(ForwardSubdetector(waferDetId.subdetId()), waferDetId.zside(), waferDetId.layer(), waferDetId.waferType(), module, HGCalDetId::kHGCalCellMask);
171  trigger_cells_to_modules_.emplace(triggerCellDetId, moduleDetId);
172  }
173  }
174 }
const HGCalGeometry * eeGeometry() const
const HGCalTopology & eeTopology() const
ForwardSubdetector
static const int kHGCalCellMask
Definition: HGCalDetId.h:13
int numberCellsHexagon(int wafer) const
const HGCalGeometry * fhGeometry() const
const HGCalDDDConstants & dddConstants() const
std::string fullPath() const
Definition: FileInPath.cc:184
int waferTypeT(int wafer) const
Definition: vlib.h:208
const HGCalTopology & fhTopology() const
void HGCalTriggerGeometryHexImp1::initialize ( const edm::ESHandle< CaloGeometry > &  calo_geometry)
finalvirtual

Implements HGCalTriggerGeometryBase.

Definition at line 39 of file HGCalTriggerGeometryHexImp1.cc.

References buildTriggerCellsAndModules(), fillMaps(), and HGCalTriggerGeometryBase::setCaloGeometry().

41 {
42  edm::LogWarning("HGCalTriggerGeometry") << "WARNING: This HGCal trigger geometry is incomplete.\n"\
43  << "WARNING: There is no neighbor information.\n";
44 
45  setCaloGeometry(calo_geometry);
46  fillMaps();
48 
49 }
void setCaloGeometry(const edm::ESHandle< CaloGeometry > &geom)

Member Data Documentation

edm::FileInPath HGCalTriggerGeometryHexImp1::l1tCellsMapping_
private

Definition at line 20 of file HGCalTriggerGeometryHexImp1.cc.

Referenced by fillMaps().

edm::FileInPath HGCalTriggerGeometryHexImp1::l1tModulesMapping_
private

Definition at line 21 of file HGCalTriggerGeometryHexImp1.cc.

Referenced by fillMaps().