00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016 #include "L1Trigger/RPCTechnicalTrigger/interface/RPCTechnicalTrigger.h"
00017 #include "L1Trigger/RPCTechnicalTrigger/interface/ProcessTestSignal.h"
00018 #include "L1Trigger/RPCTechnicalTrigger/interface/RBCProcessRPCDigis.h"
00019 #include "L1Trigger/RPCTechnicalTrigger/interface/RBCProcessRPCSimDigis.h"
00020
00021 #include "FWCore/MessageLogger/interface/MessageLogger.h"
00022 #include "FWCore/MessageLogger/interface/MessageDrop.h"
00023
00024
00025
00026
00027
00028 RPCTechnicalTrigger::RPCTechnicalTrigger(const edm::ParameterSet& iConfig) {
00029
00030
00031
00032 std::string configFile = iConfig.getParameter<std::string>("ConfigFile");
00033 m_verbosity = iConfig.getUntrackedParameter<int>("Verbosity", 0);
00034 m_rpcDigiLabel = iConfig.getParameter<edm::InputTag>("RPCDigiLabel");
00035 m_ttBits = iConfig.getParameter< std::vector<unsigned> >("BitNumbers");
00036 m_ttNames = iConfig.getParameter< std::vector<std::string> >("BitNames");
00037 m_useEventSetup = iConfig.getUntrackedParameter<int>("UseEventSetup", 0);
00038 m_useRPCSimLink = iConfig.getUntrackedParameter<int>("UseRPCSimLink", 0);
00039 m_rpcSimLinkInstance = iConfig.getParameter<edm::InputTag>("RPCSimLinkInstance");
00040
00041 edm::FileInPath f1("L1Trigger/RPCTechnicalTrigger/data/" + configFile);
00042 m_configFile = f1.fullPath();
00043
00044 if ( m_verbosity ) {
00045 LogTrace("RPCTechnicalTrigger")
00046 << m_rpcDigiLabel << '\n'
00047 << std::endl;
00048
00049 LogTrace("RPCTechnicalTrigger")
00050 << "\nConfiguration file used for UseEventSetup = 0 \n" << m_configFile << '\n'
00051 << std::endl;
00052 }
00053
00054
00055
00056
00057
00058 m_boardIndex[0] = 1;
00059 m_boardIndex[1] = 2;
00060 m_boardIndex[2] = 3;
00061
00062 m_nWheels[0] = 2;
00063 m_nWheels[1] = 1;
00064 m_nWheels[2] = 2;
00065
00066 m_ttu[0] = new TTUEmulator( m_boardIndex[0] , m_nWheels[0] );
00067 m_ttu[1] = new TTUEmulator( m_boardIndex[1] , m_nWheels[1] );
00068 m_ttu[2] = new TTUEmulator( m_boardIndex[2] , m_nWheels[2] );
00069
00070
00071 m_ttuRbcLine[0] = new TTUEmulator( m_boardIndex[0] , m_nWheels[0] );
00072 m_ttuRbcLine[1] = new TTUEmulator( m_boardIndex[1] , m_nWheels[1] );
00073 m_ttuRbcLine[2] = new TTUEmulator( m_boardIndex[2] , m_nWheels[2] );
00074
00075 m_WheelTtu[-2] = 3;
00076 m_WheelTtu[-1] = 3;
00077 m_WheelTtu[0 ] = 2;
00078 m_WheelTtu[1 ] = 1;
00079 m_WheelTtu[2 ] = 1;
00080
00081
00082
00083
00084 m_quadrants.push_back(2);
00085 m_quadrants.push_back(3);
00086 m_quadrants.push_back(4);
00087 m_quadrants.push_back(5);
00088 m_quadrants.push_back(6);
00089 m_quadrants.push_back(7);
00090 m_quadrants.push_back(8);
00091 m_quadrants.push_back(9);
00092 m_quadrants.push_back(10);
00093 m_quadrants.push_back(11);
00094
00095
00096
00097 m_ievt = 0;
00098 m_cand = 0;
00099 m_maxTtuBoards = 3;
00100 m_maxBits = 5;
00101 m_hasConfig = false;
00102 m_readConfig = NULL;
00103 produces<L1GtTechnicalTriggerRecord>();
00104
00105 }
00106
00107
00108 RPCTechnicalTrigger::~RPCTechnicalTrigger()
00109 {
00110
00111 LogDebug("RPCTechnicalTrigger") << "RPCTechnicalTrigger: object starts deletion" << std::endl;
00112
00113 if ( m_hasConfig ) {
00114
00115 delete m_ttu[0];
00116 delete m_ttu[1];
00117 delete m_ttu[2];
00118
00119 delete m_ttuRbcLine[0];
00120 delete m_ttuRbcLine[1];
00121 delete m_ttuRbcLine[2];
00122
00123 if ( m_readConfig )
00124 delete m_readConfig;
00125
00126 }
00127
00128 m_WheelTtu.clear();
00129
00130 LogDebug("RPCTechnicalTrigger") << "RPCTechnicalTrigger: object deleted" << '\n';
00131
00132 }
00133
00134
00135 void RPCTechnicalTrigger::produce(edm::Event& iEvent, const edm::EventSetup& iSetup) {
00136
00137
00138 bool status(false);
00139
00140 edm::Handle<RPCDigiCollection> pIn;
00141
00142 edm::Handle<edm::DetSetVector<RPCDigiSimLink> > simIn;
00143
00144 std::auto_ptr<L1GtTechnicalTriggerRecord> output(new L1GtTechnicalTriggerRecord());
00145
00146 if ( m_useRPCSimLink == 0 ) {
00147
00148 iEvent.getByLabel(m_rpcDigiLabel, pIn);
00149 if ( ! pIn.isValid() ) {
00150 edm::LogError("RPCTechnicalTrigger") << "can't find RPCDigiCollection with label: "
00151 << m_rpcDigiLabel << '\n';
00152 iEvent.put(output);
00153 return;
00154 }
00155 m_signal = dynamic_cast<ProcessInputSignal*>(new RBCProcessRPCDigis( m_rpcGeometry, pIn ));
00156
00157 } else {
00158
00159 iEvent.getByLabel("simMuonRPCDigis", "RPCDigiSimLink", simIn);
00160
00161 if ( ! simIn.isValid() ) {
00162 edm::LogError("RPCTechnicalTrigger") << "can't find RPCDigiCollection with label: "
00163 << m_rpcDigiLabel << '\n';
00164 iEvent.put(output);
00165 return;
00166 }
00167 m_signal = dynamic_cast<ProcessInputSignal*>(new RBCProcessRPCSimDigis( m_rpcGeometry, simIn ));
00168 }
00169
00170 LogDebug("RPCTechnicalTrigger") << "signal object created" << '\n';
00171
00172 if ( ! m_hasConfig ) {
00173 edm::LogError("RPCTechnicalTrigger") << "cannot read hardware configuration \n";
00174 iEvent.put(output);
00175 return;
00176 }
00177
00178 status = m_signal->next();
00179
00180 if ( !status) {
00181 delete m_signal;
00182 iEvent.put(output);
00183 return;
00184 }
00185
00186 m_input = m_signal->retrievedata();
00187
00188 std::vector<L1GtTechnicalTrigger> ttVec( m_ttBits.size() );
00189
00190
00191
00192 m_triggerbits.reset();
00193
00194 std::vector<TTUEmulator::TriggerResponse*>::const_iterator outItr;
00195
00196 for(int k=0; k < m_maxTtuBoards; ++k) {
00197
00198 m_ttu[k]->processTtu( m_input );
00199
00200
00201 for( m_firstSector = m_quadrants.begin(); m_firstSector != m_quadrants.end(); ++m_firstSector)
00202 m_ttuRbcLine[k]->processTtu( m_input , (*m_firstSector) );
00203
00204
00205 for( outItr = m_ttu[k]->m_triggerBxVec.begin(); outItr != m_ttu[k]->m_triggerBxVec.end(); ++outItr )
00206 m_serializedInfoLine1.push_back( new TTUResults( k, (*outItr)->m_bx, (*outItr)->m_trigger[0], (*outItr)->m_trigger[1] ) );
00207 m_ttu[k]->clearTriggerResponse();
00208
00209
00210 for( outItr = m_ttuRbcLine[k]->m_triggerBxVec.begin(); outItr != m_ttuRbcLine[k]->m_triggerBxVec.end(); ++outItr )
00211 m_serializedInfoLine2.push_back( new TTUResults( k,
00212 (*outItr)->m_bx,
00213 (*outItr)->m_trigger[0],
00214 (*outItr)->m_trigger[1],
00215 (*outItr)->m_wedge ) );
00216
00217 m_ttuRbcLine[k]->clearTriggerResponse();
00218
00219 }
00220
00221
00222 int bx(0);
00223 int infoSize(0);
00224
00225 infoSize = m_serializedInfoLine1.size();
00226
00227 std::vector<RPCTechnicalTrigger::TTUResults*>::const_iterator ttuItr;
00228
00229 std::sort( m_serializedInfoLine1.begin(), m_serializedInfoLine1.end(), sortByBx() );
00230
00231 for( ttuItr = m_serializedInfoLine1.begin(); ttuItr != m_serializedInfoLine1.end(); ++ttuItr ) {
00232 if ( m_verbosity && abs( (*ttuItr)->m_bx ) <= 1 )
00233 std::cout << "RPCTechnicalTrigger> "
00234 << (*ttuItr)->m_ttuidx << '\t'
00235 << (*ttuItr)->m_bx << '\t'
00236 << (*ttuItr)->m_trigWheel1 << '\t'
00237 << (*ttuItr)->m_trigWheel2 << '\n';
00238 }
00239
00240 bool has_bx0 = false;
00241
00242 for(int k = 0; k < infoSize; k+=m_maxTtuBoards) {
00243
00244 bx = m_serializedInfoLine1[k]->m_bx;
00245
00246 if ( bx == 0 ) {
00247
00248 m_triggerbits.set(0, m_serializedInfoLine1[k]->m_trigWheel2);
00249 m_triggerbits.set(1, m_serializedInfoLine1[k]->m_trigWheel1);
00250 m_triggerbits.set(2, m_serializedInfoLine1[k+1]->m_trigWheel1);
00251 m_triggerbits.set(3, m_serializedInfoLine1[k+2]->m_trigWheel1);
00252 m_triggerbits.set(4, m_serializedInfoLine1[k+2]->m_trigWheel2);
00253
00254 bool five_wheels_OR = m_triggerbits.any();
00255
00256 ttVec.at(0)=L1GtTechnicalTrigger(m_ttNames.at(0), m_ttBits.at(0), bx, five_wheels_OR ) ;
00257 ttVec.at(2)=L1GtTechnicalTrigger(m_ttNames.at(2), m_ttBits.at(2), bx, m_triggerbits[0] ) ;
00258 ttVec.at(3)=L1GtTechnicalTrigger(m_ttNames.at(3), m_ttBits.at(3), bx, m_triggerbits[1] ) ;
00259 ttVec.at(4)=L1GtTechnicalTrigger(m_ttNames.at(4), m_ttBits.at(4), bx, m_triggerbits[2] ) ;
00260 ttVec.at(5)=L1GtTechnicalTrigger(m_ttNames.at(5), m_ttBits.at(5), bx, m_triggerbits[3] ) ;
00261 ttVec.at(6)=L1GtTechnicalTrigger(m_ttNames.at(6), m_ttBits.at(6), bx, m_triggerbits[4] ) ;
00262
00263 m_triggerbits.reset();
00264
00265 has_bx0 = true;
00266
00267 break;
00268
00269 } else continue;
00270
00271 }
00272
00273 infoSize = m_serializedInfoLine2.size();
00274
00275 std::sort( m_serializedInfoLine2.begin(), m_serializedInfoLine2.end(), sortByBx() );
00276
00277 for( ttuItr = m_serializedInfoLine2.begin(); ttuItr != m_serializedInfoLine2.end(); ++ttuItr ) {
00278 if ( m_verbosity && abs ( (*ttuItr)->m_bx ) <= 1 )
00279 std::cout << "RPCTechnicalTrigger> "
00280 << (*ttuItr)->m_ttuidx << '\t'
00281 << (*ttuItr)->m_bx << '\t'
00282 << (*ttuItr)->m_trigWheel1 << '\t'
00283 << (*ttuItr)->m_trigWheel2 << '\t'
00284 << (*ttuItr)->m_wedge << '\n';
00285 }
00286
00287 infoSize = convertToMap( m_serializedInfoLine2 );
00288
00289 std::bitset<8> triggerCoincidence;
00290 triggerCoincidence.reset();
00291
00292
00293 bool result = searchCoincidence( -2, 0 );
00294 triggerCoincidence.set(0, result );
00295
00296
00297 result = searchCoincidence( -2, 1 );
00298 triggerCoincidence.set(1, result );
00299
00300
00301 result = searchCoincidence( -1, 0 );
00302 triggerCoincidence.set(2, result );
00303
00304
00305 result = searchCoincidence( -1, 1 );
00306 triggerCoincidence.set(3, result );
00307
00308
00309 result = searchCoincidence( -1, 2 );
00310 triggerCoincidence.set(4, result );
00311
00312
00313 result = searchCoincidence( 0 , 0 );
00314 triggerCoincidence.set(5, result );
00315
00316
00317 result = searchCoincidence( 1, 0 );
00318 triggerCoincidence.set(6, result );
00319
00320
00321 result = searchCoincidence( 2, 0 );
00322 triggerCoincidence.set(7, result );
00323
00324 bool five_wheels_OR = triggerCoincidence.any();
00325
00326 if ( m_verbosity ) std::cout << "RPCTechnicalTrigger> pointing trigger: " << five_wheels_OR << '\n';
00327
00328 ttVec.at(1)=L1GtTechnicalTrigger(m_ttNames.at(1), m_ttBits.at(1), bx, five_wheels_OR ) ;
00329
00330 triggerCoincidence.reset();
00331
00332
00333
00334 if ( ! has_bx0 ) {
00335 iEvent.put(output);
00336 status = Reset();
00337 ++m_ievt;
00338 LogDebug("RPCTechnicalTrigger") << "RPCTechnicalTrigger> end of event loop" << std::endl;
00339 return;
00340
00341 }
00342
00343 output->setGtTechnicalTrigger(ttVec);
00344 iEvent.put(output);
00345
00346
00347
00348 status = Reset();
00349 ++m_ievt;
00350 LogDebug("RPCTechnicalTrigger") << "RPCTechnicalTrigger> end of event loop" << std::endl;
00351
00352 }
00353
00354 bool RPCTechnicalTrigger::Reset()
00355 {
00356
00357 m_input->clear();
00358 m_triggerbits.reset();
00359 std::vector<TTUResults*>::iterator itrRes;
00360
00361 for( itrRes=m_serializedInfoLine1.begin(); itrRes!=m_serializedInfoLine1.end(); ++itrRes)
00362 delete (*itrRes);
00363
00364 for( itrRes=m_serializedInfoLine2.begin(); itrRes!=m_serializedInfoLine2.end(); ++itrRes)
00365 delete (*itrRes);
00366
00367 m_serializedInfoLine1.clear();
00368 m_serializedInfoLine2.clear();
00369 m_ttuResultsByQuadrant.clear();
00370
00371 delete m_signal;
00372
00373 return true;
00374
00375 }
00376
00377
00378 void RPCTechnicalTrigger::beginRun(edm::Run& iRun, const edm::EventSetup& evtSetup)
00379 {
00380 LogDebug("RPCTechnicalTrigger") << "RPCTechnicalTrigger::beginRun> starts" << std::endl;
00381
00382
00383
00384 evtSetup.get<MuonGeometryRecord>().get( m_rpcGeometry );
00385
00386
00387
00388 if ( m_useEventSetup >= 1 ) {
00389
00390 edm::ESHandle<RBCBoardSpecs> pRBCSpecs;
00391 evtSetup.get<RBCBoardSpecsRcd>().get(pRBCSpecs);
00392
00393 edm::ESHandle<TTUBoardSpecs> pTTUSpecs;
00394 evtSetup.get<TTUBoardSpecsRcd>().get(pTTUSpecs);
00395
00396 if ( !pRBCSpecs.isValid() || !pTTUSpecs.isValid() ) {
00397 edm::LogError("RPCTechnicalTrigger") << "can't find RBC/TTU BoardSpecsRcd" << '\n';
00398 m_hasConfig = false;
00399 }
00400 else {
00401 m_rbcspecs = pRBCSpecs.product();
00402 m_ttuspecs = pTTUSpecs.product();
00403 m_hasConfig = true;
00404 }
00405
00406 } else {
00407
00408
00409 m_readConfig = new TTUConfigurator( m_configFile );
00410
00411 if ( m_readConfig->m_hasConfig ) {
00412 m_readConfig->process();
00413 m_rbcspecs = m_readConfig->getRbcSpecs();
00414 m_ttuspecs = m_readConfig->getTtuSpecs();
00415 m_hasConfig = true;
00416 }
00417
00418 else m_hasConfig = false;
00419
00420 }
00421
00422 if ( m_hasConfig ) {
00423
00424
00425
00426 for (int k=0; k < m_maxTtuBoards; ++k ) {
00427
00428 m_ttu[k]->SetLineId ( 1 );
00429 m_ttuRbcLine[k]->SetLineId( 2 );
00430
00431 m_ttu[k]->setSpecifications( m_ttuspecs, m_rbcspecs );
00432 m_ttuRbcLine[k]->setSpecifications( m_ttuspecs, m_rbcspecs );
00433
00434 m_ttu[k]->initialise();
00435 m_ttuRbcLine[k]->initialise();
00436 }
00437
00438 }
00439
00440 }
00441
00442
00443 int RPCTechnicalTrigger::convertToMap( const std::vector<TTUResults*> & ttuResults )
00444 {
00445
00446 std::vector<TTUResults*>::const_iterator itr = ttuResults.begin();
00447
00448 while ( itr != ttuResults.end() ) {
00449
00450 if ( (*itr)->m_bx != 0 ) {
00451 ++itr;
00452 continue;
00453 }
00454
00455 int key(0);
00456 key = 1000 * ( (*itr)->m_ttuidx + 1 ) + 1*(*itr)->m_wedge;
00457 m_ttuResultsByQuadrant[ key ] = (*itr);
00458 ++itr;
00459
00460 }
00461
00462 return m_ttuResultsByQuadrant.size();
00463
00464 }
00465
00466
00467 bool RPCTechnicalTrigger::searchCoincidence( int wheel1, int wheel2 )
00468 {
00469
00470 std::map<int, TTUResults*>::iterator itr;
00471 bool topRight(false);
00472 bool botLeft(false);
00473
00474 int indxW1 = m_WheelTtu[wheel1];
00475 int indxW2 = m_WheelTtu[wheel2];
00476
00477 int k(0);
00478 int key(0);
00479 bool finalTrigger(false);
00480 int maxTopQuadrants = 4;
00481
00482
00483
00484 for( m_firstSector = m_quadrants.begin(); m_firstSector != m_quadrants.end(); ++m_firstSector) {
00485
00486 key = 1000 * ( indxW1 ) + (*m_firstSector);
00487
00488 itr = m_ttuResultsByQuadrant.find( key );
00489 if ( itr != m_ttuResultsByQuadrant.end() )
00490 topRight = (*itr).second->getTriggerForWheel(wheel1);
00491
00492
00493
00494 key = 1000 * ( indxW2 ) + (*m_firstSector) + 5;
00495
00496 itr = m_ttuResultsByQuadrant.find( key );
00497
00498 if ( itr != m_ttuResultsByQuadrant.end() )
00499 botLeft = (*itr).second->getTriggerForWheel(wheel2);
00500
00501
00502
00503 finalTrigger |= ( topRight && botLeft );
00504
00505 ++k;
00506
00507 if ( k > maxTopQuadrants)
00508 break;
00509
00510 }
00511
00512
00513
00514 k=0;
00515
00516 for( m_firstSector = m_quadrants.begin(); m_firstSector != m_quadrants.end(); ++m_firstSector) {
00517
00518 key = 1000 * ( indxW2 ) + (*m_firstSector);
00519
00520 itr = m_ttuResultsByQuadrant.find( key );
00521 if ( itr != m_ttuResultsByQuadrant.end() )
00522 topRight = (*itr).second->getTriggerForWheel(wheel1);
00523
00524
00525
00526 key = 1000 * ( indxW1 ) + (*m_firstSector) + 5;
00527
00528 itr = m_ttuResultsByQuadrant.find( key );
00529
00530 if ( itr != m_ttuResultsByQuadrant.end() )
00531 botLeft = (*itr).second->getTriggerForWheel(wheel2);
00532
00533
00534
00535 finalTrigger |= ( topRight && botLeft );
00536
00537 ++k;
00538
00539 if ( k > maxTopQuadrants)
00540 break;
00541
00542 }
00543
00544 return finalTrigger;
00545
00546 }
00547
00548
00549
00550 void RPCTechnicalTrigger::endJob()
00551 {
00552
00553 LogDebug("RPCTechnicalTrigger") << "RPCTechnicalTrigger::endJob>" << std::endl;
00554
00555 }
00556
00557 void RPCTechnicalTrigger::printinfo()
00558 {
00559
00560 LogDebug("RPCTechnicalTrigger") << "RPCTechnicalTrigger::Printing TTU emulators info>" << std::endl;
00561
00562 for (int k=0; k < m_maxTtuBoards; ++k ) {
00563 m_ttu[k]->printinfo();
00564 m_ttuRbcLine[k]->printinfo();
00565 }
00566
00567
00568 }
00569
00570
00571
00572 DEFINE_FWK_MODULE(RPCTechnicalTrigger);