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
 
void initialize (const edm::ESHandle< HGCalGeometry > &, const edm::ESHandle< HGCalGeometry > &, const edm::ESHandle< HGCalGeometry > &) 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
 
unsigned triggerLayer (const unsigned id) const 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 HGCalGeometryhscGeometry () const
 
const HGCalTopologyhscTopology () const
 
const HGCalGeometryhsiGeometry () const
 
const HGCalTopologyhsiTopology () const
 
bool isV9Geometry () const
 
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)
 
void setEEGeometry (const edm::ESHandle< HGCalGeometry > &geom)
 
void setHScGeometry (const edm::ESHandle< HGCalGeometry > &geom)
 
void setHSiGeometry (const edm::ESHandle< HGCalGeometry > &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 32 of file HGCalTriggerGeometryHexImp1.cc.

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

Member Function Documentation

void HGCalTriggerGeometryHexImp1::buildTriggerCellsAndModules ( )
private

Definition at line 192 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().

194 {
195  //
196  // Build trigger cells and fill map
198  // make list of cells in trigger cells
199  std::unordered_map<unsigned, list_cells> trigger_cells_to_cells;
200  for(const auto& cell_triggerCell : cells_to_trigger_cells_)
201  {
202  unsigned cell = cell_triggerCell.first;
203  unsigned triggerCell = cell_triggerCell.second;
204  auto itr_exist = trigger_cells_to_cells.emplace(triggerCell, list_cells());
205  itr_exist.first->second.emplace(cell);
206  //trigger_cells_to_cells.at(triggerCell).emplace(cell);
207  }
208  for(const auto& triggerCell_cells : trigger_cells_to_cells)
209  {
210  unsigned triggerCellId = triggerCell_cells.first;
211  list_cells cellIds = triggerCell_cells.second;
212  // Position: barycenter of the trigger cell.
213  Basic3DVector<float> triggerCellVector(0.,0.,0.);
214  for(const auto& cell : cellIds)
215  {
216  HGCalDetId cellDetId(cell);
217  triggerCellVector += (cellDetId.subdetId()==ForwardSubdetector::HGCEE ? eeGeometry()->getPosition(cellDetId) : fhGeometry()->getPosition(cellDetId)).basicVector();
218  }
219  GlobalPoint triggerCellPoint( triggerCellVector/cellIds.size() );
220  const auto& triggerCellToModuleItr = trigger_cells_to_modules_.find(triggerCellId);
221  unsigned moduleId = (triggerCellToModuleItr!=trigger_cells_to_modules_.end() ? triggerCellToModuleItr->second : 0); // 0 if the trigger cell doesn't belong to a module
222  //unsigned moduleId = trigger_cells_to_modules_.at(triggercellId);
223  // FIXME: empty neighbours
224  trigger_cells_.emplace(triggerCellId, std::make_unique<const HGCalTriggerGeometry::TriggerCell>(triggerCellId, moduleId, triggerCellPoint, list_cells(), cellIds));
225  }
226  //
227  // Build modules and fill map
228  typedef HGCalTriggerGeometry::Module::list_type list_triggerCells;
229  typedef HGCalTriggerGeometry::Module::tc_map_type tc_map_to_cells;
230  // make list of trigger cells in modules
231  std::unordered_map<unsigned, list_triggerCells> modules_to_trigger_cells;
232  for(const auto& triggerCell_module : trigger_cells_to_modules_)
233  {
234  unsigned triggerCell = triggerCell_module.first;
235  unsigned module = triggerCell_module.second;
236  auto itr_exist = modules_to_trigger_cells.emplace(module, list_triggerCells());
237  itr_exist.first->second.emplace(triggerCell);
238  //modules_to_trigger_cells.at(module).emplace(triggerCell);
239  }
240  for(const auto& module_triggerCell : modules_to_trigger_cells)
241  {
242  unsigned moduleId = module_triggerCell.first;
243  list_triggerCells triggerCellIds = module_triggerCell.second;
244  tc_map_to_cells cellsInTriggerCells;
245  // Position: barycenter of the module, from trigger cell positions
246  Basic3DVector<float> moduleVector(0.,0.,0.);
247  for(const auto& triggerCell : triggerCellIds)
248  {
249  const auto& cells_in_tc = trigger_cells_to_cells.at(triggerCell);
250  for( const unsigned cell : cells_in_tc )
251  {
252  cellsInTriggerCells.emplace(triggerCell,cell);
253  }
254  moduleVector += trigger_cells_.at(triggerCell)->position().basicVector();
255  }
256  GlobalPoint modulePoint( moduleVector/triggerCellIds.size() );
257  // FIXME: empty neighbours
258  modules_.emplace(moduleId, std::make_unique<const HGCalTriggerGeometry::Module>(moduleId, modulePoint, list_triggerCells(), triggerCellIds, cellsInTriggerCells));
259  }
260 }
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 67 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(), HGCalDDDConstants::numberCellsHexagon(), PFRecoTauDiscriminationByIsolation_cfi::offset, DetId::subdetId(), HGCalTriggerGeometryGenericMapping::trigger_cells_to_modules_, HGCalDetId::wafer(), HGCalDetId::waferType(), HGCalDDDConstants::waferTypeT(), and HGCalDetId::zside().

Referenced by initialize().

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

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

43 {
44  edm::LogWarning("HGCalTriggerGeometry") << "WARNING: This HGCal trigger geometry is incomplete.\n"\
45  << "WARNING: There is no neighbor information.\n";
46 
47  setCaloGeometry(calo_geometry);
48  fillMaps();
50 
51 }
void setCaloGeometry(const edm::ESHandle< CaloGeometry > &geom)
void HGCalTriggerGeometryHexImp1::initialize ( const edm::ESHandle< HGCalGeometry > &  hgc_ee_geometry,
const edm::ESHandle< HGCalGeometry > &  hgc_hsi_geometry,
const edm::ESHandle< HGCalGeometry > &  hgc_hsc_geometry 
)
finalvirtual

Implements HGCalTriggerGeometryBase.

Definition at line 54 of file HGCalTriggerGeometryHexImp1.cc.

References Exception.

59 {
60  throw cms::Exception("BadGeometry")
61  << "HGCalTriggerGeometryHexImp1 geometry cannot be initialized with the V9 HGCAL geometry";
62 }

Member Data Documentation

edm::FileInPath HGCalTriggerGeometryHexImp1::l1tCellsMapping_
private

Definition at line 23 of file HGCalTriggerGeometryHexImp1.cc.

Referenced by fillMaps().

edm::FileInPath HGCalTriggerGeometryHexImp1::l1tModulesMapping_
private

Definition at line 24 of file HGCalTriggerGeometryHexImp1.cc.

Referenced by fillMaps().