CMS 3D CMS Logo

HGCalTriggerGeometryImp1.cc
Go to the documentation of this file.
2 
5 
6 #include <vector>
7 #include <iostream>
8 #include <fstream>
9 
10 
12 {
13  public:
15 
16  virtual void initialize(const es_info& ) override final;
17 
18  private:
20 };
21 
22 
23 /*****************************************************************/
26  l1tCellsMapping_(conf.getParameter<edm::FileInPath>("L1TCellsMapping"))
27 /*****************************************************************/
28 {
29 }
30 
31 
32 /*****************************************************************/
34 /*****************************************************************/
35 {
36  // FIXME: !!!Only for HGCEE for the moment!!!
37  edm::LogWarning("HGCalTriggerGeometry") << "WARNING: This HGCal trigger geometry is incomplete.\n"\
38  << "WARNING: Only the EE part is covered.\n"\
39  << "WARNING: There is no neighbor information.\n";
40  //
41  // read trigger cell mapping file
42  std::ifstream l1tCellsMappingStream(l1tCellsMapping_.fullPath());
43  if(!l1tCellsMappingStream.is_open()) edm::LogError("HGCalTriggerGeometry") << "Cannot open L1TCellsMapping file\n";
44  short layer = 0;
45  short subsector = 0;
46  short cell = 0;
47  short module = 0;
48  short triggercell = 0;
49  for(; l1tCellsMappingStream>>layer>>subsector>>cell>>module>>triggercell; )
50  {
51  if(layer>30 || layer<=0)
52  {
53  edm::LogWarning("HGCalTriggerGeometry") << "Bad layer index in L1TCellsMapping\n";
54  continue;
55  }
56  // Loop on all sectors
57  // FIXME: Number of sectors in each zside should not be hardcoded
58  for(unsigned z=0; z<=1; z++)
59  {
60  int zside = (z==0 ? -1 : 1);
61  for(unsigned sector=1; sector<=18; sector++)
62  {
63  HGCEEDetId detid(HGCEE, zside, layer, sector, subsector, cell);
64  //
65  // Fill cell -> trigger cell mapping
66  HGCTriggerDetId triggerDetid(HGCTrigger, zside, layer, sector, module, triggercell);
67  const auto& ret = cells_to_trigger_cells_.insert( std::make_pair(detid, triggerDetid) );
68  if(!ret.second) edm::LogWarning("HGCalTriggerGeometry") << "Duplicate cell in L1TCellsMapping\n";
69  // Fill trigger cell -> module mapping
70  HGCTriggerDetId moduleDetid(HGCTrigger, zside, layer, sector, module, HGCTriggerDetId::UndefinedCell() );
71  trigger_cells_to_modules_.insert( std::make_pair(triggerDetid, moduleDetid) ); // do nothing if trigger cell has already been inserted
72  }
73  }
74  }
75  if(!l1tCellsMappingStream.eof()) edm::LogWarning("HGCalTriggerGeometry") << "Error reading L1TCellsMapping'"<<layer<<" "<<cell<<" "<<triggercell<<" "<<subsector<<"' \n";
76  l1tCellsMappingStream.close();
77  //
78  // Build trigger cells and fill map
80  // make list of cells in trigger cells
81  std::map<unsigned, list_cells> trigger_cells_to_cells;
82  for(const auto& cell_triggercell : cells_to_trigger_cells_)
83  {
84  unsigned cell = cell_triggercell.first;
85  unsigned triggercell = cell_triggercell.second;
86  trigger_cells_to_cells.insert( std::make_pair(triggercell, list_cells()) );
87  trigger_cells_to_cells.at(triggercell).insert(cell);
88  }
89  for(const auto& triggercell_cells : trigger_cells_to_cells)
90  {
91  unsigned triggercellId = triggercell_cells.first;
92  list_cells cellIds = triggercell_cells.second;
93  // Position: for the moment, barycenter of the trigger cell.
94  Basic3DVector<float> triggercellVector(0.,0.,0.);
95  for(const auto& cell : cellIds)
96  {
97  HGCTriggerDetId cellId(cell);
98  triggercellVector += esInfo.geom_ee->getPosition(cellId).basicVector();
99  }
100  GlobalPoint triggercellPoint( triggercellVector/cellIds.size() );
101  const auto& tc2mItr = trigger_cells_to_modules_.find(triggercellId);
102  unsigned moduleId = (tc2mItr!=trigger_cells_to_modules_.end() ? tc2mItr->second : 0); // 0 if the trigger cell doesn't belong to a module
103  //unsigned moduleId = trigger_cells_to_modules_.at(triggercellId);
104  // FIXME: empty neighbours
105  std::unique_ptr<const HGCalTriggerGeometry::TriggerCell> triggercellPtr(new HGCalTriggerGeometry::TriggerCell(triggercellId, moduleId, triggercellPoint, list_cells(), cellIds));
106  trigger_cells_.insert( std::make_pair(triggercellId, std::move(triggercellPtr)) );
107  }
108  //
109  // Build modules and fill map
110  typedef HGCalTriggerGeometry::Module::list_type list_triggercells;
111  typedef HGCalTriggerGeometry::Module::tc_map_type tc_map_to_cells;
112  // make list of trigger cells in modules
113  std::map<unsigned, list_triggercells> modules_to_trigger_cells;
114  for(const auto& triggercell_module : trigger_cells_to_modules_)
115  {
116  unsigned triggercell = triggercell_module.first;
117  unsigned module = triggercell_module.second;
118  modules_to_trigger_cells.insert( std::make_pair(module, list_triggercells()) );
119  modules_to_trigger_cells.at(module).insert(triggercell);
120  }
121  for(const auto& module_triggercell : modules_to_trigger_cells)
122  {
123  unsigned moduleId = module_triggercell.first;
124  list_triggercells triggercellIds = module_triggercell.second;
125  tc_map_to_cells cellsInTriggerCells;
126  // Position: for the moment, barycenter of the module, from trigger cell positions
127  Basic3DVector<float> moduleVector(0.,0.,0.);
128  for(const auto& triggercell : triggercellIds)
129  {
130  const auto& cells_in_tc = trigger_cells_to_cells[triggercell];
131  for( const unsigned cell : cells_in_tc ) {
132  cellsInTriggerCells.emplace(triggercell,cell);
133  }
134  moduleVector += trigger_cells_.at(triggercell)->position().basicVector();
135  }
136  GlobalPoint modulePoint( moduleVector/triggercellIds.size() );
137  // FIXME: empty neighbours
138  std::unique_ptr<const HGCalTriggerGeometry::Module> modulePtr(new HGCalTriggerGeometry::Module(moduleId, modulePoint, list_triggercells(), triggercellIds, cellsInTriggerCells));
139  modules_.insert( std::make_pair(moduleId, std::move(modulePtr)) );
140  }
141 }
142 
143 
146  "HGCalTriggerGeometryImp1");
std::unordered_set< unsigned > list_type
GlobalPoint getPosition(const DetId &id) const
virtual void initialize(const es_info &) override final
HGCalTriggerGeometryImp1(const edm::ParameterSet &conf)
std::unordered_multimap< unsigned, unsigned > tc_map_type
edm::ESHandle< HGCalGeometry > geom_ee
static const uint32_t UndefinedCell()
HLT enums.
#define DEFINE_EDM_PLUGIN(factory, type, name)
std::string fullPath() const
Definition: FileInPath.cc:184
const BasicVectorType & basicVector() const
Definition: PV3DBase.h:56
Definition: vlib.h:208
def move(src, dest)
Definition: eostools.py:510