00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #include "L1Trigger/DTTrigger/interface/DTTrig.h"
00021
00022 #include "FWCore/Framework/interface/Event.h"
00023 #include "FWCore/Framework/interface/ESHandle.h"
00024 #include "DataFormats/Common/interface/Handle.h"
00025 #include "FWCore/Utilities/interface/InputTag.h"
00026 #include "FWCore/MessageLogger/interface/MessageLogger.h"
00027
00028 #include "Geometry/DTGeometry/interface/DTGeometry.h"
00029 #include "Geometry/Records/interface/MuonGeometryRecord.h"
00030 #include "Geometry/DTGeometry/interface/DTLayer.h"
00031 #include "Geometry/DTGeometry/interface/DTChamber.h"
00032 #include "L1TriggerConfig/DTTPGConfig/interface/DTConfigManager.h"
00033 #include "L1TriggerConfig/DTTPGConfig/interface/DTConfigManagerRcd.h"
00034
00035
00036
00037
00038 #include <iostream>
00039 #include <string>
00040
00041
00042
00043
00044 #include "Geometry/DTGeometry/interface/DTChamber.h"
00045
00046
00047
00048
00049
00050 DTTrig::DTTrig(const edm::ParameterSet ¶ms) :
00051 _inputexist(1) , _configid(0) , _geomid(0) {
00052
00053
00054 _debug = params.getUntrackedParameter<bool>("debug");
00055
00056 if(_debug){
00057 std::cout << std::endl;
00058 std::cout << "**** Initialization of DTTrigger ****" << std::endl;
00059 }
00060
00061 _digitag = params.getParameter<edm::InputTag>("digiTag");
00062
00063 }
00064
00065
00066
00067
00068
00069 DTTrig::~DTTrig(){
00070
00071 clear();
00072
00073 }
00074
00075 void
00076 DTTrig::createTUs(const edm::EventSetup& iSetup ){
00077
00078
00079
00080 for(int iwh=-2;iwh<=2;iwh++){
00081 for(int ise=1;ise<=12;ise++){
00082 if(_debug){
00083 std::cout << "calling sectcollid wh sc " << iwh << " " << ise << std::endl;}
00084 DTSectCollId scid(iwh,ise);
00085 SC_iterator it = _cache1.find(scid);
00086 if ( it != _cache1.end()) {
00087 std::cout << "DTTrig::createTUs: Sector Collector unit already exists"<<std::endl;
00088 continue;
00089 }
00090 DTSectColl* sc;
00091 sc = new DTSectColl(scid);
00092 if(_debug){
00093 std::cout << " DTTrig::createTUs new SC sc = " << sc
00094 << " at scid.sector() " << scid.sector()
00095 << " at scid.wheel() " << scid.wheel()
00096 << std::endl;
00097 }
00098 _cache1[scid] = sc;
00099 }
00100 }
00101
00102 edm::ESHandle<DTGeometry>dtGeom;
00103 iSetup.get<MuonGeometryRecord>().get(dtGeom);
00104 for (std::vector<DTChamber*>::const_iterator ich=dtGeom->chambers().begin(); ich!=dtGeom->chambers().end();ich++){
00105
00106 DTChamber* chamb = (*ich);
00107 DTChamberId chid = chamb->id();
00108 TU_iterator it = _cache.find(chid);
00109 if ( it != _cache.end()) {
00110 std::cout << "DTTrig::init: Trigger unit already exists" << std::endl;
00111 continue;
00112 }
00113
00114 DTSCTrigUnit* tru = new DTSCTrigUnit(chamb);
00115 _cache[chid] = tru;
00116
00117
00118
00119 DTSectCollId scid;
00120 if(chid.sector()==13) {
00121 scid = DTSectCollId(chid.wheel(), 4);}
00122 else if(chid.sector()==14) {
00123 scid = DTSectCollId(chid.wheel(), 10);}
00124 else {
00125 scid = DTSectCollId(chid.wheel(), chid.sector() );}
00126
00127 SC_iterator it1 = _cache1.find(scid);
00128
00129 if ( it1 != _cache1.end()) {
00130
00131 DTSectColl* sc = (*it1).second;
00132 if(_debug) {
00133 std::cout << "DTTrig::init: adding TU in SC << "
00134 << " sector = " << scid.sector()
00135 << " wheel = " << scid.wheel()
00136 << std::endl;
00137 }
00138 sc->addTU(tru);
00139 }
00140 else {
00141 std::cout << "DTTrig::createTUs: Trigger Unit not in the map: ";
00142 }
00143
00144 }
00145
00146 }
00147
00148
00149 void
00150 DTTrig::triggerReco(const edm::Event& iEvent, const edm::EventSetup& iSetup) {
00151
00152 updateES(iSetup);
00153 if (!_inputexist) return;
00154
00155 DTDigiMap digiMap;
00156
00157 edm::Handle<DTDigiCollection> dtDigis;
00158 iEvent.getByLabel(_digitag, dtDigis);
00159
00160 if (!dtDigis.isValid()) {
00161 LogDebug("DTTrig")
00162 << "DTTrig::triggerReco DTDigiCollection with input tag " << _digitag
00163 << "requested in configuration, but not found in the event." << std::endl;
00164 _inputexist = false;
00165 return;
00166 }
00167
00168 DTDigiCollection::DigiRangeIterator detUnitIt;
00169
00170 for (detUnitIt=dtDigis->begin();
00171 detUnitIt!=dtDigis->end();
00172 ++detUnitIt){
00173
00174 const DTLayerId& layId = (*detUnitIt).first;
00175 const DTChamberId chambId=layId.superlayerId().chamberId();
00176 const DTDigiCollection::Range& range = (*detUnitIt).second;
00177 digiMap[chambId].put(range,layId);
00178
00179 }
00180
00181
00182 for (TU_iterator it=_cache.begin();it!=_cache.end();it++){
00183 DTSCTrigUnit* thisTU=(*it).second;
00184 if (thisTU->BtiTrigs()->size()>0){
00185 thisTU->BtiTrigs()->clearCache();
00186 thisTU->TSThTrigs()->clearCache();
00187 thisTU->TracoTrigs()->clearCache();
00188 thisTU->TSPhTrigs()->clearCache();
00189 }
00190 DTChamberId chid=thisTU->statId();
00191 DTDigiMap_iterator dmit = digiMap.find(chid);
00192 if (dmit !=digiMap.end()){
00193 thisTU->BtiTrigs()->reconstruct((*dmit).second);
00194 if(thisTU->BtiTrigs()->size()>0){
00195 thisTU->TSThTrigs()->reconstruct();
00196 thisTU->TracoTrigs()->reconstruct();
00197 if(thisTU->TracoTrigs()->size()>0)
00198 thisTU->TSPhTrigs()->reconstruct();
00199 }
00200 }
00201 }
00202
00203 for (SC_iterator it=_cache1.begin();it!=_cache1.end();it++){
00204 DTSectColl* sectcoll = (*it).second;
00205 DTSectCollId scid = (*it).first;
00206 if (sectcoll->sizePh()>0 || sectcoll->sizeTh()>0)
00207 sectcoll->clearCache();
00208 bool mustreco = false;
00209 for (int i=1;i<5;i++) {
00210 if (sectcoll->getTSPhi(i)->size()>0) {
00211 mustreco = true;
00212 break;
00213 }
00214 }
00215 for (int i=1;i<4;i++) {
00216 if (sectcoll->getTSTheta(i)->size()>0) {
00217 mustreco = true;
00218 break;
00219 }
00220 }
00221 if (scid.sector()==4 || scid.sector()==10){
00222 if (sectcoll->getTSPhi(5)->size()>0)
00223 mustreco = true;
00224 }
00225 if (mustreco)
00226 sectcoll->reconstruct();
00227 }
00228
00229 }
00230
00231 void
00232 DTTrig::updateES(const edm::EventSetup& iSetup){
00233
00234
00235 edm::ESHandle<DTConfigManager> confHandle;
00236 edm::ESHandle<DTGeometry> geomHandle;
00237
00238 if (iSetup.get<DTConfigManagerRcd>().cacheIdentifier()!=_configid) {
00239
00240 if (_debug)
00241 std::cout << "DTTrig::updateES updating DTTPG configuration" << std::endl;
00242
00243 _configid = iSetup.get<DTConfigManagerRcd>().cacheIdentifier();
00244 iSetup.get<DTConfigManagerRcd>().get(confHandle);
00245 _conf_manager = confHandle.product();
00246 for (TU_iterator it=_cache.begin();it!=_cache.end();it++){
00247 (*it).second->setConfig(_conf_manager);
00248 }
00249 for (SC_iterator it=_cache1.begin();it!=_cache1.end();it++){
00250 (*it).second->setConfig(_conf_manager);
00251 }
00252
00253 }
00254
00255 if (iSetup.get<MuonGeometryRecord>().cacheIdentifier()!=_configid) {
00256
00257 if (_debug)
00258 std::cout << "DTTrig::updateES updating muon geometry" << std::endl;
00259
00260 _geomid = iSetup.get<MuonGeometryRecord>().cacheIdentifier();
00261 iSetup.get<MuonGeometryRecord>().get(geomHandle);
00262 for (TU_iterator it=_cache.begin();it!=_cache.end();it++){
00263 (*it).second->setGeom(geomHandle->chamber((*it).second->statId()));
00264 }
00265
00266 }
00267
00268 }
00269
00270
00271 void
00272 DTTrig::clear() {
00273
00274 for (TU_iterator it=_cache.begin();it!=_cache.end();it++){
00275
00276 delete (*it).second;
00277 }
00278 _cache.clear();
00279
00280 for (SC_iterator it=_cache1.begin();it!=_cache1.end();it++){
00281
00282 delete (*it).second;
00283 }
00284 _cache1.clear();
00285
00286 }
00287
00288 DTSCTrigUnit*
00289 DTTrig::trigUnit(DTChamberId chid) {
00290 return constTrigUnit(chid);
00291
00292 }
00293
00294
00295
00296 DTSCTrigUnit*
00297 DTTrig::constTrigUnit(DTChamberId chid) const {
00298
00299 TU_const_iterator it = _cache.find(chid);
00300 if ( it == _cache.end()) {
00301 std::cout << "DTTrig::trigUnit: Trigger Unit not in the map: ";
00302 std::cout << " wheel=" << chid.wheel() ;
00303 std::cout << ", station=" << chid.station();
00304 std::cout << ", sector=" << chid.sector();
00305 std::cout << std::endl;
00306 return 0;
00307 }
00308
00309 return (*it).second;
00310 }
00311
00312 DTSectColl*
00313 DTTrig::SCUnit(DTSectCollId scid) const {
00314 SC_const_iterator it = _cache1.find(scid);
00315 if ( it == _cache1.end()) {
00316 std::cout << "DTTrig::SCUnit: Trigger Unit not in the map: ";
00317 std::cout << " wheel=" << scid.wheel() ;
00318 std::cout << ", sector=" << scid.sector();
00319 std::cout << std::endl;
00320 return 0;
00321 }
00322
00323 return (*it).second;
00324 }
00325
00326 DTSCTrigUnit*
00327 DTTrig::trigUnit(int wheel, int stat, int sect) {
00328 return constTrigUnit(wheel, stat, sect);
00329 }
00330
00331 DTSectColl*
00332 DTTrig::SCUnit(int wheel, int sect) const {
00333 sect++;
00334 return SCUnit(DTSectCollId(wheel,sect));
00335 }
00336
00337
00338 DTSCTrigUnit*
00339 DTTrig::constTrigUnit(int wheel, int stat, int sect) const {
00340 sect++;
00341 return constTrigUnit(DTChamberId(wheel,stat,sect));
00342
00343 }
00344
00345
00346 DTChambPhSegm*
00347 DTTrig::chPhiSegm1(DTSCTrigUnit* unit, int step) {
00348 if(unit==0)return 0;
00349 if(unit->nPhiSegm(step)<1)return 0;
00350 return const_cast<DTChambPhSegm*>(unit->phiSegment(step,1));
00351 }
00352
00353 DTChambPhSegm*
00354 DTTrig::chPhiSegm2(DTSCTrigUnit* unit, int step) {
00355 if(unit==0)return 0;
00356 if(unit->nPhiSegm(step)<2)return 0;
00357 return const_cast<DTChambPhSegm*>(unit->phiSegment(step,2));
00358 }
00359
00360 DTChambThSegm*
00361 DTTrig::chThetaSegm(DTSCTrigUnit* unit, int step) {
00362 if(unit==0)return 0;
00363 if(unit->nThetaSegm(step)<1)return 0;
00364 return const_cast<DTChambThSegm*>(unit->thetaSegment(step,1));
00365 }
00366
00367 DTChambPhSegm*
00368 DTTrig::chPhiSegm1(DTChamberId sid, int step) {
00369 return chPhiSegm1(trigUnit(sid),step);
00370 }
00371
00372 DTChambPhSegm*
00373 DTTrig::chPhiSegm2(DTChamberId sid, int step) {
00374 return chPhiSegm2(trigUnit(sid),step);
00375 }
00376
00377 DTChambThSegm*
00378 DTTrig::chThetaSegm(DTChamberId sid, int step) {
00379 if(sid.station()==4)return 0;
00380 return chThetaSegm(trigUnit(sid),step);
00381 }
00382
00383 DTChambPhSegm*
00384 DTTrig::chPhiSegm1(int wheel, int stat, int sect, int step) {
00385 return chPhiSegm1(trigUnit(wheel,stat,sect),step);
00386
00387
00388
00389 }
00390
00391 DTChambPhSegm*
00392 DTTrig::chPhiSegm2(int wheel, int stat, int sect, int step) {
00393
00394
00395
00396
00397 return chPhiSegm2(trigUnit(wheel,stat,sect),step);
00398
00399
00400
00401 }
00402
00403 DTChambThSegm*
00404 DTTrig::chThetaSegm(int wheel, int stat, int sect, int step) {
00405 if(stat==4)return 0;
00406 return chThetaSegm(trigUnit(wheel,stat,sect),step);
00407 }
00408
00409
00410 DTSectCollPhSegm*
00411 DTTrig::chSectCollPhSegm1(DTSectColl* unit, int step) {
00412
00413 if(unit==0)return 0;
00414 if(unit->nSegmPh(step)<1)return 0;
00415 return const_cast<DTSectCollPhSegm*>(unit->SectCollPhSegment(step,1));
00416 }
00417
00418 DTSectCollPhSegm*
00419 DTTrig::chSectCollPhSegm2(DTSectColl* unit, int step) {
00420 if(unit==0)return 0;
00421 if(unit->nSegmPh(step)<2)return 0;
00422 return const_cast<DTSectCollPhSegm*>(unit->SectCollPhSegment(step,2));
00423 }
00424
00425
00426 DTSectCollPhSegm*
00427 DTTrig::chSectCollPhSegm1(int wheel, int sect, int step) {
00428
00429 return chSectCollPhSegm1(SCUnit(wheel,sect),step);
00430 }
00431
00432 DTSectCollPhSegm*
00433 DTTrig::chSectCollPhSegm2(int wheel, int sect, int step) {
00434
00435
00436
00437
00438 return chSectCollPhSegm2(SCUnit(wheel,sect),step);
00439
00440 }
00441
00442 DTSectCollThSegm*
00443 DTTrig::chSectCollThSegm(DTSectColl* unit, int step) {
00444
00445 if(unit==0)return 0;
00446 if(unit->nSegmTh(step)<1)return 0;
00447 return const_cast<DTSectCollThSegm*>(unit->SectCollThSegment(step));
00448 }
00449
00450 DTSectCollThSegm*
00451 DTTrig::chSectCollThSegm(int wheel, int sect, int step) {
00452
00453 return chSectCollThSegm(SCUnit(wheel,sect),step);
00454 }
00455
00456
00457
00458
00459 void
00460 DTTrig::dumpGeom() {
00461
00462 for (TU_const_iterator it=_cache.begin();it!=_cache.end();it++){
00463 ((*it).second)->dumpGeom();
00464 }
00465 }
00466
00467 void
00468 DTTrig::dumpLuts(short int lut_btic, const DTConfigManager *conf) {
00469 for (TU_const_iterator it=_cache.begin();it!=_cache.end();it++){
00470
00471 DTSCTrigUnit* thisTU = (*it).second;
00472
00473
00474 thisTU->dumpLUT(lut_btic);
00475
00476
00477 DTChamberId chid = thisTU->statId();
00478 conf->dumpLUTParam(chid);
00479
00480 }
00481
00482 return;
00483
00484 }
00485
00486 std::vector<DTBtiTrigData>
00487 DTTrig::BtiTrigs() {
00488
00489 std::vector<DTBtiTrigData> trigs;
00490 TU_iterator ptu;
00491 for(ptu=_cache.begin();ptu!=_cache.end();ptu++) {
00492 DTSCTrigUnit* tu = (*ptu).second;
00493 std::vector<DTBtiTrigData>::const_iterator p;
00494 std::vector<DTBtiTrigData>::const_iterator peb=tu->BtiTrigs()->end();
00495 for(p=tu->BtiTrigs()->begin();p!=peb;p++){
00496 trigs.push_back(*p);
00497 }
00498 }
00499 return trigs;
00500 }
00501
00502 std::vector<DTTracoTrigData>
00503 DTTrig::TracoTrigs() {
00504 std::vector<DTTracoTrigData> trigs;
00505 TU_iterator ptu;
00506
00507 for(ptu=_cache.begin();ptu!=_cache.end();ptu++) {
00508 DTSCTrigUnit* tu = (*ptu).second;
00509 std::vector<DTTracoTrigData>::const_iterator p;
00510 std::vector<DTTracoTrigData>::const_iterator peb=tu->TracoTrigs()->end();
00511 for(p=tu->TracoTrigs()->begin();p!=peb;p++){
00512 trigs.push_back(*p);
00513 }
00514 }
00515 return trigs;
00516 }
00517
00518 std::vector<DTChambPhSegm>
00519 DTTrig::TSPhTrigs() {
00520
00521 std::vector<DTChambPhSegm> trigs;
00522 TU_iterator ptu;
00523 for(ptu=_cache.begin();ptu!=_cache.end();ptu++) {
00524 DTSCTrigUnit* tu = (*ptu).second;
00525 std::vector<DTChambPhSegm>::const_iterator p;
00526 std::vector<DTChambPhSegm>::const_iterator peb=tu->TSPhTrigs()->end();
00527 for(p=tu->TSPhTrigs()->begin();p!=peb;p++){
00528 trigs.push_back(*p);
00529 }
00530 }
00531 return trigs;
00532 }
00533
00534 std::vector<DTChambThSegm>
00535 DTTrig::TSThTrigs() {
00536
00537 std::vector<DTChambThSegm> trigs;
00538 TU_iterator ptu;
00539 for(ptu=_cache.begin();ptu!=_cache.end();ptu++) {
00540 DTSCTrigUnit* tu = (*ptu).second;
00541 std::vector<DTChambThSegm>::const_iterator p;
00542 std::vector<DTChambThSegm>::const_iterator peb=tu->TSThTrigs()->end();
00543 for(p=tu->TSThTrigs()->begin();p!=peb;p++){
00544 trigs.push_back(*p);
00545 }
00546 }
00547 return trigs;
00548 }
00549
00550 std::vector<DTSectCollPhSegm>
00551 DTTrig::SCPhTrigs() {
00552
00553 std::vector<DTSectCollPhSegm> trigs;
00554
00555 SC_iterator psc;
00556 for(psc=_cache1.begin();psc!=_cache1.end();psc++) {
00557
00558
00559
00560
00561
00562
00563
00564
00565
00566
00567 DTSectColl* sc = (*psc).second;
00568 std::vector<DTSectCollPhSegm>::const_iterator p;
00569 std::vector<DTSectCollPhSegm>::const_iterator peb=sc->endPh();
00570 for(p=sc->beginPh();p!=peb;p++){
00571 trigs.push_back(*p);
00572 }
00573
00574 }
00575 return trigs;
00576 }
00577
00578
00579 std::vector<DTSectCollThSegm>
00580 DTTrig::SCThTrigs() {
00581
00582 std::vector<DTSectCollThSegm> trigs;
00583 SC_iterator psc;
00584 for(psc=_cache1.begin();psc!=_cache1.end();psc++) {
00585 DTSectColl* sc = (*psc).second;
00586 std::vector<DTSectCollThSegm>::const_iterator p;
00587 std::vector<DTSectCollThSegm>::const_iterator peb=sc->endTh();
00588 for(p=sc->beginTh();p!=peb;p++){
00589 trigs.push_back(*p);
00590 }
00591
00592 }
00593 return trigs;
00594 }