CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
OMTFinputMaker.cc
Go to the documentation of this file.
1 #include <cmath>
2 #include <vector>
3 #include <iostream>
4 #include <algorithm>
5 
10 
15 
18 
24 void OMTFinputMaker::initialize(const edm::EventSetup& es, const OMTFConfiguration *omtfConfig){
25 
27 
28  myOmtfConfig = omtfConfig;
29 
30 }
36 bool OMTFinputMaker::acceptDigi(uint32_t rawId,
37  unsigned int iProcessor,
39 
40  unsigned int aMin = myOmtfConfig->getBarrelMin()[iProcessor];
41  unsigned int aMax = myOmtfConfig->getBarrelMax()[iProcessor];
42  unsigned int aSector = 99;
43 
45  DetId detId(rawId);
46  if (detId.det() != DetId::Muon)
47  edm::LogError("Critical OMTFinputMaker") << "PROBLEM: hit in unknown Det, detID: "<<detId.det()<<std::endl;
48  switch (detId.subdetId()) {
49  case MuonSubdetId::RPC: {
50  RPCDetId aId(rawId);
51 
53  if(type==l1t::tftype::omtf_pos &&
54  (aId.region()<0 ||
55  (aId.region()==0 && aId.ring()!=2) ||
56  (aId.region()==0 && aId.station()==4) ||
57  (aId.region()==0 && aId.station()==2 && aId.layer()==2 && aId.roll()==1) ||
58  (aId.region()==0 && aId.station()==3 && aId.roll()==1) ||
59  (aId.region()==1 && aId.station()==4) ||
61  (aId.region()==1 && aId.station()>0 && aId.ring()<3))
62  ) return false;
63 
64  if(type==l1t::tftype::omtf_neg &&
65  (aId.region()>0 ||
66  (aId.region()==0 && aId.ring()!=-2) ||
67  (aId.region()==0 && aId.station()==4) ||
68  (aId.region()==0 && aId.station()==2 && aId.layer()==2 && aId.roll()==1) ||
69  (aId.region()==0 && aId.station()==3 && aId.roll()==1) ||
70  (aId.region()==-1 && aId.station()==4) ||
71  //RPC RE1/2 temporarily not used (aId.region()==1 && aId.station()==1 && aId.ring()<2) ||
72  (aId.region()==-1 && aId.station()>0 && aId.ring()<3))
73  ) return false;
74 
75  if(type==l1t::tftype::bmtf && aId.region()!=0) return false;
76 
77  if(type==l1t::tftype::emtf_pos &&
78  (aId.region()<=0 ||
79  (aId.station()==1 && aId.ring()==3))) return false;
80  if(type==l1t::tftype::emtf_neg &&
81  (aId.region()>=0 ||
82  (aId.station()==1 && aId.ring()==3))) return false;
84  if(aId.region()==0) aSector = aId.sector();
85  if(aId.region()!=0){
86  aSector = (aId.sector()-1)*6+aId.subsector();
87  aMin = myOmtfConfig->getEndcap10DegMin()[iProcessor];
88  aMax = myOmtfConfig->getEndcap10DegMax()[iProcessor];
89  }
90 
91  break;
92  }
93  case MuonSubdetId::DT: {
94  DTChamberId dt(rawId);
95 
96  if(type==l1t::tftype::omtf_pos && dt.wheel()!=2) return false;
97  if(type==l1t::tftype::omtf_neg && dt.wheel()!=-2) return false;
98  if(type==l1t::tftype::emtf_pos || type==l1t::tftype::emtf_neg) return false;
99 
100  aSector = dt.sector();
101  break;
102  }
103  case MuonSubdetId::CSC: {
104 
105  CSCDetId csc(rawId);
106  if(type==l1t::tftype::omtf_pos &&
107  (csc.endcap()==2 || csc.ring()==1 || csc.station()==4)) return false;
108  if(type==l1t::tftype::omtf_neg &&
109  (csc.endcap()==1 || csc.ring()==1 || csc.station()==4)) return false;
110 
111  if(type==l1t::tftype::emtf_pos &&
112  (csc.endcap()==2 || (csc.station()==1 && csc.ring()==3))
113  ) return false;
114  if(type==l1t::tftype::emtf_neg &&
115  (csc.endcap()==1 || (csc.station()==1 && csc.ring()==3))
116  ) return false;
117 
118  aSector = csc.chamber();
119  aMin = myOmtfConfig->getEndcap10DegMin()[iProcessor];
120  aMax = myOmtfConfig->getEndcap10DegMax()[iProcessor];
121 
122  if( (type==l1t::tftype::emtf_pos || type==l1t::tftype::emtf_neg) &&
123  csc.station()>1 && csc.ring()==1){
124  aMin = myOmtfConfig->getEndcap20DegMin()[iProcessor];
125  aMax = myOmtfConfig->getEndcap20DegMax()[iProcessor];
126  }
127  break;
128  }
129  }
130 
131  if(aMax>aMin && aSector>=aMin && aSector<=aMax) return true;
132  if(aMax<aMin && (aSector>=aMin || aSector<=aMax)) return true;
133 
134  return false;
135 }
138 unsigned int OMTFinputMaker::getInputNumber(unsigned int rawId,
139  unsigned int iProcessor,
140  l1t::tftype type){
141 
142  unsigned int iInput = 99;
143  unsigned int aSector = 99;
144  int aMin = myOmtfConfig->getBarrelMin()[iProcessor];
145  int iRoll = 1;
146  int nInputsPerSector = 2;
147 
148  DetId detId(rawId);
149  if (detId.det() != DetId::Muon) edm::LogError("Critical OMTFinputMaker") << "PROBLEM: hit in unknown Det, detID: "<<detId.det()<<std::endl;
150  switch (detId.subdetId()) {
151  case MuonSubdetId::RPC: {
152  RPCDetId rpc(rawId);
153  if(rpc.region()==0){
154  nInputsPerSector = 4;
155  aSector = rpc.sector();
158  if(iProcessor==5 && aSector<3) aMin = -1;
159  //Use division into rolls
160  iRoll = rpc.roll();
163  if(rpc.station()==2 && rpc.layer()==2 && rpc.roll()==2) iRoll = 1;
165  if(rpc.station()==3){
166  iRoll = 1;
167  nInputsPerSector = 2;
168  }
170  if(type==l1t::tftype::bmtf)iRoll = 1;
171  }
172  if(rpc.region()!=0){
173  aSector = (rpc.sector()-1)*6+rpc.subsector();
174  aMin = myOmtfConfig->getEndcap10DegMin()[iProcessor];
177  if(iProcessor==5 && aSector<5) aMin = -4;
178  }
179  break;
180  }
181  case MuonSubdetId::DT: {
182  DTChamberId dt(rawId);
183  aSector = dt.sector();
186  if(iProcessor==5 && aSector<3) aMin = -1;
187  break;
188  }
189  case MuonSubdetId::CSC: {
190  CSCDetId csc(rawId);
191  aSector = csc.chamber();
192  aMin = myOmtfConfig->getEndcap10DegMin()[iProcessor];
195  if(iProcessor==5 && aSector<5) aMin = -4;
199  if( (type==l1t::tftype::emtf_pos || type==l1t::tftype::emtf_neg) &&
200  csc.station()>1 && csc.ring()==1){
201  aMin = myOmtfConfig->getEndcap20DegMin()[iProcessor];
202  if(iProcessor==5 && aSector<3) aMin = -2;
203  }
204  break;
205  }
206  }
207 
209  iInput = (aSector - aMin)*nInputsPerSector;
211  iInput+=iRoll-1;
212 
213  return iInput;
214 }
218  const L1MuDTChambThContainer *dtThDigis,
219  unsigned int iProcessor,
221 {
222 
224  if(!dtPhDigis) return result;
225 
226  for (const auto digiIt: *dtPhDigis->getContainer()) {
227 
228  DTChamberId detid(digiIt.whNum(),digiIt.stNum(),digiIt.scNum()+1);
229 // std::cout << detid << "Digi q: " <<digiIt.code() << " bx: "<<digiIt.bxNum()<<" BxCnt: " << digiIt.BxCnt() <<" phi: "<<myAngleConverter.getProcessorPhi(iProcessor, type, digiIt) << std::endl;
230 
232  if(!acceptDigi(detid.rawId(), iProcessor, type)) continue;
233 
238  // FIXME (MK): at least Ts2Tag selection is not correct! Check it
239 // if (digiIt.bxNum()!= 0 || digiIt.BxCnt()!= 0 || digiIt.Ts2Tag()!= 0 || digiIt.code()<4) continue;
240  if (digiIt.bxNum()!= 0) continue;
241 // if (digiIt.code() != 1 && digiIt.code() !=2 && digiIt.code() !=3) continue;
242  if (digiIt.code() != 4 && digiIt.code() != 5 && digiIt.code() != 6) continue;
243 
244  unsigned int hwNumber = myOmtfConfig->getLayerNumber(detid.rawId());
245  if(myOmtfConfig->getHwToLogicLayer().find(hwNumber)==myOmtfConfig->getHwToLogicLayer().end()) continue;
246 
247  auto iter = myOmtfConfig->getHwToLogicLayer().find(hwNumber);
248  unsigned int iLayer = iter->second;
249  int iPhi = myAngleConverter.getProcessorPhi(iProcessor, type, digiIt);
250  int iEta = myAngleConverter.getGlobalEta(detid.rawId(), digiIt, dtThDigis);
251  unsigned int iInput= getInputNumber(detid.rawId(), iProcessor, type);
252  result.addLayerHit(iLayer,iInput,iPhi,iEta);
253  result.addLayerHit(iLayer+1,iInput,digiIt.phiB(),iEta);
254 // std::cout <<"Hit added, iPhi : " << iPhi << " input: " << iInput << std::endl;
255  }
256 
257  return result;
258 
259 }
263  unsigned int iProcessor,
264  l1t::tftype type){
265 
267  if(!cscDigis) return result;
268 
269  auto chamber = cscDigis->begin();
270  auto chend = cscDigis->end();
271  for( ; chamber != chend; ++chamber ) {
272 
273  unsigned int rawid = (*chamber).first;
275  if(!acceptDigi(rawid, iProcessor, type)) continue;
276  auto digi = (*chamber).second.first;
277  auto dend = (*chamber).second.second;
278  for( ; digi != dend; ++digi ) {
279 
282  if (abs(digi->getBX()- 6)>0) continue;
283 
284  unsigned int hwNumber = myOmtfConfig->getLayerNumber(rawid);
285  if(myOmtfConfig->getHwToLogicLayer().find(hwNumber)==myOmtfConfig->getHwToLogicLayer().end()) continue;
286 
287  unsigned int iLayer = myOmtfConfig->getHwToLogicLayer().at(hwNumber);
288  int iPhi = myAngleConverter.getProcessorPhi(iProcessor, type, CSCDetId(rawid), *digi);
289  int iEta = myAngleConverter.getGlobalEta(rawid, *digi);
293  //if(abs(iEta)>1.26/2.61*240) continue;
294  if (abs(iEta) > 115) continue;
295  unsigned int iInput= getInputNumber(rawid, iProcessor, type);
296  result.addLayerHit(iLayer,iInput,iPhi,iEta);
297  }
298  }
299  return result;
300 }
303 bool rpcPrimitiveCmp(const RPCDigi &a, const RPCDigi &b) { return a.strip() < b.strip(); };
307  unsigned int iProcessor,
308  l1t::tftype type){
309 
311  if(!rpcDigis) return result;
312  std::stringstream str;
313 
314  const RPCDigiCollection & rpcDigiCollection = *rpcDigis;
315  for (auto rollDigis : rpcDigiCollection) {
316  RPCDetId roll = rollDigis.first;
317  unsigned int rawid = roll.rawId();
318  if(!acceptDigi(rawid, iProcessor, type)) continue;
322  std::vector<RPCDigi> digisCopy;
323  std::copy_if(rollDigis.second.first, rollDigis.second.second, std::back_inserter(digisCopy), [](const RPCDigi & aDigi){return (aDigi.bx()==0);});
324  std::sort(digisCopy.begin(),digisCopy.end(),rpcPrimitiveCmp);
325  typedef std::pair<unsigned int, unsigned int> Cluster;
326  std::vector<Cluster> clusters;
327  for(auto & digi: digisCopy) {
328  if(clusters.empty()) clusters.push_back(Cluster(digi.strip(),digi.strip()));
329  else if (digi.strip() - clusters.back().second == 1) clusters.back().second = digi.strip();
330  else if (digi.strip() - clusters.back().second > 1) clusters.push_back(Cluster(digi.strip(),digi.strip()));
331  }
332 
333  for (auto & cluster: clusters) {
334  int iPhiHalfStrip1 = myAngleConverter.getProcessorPhi(iProcessor, type, roll, cluster.first);
335  int iPhiHalfStrip2 = myAngleConverter.getProcessorPhi(iProcessor, type, roll, cluster.second);
336  int iPhi = (iPhiHalfStrip1+iPhiHalfStrip2)/2;
337  int iEta = myAngleConverter.getGlobalEta(rawid, cluster.first);
338  unsigned int hwNumber = myOmtfConfig->getLayerNumber(rawid);
339  unsigned int iLayer = myOmtfConfig->getHwToLogicLayer().at(hwNumber);
340  unsigned int iInput= getInputNumber(rawid, iProcessor, type);
341  result.addLayerHit(iLayer,iInput,iPhi,iEta);
342 
343  str<<" RPC halfDigi "
344  <<" begin: "<<cluster.first<<" end: "<<cluster.second
345  <<" iPhi: "<<iPhi
346  <<" iEta: "<<iEta
347  <<" hwNumber: "<<hwNumber
348  <<" iInput: "<<iInput
349  <<" iLayer: "<<iLayer
350  <<std::endl;
351  }
352  }
353 
354  edm::LogInfo("OMTFInputMaker")<<str.str();
355  return result;
356 }
360  const L1MuDTChambThContainer *dtThDigis,
361  const CSCCorrelatedLCTDigiCollection *cscDigis,
362  const RPCDigiCollection *rpcDigis,
363  unsigned int iProcessor,
364  l1t::tftype type){
366  result += processDT(dtPhDigis, dtThDigis, iProcessor, type);
367  result += processCSC(cscDigis, iProcessor, type);
368  result += processRPC(rpcDigis, iProcessor, type);
369  return result;
370 }
int chamber() const
Definition: CSCDetId.h:68
type
Definition: HCALResponse.h:21
float dt
Definition: AMPTWrapper.h:126
OMTFinput processCSC(const CSCCorrelatedLCTDigiCollection *cscDigis, unsigned int iProcessor, l1t::tftype type)
const std::vector< unsigned int > & getBarrelMax() const
OMTFinput processRPC(const RPCDigiCollection *rpcDigis, unsigned int iProcessor, l1t::tftype type)
const std::map< int, int > & getHwToLogicLayer() const
int bx() const
Definition: RPCDigi.cc:47
void initialize(const edm::EventSetup &es, const OMTFConfiguration *)
int getGlobalEta(unsigned int rawid, const L1MuDTChambPhDigi &aDigi, const L1MuDTChambThContainer *dtThDigis)
Convert local eta coordinate to global digital microGMT scale.
const std::vector< unsigned int > & getEndcap10DegMin() const
unsigned int nPhiBins() const
const OMTFConfiguration * myOmtfConfig
tuple result
Definition: mps_fire.py:83
uint32_t rawId() const
get the raw id
Definition: DetId.h:43
int endcap() const
Definition: CSCDetId.h:93
int getProcessorPhi(unsigned int iProcessor, l1t::tftype part, const L1MuDTChambPhDigi &digi) const
static const int CSC
Definition: MuonSubdetId.h:13
int strip() const
Definition: RPCDigi.cc:45
int roll() const
Definition: RPCDetId.h:120
const std::vector< unsigned int > & getEndcap20DegMax() const
int ring() const
Definition: RPCDetId.h:72
OMTFinput processDT(const L1MuDTChambPhContainer *dtPhDigis, const L1MuDTChambThContainer *dtThDigis, unsigned int iProcessor, l1t::tftype type)
AngleConverter myAngleConverter
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
const std::vector< unsigned int > & getEndcap10DegMax() const
int subdetId() const
get the contents of the subdetector field (not cast into any detector&#39;s numbering enum) ...
Definition: DetId.h:37
int ring() const
Definition: CSCDetId.h:75
int layer() const
Definition: RPCDetId.h:108
Definition: DetId.h:18
bool acceptDigi(uint32_t rawId, unsigned int iProcessor, l1t::tftype type)
uint32_t getLayerNumber(uint32_t rawId) const
const std::vector< unsigned int > & getBarrelMin() const
unsigned int getInputNumber(unsigned int rawId, unsigned int iProcessor, l1t::tftype type)
double b
Definition: hdecay.h:120
Phi_Container const * getContainer() const
int sector() const
Sector id: the group of chambers at same phi (and increasing r)
Definition: RPCDetId.h:102
return(e1-e2)*(e1-e2)+dp *dp
int subsector() const
SubSector id : some sectors are divided along the phi direction in subsectors (from 1 to 4 in Barrel...
Definition: RPCDetId.h:114
bool rpcPrimitiveCmp(const RPCDigi &a, const RPCDigi &b)
static const int RPC
Definition: MuonSubdetId.h:14
int sector() const
Definition: DTChamberId.h:61
double a
Definition: hdecay.h:121
bool addLayerHit(unsigned int iLayer, unsigned int iInput, int iPhi, int iEta)
Definition: OMTFinput.cc:46
OMTFinput buildInputForProcessor(const L1MuDTChambPhContainer *dtPhDigis, const L1MuDTChambThContainer *dtThDigis, const CSCCorrelatedLCTDigiCollection *cscDigis, const RPCDigiCollection *rpcDigis, unsigned int iProcessor, l1t::tftype type=l1t::tftype::omtf_pos)
Method translating trigger digis into input matrix with global phi coordinates.
void checkAndUpdateGeometry(const edm::EventSetup &, unsigned int)
Update the Geometry with current Event Setup.
int station() const
Definition: CSCDetId.h:86
const std::vector< unsigned int > & getEndcap20DegMin() const
static const int DT
Definition: MuonSubdetId.h:12
Detector det() const
get the detector field from this detid
Definition: DetId.h:35
int wheel() const
Return the wheel number.
Definition: DTChamberId.h:45
int region() const
Region id: 0 for Barrel, +/-1 For +/- Endcap.
Definition: RPCDetId.h:63
int station() const
Definition: RPCDetId.h:96