CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
OMTFConfiguration.cc
Go to the documentation of this file.
1 #include <iostream>
2 #include <algorithm>
3 
6 
11 
13 
16 
18 
21 RefHitDef::RefHitDef(unsigned int aInput,
22  int aPhiMin, int aPhiMax,
23  unsigned int aRegion,
24  unsigned int aRefLayer):
25  iInput(aInput),
26  iRegion(aRegion),
27  iRefLayer(aRefLayer),
28  range(std::pair<int,int>(aPhiMin,aPhiMax)){}
31 bool RefHitDef::fitsRange(int iPhi) const{
32 
33  return iPhi>=range.first &&
34  iPhi<range.second;
35 
36 }
39 std::ostream & operator << (std::ostream &out, const RefHitDef & aRefHitDef){
40 
41 
42  out<<"iRefLayer: "<<aRefHitDef.iRefLayer
43  <<" iInput: "<<aRefHitDef.iInput
44  <<" iRegion: "<<aRefHitDef.iRegion
45  <<" range: ("<<aRefHitDef.range.first
46  <<", "<<aRefHitDef.range.second<<std::endl;
47 
48  return out;
49 }
53  latest_instance_ = this;
54 
55  if(theConfig.getParameter<bool>("configFromXML")){
56  if (!theConfig.exists("configXMLFile") ) return;
57  std::string fName = theConfig.getParameter<edm::FileInPath>("configXMLFile").fullPath();
58 
59  XMLConfigReader myReader(this);
60  myReader.setConfigFile(fName);
61  configure(&myReader);
62  }
63 }
67 
69  std::vector<int> aLayer1D(nInputs,0);
70 
72  vector2D aLayer2D;
73  aLayer2D.assign(nLayers,aLayer1D);
74 
76  vector3D aLayer3D;
77  aLayer3D.assign(nLogicRegions,aLayer2D);
78 
80  measurements4D.assign(nProcessors,aLayer3D);
81  measurements4Dref.assign(nProcessors,aLayer3D);
82 }
86 
87  aReader->readConfig(this);
89 
90 }
94 
96  minPdfVal = 0.001;
97  fwVersion = omtfParams->fwVersion();
98  nPdfAddrBits = omtfParams->nPdfAddrBits();
99  nPdfValBits = omtfParams->nPdfValBits();
100  nHitsPerLayer = omtfParams->nHitsPerLayer();
101  nPhiBits = omtfParams->nPhiBits();
102  nPhiBins = omtfParams->nPhiBins();
103  nRefHits = omtfParams->nRefHits();
104  nTestRefHits = omtfParams->nTestRefHits();
105  nProcessors = omtfParams->nProcessors();
106  nLogicRegions = omtfParams->nLogicRegions();
107  nInputs = omtfParams->nInputs();
108  nLayers = omtfParams->nLayers();
109  nRefLayers = omtfParams->nRefLayers();
110  nGoldenPatterns = omtfParams->nGoldenPatterns();
111 
113  barrelMin.resize(nProcessors);
114  endcap10DegMin.resize(nProcessors);
115  endcap20DegMin.resize(nProcessors);
116 
117  barrelMax.resize(nProcessors);
118  endcap10DegMax.resize(nProcessors);
119  endcap20DegMax.resize(nProcessors);
120 
121  const std::vector<int> *connectedSectorsStartVec = omtfParams->connectedSectorsStart();
122  const std::vector<int> *connectedSectorsEndVec = omtfParams->connectedSectorsEnd();
123 
124  std::copy(connectedSectorsStartVec->begin(), connectedSectorsStartVec->begin()+6, barrelMin.begin());
125  std::copy(connectedSectorsStartVec->begin()+6, connectedSectorsStartVec->begin()+12, endcap10DegMin.begin());
126  std::copy(connectedSectorsStartVec->begin()+12, connectedSectorsStartVec->end(), endcap20DegMin.begin());
127 
128  std::copy(connectedSectorsEndVec->begin(), connectedSectorsEndVec->begin()+6, barrelMax.begin());
129  std::copy(connectedSectorsEndVec->begin()+6, connectedSectorsEndVec->begin()+12, endcap10DegMax.begin());
130  std::copy(connectedSectorsEndVec->begin()+12, connectedSectorsEndVec->end(), endcap20DegMax.begin());
131 
133  const std::vector<L1TMuonOverlapParams::LayerMapNode> *layerMap = omtfParams->layerMap();
134 
135  for(unsigned int iLayer=0;iLayer<nLayers;++iLayer){
136  L1TMuonOverlapParams::LayerMapNode aNode = layerMap->at(iLayer);
137  hwToLogicLayer[aNode.hwNumber] = aNode.logicNumber;
138  logicToHwLayer[aNode.logicNumber] = aNode.hwNumber;
139  logicToLogic[aNode.logicNumber] = aNode.connectedToLayer;
140  if(aNode.bendingLayer) bendingLayers.insert(aNode.logicNumber);
141  }
144 
145  const std::vector<L1TMuonOverlapParams::RefLayerMapNode> *refLayerMap = omtfParams->refLayerMap();
146  for(unsigned int iRefLayer=0;iRefLayer<nRefLayers;++iRefLayer){
147  L1TMuonOverlapParams::RefLayerMapNode aNode = refLayerMap->at(iRefLayer);
148  refToLogicNumber[aNode.refLayer] = aNode.logicNumber;
149  }
151  std::vector<int> vector1D(nRefLayers,nPhiBins);
152  processorPhiVsRefLayer.assign(nProcessors,vector1D);
153 
156  vector1D_A aLayer1D(nLayers);
158  vector2D_A aLayer2D;
159  aLayer2D.assign(nLogicRegions,aLayer1D);
161  connections.assign(nProcessors,aLayer2D);
162 
165  std::vector<std::pair<int,int> > aRefHit1D(nLogicRegions,std::pair<int,int>(9999,9999));
167  std::vector<std::vector<std::pair<int,int> > > aRefHit2D;
168  aRefHit2D.assign(nRefLayers,aRefHit1D);
170  regionPhisVsRefLayerVsInput.assign(nInputs,aRefHit2D);
171 
172  //Vector of ref hit definitions
173  std::vector<RefHitDef> aRefHitsDefs(nRefHits);
175  refHitsDefs.assign(nProcessors,aRefHitsDefs);
176 
177  const std::vector<int> *phiStartMap = omtfParams->globalPhiStartMap();
178  const std::vector<L1TMuonOverlapParams::RefHitNode> *refHitMap = omtfParams->refHitMap();
179  const std::vector<L1TMuonOverlapParams::LayerInputNode> *layerInputMap = omtfParams->layerInputMap();
180  unsigned int tmpIndex = 0;
181  for(unsigned int iProcessor=0;iProcessor<nProcessors;++iProcessor){
182  for(unsigned int iRefLayer=0;iRefLayer<nRefLayers;++iRefLayer){
183  int iPhiStart = phiStartMap->at(iRefLayer+iProcessor*nRefLayers);
184  processorPhiVsRefLayer[iProcessor][iRefLayer] = iPhiStart;
185  }
186  for(unsigned int iRefHit=0;iRefHit<nRefHits;++iRefHit){
187  int iPhiMin = refHitMap->at(iRefHit+iProcessor*nRefHits).iPhiMin;
188  int iPhiMax = refHitMap->at(iRefHit+iProcessor*nRefHits).iPhiMax;
189  unsigned int iInput = refHitMap->at(iRefHit+iProcessor*nRefHits).iInput;
190  unsigned int iRegion = refHitMap->at(iRefHit+iProcessor*nRefHits).iRegion;
191  unsigned int iRefLayer = refHitMap->at(iRefHit+iProcessor*nRefHits).iRefLayer;
192  regionPhisVsRefLayerVsInput[iInput][iRefLayer][iRegion] = std::pair<int,int>(iPhiMin,iPhiMax);
193  refHitsDefs[iProcessor][iRefHit] = RefHitDef(iInput,iPhiMin,iPhiMax,iRegion,iRefLayer);
194  }
195  for(unsigned int iLogicRegion=0;iLogicRegion<nLogicRegions;++iLogicRegion){
196  for(unsigned int iLayer=0;iLayer<nLayers;++iLayer){
197  tmpIndex = iLayer+iLogicRegion*nLayers + iProcessor*nLogicRegions*nLayers;
198  unsigned int iFirstInput = layerInputMap->at(tmpIndex).iFirstInput;
199  unsigned int nInputs = layerInputMap->at(tmpIndex).nInputs;
200  connections[iProcessor][iLogicRegion][iLayer] = std::pair<unsigned int, unsigned int>(iFirstInput,nInputs);
202  if(iProcessor!=0) connections[iProcessor][iLogicRegion][iLayer] = connections[0][iLogicRegion][iLayer];
203  }
204  }
205  }
206 
208 
209 }
212 std::ostream & operator << (std::ostream &out, const OMTFConfiguration & aConfig){
213 
214 
215  out<<"nLayers: "<<aConfig.nLayers
216  <<" nHitsPerLayer: "<<aConfig.nHitsPerLayer
217  <<" nRefLayers: "<<aConfig.nRefLayers
218  <<" nPdfAddrBits: "<<aConfig.nPdfAddrBits
219  <<" nPdfValBits: "<<aConfig.nPdfValBits
220  <<std::endl;
221 
222  for(unsigned int iProcessor = 0;iProcessor<aConfig.nProcessors; ++iProcessor){
223  out<<"Processor: "<<iProcessor;
224  for(unsigned int iRefLayer=0;iRefLayer<aConfig.nRefLayers;++iRefLayer){
225  out<<" "<<aConfig.processorPhiVsRefLayer[iProcessor][iRefLayer];
226  }
227  out<<std::endl;
228  }
229 
230  return out;
231 
232 }
236  unsigned int coneSize,
237  int iPhi) const {
238 
239  if(iPhi<0) iPhi+=nPhiBins;
240  if(iPhiStart<0) iPhiStart+=nPhiBins;
241 
242  if(iPhiStart+(int)coneSize<(int)nPhiBins){
243  return iPhiStart<=iPhi && iPhiStart+(int)coneSize>iPhi;
244  }
245  else if(iPhi>(int)nPhiBins/2){
246  return iPhiStart<=iPhi;
247  }
248  else if(iPhi<(int)nPhiBins/2){
249  return iPhi<iPhiStart+(int)coneSize-(int)nPhiBins;
250  }
251  return false;
252 }
255 unsigned int OMTFConfiguration::getRegionNumberFromMap(unsigned int iInput,
256  unsigned int iRefLayer,
257  int iPhi) const {
258 
259  for(unsigned int iRegion=0;iRegion<nLogicRegions;++iRegion){
260  if(iPhi>=regionPhisVsRefLayerVsInput[iInput][iRefLayer][iRegion].first &&
261  iPhi<=regionPhisVsRefLayerVsInput[iInput][iRefLayer][iRegion].second)
262  return iRegion;
263  }
264 
265  return 99;
266 }
269 int OMTFConfiguration::globalPhiStart(unsigned int iProcessor) const {
270 
271  return *std::min_element(processorPhiVsRefLayer[iProcessor].begin(),
272  processorPhiVsRefLayer[iProcessor].end());
273 
274 }
277 uint32_t OMTFConfiguration::getLayerNumber(uint32_t rawId) const {
278 
279  uint32_t aLayer = 0;
280 
281  DetId detId(rawId);
282  if (detId.det() != DetId::Muon){
283  std::cout << "PROBLEM: hit in unknown Det, detID: "<<detId.det()<<std::endl;
284  return rawId;
285  }
286 
287  switch (detId.subdetId()) {
288  case MuonSubdetId::RPC: {
289  RPCDetId aId(rawId);
290  bool isBarrel = (aId.region()==0);
291  if(isBarrel) aLayer = aId.station() <=2 ?
292  2*( aId.station()-1)+ aId.layer()
293  : aId.station()+2;
294  else aLayer = aId.station();
295  aLayer+= 10*(!isBarrel);
296  break;
297  }
298  case MuonSubdetId::DT: {
299  DTChamberId dt(rawId);
300  aLayer = dt.station();
301  break;
302  }
303  case MuonSubdetId::CSC: {
304  CSCDetId csc(rawId);
305  aLayer = csc.station();
306  if(csc.ring()==2 && csc.station()==1) aLayer = 1811;//1811 = 2011 - 200, as we want to get 2011 for this chamber.
307  if(csc.station()==4) aLayer = 4;
308  break;
309  }
310  }
311 
312  int hwNumber = aLayer+100*detId.subdetId();
313 
314  return hwNumber;
315 }
bool fitsRange(int iPhi) const
std::vector< unsigned int > endcap20DegMax
T getParameter(std::string const &) const
float dt
Definition: AMPTWrapper.h:126
unsigned int nLayers
const std::vector< LayerMapNode > * layerMap() const
std::map< int, int > logicToLogic
std::vector< unsigned int > endcap10DegMin
OMTFConfiguration(const edm::ParameterSet &cfg)
unsigned int nInputs
unsigned int hwNumber
short layer number used within OMTF emulator
const std::vector< int > * connectedSectorsEnd() const
unsigned fwVersion() const
bool isBarrel(GeomDetEnumerators::SubDetector m)
bool exists(std::string const &parameterName) const
checks if a parameter exists
bool isInRegionRange(int iPhiStart, unsigned int coneSize, int iPhi) const
static OMTFConfiguration * latest_instance_
#define NULL
Definition: scimark2.h:8
unsigned int logicNumber
logic numer of the layer
std::vector< std::vector< int > > processorPhiVsRefLayer
unsigned int iInput
Hit input number within a cone.
std::ostream & operator<<(std::ostream &out, const ALILine &li)
Definition: ALILine.cc:187
unsigned int nProcessors
unsigned int nLogicRegions
std::map< int, int > logicToHwLayer
std::vector< vector2D > vector3D
std::vector< unsigned int > endcap20DegMin
std::vector< int > refToLogicNumber
std::vector< unsigned int > endcap10DegMax
U second(std::pair< T, U > const &p)
const std::vector< LayerInputNode > * layerInputMap() const
unsigned int nPdfAddrBits
static const int CSC
Definition: MuonSubdetId.h:13
unsigned int getRegionNumberFromMap(unsigned int iInput, unsigned int iRefLayer, int iPhi) const
std::vector< vector1D > vector2D
void configure(XMLConfigReader *aReader)
unsigned int fwVersion
unsigned int nTestRefHits
tuple omtfParams
OMTF ESProducer.
unsigned int nHitsPerLayer
std::vector< std::vector< RefHitDef > > refHitsDefs
std::vector< std::pair< unsigned int, unsigned int > > vector1D_A
Map of connections.
std::vector< int > vector1D
unsigned int nPhiBins
RefHitDef(unsigned int aInput=15, int aPhiMin=5760, int aPhiMax=5760, unsigned int aRegion=99, unsigned int aRefLayer=99)
#define end
Definition: vmac.h:37
void readConfig(const std::string fName)
bool bendingLayer
Is this a bending layers?
int subdetId() const
get the contents of the subdetector field (not cast into any detector&#39;s numbering enum) ...
Definition: DetId.h:37
unsigned int nPhiBits
void setConfigFile(const std::string &fName)
int ring() const
Definition: CSCDetId.h:75
int layer() const
Definition: RPCDetId.h:108
Definition: DetId.h:18
int nPdfAddrBits() const
Access to specific general settings.
std::vector< unsigned int > barrelMin
uint32_t getLayerNumber(uint32_t rawId) const
unsigned int refLayer
Reference layer number.
unsigned int nRefLayers
const std::vector< int > * globalPhiStartMap() const
std::pair< int, int > range
int globalPhiStart(unsigned int iProcessor) const
std::set< int > bendingLayers
std::map< int, int > hwToLogicLayer
unsigned int nRefHits
#define begin
Definition: vmac.h:30
static const int RPC
Definition: MuonSubdetId.h:14
unsigned int iRefLayer
Reference layer logic number (0-7)
unsigned int logicNumber
Corresponding logical layer number.
int station() const
Definition: CSCDetId.h:86
tuple cout
Definition: gather_cfg.py:145
static const int DT
Definition: MuonSubdetId.h:12
unsigned int iRegion
Region number assigned to this referecne hit.
unsigned int nGoldenPatterns
std::vector< vector1D_A > vector2D_A
const std::vector< RefLayerMapNode > * refLayerMap() const
int station() const
Return the station number.
Definition: DTChamberId.h:51
std::vector< std::vector< std::vector< std::pair< int, int > > > > regionPhisVsRefLayerVsInput
Detector det() const
get the detector field from this detid
Definition: DetId.h:35
const std::vector< int > * connectedSectorsStart() const
std::vector< unsigned int > barrelMax
unsigned int nPdfValBits
const std::vector< RefHitNode > * refHitMap() const
int region() const
Region id: 0 for Barrel, +/-1 For +/- Endcap.
Definition: RPCDetId.h:63
int station() const
Definition: RPCDetId.h:96