CMS 3D CMS Logo

All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
RPCTechnicalTrigger.cc
Go to the documentation of this file.
1 // $Id:
2 
3 //-----------------------------------------------------------------------------
4 // Implementation file for class : RPCTechnicalTrigger
5 //
6 // 2008-10-15 : Andres Osorio
7 //-----------------------------------------------------------------------------
8 
9 //=============================================================================
10 // Standard constructor, initializes variables
11 //=============================================================================
12 
13 // Include files
14 
15 // local
20 
23 
24 //=============================================================================
25 // Standard constructor, initializes variables
26 //=============================================================================
27 
29 
30  //...........................................................................
31 
32  std::string configFile = iConfig.getParameter<std::string>("ConfigFile");
33  m_verbosity = iConfig.getUntrackedParameter<int>("Verbosity", 0);
34  m_rpcDigiLabel = iConfig.getParameter<edm::InputTag>("RPCDigiLabel");
35  m_ttBits = iConfig.getParameter< std::vector<unsigned> >("BitNumbers");
36  m_ttNames = iConfig.getParameter< std::vector<std::string> >("BitNames");
37  m_useEventSetup = iConfig.getUntrackedParameter<int>("UseEventSetup", 0);
38  m_useRPCSimLink = iConfig.getUntrackedParameter<int>("UseRPCSimLink", 0);
39  m_rpcSimLinkInstance = iConfig.getParameter<edm::InputTag>("RPCSimLinkInstance");
40 
41  edm::FileInPath f1("L1Trigger/RPCTechnicalTrigger/data/" + configFile);
42  m_configFile = f1.fullPath();
43 
44  if ( m_verbosity ) {
45  LogTrace("RPCTechnicalTrigger")
46  << m_rpcDigiLabel << '\n'
47  << std::endl;
48 
49  LogTrace("RPCTechnicalTrigger")
50  << "\nConfiguration file used for UseEventSetup = 0 \n" << m_configFile << '\n'
51  << std::endl;
52  }
53 
54  //...........................................................................
55  //... There are three Technical Trigger Units Boards: 1 can handle 2 Wheels
56  //... n_Wheels sets the number of wheels attached to board with index boardIndex
57 
58  m_boardIndex[0] = 1;
59  m_boardIndex[1] = 2;
60  m_boardIndex[2] = 3;
61 
62  m_nWheels[0] = 2;
63  m_nWheels[1] = 1;
64  m_nWheels[2] = 2;
65 
66  m_ttu[0] = new TTUEmulator( m_boardIndex[0] , m_nWheels[0] );
67  m_ttu[1] = new TTUEmulator( m_boardIndex[1] , m_nWheels[1] );
68  m_ttu[2] = new TTUEmulator( m_boardIndex[2] , m_nWheels[2] );
69 
70  //... This is second line that delivers in parallel a second trigger
71  m_ttuRbcLine[0] = new TTUEmulator( m_boardIndex[0] , m_nWheels[0] );
72  m_ttuRbcLine[1] = new TTUEmulator( m_boardIndex[1] , m_nWheels[1] );
73  m_ttuRbcLine[2] = new TTUEmulator( m_boardIndex[2] , m_nWheels[2] );
74 
75  m_WheelTtu[-2] = 3;
76  m_WheelTtu[-1] = 3;
77  m_WheelTtu[0 ] = 2;
78  m_WheelTtu[1 ] = 1;
79  m_WheelTtu[2 ] = 1;
80 
81  //...........................................................................
82  //For the pointing Logic: declare here the first sector of each quadrant
83  //
84  m_quadrants.push_back(2);
85  m_quadrants.push_back(3);
86  m_quadrants.push_back(4);
87  m_quadrants.push_back(5);
88  m_quadrants.push_back(6);
89  m_quadrants.push_back(7);
90  m_quadrants.push_back(8);
91  m_quadrants.push_back(9);
92  m_quadrants.push_back(10);
93  m_quadrants.push_back(11);
94 
95  //...........................................................................
96 
97  m_ievt = 0;
98  m_cand = 0;
99  m_maxTtuBoards = 3;
100  m_maxBits = 5;
101  m_hasConfig = false;
102  m_readConfig = NULL;
103  produces<L1GtTechnicalTriggerRecord>();
104 
105 }
106 
107 
109 {
110 
111  LogDebug("RPCTechnicalTrigger") << "RPCTechnicalTrigger: object starts deletion" << std::endl;
112 
113  if ( m_hasConfig ) {
114 
115  delete m_ttu[0];
116  delete m_ttu[1];
117  delete m_ttu[2];
118 
119  delete m_ttuRbcLine[0];
120  delete m_ttuRbcLine[1];
121  delete m_ttuRbcLine[2];
122 
123  if ( m_readConfig )
124  delete m_readConfig;
125 
126  }
127 
128  m_WheelTtu.clear();
129 
130  LogDebug("RPCTechnicalTrigger") << "RPCTechnicalTrigger: object deleted" << '\n';
131 
132 }
133 
134 //=============================================================================
136 
137 
138  bool status(false);
139 
141 
143 
144  std::auto_ptr<L1GtTechnicalTriggerRecord> output(new L1GtTechnicalTriggerRecord());
145 
146  if ( m_useRPCSimLink == 0 ) {
147 
148  iEvent.getByLabel(m_rpcDigiLabel, pIn);
149  if ( ! pIn.isValid() ) {
150  edm::LogError("RPCTechnicalTrigger") << "can't find RPCDigiCollection with label: "
151  << m_rpcDigiLabel << '\n';
152  iEvent.put(output);
153  return;
154  }
155  m_signal = dynamic_cast<ProcessInputSignal*>(new RBCProcessRPCDigis( m_rpcGeometry, pIn ));
156 
157  } else {
158 
159  iEvent.getByLabel("simMuonRPCDigis", "RPCDigiSimLink", simIn);
160 
161  if ( ! simIn.isValid() ) {
162  edm::LogError("RPCTechnicalTrigger") << "can't find RPCDigiCollection with label: "
163  << m_rpcDigiLabel << '\n';
164  iEvent.put(output);
165  return;
166  }
167  m_signal = dynamic_cast<ProcessInputSignal*>(new RBCProcessRPCSimDigis( m_rpcGeometry, simIn ));
168  }
169 
170  LogDebug("RPCTechnicalTrigger") << "signal object created" << '\n';
171 
172  if ( ! m_hasConfig ) {
173  edm::LogError("RPCTechnicalTrigger") << "cannot read hardware configuration \n";
174  iEvent.put(output);
175  return;
176  }
177 
178  status = m_signal->next();
179 
180  if ( !status) {
181  delete m_signal;
182  iEvent.put(output);
183  return;
184  }
185 
187 
188  std::vector<L1GtTechnicalTrigger> ttVec( m_ttBits.size() );
189 
190  //. distribute data to different TTU emulator instances and process it
191 
192  m_triggerbits.reset();
193 
194  int indx(0);
195 
196  std::vector<TTUEmulator::TriggerResponse*>::const_iterator outItr;
197 
198  for(int k=0; k < m_maxTtuBoards; ++k) {
199 
200  indx=k*2;
201 
202  m_ttu[k]->processTtu( m_input );
203 
204  //work out Pointing Logic to Tracker
206  m_ttuRbcLine[k]->processTtu( m_input , (*m_firstSector) );
207 
208  //...for trigger 1
209  for( outItr = m_ttu[k]->m_triggerBxVec.begin(); outItr != m_ttu[k]->m_triggerBxVec.end(); ++outItr )
210  m_serializedInfoLine1.push_back( new TTUResults( k, (*outItr)->m_bx, (*outItr)->m_trigger[0], (*outItr)->m_trigger[1] ) );
212 
213  //...for trigger 2
214  for( outItr = m_ttuRbcLine[k]->m_triggerBxVec.begin(); outItr != m_ttuRbcLine[k]->m_triggerBxVec.end(); ++outItr )
215  m_serializedInfoLine2.push_back( new TTUResults( k,
216  (*outItr)->m_bx,
217  (*outItr)->m_trigger[0],
218  (*outItr)->m_trigger[1],
219  (*outItr)->m_wedge ) );
220 
222 
223  }
224 
225  //.. write results to technical trigger bits
226  int bx(0);
227  int infoSize(0);
228 
229  infoSize = m_serializedInfoLine1.size();
230 
231  std::vector<RPCTechnicalTrigger::TTUResults*>::const_iterator ttuItr;
232 
234 
235  for( ttuItr = m_serializedInfoLine1.begin(); ttuItr != m_serializedInfoLine1.end(); ++ttuItr ) {
236  if ( m_verbosity && abs( (*ttuItr)->m_bx ) <= 1 )
237  std::cout << "RPCTechnicalTrigger> "
238  << (*ttuItr)->m_ttuidx << '\t'
239  << (*ttuItr)->m_bx << '\t'
240  << (*ttuItr)->m_trigWheel1 << '\t'
241  << (*ttuItr)->m_trigWheel2 << '\n';
242  }
243 
244  bool has_bx0 = false;
245 
246  for(int k = 0; k < infoSize; k+=m_maxTtuBoards) {
247 
248  bx = m_serializedInfoLine1[k]->m_bx;
249 
250  if ( bx == 0 ) {
251 
252  m_triggerbits.set(0, m_serializedInfoLine1[k]->m_trigWheel2);
253  m_triggerbits.set(1, m_serializedInfoLine1[k]->m_trigWheel1);
254  m_triggerbits.set(2, m_serializedInfoLine1[k+1]->m_trigWheel1);
255  m_triggerbits.set(3, m_serializedInfoLine1[k+2]->m_trigWheel1);
256  m_triggerbits.set(4, m_serializedInfoLine1[k+2]->m_trigWheel2);
257 
258  bool five_wheels_OR = m_triggerbits.any();
259 
260  ttVec.at(0)=L1GtTechnicalTrigger(m_ttNames.at(0), m_ttBits.at(0), bx, five_wheels_OR ) ; // bit 24 = Or 5 wheels in TTU mode
261  ttVec.at(2)=L1GtTechnicalTrigger(m_ttNames.at(2), m_ttBits.at(2), bx, m_triggerbits[0] ) ; // bit 26
262  ttVec.at(3)=L1GtTechnicalTrigger(m_ttNames.at(3), m_ttBits.at(3), bx, m_triggerbits[1] ) ; // bit 27
263  ttVec.at(4)=L1GtTechnicalTrigger(m_ttNames.at(4), m_ttBits.at(4), bx, m_triggerbits[2] ) ; // bit 28
264  ttVec.at(5)=L1GtTechnicalTrigger(m_ttNames.at(5), m_ttBits.at(5), bx, m_triggerbits[3] ) ; // bit 29
265  ttVec.at(6)=L1GtTechnicalTrigger(m_ttNames.at(6), m_ttBits.at(6), bx, m_triggerbits[4] ) ; // bit 30
266 
267  m_triggerbits.reset();
268 
269  has_bx0 = true;
270 
271  break;
272 
273  } else continue;
274 
275  }
276 
277  infoSize = m_serializedInfoLine2.size();
278 
280 
281  for( ttuItr = m_serializedInfoLine2.begin(); ttuItr != m_serializedInfoLine2.end(); ++ttuItr ) {
282  if ( m_verbosity && abs ( (*ttuItr)->m_bx ) <= 1 )
283  std::cout << "RPCTechnicalTrigger> "
284  << (*ttuItr)->m_ttuidx << '\t'
285  << (*ttuItr)->m_bx << '\t'
286  << (*ttuItr)->m_trigWheel1 << '\t'
287  << (*ttuItr)->m_trigWheel2 << '\t'
288  << (*ttuItr)->m_wedge << '\n';
289  }
290 
291  infoSize = convertToMap( m_serializedInfoLine2 );
292 
293  std::bitset<8> triggerCoincidence;
294  triggerCoincidence.reset();
295 
296  // searchCoincidence( W-2 , W0 )
297  bool result = searchCoincidence( -2, 0 );
298  triggerCoincidence.set(0, result );
299 
300  // searchCoincidence( W-2 , W+1 )
301  result = searchCoincidence( -2, 1 );
302  triggerCoincidence.set(1, result );
303 
304  // searchCoincidence( W-1 , W0 )
305  result = searchCoincidence( -1, 0 );
306  triggerCoincidence.set(2, result );
307 
308  // searchCoincidence( W-1 , W+1 )
309  result = searchCoincidence( -1, 1 );
310  triggerCoincidence.set(3, result );
311 
312  // searchCoincidence( W-1 , W+2 )
313  result = searchCoincidence( -1, 2 );
314  triggerCoincidence.set(4, result );
315 
316  // searchCoincidence( W0 , W0 )
317  result = searchCoincidence( 0 , 0 );
318  triggerCoincidence.set(5, result );
319 
320  // searchCoincidence( W+1 , W0 )
321  result = searchCoincidence( 1, 0 );
322  triggerCoincidence.set(6, result );
323 
324  // searchCoincidence( W+2 , W0 )
325  result = searchCoincidence( 2, 0 );
326  triggerCoincidence.set(7, result );
327 
328  bool five_wheels_OR = triggerCoincidence.any();
329 
330  if ( m_verbosity ) std::cout << "RPCTechnicalTrigger> pointing trigger: " << five_wheels_OR << '\n';
331 
332  ttVec.at(1)=L1GtTechnicalTrigger(m_ttNames.at(1), m_ttBits.at(1), bx, five_wheels_OR ) ; // bit 25 = Or 5 wheels in RBC mode
333 
334  triggerCoincidence.reset();
335 
336  //...check that data appeared at bx=0
337 
338  if ( ! has_bx0 ) {
339  iEvent.put(output);
340  status = Reset();
341  ++m_ievt;
342  LogDebug("RPCTechnicalTrigger") << "RPCTechnicalTrigger> end of event loop" << std::endl;
343  return;
344 
345  }
346 
347  output->setGtTechnicalTrigger(ttVec);
348  iEvent.put(output);
349 
350  //.... all done
351 
352  status = Reset();
353  ++m_ievt;
354  LogDebug("RPCTechnicalTrigger") << "RPCTechnicalTrigger> end of event loop" << std::endl;
355 
356 }
357 
359 {
360 
361  m_input->clear();
362  m_triggerbits.reset();
363  std::vector<TTUResults*>::iterator itrRes;
364 
365  for( itrRes=m_serializedInfoLine1.begin(); itrRes!=m_serializedInfoLine1.end(); ++itrRes)
366  delete (*itrRes);
367 
368  for( itrRes=m_serializedInfoLine2.begin(); itrRes!=m_serializedInfoLine2.end(); ++itrRes)
369  delete (*itrRes);
370 
371  m_serializedInfoLine1.clear();
372  m_serializedInfoLine2.clear();
373  m_ttuResultsByQuadrant.clear();
374 
375  delete m_signal;
376 
377  return true;
378 
379 }
380 
381 // ------------ method called once each job just before starting event loop ------------
383 {
384 
385  bool status(false);
386 
387  LogDebug("RPCTechnicalTrigger") << "RPCTechnicalTrigger::beginRun> starts" << std::endl;
388 
389  //. Set up RPC geometry
390 
391  evtSetup.get<MuonGeometryRecord>().get( m_rpcGeometry );
392 
393  //.. Get Board Specifications (hardware configuration)
394 
395  if ( m_useEventSetup >= 1 ) {
396 
398  evtSetup.get<RBCBoardSpecsRcd>().get(pRBCSpecs);
399 
401  evtSetup.get<TTUBoardSpecsRcd>().get(pTTUSpecs);
402 
403  if ( !pRBCSpecs.isValid() || !pTTUSpecs.isValid() ) {
404  edm::LogError("RPCTechnicalTrigger") << "can't find RBC/TTU BoardSpecsRcd" << '\n';
405  m_hasConfig = false;
406  }
407  else {
408  m_rbcspecs = pRBCSpecs.product();
409  m_ttuspecs = pTTUSpecs.product();
410  m_hasConfig = true;
411  }
412 
413  } else {
414 
415  // read hardware configuration from file
417 
418  if ( m_readConfig->m_hasConfig ) {
422  m_hasConfig = true;
423  }
424 
425  else m_hasConfig = false;
426 
427  }
428 
429  if ( m_hasConfig ) {
430 
431  //... Initialize all
432 
433  for (int k=0; k < m_maxTtuBoards; ++k ) {
434 
435  m_ttu[k]->SetLineId ( 1 );
436  m_ttuRbcLine[k]->SetLineId( 2 );
437 
440 
441  status = m_ttu[k]->initialise();
442  status = m_ttuRbcLine[k]->initialise();
443 
444 
445  }
446 
447  }
448 
449 }
450 
451 //
452 int RPCTechnicalTrigger::convertToMap( const std::vector<TTUResults*> & ttuResults )
453 {
454 
455  std::vector<TTUResults*>::const_iterator itr = ttuResults.begin();
456 
457  while ( itr != ttuResults.end() ) {
458 
459  if ( (*itr)->m_bx != 0 ) {
460  ++itr;
461  continue;
462  }
463 
464  int key(0);
465  key = 1000 * ( (*itr)->m_ttuidx + 1 ) + 1*(*itr)->m_wedge;
466  m_ttuResultsByQuadrant[ key ] = (*itr);
467  ++itr;
468 
469  }
470 
471  return m_ttuResultsByQuadrant.size();
472 
473 }
474 
475 //...RBC pointing logic to tracker bit 25: hardwired
476 bool RPCTechnicalTrigger::searchCoincidence( int wheel1, int wheel2 )
477 {
478 
479  std::map<int, TTUResults*>::iterator itr;
480  bool topRight(false);
481  bool botLeft(false);
482 
483  int indxW1 = m_WheelTtu[wheel1];
484  int indxW2 = m_WheelTtu[wheel2];
485 
486  int k(0);
487  int key(0);
488  bool finalTrigger(false);
489  int maxTopQuadrants = 4;
490 
491  //work out Pointing Logic to Tracker
492 
493  for( m_firstSector = m_quadrants.begin(); m_firstSector != m_quadrants.end(); ++m_firstSector) {
494 
495  key = 1000 * ( indxW1 ) + (*m_firstSector);
496 
497  itr = m_ttuResultsByQuadrant.find( key );
498  if ( itr != m_ttuResultsByQuadrant.end() )
499  topRight = (*itr).second->getTriggerForWheel(wheel1);
500 
501  //std::cout << "W1: " << wheel1 << " " << "sec: " << (*m_firstSector) << " dec: " << topRight << '\n';
502 
503  key = 1000 * ( indxW2 ) + (*m_firstSector) + 5;
504 
505  itr = m_ttuResultsByQuadrant.find( key );
506 
507  if ( itr != m_ttuResultsByQuadrant.end() )
508  botLeft = (*itr).second->getTriggerForWheel(wheel2);
509 
510  //std::cout << "W2: " << wheel2 << " " << "sec: " << (*m_firstSector) + 5 << " dec: " << botLeft << '\n';
511 
512  finalTrigger |= ( topRight && botLeft );
513 
514  ++k;
515 
516  if ( k > maxTopQuadrants)
517  break;
518 
519  }
520 
521  //Try the opposite now
522 
523  k=0;
524 
525  for( m_firstSector = m_quadrants.begin(); m_firstSector != m_quadrants.end(); ++m_firstSector) {
526 
527  key = 1000 * ( indxW2 ) + (*m_firstSector);
528 
529  itr = m_ttuResultsByQuadrant.find( key );
530  if ( itr != m_ttuResultsByQuadrant.end() )
531  topRight = (*itr).second->getTriggerForWheel(wheel1);
532 
533  //std::cout << "W1: " << wheel1 << " " << "sec: " << (*m_firstSector) << " dec: " << topRight << '\n';
534 
535  key = 1000 * ( indxW1 ) + (*m_firstSector) + 5;
536 
537  itr = m_ttuResultsByQuadrant.find( key );
538 
539  if ( itr != m_ttuResultsByQuadrant.end() )
540  botLeft = (*itr).second->getTriggerForWheel(wheel2);
541 
542  //std::cout << "W2: " << wheel2 << " " << "sec: " << (*m_firstSector) + 5 << " dec: " << botLeft << '\n';
543 
544  finalTrigger |= ( topRight && botLeft );
545 
546  ++k;
547 
548  if ( k > maxTopQuadrants)
549  break;
550 
551  }
552 
553  return finalTrigger;
554 
555 }
556 
557 // ------------ method called once each job just after ending the event loop ------------
558 
560 {
561 
562  LogDebug("RPCTechnicalTrigger") << "RPCTechnicalTrigger::endJob>" << std::endl;
563 
564 }
565 
567 {
568 
569  LogDebug("RPCTechnicalTrigger") << "RPCTechnicalTrigger::Printing TTU emulators info>" << std::endl;
570 
571  for (int k=0; k < m_maxTtuBoards; ++k ) {
572  m_ttu[k]->printinfo();
574  }
575 
576 
577 }
578 
579 
580 //define this as a plug-in
#define LogDebug(id)
edm::InputTag m_rpcSimLinkInstance
T getParameter(std::string const &) const
T getUntrackedParameter(std::string const &, T const &) const
std::map< int, int > m_WheelTtu
virtual RPCInputSignal * retrievedata()=0
std::vector< TTUResults * > m_serializedInfoLine1
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:17
edm::ESHandle< RPCGeometry > m_rpcGeometry
TTUBoardSpecs * getTtuSpecs()
virtual void clear()=0
Destructor.
#define abs(x)
Definition: mlp_lapack.h:159
#define NULL
Definition: scimark2.h:8
std::vector< int > m_quadrants
std::bitset< 5 > m_triggerbits
RBCBoardSpecs * getRbcSpecs()
std::vector< TriggerResponse * > m_triggerBxVec
Definition: TTUEmulator.h:113
ProcessInputSignal * m_signal
void clearTriggerResponse()
Definition: TTUEmulator.cc:325
int iEvent
Definition: GenABIO.cc:243
OrphanHandle< PROD > put(std::auto_ptr< PROD > product)
Put a new product.
Definition: Event.h:84
std::map< int, TTUResults * > m_ttuResultsByQuadrant
tuple result
Definition: query.py:137
TTUEmulator * m_ttu[3]
std::vector< TTUResults * > m_serializedInfoLine2
RPCTechnicalTrigger(const edm::ParameterSet &)
bool initialise()
Definition: TTUEmulator.cc:134
bool isValid() const
Definition: HandleBase.h:76
bool getByLabel(InputTag const &tag, Handle< PROD > &result) const
Definition: Event.h:359
#define LogTrace(id)
std::vector< unsigned > m_ttBits
void SetLineId(int)
Definition: TTUEmulator.cc:150
TTUConfigurator * m_readConfig
int k[5][pyjets_maxn]
const TTUBoardSpecs * m_ttuspecs
void printinfo()
Definition: TTUEmulator.cc:337
void processTtu(RPCInputSignal *)
Definition: TTUEmulator.cc:163
virtual int next()=0
std::vector< std::string > m_ttNames
std::vector< int >::iterator m_firstSector
const T & get() const
Definition: EventSetup.h:55
T const * product() const
Definition: ESHandle.h:62
virtual void produce(edm::Event &, const edm::EventSetup &)
list key
Definition: combine.py:13
TTUEmulator * m_ttuRbcLine[3]
edm::InputTag m_rpcDigiLabel
tuple cout
Definition: gather_cfg.py:41
const RBCBoardSpecs * m_rbcspecs
tuple status
Definition: ntuplemaker.py:245
RPCInputSignal * m_input
bool isValid() const
Definition: ESHandle.h:37
int convertToMap(const std::vector< TTUResults * > &)
virtual void beginRun(edm::Run &, const edm::EventSetup &)
Definition: Run.h:31
bool searchCoincidence(int, int)
void setSpecifications(const TTUBoardSpecs *, const RBCBoardSpecs *)
Definition: TTUEmulator.cc:119