CMS 3D CMS Logo

OMTFConfiguration.cc
Go to the documentation of this file.
1 #include <iostream>
2 #include <algorithm>
3 
6 
11 
13 
16 RefHitDef::RefHitDef(unsigned int aInput, int aPhiMin, int aPhiMax, unsigned int aRegion, unsigned int aRefLayer)
17  : iInput(aInput), iRegion(aRegion), iRefLayer(aRefLayer), range(std::pair<int, int>(aPhiMin, aPhiMax)) {}
20 bool RefHitDef::fitsRange(int iPhi) const { return iPhi >= range.first && iPhi <= range.second; }
23 std::ostream &operator<<(std::ostream &out, const RefHitDef &aRefHitDef) {
24  out << "iRefLayer: " << aRefHitDef.iRefLayer << " iInput: " << aRefHitDef.iInput << " iRegion: " << aRefHitDef.iRegion
25  << " range: (" << aRefHitDef.range.first << ", " << aRefHitDef.range.second << std::endl;
26 
27  return out;
28 }
33  std::vector<int> aLayer1D(nInputs(), 0);
34 
36  vector2D aLayer2D;
37  aLayer2D.assign(nLayers(), aLayer1D);
38 
40  vector3D aLayer3D;
41  aLayer3D.assign(nLogicRegions(), aLayer2D);
42 
44  measurements4D.assign(nProcessors(), aLayer3D);
45  measurements4Dref.assign(nProcessors(), aLayer3D);
46 }
51 
53  barrelMin.resize(nProcessors());
54  endcap10DegMin.resize(nProcessors());
55  endcap20DegMin.resize(nProcessors());
56 
57  barrelMax.resize(nProcessors());
58  endcap10DegMax.resize(nProcessors());
59  endcap20DegMax.resize(nProcessors());
60 
61  const std::vector<int> *connectedSectorsStartVec = omtfParams->connectedSectorsStart();
62  const std::vector<int> *connectedSectorsEndVec = omtfParams->connectedSectorsEnd();
63 
64  std::copy(connectedSectorsStartVec->begin(), connectedSectorsStartVec->begin() + 6, barrelMin.begin());
65  std::copy(connectedSectorsStartVec->begin() + 6, connectedSectorsStartVec->begin() + 12, endcap10DegMin.begin());
66  std::copy(connectedSectorsStartVec->begin() + 12, connectedSectorsStartVec->end(), endcap20DegMin.begin());
67 
68  std::copy(connectedSectorsEndVec->begin(), connectedSectorsEndVec->begin() + 6, barrelMax.begin());
69  std::copy(connectedSectorsEndVec->begin() + 6, connectedSectorsEndVec->begin() + 12, endcap10DegMax.begin());
70  std::copy(connectedSectorsEndVec->begin() + 12, connectedSectorsEndVec->end(), endcap20DegMax.begin());
71 
73  const std::vector<L1TMuonOverlapParams::LayerMapNode> *layerMap = omtfParams->layerMap();
74 
75  for (unsigned int iLayer = 0; iLayer < nLayers(); ++iLayer) {
76  L1TMuonOverlapParams::LayerMapNode aNode = layerMap->at(iLayer);
77  hwToLogicLayer[aNode.hwNumber] = aNode.logicNumber;
78  logicToHwLayer[aNode.logicNumber] = aNode.hwNumber;
80  if (aNode.bendingLayer)
81  bendingLayers.insert(aNode.logicNumber);
82  }
84  refToLogicNumber.resize(nRefLayers());
85 
86  const std::vector<L1TMuonOverlapParams::RefLayerMapNode> *refLayerMap = omtfParams->refLayerMap();
87  for (unsigned int iRefLayer = 0; iRefLayer < nRefLayers(); ++iRefLayer) {
88  L1TMuonOverlapParams::RefLayerMapNode aNode = refLayerMap->at(iRefLayer);
89  refToLogicNumber[aNode.refLayer] = aNode.logicNumber;
90  }
92  std::vector<int> vector1D(nRefLayers(), nPhiBins());
94 
97  vector1D_pair aLayer1D(nLayers());
99  vector2D_pair aLayer2D;
100  aLayer2D.assign(nLogicRegions(), aLayer1D);
102  connections.assign(nProcessors(), aLayer2D);
103 
106  std::vector<std::pair<int, int> > aRefHit1D(nLogicRegions(), std::pair<int, int>(9999, 9999));
108  std::vector<std::vector<std::pair<int, int> > > aRefHit2D;
109  aRefHit2D.assign(nRefLayers(), aRefHit1D);
111  regionPhisVsRefLayerVsInput.assign(nInputs(), aRefHit2D);
112 
113  //Vector of ref hit definitions
114  std::vector<RefHitDef> aRefHitsDefs(nRefHits());
116  refHitsDefs.assign(nProcessors(), aRefHitsDefs);
117 
118  const std::vector<int> *phiStartMap = omtfParams->globalPhiStartMap();
119  const std::vector<L1TMuonOverlapParams::RefHitNode> *refHitMap = omtfParams->refHitMap();
120  const std::vector<L1TMuonOverlapParams::LayerInputNode> *layerInputMap = omtfParams->layerInputMap();
121  unsigned int tmpIndex = 0;
122  for (unsigned int iProcessor = 0; iProcessor < nProcessors(); ++iProcessor) {
123  for (unsigned int iRefLayer = 0; iRefLayer < nRefLayers(); ++iRefLayer) {
124  int iPhiStart = phiStartMap->at(iRefLayer + iProcessor * nRefLayers());
125  processorPhiVsRefLayer[iProcessor][iRefLayer] = iPhiStart;
126  }
127  for (unsigned int iRefHit = 0; iRefHit < nRefHits(); ++iRefHit) {
128  int iPhiMin = refHitMap->at(iRefHit + iProcessor * nRefHits()).iPhiMin;
129  int iPhiMax = refHitMap->at(iRefHit + iProcessor * nRefHits()).iPhiMax;
130  unsigned int iInput = refHitMap->at(iRefHit + iProcessor * nRefHits()).iInput;
131  unsigned int iRegion = refHitMap->at(iRefHit + iProcessor * nRefHits()).iRegion;
132  unsigned int iRefLayer = refHitMap->at(iRefHit + iProcessor * nRefHits()).iRefLayer;
133  regionPhisVsRefLayerVsInput[iInput][iRefLayer][iRegion] = std::pair<int, int>(iPhiMin, iPhiMax);
134  refHitsDefs[iProcessor][iRefHit] = RefHitDef(iInput, iPhiMin, iPhiMax, iRegion, iRefLayer);
135  }
136  for (unsigned int iLogicRegion = 0; iLogicRegion < nLogicRegions(); ++iLogicRegion) {
137  for (unsigned int iLayer = 0; iLayer < nLayers(); ++iLayer) {
138  tmpIndex = iLayer + iLogicRegion * nLayers() + iProcessor * nLogicRegions() * nLayers();
139  unsigned int iFirstInput = layerInputMap->at(tmpIndex).iFirstInput;
140  unsigned int nInputsInRegion = layerInputMap->at(tmpIndex).nInputs;
141  connections[iProcessor][iLogicRegion][iLayer] =
142  std::pair<unsigned int, unsigned int>(iFirstInput, nInputsInRegion);
144  if (iProcessor != 0)
145  connections[iProcessor][iLogicRegion][iLayer] = connections[0][iLogicRegion][iLayer];
146  }
147  }
148  }
149 
151 }
154 std::ostream &operator<<(std::ostream &out, const OMTFConfiguration &aConfig) {
155  out << "nLayers(): " << aConfig.nLayers() << " nHitsPerLayer(): " << aConfig.nHitsPerLayer()
156  << " nRefLayers(): " << aConfig.nRefLayers() << " nPdfAddrBits: " << aConfig.nPdfAddrBits()
157  << " nPdfValBits: " << aConfig.nPdfValBits() << std::endl;
158 
159  for (unsigned int iProcessor = 0; iProcessor < aConfig.nProcessors(); ++iProcessor) {
160  out << "Processor: " << iProcessor;
161  for (unsigned int iRefLayer = 0; iRefLayer < aConfig.nRefLayers(); ++iRefLayer) {
162  out << " " << aConfig.processorPhiVsRefLayer[iProcessor][iRefLayer];
163  }
164  out << std::endl;
165  }
166 
167  return out;
168 }
171 bool OMTFConfiguration::isInRegionRange(int iPhiStart, unsigned int coneSize, int iPhi) const {
172  if (iPhi < 0)
173  iPhi += nPhiBins();
174  if (iPhiStart < 0)
175  iPhiStart += nPhiBins();
176 
177  if (iPhiStart + (int)coneSize < (int)nPhiBins()) {
178  return iPhiStart <= iPhi && iPhiStart + (int)coneSize > iPhi;
179  } else if (iPhi > (int)nPhiBins() / 2) {
180  return iPhiStart <= iPhi;
181  } else if (iPhi < (int)nPhiBins() / 2) {
182  return iPhi < iPhiStart + (int)coneSize - (int)nPhiBins();
183  }
184  return false;
185 }
188 unsigned int OMTFConfiguration::getRegionNumberFromMap(unsigned int iInput, unsigned int iRefLayer, int iPhi) const {
189  for (unsigned int iRegion = 0; iRegion < nLogicRegions(); ++iRegion) {
190  if (iPhi >= regionPhisVsRefLayerVsInput[iInput][iRefLayer][iRegion].first &&
191  iPhi <= regionPhisVsRefLayerVsInput[iInput][iRefLayer][iRegion].second)
192  return iRegion;
193  }
194 
195  return 99;
196 }
199 int OMTFConfiguration::globalPhiStart(unsigned int iProcessor) const {
200  return *std::min_element(processorPhiVsRefLayer[iProcessor].begin(), processorPhiVsRefLayer[iProcessor].end());
201 }
204 uint32_t OMTFConfiguration::getLayerNumber(uint32_t rawId) const {
205  uint32_t aLayer = 0;
206 
207  DetId detId(rawId);
208  if (detId.det() != DetId::Muon) {
209  std::cout << "PROBLEM: hit in unknown Det, detID: " << detId.det() << std::endl;
210  return rawId;
211  }
212 
213  switch (detId.subdetId()) {
214  case MuonSubdetId::RPC: {
215  RPCDetId aId(rawId);
216  bool isBarrel = (aId.region() == 0);
217  if (isBarrel)
218  aLayer = aId.station() <= 2 ? 2 * (aId.station() - 1) + aId.layer() : aId.station() + 2;
219  else
220  aLayer = aId.station();
221  aLayer += 10 * (!isBarrel);
222  break;
223  }
224  case MuonSubdetId::DT: {
225  DTChamberId dt(rawId);
226  aLayer = dt.station();
227  break;
228  }
229  case MuonSubdetId::CSC: {
230  CSCDetId csc(rawId);
231  aLayer = csc.station();
232  if (csc.ring() == 2 && csc.station() == 1)
233  aLayer = 1811; //1811 = 2011 - 200, as we want to get 2011 for this chamber.
234  if (csc.station() == 4)
235  aLayer = 4;
236  break;
237  }
238  }
239 
240  int hwNumber = aLayer + 100 * detId.subdetId();
241 
242  return hwNumber;
243 }
float dt
Definition: AMPTWrapper.h:136
std::vector< std::pair< unsigned int, unsigned int > > vector1D_pair
unsigned int hwNumber
short layer number used within OMTF emulator
std::vector< unsigned int > endcap20DegMax
unsigned int logicNumber
logic numer of the layer
std::vector< unsigned int > endcap10DegMin
std::vector< unsigned int > barrelMax
unsigned int iInput
Hit input number within a cone.
vector4D measurements4D
4D matrices used during creation of the connections tables.
unsigned int nPdfValBits() const
std::vector< std::vector< std::vector< std::pair< int, int > > > > regionPhisVsRefLayerVsInput
constexpr Detector det() const
get the detector field from this detid
Definition: DetId.h:46
std::map< int, int > logicToLogic
unsigned int nRefHits() const
U second(std::pair< T, U > const &p)
unsigned int nHitsPerLayer() const
std::vector< vector1D > vector2D
unsigned int nPhiBins() const
omtfParams
OMTF ESProducer.
unsigned int getRegionNumberFromMap(unsigned int iInput, unsigned int iRefLayer, int iPhi) const
std::vector< unsigned int > barrelMin
unsigned int nPdfAddrBits() const
bool isInRegionRange(int iPhiStart, unsigned int coneSize, int iPhi) const
bool fitsRange(int iPhi) const
std::vector< std::vector< int > > processorPhiVsRefLayer
vector3D_pair connections
Map of connections.
std::vector< int > vector1D
unsigned int nLayers() const
constexpr int subdetId() const
get the contents of the subdetector field (not cast into any detector&#39;s numbering enum) ...
Definition: DetId.h:48
RefHitDef(unsigned int aInput=15, int aPhiMin=5760, int aPhiMax=5760, unsigned int aRegion=99, unsigned int aRefLayer=99)
bool bendingLayer
Is this a bending layers?
Definition: L1Track.h:19
std::vector< int > refToLogicNumber
int globalPhiStart(unsigned int iProcessor) const
void configure(const L1TMuonOverlapParams *omtfParams)
unsigned int nRefLayers() const
Definition: DetId.h:17
std::ostream & operator<<(std::ostream &out, const RefHitDef &aRefHitDef)
std::map< int, int > hwToLogicLayer
unsigned int refLayer
Reference layer number.
static constexpr int RPC
Definition: MuonSubdetId.h:13
std::map< int, int > logicToHwLayer
std::vector< vector2D > vector3D
int station() const
Definition: RPCDetId.h:78
std::pair< int, int > range
unsigned int nInputs() const
int region() const
Region id: 0 for Barrel, +/-1 For +/- Endcap.
Definition: RPCDetId.h:53
std::set< int > bendingLayers
L1TMuonOverlapParams rawParams
unsigned int iRefLayer
Reference layer logic number (0-7)
unsigned int logicNumber
Corresponding logical layer number.
unsigned int iRegion
Region number assigned to this referecne hit.
int layer() const
Definition: RPCDetId.h:85
unsigned int nProcessors() const
static constexpr int DT
Definition: MuonSubdetId.h:11
static constexpr int CSC
Definition: MuonSubdetId.h:12
std::vector< unsigned int > endcap10DegMax
uint32_t getLayerNumber(uint32_t rawId) const
std::vector< unsigned int > endcap20DegMin
unsigned int nLogicRegions() const
std::vector< vector1D_pair > vector2D_pair
std::vector< std::vector< RefHitDef > > refHitsDefs