CMS 3D CMS Logo

List of all members | Public Member Functions | Private Member Functions | Private Attributes
OMTFinputMaker Class Reference

#include <OMTFinputMaker.h>

Public Member Functions

OMTFinput buildInputForProcessor (const L1MuDTChambPhContainer *dtPhDigis, const L1MuDTChambThContainer *dtThDigis, const CSCCorrelatedLCTDigiCollection *cscDigis, const RPCDigiCollection *rpcDigis, unsigned int iProcessor, l1t::tftype type=l1t::tftype::omtf_pos, int bx=0)
 Method translating trigger digis into input matrix with global phi coordinates. More...
 
int getFlag () const
 
void initialize (const edm::EventSetup &es, const OMTFConfiguration *)
 
 OMTFinputMaker ()
 
void setFlag (int aFlag)
 
 ~OMTFinputMaker ()
 

Private Member Functions

bool acceptDigi (uint32_t rawId, unsigned int iProcessor, l1t::tftype type)
 
unsigned int getInputNumber (unsigned int rawId, unsigned int iProcessor, l1t::tftype type)
 
OMTFinput processCSC (const CSCCorrelatedLCTDigiCollection *cscDigis, unsigned int iProcessor, l1t::tftype type, int bx)
 
OMTFinput processDT (const L1MuDTChambPhContainer *dtPhDigis, const L1MuDTChambThContainer *dtThDigis, unsigned int iProcessor, l1t::tftype type, int bx)
 
OMTFinput processRPC (const RPCDigiCollection *rpcDigis, unsigned int iProcessor, l1t::tftype type, int bx)
 

Private Attributes

int flag
 
AngleConverter myAngleConverter
 
const OMTFConfigurationmyOmtfConfig
 

Detailed Description

Definition at line 22 of file OMTFinputMaker.h.

Constructor & Destructor Documentation

OMTFinputMaker::OMTFinputMaker ( )

Definition at line 21 of file OMTFinputMaker.cc.

21 {}
OMTFinputMaker::~OMTFinputMaker ( )

Definition at line 33 of file OMTFinputMaker.cc.

33 { }

Member Function Documentation

bool OMTFinputMaker::acceptDigi ( uint32_t  rawId,
unsigned int  iProcessor,
l1t::tftype  type 
)
private

Check if digis are within a give processor input. Simply checks sectors range.

Clean up digis. Remove unconnected detectors

Select RPC chambers connected to OMTF

RPC RE1/2 temporarily not used (aId.region()==1 && aId.station()==1 && aId.ring()<2) ||

Definition at line 36 of file OMTFinputMaker.cc.

References l1t::bmtf, CSCDetId::chamber(), MuonSubdetId::CSC, omtf::DataWord64::csc, DetId::det(), MuonSubdetId::DT, dt, l1t::emtf_neg, l1t::emtf_pos, CSCDetId::endcap(), OMTFConfiguration::getBarrelMax(), OMTFConfiguration::getBarrelMin(), OMTFConfiguration::getEndcap10DegMax(), OMTFConfiguration::getEndcap10DegMin(), OMTFConfiguration::getEndcap20DegMax(), OMTFConfiguration::getEndcap20DegMin(), RPCDetId::layer(), DetId::Muon, myOmtfConfig, l1t::omtf_neg, l1t::omtf_pos, RPCDetId::region(), RPCDetId::ring(), CSCDetId::ring(), RPCDetId::roll(), MuonSubdetId::RPC, DTChamberId::sector(), RPCDetId::sector(), CSCDetId::station(), RPCDetId::station(), DetId::subdetId(), RPCDetId::subsector(), and DTChamberId::wheel().

Referenced by processCSC(), processDT(), and processRPC().

38  {
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 
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 
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 
78  (aId.region()<=0 ||
79  (aId.station()==1 && aId.ring()==3))) return false;
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;
99 
100  aSector = dt.sector();
101  break;
102  }
103  case MuonSubdetId::CSC: {
104 
105  CSCDetId csc(rawId);
107  (csc.endcap()==2 || csc.ring()==1 || csc.station()==4)) return false;
109  (csc.endcap()==1 || csc.ring()==1 || csc.station()==4)) return false;
110 
112  (csc.endcap()==2 || (csc.station()==1 && csc.ring()==3))
113  ) return false;
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 
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 }
type
Definition: HCALResponse.h:21
float dt
Definition: AMPTWrapper.h:126
const std::vector< unsigned int > & getBarrelMax() const
const std::vector< unsigned int > & getEndcap10DegMin() const
const OMTFConfiguration * myOmtfConfig
const std::vector< unsigned int > & getEndcap20DegMax() const
const std::vector< unsigned int > & getEndcap10DegMax() const
Definition: L1Track.h:19
Definition: DetId.h:18
const std::vector< unsigned int > & getBarrelMin() const
static constexpr int RPC
Definition: MuonSubdetId.h:14
const std::vector< unsigned int > & getEndcap20DegMin() const
static constexpr int DT
Definition: MuonSubdetId.h:12
static constexpr int CSC
Definition: MuonSubdetId.h:13
OMTFinput OMTFinputMaker::buildInputForProcessor ( const L1MuDTChambPhContainer dtPhDigis,
const L1MuDTChambThContainer dtThDigis,
const CSCCorrelatedLCTDigiCollection cscDigis,
const RPCDigiCollection rpcDigis,
unsigned int  iProcessor,
l1t::tftype  type = l1t::tftype::omtf_pos,
int  bx = 0 
)

Method translating trigger digis into input matrix with global phi coordinates.

Definition at line 380 of file OMTFinputMaker.cc.

References myOmtfConfig, processCSC(), processDT(), processRPC(), and mps_fire::result.

Referenced by OMTFPatternMaker::analyze(), and OMTFReconstruction::getProcessorCandidates().

386  {
388  result += processDT(dtPhDigis, dtThDigis, iProcessor, type, bx);
389  result += processCSC(cscDigis, iProcessor, type, bx);
390  result += processRPC(rpcDigis, iProcessor, type, bx);
391  return result;
392 }
type
Definition: HCALResponse.h:21
OMTFinput processRPC(const RPCDigiCollection *rpcDigis, unsigned int iProcessor, l1t::tftype type, int bx)
const OMTFConfiguration * myOmtfConfig
OMTFinput processCSC(const CSCCorrelatedLCTDigiCollection *cscDigis, unsigned int iProcessor, l1t::tftype type, int bx)
OMTFinput processDT(const L1MuDTChambPhContainer *dtPhDigis, const L1MuDTChambThContainer *dtThDigis, unsigned int iProcessor, l1t::tftype type, int bx)
int OMTFinputMaker::getFlag ( ) const
inline

Definition at line 43 of file OMTFinputMaker.h.

References RemoveAddSevLevel::flag.

Referenced by OMTFReconstruction::getProcessorCandidates().

43 { return flag;}
unsigned int OMTFinputMaker::getInputNumber ( unsigned int  rawId,
unsigned int  iProcessor,
l1t::tftype  type 
)
private

Give input number for givedn processor, using the chamber sector number. Result is modulo allowed number of hits per chamber

on the 0-2pi border we need to add 1 30 deg sector to get the correct index

Set roll number by hand to keep common input number shift formula for all stations

Only one roll from station 3 is connected.

At the moment do not use RPC chambers splitting into rolls for bmtf part

on the 0-2pi border we need to add 4 10 deg sectors to get the correct index

on the 0-2pi border we need to add 1 30 deg sector to get the correct index

on the 0-2pi border we need to add 4 10deg sectors to get the correct index

Endcap region covers algo 10 deg sectors on the 0-2pi border we need to add 2 20deg sectors to get the correct index

Assume 2 hits per chamber

Chambers divided into two rolls have rolls number 1 and 3

Definition at line 138 of file OMTFinputMaker.cc.

References l1t::bmtf, CSCDetId::chamber(), MuonSubdetId::CSC, omtf::DataWord64::csc, DetId::det(), MuonSubdetId::DT, dt, l1t::emtf_neg, l1t::emtf_pos, OMTFConfiguration::getBarrelMin(), OMTFConfiguration::getEndcap10DegMin(), OMTFConfiguration::getEndcap20DegMin(), RPCDetId::layer(), DetId::Muon, myOmtfConfig, RPCDetId::region(), CSCDetId::ring(), RPCDetId::roll(), MuonSubdetId::RPC, omtf::DataWord64::rpc, DTChamberId::sector(), RPCDetId::sector(), CSCDetId::station(), RPCDetId::station(), DetId::subdetId(), and RPCDetId::subsector().

Referenced by processCSC(), processDT(), and processRPC().

140  {
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;
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 }
type
Definition: HCALResponse.h:21
float dt
Definition: AMPTWrapper.h:126
const std::vector< unsigned int > & getEndcap10DegMin() const
const OMTFConfiguration * myOmtfConfig
Definition: L1Track.h:19
Definition: DetId.h:18
const std::vector< unsigned int > & getBarrelMin() const
static constexpr int RPC
Definition: MuonSubdetId.h:14
const std::vector< unsigned int > & getEndcap20DegMin() const
static constexpr int DT
Definition: MuonSubdetId.h:12
static constexpr int CSC
Definition: MuonSubdetId.h:13
void OMTFinputMaker::initialize ( const edm::EventSetup es,
const OMTFConfiguration omtfConfig 
)

Definition at line 24 of file OMTFinputMaker.cc.

References AngleConverter::checkAndUpdateGeometry(), myAngleConverter, myOmtfConfig, and OMTFConfiguration::nPhiBins().

Referenced by OMTFPatternMaker::analyze(), and OMTFReconstruction::beginRun().

24  {
25 
27 
28  myOmtfConfig = omtfConfig;
29 
30 }
unsigned int nPhiBins() const
const OMTFConfiguration * myOmtfConfig
AngleConverter myAngleConverter
void checkAndUpdateGeometry(const edm::EventSetup &, unsigned int)
Update the Geometry with current Event Setup.
OMTFinput OMTFinputMaker::processCSC ( const CSCCorrelatedLCTDigiCollection cscDigis,
unsigned int  iProcessor,
l1t::tftype  type,
int  bx 
)
private

Take the CSC digis, select chambers connected to given processor, convers logal angles to global scale. For CSC do NOT take the bending angle.

Check it the data fits into given processor input range

Check if LCT trigger primitive has the right BX.

Accept CSC digis only up to eta=1.26. The nominal OMTF range is up to 1.24, but cutting at 1.24 kill efficnency at the edge. 1.26 is one eta bin above nominal.

Definition at line 266 of file OMTFinputMaker.cc.

References acceptDigi(), OMTFinput::addLayerHit(), relativeConstraints::chamber, AngleConverter::getGlobalEta(), OMTFConfiguration::getHwToLogicLayer(), getInputNumber(), OMTFConfiguration::getLayerNumber(), AngleConverter::getProcessorPhi(), CSCConstants::LCT_CENTRAL_BX, myAngleConverter, myOmtfConfig, and mps_fire::result.

Referenced by buildInputForProcessor().

268  {
269 
271  if(!cscDigis) return result;
272 
273  auto chamber = cscDigis->begin();
274  auto chend = cscDigis->end();
275  for( ; chamber != chend; ++chamber ) {
276 
277  unsigned int rawid = (*chamber).first;
279  if(!acceptDigi(rawid, iProcessor, type)) continue;
280  auto digi = (*chamber).second.first;
281  auto dend = (*chamber).second.second;
282  for( ; digi != dend; ++digi ) {
283 
285  if (digi->getBX()-CSCConstants::LCT_CENTRAL_BX != bxTrg) continue;
286 
287  unsigned int hwNumber = myOmtfConfig->getLayerNumber(rawid);
288  if(myOmtfConfig->getHwToLogicLayer().find(hwNumber)==myOmtfConfig->getHwToLogicLayer().end()) continue;
289 
290  unsigned int iLayer = myOmtfConfig->getHwToLogicLayer().at(hwNumber);
291  int iPhi = myAngleConverter.getProcessorPhi(iProcessor, type, CSCDetId(rawid), *digi);
292  int iEta = myAngleConverter.getGlobalEta(rawid, *digi);
296  //if(abs(iEta)>1.26/2.61*240) continue;
297  //if (abs(iEta) > 115) continue;
298  unsigned int iInput= getInputNumber(rawid, iProcessor, type);
299 // std::cout <<" ADDING CSC hit, proc: "<<iProcessor<<" iPhi : " << iPhi <<" iEta: "<< iEta << std::endl;
300  bool allowOverwrite = false;
301  result.addLayerHit(iLayer,iInput,iPhi,iEta,allowOverwrite);
302  }
303  }
304  return result;
305 }
type
Definition: HCALResponse.h:21
const std::map< int, int > & getHwToLogicLayer() const
int getGlobalEta(unsigned int rawid, const L1MuDTChambPhDigi &aDigi, const L1MuDTChambThContainer *dtThDigis)
Convert local eta coordinate to global digital microGMT scale.
const OMTFConfiguration * myOmtfConfig
int getProcessorPhi(unsigned int iProcessor, l1t::tftype part, const L1MuDTChambPhDigi &digi) const
AngleConverter myAngleConverter
bool acceptDigi(uint32_t rawId, unsigned int iProcessor, l1t::tftype type)
uint32_t getLayerNumber(uint32_t rawId) const
unsigned int getInputNumber(unsigned int rawId, unsigned int iProcessor, l1t::tftype type)
OMTFinput OMTFinputMaker::processDT ( const L1MuDTChambPhContainer dtPhDigis,
const L1MuDTChambThContainer dtThDigis,
unsigned int  iProcessor,
l1t::tftype  type,
int  bx 
)
private

Take the DT digis, select chambers connected to given processor, convers logal angles to global scale. For DT take also the bending angle.

Check it the data fits into given processor input range

Check Trigger primitive quality Ts2Tag() == 0 - take only first track from DT Trigger Server BxCnt() == 0 - ?? code()>=3 - take only double layer hits, HH, HL and LL

Definition at line 217 of file OMTFinputMaker.cc.

References acceptDigi(), OMTFinput::addLayerHit(), OMTFConfiguration::fwVersion(), L1MuDTChambPhContainer::getContainer(), AngleConverter::getGlobalEta(), OMTFConfiguration::getHwToLogicLayer(), getInputNumber(), OMTFConfiguration::getLayerNumber(), AngleConverter::getProcessorPhi(), myAngleConverter, myOmtfConfig, and mps_fire::result.

Referenced by buildInputForProcessor().

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 
240  if (digiIt.bxNum()!= bxTrg) continue;
241 
242  if (myOmtfConfig->fwVersion() <= 4) {
243  if (digiIt.code() != 4 && digiIt.code() != 5 && digiIt.code() != 6) continue;
244  } else {
245  if (digiIt.code() != 2 && digiIt.code() != 3 && digiIt.code() != 4 && digiIt.code() != 5 && digiIt.code() != 6) continue;
246  }
247 
248  unsigned int hwNumber = myOmtfConfig->getLayerNumber(detid.rawId());
249  if(myOmtfConfig->getHwToLogicLayer().find(hwNumber)==myOmtfConfig->getHwToLogicLayer().end()) continue;
250 
251  auto iter = myOmtfConfig->getHwToLogicLayer().find(hwNumber);
252  unsigned int iLayer = iter->second;
253  int iPhi = myAngleConverter.getProcessorPhi(iProcessor, type, digiIt);
254  int iEta = myAngleConverter.getGlobalEta(detid.rawId(), digiIt, dtThDigis);
255  unsigned int iInput= getInputNumber(detid.rawId(), iProcessor, type);
256  bool allowOverwrite = false;
257  result.addLayerHit(iLayer,iInput,iPhi,iEta, allowOverwrite);
258  result.addLayerHit(iLayer+1,iInput,digiIt.phiB(),iEta, allowOverwrite);
259  }
260 
261  return result;
262 
263 }
type
Definition: HCALResponse.h:21
const std::map< int, int > & getHwToLogicLayer() const
unsigned int fwVersion() const
int getGlobalEta(unsigned int rawid, const L1MuDTChambPhDigi &aDigi, const L1MuDTChambThContainer *dtThDigis)
Convert local eta coordinate to global digital microGMT scale.
const OMTFConfiguration * myOmtfConfig
int getProcessorPhi(unsigned int iProcessor, l1t::tftype part, const L1MuDTChambPhDigi &digi) const
AngleConverter myAngleConverter
bool acceptDigi(uint32_t rawId, unsigned int iProcessor, l1t::tftype type)
uint32_t getLayerNumber(uint32_t rawId) const
unsigned int getInputNumber(unsigned int rawId, unsigned int iProcessor, l1t::tftype type)
Phi_Container const * getContainer() const
OMTFinput OMTFinputMaker::processRPC ( const RPCDigiCollection rpcDigis,
unsigned int  iProcessor,
l1t::tftype  type,
int  bx 
)
private

Decluster nearby hits in single chamber, by taking average cluster position, expressed in half RPC strip: pos = (cluster_begin + cluster_end)

Find clusters of consecutive fired strips. Have to copy the digis in chamber to sort them (not optimal). NOTE: when copying I select only digis with bx== //FIXME: find a better place/way to filtering digi against quality/BX etc.

Definition at line 311 of file OMTFinputMaker.cc.

References funct::abs(), acceptDigi(), OMTFinput::addLayerHit(), fastPrimaryVertexProducer_cfi::clusters, AngleConverter::getGlobalEta(), OMTFConfiguration::getHwToLogicLayer(), getInputNumber(), OMTFConfiguration::getLayerNumber(), AngleConverter::getProcessorPhi(), myAngleConverter, myOmtfConfig, DetId::rawId(), mps_fire::result, rpcPrimitiveCmp(), and str.

Referenced by buildInputForProcessor().

313  {
314 
316  if(!rpcDigis) return result;
317  std::stringstream str;
318 
319 // std::cout <<" RPC HITS, processor : " << iProcessor << std::endl;
320 
321  const RPCDigiCollection & rpcDigiCollection = *rpcDigis;
322  for (auto rollDigis : rpcDigiCollection) {
323  RPCDetId roll = rollDigis.first;
324  unsigned int rawid = roll.rawId();
325  int nClusters = 0;
326  if(!acceptDigi(rawid, iProcessor, type)) continue;
330 // 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; }
331  std::vector<RPCDigi> digisCopy;
332 // std::copy_if(rollDigis.second.first, rollDigis.second.second, std::back_inserter(digisCopy), [](const RPCDigi & aDigi){return (aDigi.bx()==0);} );
333  for (auto pDigi=rollDigis.second.first; pDigi != rollDigis.second.second; pDigi++) { if (pDigi->bx()==bxTrg) digisCopy.push_back( *pDigi); }
334  std::sort(digisCopy.begin(),digisCopy.end(),rpcPrimitiveCmp);
335  typedef std::pair<unsigned int, unsigned int> Cluster;
336  std::vector<Cluster> clusters;
337  for(auto & digi: digisCopy) {
338  if(clusters.empty()) clusters.push_back(Cluster(digi.strip(),digi.strip()));
339  else if (digi.strip() - clusters.back().second == 1) clusters.back().second = digi.strip();
340  else if (digi.strip() - clusters.back().second > 1) clusters.push_back(Cluster(digi.strip(),digi.strip()));
341  }
342 
343  for (auto & cluster: clusters) {
344 // int iPhiHalfStrip1 = myAngleConverter.getProcessorPhi(iProcessor, type, roll, cluster.first);
345 // int iPhiHalfStrip2 = myAngleConverter.getProcessorPhi(iProcessor, type, roll, cluster.second);
346  int iPhi = myAngleConverter.getProcessorPhi(iProcessor, type, roll, cluster.first, cluster.second);
347  int cSize = abs(int(cluster.first)-int(cluster.second))+1;
348 // std::cout << " HStrip_1: " << iPhiHalfStrip1 <<" HStrip_2: "<<iPhiHalfStrip2<<" iPhi: " << iPhi << " cluster: ["<< cluster.first << ", "<< cluster.second <<"]"<< std::endl;
349  if (cSize>3) continue;
350  int iEta = myAngleConverter.getGlobalEta(rawid, cluster.first);
351  unsigned int hwNumber = myOmtfConfig->getLayerNumber(rawid);
352  unsigned int iLayer = myOmtfConfig->getHwToLogicLayer().at(hwNumber);
353  unsigned int iInput= getInputNumber(rawid, iProcessor, type);
354 // std::cout <<"ADDING HIT: iLayer = " << iLayer << " iInput: " << iInput << " iPhi: " << iPhi << std::endl;
355  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
356  bool outres =
357  result.addLayerHit(iLayer,iInput,iPhi,iEta);
358 // if (cSize>2) flag |= 2;
359 // if (!outres) flag |= 1;
360  nClusters++;
361 
362  str <<" RPC halfDigi "
363  <<" begin: "<<cluster.first<<" end: "<<cluster.second
364  <<" iPhi: "<<iPhi
365  <<" iEta: "<<iEta
366  <<" hwNumber: "<<hwNumber
367  <<" iInput: "<<iInput
368  <<" iLayer: "<<iLayer
369  <<" out: " << outres
370  <<std::endl;
371  }
372 // if (nClusters > 2) flag=1;
373  }
374 
375  edm::LogInfo("OMTFInputMaker")<<str.str();
376  return result;
377 }
type
Definition: HCALResponse.h:21
const std::map< int, int > & getHwToLogicLayer() const
constexpr uint32_t rawId() const
get the raw id
Definition: DetId.h:50
int getGlobalEta(unsigned int rawid, const L1MuDTChambPhDigi &aDigi, const L1MuDTChambThContainer *dtThDigis)
Convert local eta coordinate to global digital microGMT scale.
const OMTFConfiguration * myOmtfConfig
int getProcessorPhi(unsigned int iProcessor, l1t::tftype part, const L1MuDTChambPhDigi &digi) const
AngleConverter myAngleConverter
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
bool acceptDigi(uint32_t rawId, unsigned int iProcessor, l1t::tftype type)
uint32_t getLayerNumber(uint32_t rawId) const
unsigned int getInputNumber(unsigned int rawId, unsigned int iProcessor, l1t::tftype type)
bool rpcPrimitiveCmp(const RPCDigi &a, const RPCDigi &b)
#define str(s)
void OMTFinputMaker::setFlag ( int  aFlag)
inline

Definition at line 42 of file OMTFinputMaker.h.

References RemoveAddSevLevel::flag.

Referenced by OMTFReconstruction::getProcessorCandidates().

42 {flag = aFlag; }

Member Data Documentation

int OMTFinputMaker::flag
private

Definition at line 86 of file OMTFinputMaker.h.

AngleConverter OMTFinputMaker::myAngleConverter
private

Definition at line 82 of file OMTFinputMaker.h.

Referenced by initialize(), processCSC(), processDT(), and processRPC().

const OMTFConfiguration* OMTFinputMaker::myOmtfConfig
private