CMS 3D CMS Logo

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 
231  if(!acceptDigi(detid.rawId(), iProcessor, type)) continue;
232 
237  // FIXME (MK): at least Ts2Tag selection is not correct! Check it
238 // if (digiIt.bxNum()!= 0 || digiIt.BxCnt()!= 0 || digiIt.Ts2Tag()!= 0 || digiIt.code()<4) continue;
239  if (digiIt.bxNum()!= 0) continue;
240  if (digiIt.code() != 4 && digiIt.code() != 5 && digiIt.code() != 6) continue;
241 
242  unsigned int hwNumber = myOmtfConfig->getLayerNumber(detid.rawId());
243  if(myOmtfConfig->getHwToLogicLayer().find(hwNumber)==myOmtfConfig->getHwToLogicLayer().end()) continue;
244 
245  auto iter = myOmtfConfig->getHwToLogicLayer().find(hwNumber);
246  unsigned int iLayer = iter->second;
247  int iPhi = myAngleConverter.getProcessorPhi(iProcessor, type, digiIt);
248  int iEta = myAngleConverter.getGlobalEta(detid.rawId(), digiIt, dtThDigis);
249  unsigned int iInput= getInputNumber(detid.rawId(), iProcessor, type);
250  result.addLayerHit(iLayer,iInput,iPhi,iEta);
251  result.addLayerHit(iLayer+1,iInput,digiIt.phiB(),iEta);
252  }
253 
254  return result;
255 
256 }
260  unsigned int iProcessor,
261  l1t::tftype type){
262 
264  if(!cscDigis) return result;
265 
266  auto chamber = cscDigis->begin();
267  auto chend = cscDigis->end();
268  for( ; chamber != chend; ++chamber ) {
269 
270  unsigned int rawid = (*chamber).first;
272  if(!acceptDigi(rawid, iProcessor, type)) continue;
273  auto digi = (*chamber).second.first;
274  auto dend = (*chamber).second.second;
275  for( ; digi != dend; ++digi ) {
276 
279  if (abs(digi->getBX()- 6)>0) continue;
280 
281  unsigned int hwNumber = myOmtfConfig->getLayerNumber(rawid);
282  if(myOmtfConfig->getHwToLogicLayer().find(hwNumber)==myOmtfConfig->getHwToLogicLayer().end()) continue;
283 
284  unsigned int iLayer = myOmtfConfig->getHwToLogicLayer().at(hwNumber);
285  int iPhi = myAngleConverter.getProcessorPhi(iProcessor, type, CSCDetId(rawid), *digi);
286  int iEta = myAngleConverter.getGlobalEta(rawid, *digi);
290  //if(abs(iEta)>1.26/2.61*240) continue;
291  //if (abs(iEta) > 115) continue;
292  unsigned int iInput= getInputNumber(rawid, iProcessor, type);
293 // std::cout <<" ADDING CSC hit, proc: "<<iProcessor<<" iPhi : " << iPhi <<" iEta: "<< iEta << std::endl;
294  result.addLayerHit(iLayer,iInput,iPhi,iEta);
295  }
296  }
297  return result;
298 }
301 bool rpcPrimitiveCmp(const RPCDigi &a, const RPCDigi &b) { return a.strip() < b.strip(); };
305  unsigned int iProcessor,
306  l1t::tftype type){
307 
309  if(!rpcDigis) return result;
310  std::stringstream str;
311 
312 // std::cout <<" RPC HITS, processor : " << iProcessor << std::endl;
313 
314  const RPCDigiCollection & rpcDigiCollection = *rpcDigis;
315  for (auto rollDigis : rpcDigiCollection) {
316  RPCDetId roll = rollDigis.first;
317  unsigned int rawid = roll.rawId();
318  int nClusters = 0;
319  if(!acceptDigi(rawid, iProcessor, type)) continue;
323 // for (auto tdigi = rollDigis.second.first; tdigi != rollDigis.second.second; tdigi++) { std::cout << "RPC DIGIS: " << roll.rawId()<< " "<<roll<<" digi: " << tdigi->strip() <<" bx: " << tdigi->bx() << std::endl; }
324  std::vector<RPCDigi> digisCopy;
325  std::copy_if(rollDigis.second.first, rollDigis.second.second, std::back_inserter(digisCopy), [](const RPCDigi & aDigi){return (aDigi.bx()==0);});
326  std::sort(digisCopy.begin(),digisCopy.end(),rpcPrimitiveCmp);
327  typedef std::pair<unsigned int, unsigned int> Cluster;
328  std::vector<Cluster> clusters;
329  for(auto & digi: digisCopy) {
330  if(clusters.empty()) clusters.push_back(Cluster(digi.strip(),digi.strip()));
331  else if (digi.strip() - clusters.back().second == 1) clusters.back().second = digi.strip();
332  else if (digi.strip() - clusters.back().second > 1) clusters.push_back(Cluster(digi.strip(),digi.strip()));
333  }
334 
335  for (auto & cluster: clusters) {
336 // int iPhiHalfStrip1 = myAngleConverter.getProcessorPhi(iProcessor, type, roll, cluster.first);
337 // int iPhiHalfStrip2 = myAngleConverter.getProcessorPhi(iProcessor, type, roll, cluster.second);
338  int iPhi = myAngleConverter.getProcessorPhi(iProcessor, type, roll, cluster.first, cluster.second);
339  int cSize = abs(int(cluster.first)-int(cluster.second))+1;
340 // std::cout << " HStrip_1: " << iPhiHalfStrip1 <<" HStrip_2: "<<iPhiHalfStrip2<<" iPhi: " << iPhi << " cluster: ["<< cluster.first << ", "<< cluster.second <<"]"<< std::endl;
341  if (cSize>3) continue;
342  int iEta = myAngleConverter.getGlobalEta(rawid, cluster.first);
343  unsigned int hwNumber = myOmtfConfig->getLayerNumber(rawid);
344  unsigned int iLayer = myOmtfConfig->getHwToLogicLayer().at(hwNumber);
345  unsigned int iInput= getInputNumber(rawid, iProcessor, type);
346 // std::cout <<"ADDING HIT: iLayer = " << iLayer << " iInput: " << iInput << " iPhi: " << iPhi << std::endl;
347  if (iLayer==17 && (iInput==0 || iInput==1)) continue; // FIXME (MK) there is no RPC link for that input, because it is taken by DAQ link
348  bool outres =
349  result.addLayerHit(iLayer,iInput,iPhi,iEta);
350 // if (cSize>2) flag |= 2;
351 // if (!outres) flag |= 1;
352  nClusters++;
353 
354  str <<" RPC halfDigi "
355  <<" begin: "<<cluster.first<<" end: "<<cluster.second
356  <<" iPhi: "<<iPhi
357  <<" iEta: "<<iEta
358  <<" hwNumber: "<<hwNumber
359  <<" iInput: "<<iInput
360  <<" iLayer: "<<iLayer
361  <<" out: " << outres
362  <<std::endl;
363  }
364 // if (nClusters > 2) flag=1;
365  }
366 
367  edm::LogInfo("OMTFInputMaker")<<str.str();
368  return result;
369 }
373  const L1MuDTChambThContainer *dtThDigis,
374  const CSCCorrelatedLCTDigiCollection *cscDigis,
375  const RPCDigiCollection *rpcDigis,
376  unsigned int iProcessor,
377  l1t::tftype type){
379  result += processDT(dtPhDigis, dtThDigis, iProcessor, type);
380  result += processCSC(cscDigis, iProcessor, type);
381  result += processRPC(rpcDigis, iProcessor, type);
382  return result;
383 }
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
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
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.h:28
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
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