ATLAS Offline Software
Loading...
Searching...
No Matches
LVL1TGCTrigger.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2026 CERN for the benefit of the ATLAS collaboration
3*/
4
5// STL
6#include <sstream>
7#include <fstream>
8#include <vector>
9
10// TGC
12#include "TrigT1TGC/TGCASDOut.h"
13#include "TrigT1TGC/TGCEvent.h"
19#include "TrigT1TGC/TGCSector.h"
23#include "TrigT1TGC/TGCNSW.h"
25#include "TrigT1TGC/TGCBIS78.h"
27
28// Other stuff
34
35// MuonSpectrometer
39
42
43// DetMask stuff
44#include "eformat/DetectorMask.h"
45#include "eformat/SourceIdentifier.h"
46
47namespace LVL1TGCTrigger {
48
49LVL1TGCTrigger::LVL1TGCTrigger(const std::string& name, ISvcLocator* pSvcLocator)
50: AthAlgorithm(name,pSvcLocator),
51 m_db(0),
54 m_debuglevel(false)
55{}
56
59{
60 ATH_MSG_DEBUG("LVL1TGCTrigger destructor called");
61 if (m_db) {
62 delete m_db;
63 m_db =0;
64 }
65}
66
69{
70 ATH_MSG_DEBUG("LVL1TGCTrigger::initialize()");
71
72 m_debuglevel = (msgLevel() <= MSG::DEBUG); // save if threshold for debug
73
74 m_tgcArgs.set_MSGLEVEL(msgLevel());
75 m_tgcArgs.set_SHPT_ORED( m_SHPTORED.value() );
76 m_tgcArgs.set_USE_INNER( m_USEINNER.value() );
77 m_tgcArgs.set_INNER_VETO( m_INNERVETO.value() );
78 m_tgcArgs.set_TILE_MU( m_TILEMU.value() );
79 m_tgcArgs.set_USE_NSW( m_USENSW.value() );
80 m_tgcArgs.set_USE_BIS78( m_USEBIS78.value() );
81 m_tgcArgs.set_FORCE_NSW_COIN( m_FORCENSWCOIN.value() );
82
83 m_tgcArgs.set_USE_CONDDB( m_USE_CONDDB.value() );
84 m_tgcArgs.set_useRun3Config( m_useRun3Config.value() );
85
86 m_tgcArgs.set_NSWSideInfo( m_NSWSideInfo.value() );
87
88 ATH_CHECK( m_readCondKey.initialize(!m_useRun3Config.value()) );
89 ATH_CHECK( m_readLUTs_CondKey.initialize(m_useRun3Config.value()) );
90 ATH_CHECK(m_cablingKey.initialize());
91
92 // CondDB is not available for Run3 config. set USE_CONDDB to false to avoid errors.
93 // will be removed the below part.
94 if(m_useRun3Config.value()){
95 m_tgcArgs.set_USE_CONDDB(false);
96 }
97
98 // initialize TGCDataBase
100
101
102 // create TGCElectronicsSystem
103 m_system = std::make_unique<TGCElectronicsSystem>(&m_tgcArgs,m_db);
104
105 m_TimingManager = std::make_unique<TGCTimingManager>(m_readCondKey);
106 m_TimingManager->setBunchCounter(0);
107
109
110 // read and write handle key
111 ATH_CHECK(m_keyTgcRdoIn.initialize());
112 ATH_CHECK(m_keyTgcDigit.initialize());
113 ATH_CHECK(m_keyTileMu.initialize());
114 ATH_CHECK(m_keyNSWTrigOut.initialize(tgcArgs()->USE_NSW())); // to be updated once the Run 3 CondDb becomes available (should be automatically configured by db info)
115 ATH_CHECK(m_keyBIS78TrigOut.initialize(tgcArgs()->USE_BIS78())); // to be updated as well
116 ATH_CHECK(m_muctpiPhase1Key.initialize(tgcArgs()->useRun3Config()));
117 ATH_CHECK(m_keyTgcRdo.initialize(tgcArgs()->useRun3Config()));
119
120 // clear mask channel map
121 m_MaskedChannel.clear();
122
123 return StatusCode::SUCCESS;
124}
125
128{
129 ATH_MSG_DEBUG("LVL1TGCTrigger::finalize() called" << " m_nEventInSector = " << m_nEventInSector);
130
131 if (m_db) delete m_db;
132 m_db = 0 ;
133
134 return StatusCode::SUCCESS;
135}
136
139{
140 ATH_MSG_DEBUG("execute() called");
141 const EventContext& ctx = Gaudi::Hive::currentContext();
142
143 const Muon::TgcCablingMap* cabling{nullptr};
144 ATH_CHECK(SG::get(cabling, m_cablingKey, ctx));
145
146 // doMaskOperation is performed at the first event
147 // It is better to implement callback against
148 // MuonTGC_CablingSvc::updateCableASDToPP (Susumu Oda, 2010/10/27)
149 if(m_firstTime) {
150 // do mask operation
151 ATH_CHECK(getMaskedChannel(*cabling));
152 m_firstTime = false;
153 }
154
155 // Tile-Muon data
156 bool doTileMu = m_tgcArgs.TILE_MU();
157
158 if (doTileMu && !m_tgcArgs.useRun3Config()) { // for Run-2
159 const TGCTriggerData* readCdo{};
160 ATH_CHECK(SG::get(readCdo, m_readCondKey, ctx));
161 doTileMu = readCdo->isActive(TGCTriggerData::CW_TILE);
162 }
163
164 // NSW data
165 bool doNSW = m_tgcArgs.USE_NSW();
166
167 // BIS78 data
168 bool doBIS78 = m_tgcArgs.USE_BIS78();
169
170 // TgcRdo
171 std::map<std::pair<int, int>, std::unique_ptr<TgcRdo>> tgcrdo;
172
173
174 const TgcDigitContainer* tgc_container{nullptr};
175 ATH_CHECK(SG::get(tgc_container, m_keyTgcDigit, ctx));
176
178 ATH_CHECK(wh_muctpiTgc.record(std::make_unique<LVL1MUONIF::Lvl1MuCTPIInputPhase1>()));
179 LVL1MUONIF::Lvl1MuCTPIInputPhase1* muctpiinputPhase1 = wh_muctpiTgc.ptr();
180
181 // process one by one
182 StatusCode sc = StatusCode::SUCCESS;
183 for (int bc=TgcDigit::BC_PREVIOUS; bc<=TgcDigit::BC_NEXTNEXT; bc++){
184 sc = StatusCode::SUCCESS;
185
186 // Use TileMu only if BC_CURRENT
187 if (doTileMu && bc == m_CurrentBunchTag) {
188 ATH_CHECK(m_system->getTMDB()->retrieve(m_keyTileMu, ctx));
189 }
190
191 // Use NSW trigger output
192 if(doNSW && bc==m_CurrentBunchTag){ // To implement BC-calculation
193 ATH_CHECK(m_system->getNSW()->retrieve(m_keyNSWTrigOut, ctx));
194 }
195
196 // Use RPC BIS78 trigger output
197 if(doBIS78 && bc == m_CurrentBunchTag){ // Todo: implement BC-calculation
198 ATH_CHECK(m_system->getBIS78()->retrieve(m_keyBIS78TrigOut, ctx));
199 }
200
202 m_bctagInProcess = bc;
203 ATH_CHECK(processOneBunch(*cabling, tgc_container, muctpiinputPhase1, tgcrdo));
204 }
205
206 }
207
208
209 // before writing the output TgcRdo container,
210 // read input TgcRdo and copy the tracklet etc.
211 const TgcRdoContainer* rdoContIn{nullptr};
212 ATH_CHECK(SG::get(rdoContIn, m_keyTgcRdoIn, ctx));
213 if(rdoContIn->size()>0) {
214 TgcRdoContainer::const_iterator itR = rdoContIn->begin();
215 for(; itR!=rdoContIn->end(); ++itR){
216 const TgcRdo* rdoIn = (*itR);
217 std::pair<int, int> subDetectorRod(rdoIn->subDetectorId(), rdoIn->rodId());
218 std::map<std::pair<int, int>, std::unique_ptr<TgcRdo>>::iterator itRdo = tgcrdo.find(subDetectorRod);
219 if (itRdo!=tgcrdo.end()) {
220 // if subDetectorId and rodId for input and output RDOs are the same,
221 // copy the tracklet info etc. from input to the output TgcRdo
222 for ( const TgcRawData* rd : *rdoIn ) {
223 itRdo->second->push_back(std::make_unique<TgcRawData>(*rd));
224 }
225 }
226 }
227 }
228
229 // write tgcL1rdo container
230 SG::WriteHandle<TgcRdoContainer> tgcL1rdoHandle (m_keyTgcRdo, ctx);
231 auto trgContainer=std::make_unique<TgcRdoContainer>();
232 for(const auto& tgcRdoMap : tgcrdo){
233 for(const auto rawData : *tgcRdoMap.second){
234 trgContainer->push_back(rawData);
235 }
236 }
237 ATH_CHECK(tgcL1rdoHandle.record(std::move(trgContainer)));
238
239 return sc;
240}
241
243 const TgcDigitContainer* tgc_container,
244 LVL1MUONIF::Lvl1MuCTPIInputPhase1* muctpiinputPhase1,
245 std::map<std::pair<int, int>, std::unique_ptr<TgcRdo>>& tgcrdo)
246{
247 ATH_MSG_DEBUG("start processOneBunch: for BC=" << m_bctagInProcess);
248
249 std::map<Identifier, int> tgcDigitIDs;
250 std::map<Identifier, int>::iterator itCh;
251
252 // doMaskOperation (masked & fired)
253 doMaskOperation(tgc_container, tgcDigitIDs);
254
255 // fill ASDOut to this event
256 TGCEvent event;
257 fillTGCEvent(cabling, tgcDigitIDs, event);
258 tgcDigitIDs.clear();
259
260 // process trigger electronics emulation...
261 m_TimingManager->increaseBunchCounter();
262 m_system->distributeSignal(&event);
263
264 // EIFI trigger bits for SL are cleared.
265 m_innerTrackletSlotHolder.clearTriggerBits();
266
267 // PatchPanel, SlaveBoard
269 for( int j=0; j<m_system->getNumberOfOctant(); j+=1){
270 for( int k=0; k<m_system->getNumberOfModule(); k+=1){
271 TGCSector* sector = m_system->getSector(i,j,k);
272 if((sector!=0)&&(sector->hasHit())){
274 m_TimingManager->startPatchPanel(sector, m_db);
275 m_TimingManager->startSlaveBoard(sector);
276 if (m_OutputTgcRDO.value()) recordRdoSLB(cabling, sector, tgcrdo);
277 // EIFI trigger bits for SL are filled in this method.
278 }
279 }
280 }
281 }
282
283 // HighPtBoard, SectorLogic
284 const int muctpiBcId_offset = TgcDigit::BC_CURRENT;
285 int muctpiBcId = m_bctagInProcess - muctpiBcId_offset;
286 for(int i=0; i< LVL1TGC::kNSide; i++) {
287 int sectoraddr_endcap = 0;
288 int sectoraddr_forward = 0;
289 for(int j=0; j<m_system->getNumberOfOctant(); j+=1){
290 for(int k=0; k<m_system->getNumberOfModule(); k+=1){
291 if(k>=9) continue;// skip Inner TGC
292 TGCSector* sector = m_system->getSector(i,j,k);
293 if(sector==0) continue;
294
295 m_TimingManager->startHighPtBoard(sector);
296 if (m_OutputTgcRDO.value()) recordRdoHPT(cabling, sector, tgcrdo);
297
298 // EIFI trigger bits are checked if Endcap
299 if(sector->getRegionType() == TGCRegionType::ENDCAP && sector->getSL()) {
300 if((sector->hasHit())){
301 // Pointers to store EIFI trigger bits for Endcap SL
303 = {0, 0, 0, 0};
304 m_innerTrackletSlotHolder.getInnerTrackletSlots(i, j, k, innerTrackletSlots);
305 sector->getSL()->setInnerTrackletSlots(innerTrackletSlots);
306 }
307 }
308 m_TimingManager->startSectorLogic(sector);
309 if(sector->hasHit()) sector->clearNumberOfHit();
310
311 // Fill inner (EIFI/Tile) words
312 if (m_OutputTgcRDO.value() && m_tgcArgs.USE_INNER()) recordRdoInner(cabling, sector, tgcrdo);
313
314 // Fill Lvl1MuCTPInput
315 if (m_OutputTgcRDO.value()) recordRdoSL(cabling, sector, tgcrdo);
316
317 size_t tgcsystem=0,subsystem=0;
318 if(i==0) subsystem = LVL1MUONIF::Lvl1MuCTPIInput::idSideA();
319 if(i==1) subsystem = LVL1MUONIF::Lvl1MuCTPIInput::idSideC();
320
321 std::shared_ptr<TGCTrackSelectorOut> trackSelectorOut;
322 sector->getSL()->getTrackSelectorOutput(trackSelectorOut);
323
324 std::shared_ptr<LVL1TGC::TGCNSW> nsw = m_system->getNSW();
325 int module = sector->getModuleId();
326 int sectorId;
327 if(sector->getRegionType() == TGCRegionType::ENDCAP) {
330 if(trackSelectorOut != 0) FillSectorLogicData(&sldata,trackSelectorOut.get());
331
332 if ( m_tgcArgs.USE_NSW() ){
333 sectorId = ((module/3)*2+module%3) + sector->getOctantId()*6;
334 std::shared_ptr<const LVL1TGC::NSWTrigOut> pNSWOut = nsw->getOutput(sector->getRegionType(),
335 sector->getSideId(),
336 sectorId);
337 if ( pNSWOut ){
338 // set monitoring flag
339 for(bool NSWmonitor : pNSWOut->getNSWmonitor() ){
340 if ( NSWmonitor ) {
341 sldata.nsw(true);
342 break;
343 }
344 }
345 }
346 }
347 muctpiinputPhase1->setSectorLogicData(sldata,tgcsystem,subsystem,sectoraddr_endcap++,muctpiBcId);
348 } else if(sector->getRegionType() == TGCRegionType::FORWARD) {
349 LVL1MUONIF::Lvl1MuForwardSectorLogicDataPhase1 sldata;
350 tgcsystem = LVL1MUONIF::Lvl1MuCTPIInputPhase1::idForwardSystem();
351 if(trackSelectorOut != 0) FillSectorLogicData(&sldata,trackSelectorOut.get());
352
353 if ( m_tgcArgs.USE_NSW() ) {
354 sectorId = (module/3) + sector->getOctantId()*3;
355 std::shared_ptr<const LVL1TGC::NSWTrigOut> pNSWOut = nsw->getOutput(sector->getRegionType(),
356 sector->getSideId(),
357 sectorId);
358 if ( pNSWOut ){
359 // set monitoring flag
360 for(bool NSWmonitor : pNSWOut->getNSWmonitor() ){
361 if ( NSWmonitor ) {
362 sldata.nsw(true);
363 break;
364 }
365 }
366 }
367 }
368 muctpiinputPhase1->setSectorLogicData(sldata,tgcsystem,subsystem,sectoraddr_forward++,muctpiBcId);
369 }
370
371 trackSelectorOut.get()->reset();
372
373
374 } // k Module
375 } // j Octant
376 } // i Side
377
378 event.Clear();
379
380 return StatusCode::SUCCESS;
381}
382
383
386 std::map<Identifier, int>& TgcDigitIDs)
387{
388 // (1) skip masked channels
389 for (const TgcDigitCollection* c : *tgc_container) {
390 for (const TgcDigit* h : *c) {
391
392 // check BCID
393 if (h->bcTag()!=m_bctagInProcess) continue;
394
395 Identifier channelId = h->identify();
396 const auto itCh = m_MaskedChannel.find(channelId);
397 if (itCh!=m_MaskedChannel.end() && itCh->second==0) {
398 ATH_MSG_DEBUG("This channel is masked! offlineID=" << channelId);
399 continue;
400 }
401 TgcDigitIDs.emplace(channelId, 1);
402 }
403 }
404
405 // (2) add fired channels by force
406 for(const auto& [Id, OnOff] : m_MaskedChannel) {
407 if (OnOff==1) {
408 ATH_MSG_VERBOSE("This channel is fired by force! offlineID=" << Id);
409 TgcDigitIDs.emplace(Id, 1);
410 }
411 }
412
413 ATH_MSG_DEBUG("# of total hits " << TgcDigitIDs.size());
414
415 return;
416}
417
420 const std::map<Identifier, int>& tgcDigitIDs, TGCEvent& event)
421{
422 // Loop on TGC detectors (collections)
423 for(const auto& itCh : tgcDigitIDs) {
424 const Identifier channelId = itCh.first;
425 int subsystemNumber{0}, octantNumber{0}, moduleNumber{0},
426 layerNumber{0}, rNumber{0}, wireOrStrip{0}, channelNumber{0};
427 bool status = cabling.getOnlineIDfromOfflineID(channelId,
428 subsystemNumber,
429 octantNumber,
430 moduleNumber,
431 layerNumber,
432 rNumber,
433 wireOrStrip,
434 channelNumber);
435
436 if(!status) {
437 ATH_MSG_INFO("Fail to getOnlineIDfromOfflineID for " << channelId);
438 } else {
439 bool fstatus;
440 int subDetectorID, srodID, sswID, sbLoc, channelID;
441 int phi=0;
442 int moduleType=0;
443 int slbID=0;
444 bool isAside=true;
445 bool isEndcap=true;
446
447 fstatus = cabling.getReadoutIDfromOfflineID(channelId,
448 subDetectorID,
449 srodID,sswID,
450 sbLoc,channelID);
451
452 if (fstatus) {
453 fstatus = cabling.getSLBIDfromReadoutID(phi, isAside, isEndcap,
454 moduleType, slbID,
455 subDetectorID,
456 srodID, sswID,sbLoc);
457 }
458 if (fstatus) {
459 ATH_MSG_VERBOSE("hit : subsys#=" << subsystemNumber
460 << " octant#=" << octantNumber
461 << " mod#=" << moduleNumber
462 << " layer#=" << layerNumber << " r#=" << rNumber
463 << " isStrip=" << wireOrStrip
464 << " ch#=" << channelNumber << endmsg
465 << " --> readoutID: sudetID=" << subDetectorID
466 << " srodID=" << srodID << " sswID=" << sswID
467 << " slbID=" << slbID << " chID=" << channelID);
468
469 TGCZDirection zdire = (subsystemNumber==1)? kZ_FORWARD : kZ_BACKWARD;
470 TGCReadoutIndex index(zdire,octantNumber,moduleNumber,rNumber,layerNumber);
471 TGCSignalType signal = (wireOrStrip==1)? STRIP : WIRE;
472 event.NewASDOut(index,
473 signal,
474 channelNumber,
475 0);
476 } else {
477 ATH_MSG_INFO("Fail to getSLBIDfromOfflineID for " << channelId);
478 }
479 }
480 } // End Loop on TGC detectors (collections)
481 if (m_debuglevel) {
482 ATH_MSG_DEBUG("Could make TGCEvent with TgcDigitContainer."
483 << " vector size : " << event.GetNASDOut() );
484 for(int iout=1; iout<= event.GetNASDOut(); iout++){
485 TGCASDOut* asdout = (event.GetASDOutVector()[iout-1]);
486 ATH_MSG_DEBUG( " Z:" << asdout->GetTGCReadoutIndex().GetZDirection() <<
487 " O:" << asdout->GetTGCReadoutIndex().GetOctantNumber() <<
488 " M:" << asdout->GetTGCReadoutIndex().GetModuleNumber() <<
489 " R:" << asdout->GetTGCReadoutIndex().GetRNumber() <<
490 " L:" << asdout->GetTGCReadoutIndex().GetLayerNumber() <<
491 " S:" << asdout->GetSignalType() <<
492 " I:" << asdout->GetHitID() <<
493 " T:" << asdout->GetHitToF() );
494 }
495 }
496}
497
498
501 const TGCTrackSelectorOut *trackSelectorOut)
502{
503 // M.Aoki (26/10/2019)
504 // this function will be updated for Run3-specific configuration such as quality flags, 15 thresholds
505 if(trackSelectorOut ==0) return;
506
507 sldata->clear2candidatesInSector();// for temporary
508
509 const int muctpiBcId_offset = TgcDigit::BC_CURRENT;
510 sldata->bcid(m_bctagInProcess - muctpiBcId_offset);
511
512 for(int trackNumber=0;trackNumber!=trackSelectorOut->getNCandidate();trackNumber++){
513
514 sldata->roi(trackNumber,((trackSelectorOut->getR(trackNumber))<<2)+(trackSelectorOut->getPhi(trackNumber)));
515 sldata->pt(trackNumber,trackSelectorOut->getPtLevel(trackNumber));
516 if (trackSelectorOut->getInnerVeto(trackNumber)) sldata->ovl(trackNumber,1);
517 else sldata->ovl(trackNumber,0);
518 sldata->charge(trackNumber, trackSelectorOut->getCharge(trackNumber));
519 sldata->bw2or3(trackNumber, trackSelectorOut->getCoincidenceType(trackNumber));
520 sldata->goodmf(trackNumber, trackSelectorOut->getGoodMFFlag(trackNumber));
521 sldata->innercoin(trackNumber, trackSelectorOut->getInnerCoincidenceFlag(trackNumber));
522 }
523 for(int trackNumber=0;trackNumber!=TGCTrackSelectorOut::NCandidateInTrackSelector;trackNumber++){
524 sldata->set2candidates(trackNumber);// not used for TGC
525 sldata->clear2candidates(trackNumber);// not used for TGC
526 }
527}
528
531 TGCSector * sector,
532 std::map<std::pair<int, int>, std::unique_ptr<TgcRdo>>& tgcrdo)
533{
534 uint16_t bcTag=m_CurrentBunchTag, l1Id=0, bcId=0;
535 // readoutID
536 int subDetectorId, rodId, sswId, sbLoc, secId, secIdEIFI;
537 // SLBID
538 bool isAside, isEndcap; int phi, moduleType, id, phiEIFI;
539 isAside = (sector->getSideId()==0 ? 1 : 0);
540 isEndcap = (sector->getRegionType() == TGCRegionType::ENDCAP ? 1 : 0);
541 int module = sector->getModuleId();
542 // OnlineID moduleNumber
543 // <---- phi ----
544 // EC: 7 6 4 3 1 0 11 10 9
545 // FWD: 8 5 2 14 13 12
546 // [M1, M2, M3] [EI/FI]
547 // secId=0-5(EC), 0-2(FWD) for TgcRawData
548 secId = (isEndcap ? (module/3)*2+module%3 : module/3);
549 // phi=1-48(EC), 1-24(FWD) in detector ID scheme
550 phi = (isEndcap ? (secId+46+sector->getOctantId()*6)%48+1 : (secId+23+sector->getOctantId()*3)%24+1);
551 // secIdEIFI=0-2
552 secIdEIFI = module%3;
553 // phiEIFI=1-24
554 phiEIFI = (secIdEIFI+23+sector->getOctantId()*3)%24+1;
555
556 // SLB
557 const int NumberOfSLBType = 6;
558 // 0: WT, 1: WD, 2: ST, 3: SD, 4: WI 5:SI
559 for(int itype=0; itype<NumberOfSLBType; itype++) {
560 moduleType = getLPTTypeInRawData(itype);
561
562 // loop over all SB of each type
563 for(unsigned int index=0; index<sector->getNumberOfSB(itype); index++) {
564 TGCSlaveBoard * slb = sector->getSB(itype, index);
565 if (0==slb) continue;
566 id = slb->getId();
567 const TGCSlaveBoardOut * out = slb->getOutput();
568 if (0==out) continue;
569
570 bool isEIFI = (moduleType==TgcRawData::SLB_TYPE_INNER_WIRE ||
571 moduleType==TgcRawData::SLB_TYPE_INNER_STRIP);
572
573 // get ReadoutID
574 bool status =
575 cabling.getReadoutIDfromSLBID((isEIFI ? phiEIFI : phi),
576 isAside, isEndcap,
577 moduleType, id,
578 subDetectorId, rodId,
579 sswId, sbLoc);
580 if (!status) {
581 ATH_MSG_DEBUG("TGCcablignSvc::getReadoutIDfromSLBID fails");
582 ATH_MSG_DEBUG( "phi=" << phi
583 << " side=" << ((isAside) ? "A": "C")
584 << " region=" << ((isEndcap) ? "Endcap" : "Forward")
585 << " type=" << moduleType
586 << " id=" << id
587 << " subDetectorId=" << subDetectorId
588 << " rodId=" << rodId
589 << " sswId=" << sswId
590 << " sbLoc=" << sbLoc);
591 continue;
592 }
593
594 // fill TgcRawData
595 for(int iData=0; iData<out->getNumberOfData(); iData++) { // max 8
596 if (!out->getHit(iData)) continue;
597
598 // see TGCcabling/TGCId.h (WD=0,SD,WT,ST,SI,WI). Same as TgcRawData
599 TgcRawData::SlbType type = (TgcRawData::SlbType)moduleType;
600 int subMat = iData % 4;
601 int seg = 0;
602 if (type==TgcRawData::SLB_TYPE_TRIPLET_STRIP ) {
603 if (iData<4) seg= 1;
604 // 13.Jan.2011 reversed by Hisaya
605 // because Layer swap in TGCStripTripletSB::doCoincidence()
606 } else if ( (type==TgcRawData::SLB_TYPE_INNER_WIRE ) ||
607 (type==TgcRawData::SLB_TYPE_INNER_STRIP) ) {
608 seg= iData/4;
609 }
610 std::unique_ptr<TgcRawData> rawdata(new TgcRawData(bcTag,
611 static_cast<uint16_t>(subDetectorId),
612 static_cast<uint16_t>(rodId),
613 static_cast<uint16_t>(sswId),
614 static_cast<uint16_t>(sbLoc),
615 l1Id, bcId,
616 type, out->getDev(iData), seg, subMat,
617 out->getPos(iData)));
618 addRawData(std::move(rawdata), tgcrdo);
619
620 // EIFI trigger bits for SL are filled.
621 if(isEIFI) {
622 bool setEIFITriggerBit =
623 m_innerTrackletSlotHolder.setTriggerBit(sector->getSideId(),
624 phiEIFI,
625 (isEndcap ?
626 TGCInnerTrackletSlot::EI : TGCInnerTrackletSlot::FI),
627 (type==TgcRawData::SLB_TYPE_INNER_WIRE ?
628 TGCInnerTrackletSlot::WIRE : TGCInnerTrackletSlot::STRIP),
629 static_cast<unsigned int>(subMat),
630 true);
631
632 if(!setEIFITriggerBit) {
633 ATH_MSG_INFO("Fail to set Inner trigger bit of"
634 << " sideId= " << sector->getSideId()
635 << " slotId= " << phiEIFI
636 << " region= " << (isEndcap ? "EI" : "FI")
637 << " readout= " << (type==TgcRawData::SLB_TYPE_INNER_WIRE ? "WIRE" : "STRIP")
638 << " subMat(iBit)= " << static_cast<unsigned int>(subMat) );
639 }
640 }
641
642 ATH_MSG_DEBUG(" recordRdoSLB : reg=" << (isEndcap ? "EC" : "FWD")
643 << " srod=" << rodId << " sswId=" << sswId
644 << " SBLoc=" << sbLoc << " type=" << itype
645 << " iData(subMat:seg)=" << iData << " pos="
646 << out->getPos(iData) << " dev=" << out->getDev(iData) );
647 }
648 // end of filling TgcRawData
649
650 } // end of loop over SB
651 } // end loop for SLB type
652}
653
656 TGCSector* sector,
657 std::map<std::pair<int, int>, std::unique_ptr<TgcRdo>>& tgcrdo)
658{
659 if(sector->hasHit() == false) return;
660
661 // readoutID
662 int subDetectorId{0}, rodId{0}, sswId{0}, sbLoc{0}, secId{0};
663
664 // get numbering scheme info from cabling svc
665 int startEndcapSector{0}, coverageOfEndcapSector{0};
666 int startForwardSector{0}, coverageOfForwardSector{0};
667 rodId = 1;
668 cabling.getCoveragefromSRodID(rodId,
669 startEndcapSector,
670 coverageOfEndcapSector,
671 startForwardSector,
672 coverageOfForwardSector
673 ) ;
674
675 uint16_t bcTag=m_CurrentBunchTag, l1Id=0, bcId=0;
676
677 // HPTID
678 bool isAside{false}, isEndcap{false}, isStrip{false};
679 int phi{0};
680 isAside = (sector->getSideId()==0);
681 isEndcap = (sector->getRegionType() == TGCRegionType::ENDCAP);
682 int module = sector->getModuleId();
683 // sector Id = 0..47 (Endcap) 0..23 (forward)
684 int sectorId{0};
685 if (isEndcap){
686 sectorId = ((module/3)*2+module%3) + sector->getOctantId()*6;
687 } else {
688 sectorId = (module/3) + sector->getOctantId()*3;
689 }
690 // secId for TgcRawData
691 // 0-3(EC), 0-1(FWD) for new TGCcabling (1/12sector)
692 // 0-5(EC), 0-2(FWD) for new TGCcabling (octant)
693 if (isEndcap){
694 secId = sectorId % coverageOfEndcapSector;
695 } else {
696 secId = sectorId % coverageOfForwardSector;
697 }
698 // phi=1-48(EC), 1-24(FWD) in detector ID scheme
699 phi = (isEndcap ? (sectorId+46)%48+1 : (sectorId+23)%24+1);
700
701 for(int itype=0; itype<2; itype++) { // loop over HPB type(wire/strip)
702 isStrip = (itype==0 ? 0 : 1); // 0=wire 1=strip
703 for(unsigned int ihpb=0; ihpb<sector->getNumberOfHPB(itype); ihpb++) { // loop over # of HPB per sector
704 TGCHighPtBoard * hpb = sector->getHPB(itype, ihpb);
705 if (0==hpb) continue;
706 TGCHighPtChipOut * out = hpb->getOutput();
707 if (0==out) continue;
708
709 // get ReadoutID
710 bool status = cabling.getReadoutIDfromHPTID(phi, isAside, isEndcap, isStrip, hpb->getId(),
711 subDetectorId, rodId, sswId, sbLoc);
712 if (!status) {
713 ATH_MSG_WARNING("TGCcablignSvc::getReadoutIDfromHPTID fails");
714 continue;
715 }
716
717 // loop over chip and candidate
718 for(int ichip=0; ichip<NumberOfChip; ichip++) { // NumberOfChip=2
719 for(int icand=0; icand<TGCHighPtChipOut::s_NHitInTrackSelector; icand++) {
720 if (!out->getSel(ichip, icand)) continue; // should be 1 or 2
721 int chip = ichip;
722 int index = ihpb;
723 int hitId = out->getHitID(ichip, icand);
724 cabling.getRDOHighPtIDfromSimHighPtID(!isEndcap, isStrip,
725 index, chip, hitId);
726 bool isHPT = out->getPt(ichip,icand)==PtHigh ? 1 : 0;
727 auto rawdata = std::make_unique<TgcRawData>(bcTag,
728 static_cast<uint16_t>(subDetectorId),
729 static_cast<uint16_t>(rodId),
730 l1Id,
731 bcId,
732 isStrip, (!isEndcap), secId, chip, icand,
733 isHPT, hitId,
734 out->getPos(ichip, icand),
735 out->getDev(ichip, icand),
736 0);
737 addRawData(std::move(rawdata), tgcrdo);
738
739 // Print
740 ATH_MSG_DEBUG( "recordRdoHPT : bdTag =" << bcTag
741 << " side=" << ( (isAside)? "A" : "C")
742 << (isEndcap ? "EC" : "FWD")
743 << " w/s=" << ( (isStrip)? "s" : "w")
744 << " id=" << hpb->getId()
745 << " ecId=" << secId
746 << " chip=" << ichip
747 << " cand=" << icand
748 << " block=" << out->getHitID(ichip, icand)
749 << " subMatrix=" << out->getPos(ichip, icand)
750 << " dev=" << out->getDev(ichip, icand)
751 << " srod=" << rodId << " sswId=" << sswId << " SBLoc=" << sbLoc );
752
753 // Strip HPT hit may be duplicated
754 if ( m_tgcArgs.SHPT_ORED() &&
755 isEndcap && isStrip &&
756 (chip==1) ) {
757 int oredId = -1;
758 if (hitId == 1) oredId = 5;
759 else if (hitId == 2) oredId = 6;
760 else if (hitId == 5) oredId = 1;
761 else if (hitId == 6) oredId = 2;
762 if (oredId >=0) {
763 auto rawdata2 = std::make_unique<TgcRawData>(bcTag,
764 static_cast<uint16_t>(subDetectorId),
765 static_cast<uint16_t>(rodId),
766 l1Id,
767 bcId,
768 isStrip, (!isEndcap), secId, chip, icand,
769 isHPT, oredId,
770 out->getPos(ichip, icand),
771 out->getDev(ichip, icand),
772 0);
773 addRawData(std::move(rawdata2), tgcrdo);
774 }
776
777 }
778
779 }
780 }
781 // end loop of candidate and chip
782
783 } // end loop for # of HPB per sector
784 } // end loop for HPB type
785}
786
787
790 TGCSector * sector,
791 std::map<std::pair<int, int>, std::unique_ptr<TgcRdo>>& tgcrdo)
792{
793 const bool isAside = sector->getSideId()==0;
794 const bool isEndcap = (sector->getRegionType() == TGCRegionType::ENDCAP);
795 if (!isEndcap) return;
796
797 //*** isEndcap must be true for the rest of this function. ***
798
799 // sector Id = 0..47, phi = 1..48
800 int module = sector->getModuleId();
801 int octant = sector->getOctantId();
802 int sectorId = ((module/3)*2+module%3) + octant*6;
803 int phi = (sectorId+46)%48+1;
804
805 // get readout ID
806 int subDetectorId=0, rodId=0, sswId=0, sbLoc=0;
807
808 bool status = cabling.getSReadoutIDfromSLID(phi, isAside, isEndcap,
809 subDetectorId, rodId, sswId, sbLoc);
810 if (!status) {
811 ATH_MSG_WARNING("TGCcablingSvc::ReadoutIDfromSLID fails in recordRdoInner()" );
812 return;
813 }
814
815 // secID for TGCRawData
816 // 0-3(EC), 0-1(FWD) for 1/12 sector
817 // 0-15(EC), 0-7(FWD) for 1/3 sector covered by SROD in RUn3
818 int startEndcapSector{0}, coverageOfEndcapSector{0};
819 int startForwardSector{0}, coverageOfForwardSector{0};
820 if (!cabling.getCoveragefromSRodID(rodId,
821 startEndcapSector,
822 coverageOfEndcapSector,
823 startForwardSector,
824 coverageOfForwardSector
825 ) )
826 {
827 ATH_MSG_WARNING("LVL1TGCTrigger::recordRdoInner --- bad rodId " << rodId );
828 return;
829 }
830
831 int secId = 0;
832 secId = sectorId % coverageOfEndcapSector;
833
834 uint16_t bcTag = m_CurrentBunchTag, l1Id = 0, bcId = 0;
835
836 // EIFI
838
839 const TGCInnerTrackletSlot* innerTrackletSlots[n_slots] = {0, 0, 0, 0};
840 m_innerTrackletSlotHolder.getInnerTrackletSlots(sector->getSideId(),
841 octant, module, innerTrackletSlots);
842
843 std::array<int, n_slots>inner_eifi;
844 m_innerTrackletSlotHolder.getInnerTrackletBits(innerTrackletSlots, inner_eifi);
845
846 for (int i_slot = 0; i_slot < n_slots; i_slot++) {
847 if (inner_eifi[i_slot] > 0) {
848 auto rawdata_eifi = std::make_unique<TgcRawData>(bcTag,
849 static_cast<uint16_t>(subDetectorId),
850 static_cast<uint16_t>(rodId),
851 l1Id,
852 bcId,
853 (!isEndcap),
854 secId, /*to be checked*/
855 static_cast<uint16_t>(inner_eifi[i_slot]),
856 0, /*fi*/
857 static_cast<uint16_t>(i_slot) /*chamber Id*/);
858 addRawData(std::move(rawdata_eifi), tgcrdo);
859 }
860 }
861
862 // Tile
863 int inner_tile = m_system->getTMDB()->getInnerTileBits(sector->getSideId(), sectorId);
864
865 if (inner_tile > 0) {
866 //TgcRawData * rawdata_tile = new TgcRawData(bcTag,
867 //std::shared_ptr<TgcRawData> rawdata_tile (
868 auto rawdata_tile = std::make_unique<TgcRawData>(bcTag,
869 static_cast<uint16_t>(subDetectorId),
870 static_cast<uint16_t>(rodId),
871 l1Id,
872 bcId,
873 (!isEndcap),
874 secId,
875 inner_tile,
876 0 /*bcid*/ );
877 addRawData(std::move(rawdata_tile), tgcrdo);
878 }
879
880 // NSW
881 TGCRegionType region = sector->getRegionType();
882 if ( m_USENSW ) {
883 std::shared_ptr<const LVL1TGC::NSWTrigOut> nsw_trigout = m_system->getNSW()->getOutput(region, !isAside, sectorId);
884 for ( int icand=0; icand<(int)nsw_trigout->getNSWeta().size(); icand++ ){
885 auto rawdata_nsw = std::make_unique<TgcRawData>(bcTag,
886 static_cast<uint16_t>(subDetectorId),
887 static_cast<uint16_t>(rodId),
888 l1Id,
889 bcId,
890 (!isEndcap),
891 static_cast<uint16_t>(secId), /*?*/
892 static_cast<uint16_t>(nsw_trigout->getNSWeta().at(icand)),
893 static_cast<uint16_t>(nsw_trigout->getNSWphi().at(icand)),
894 static_cast<uint16_t>(icand), //nswcand
895 static_cast<uint16_t>(nsw_trigout->getNSWDtheta().at(icand)),
896 0, //nswphires
897 0, //nswlowres
898 static_cast<uint16_t>(nsw_trigout->getNSWTriggerProcessor().at(icand)));
899 addRawData(std::move(rawdata_nsw), tgcrdo);
900 }
901 }
902
903 // RPC BIS78
904 if ( m_USEBIS78 ) {
905 std::shared_ptr<const LVL1TGC::BIS78TrigOut> bis78_trigout = m_system->getBIS78()->getOutput(sectorId);
906 for ( int icand=0; icand<(int)bis78_trigout->getBIS78eta().size(); icand++ ){
907 auto rawdata_bis78 = std::make_unique<TgcRawData>(bcTag,
908 static_cast<uint16_t>(subDetectorId),
909 static_cast<uint16_t>(rodId),
910 l1Id,
911 bcId,
912 (!isEndcap),
913 static_cast<uint16_t>(secId), /*?*/
914 static_cast<uint16_t>(bis78_trigout->getBIS78eta().at(icand)),
915 static_cast<uint16_t>(bis78_trigout->getBIS78phi().at(icand)),
916 static_cast<uint16_t>(icand),
917 static_cast<uint16_t>(bis78_trigout->getBIS78Deta().at(icand)),
918 static_cast<uint16_t>(bis78_trigout->getBIS78Dphi().at(icand)));
919 addRawData(std::move(rawdata_bis78), tgcrdo);
920 }
921 }
922}
923
926 TGCSector* sector,
927 std::map<std::pair<int, int>, std::unique_ptr<TgcRdo>>& tgcrdo)
928{
929 // check if whether trigger output exists or not
930 std::shared_ptr<TGCTrackSelectorOut> selectorOut;
931 sector->getSL()->getTrackSelectorOutput(selectorOut);
932
933 if (selectorOut == nullptr) return;
934 if (selectorOut->getNCandidate() == 0) return;
935
936 // trigger info
937 // bool cand3plus = 0;
938 bool isEndcap = (sector->getRegionType() == TGCRegionType::ENDCAP);
939 bool isAside = (sector->getSideId()==0);
940 bool veto=0;
941 int phi=0, index=0, threshold=0, roi=0;
942 int Zdir= (isAside) ? 1 : -1;
943
944 // sector Id = 0..47 (Endcap) 0..23 (forward)
945 int module = sector->getModuleId();
946 int sectorId;
947 if (isEndcap){
948 sectorId = ((module/3)*2+module%3) + sector->getOctantId()*6;
949 } else {
950 sectorId = (module/3) + sector->getOctantId()*3;
951 }
952
953 // secID for TGCRawData
954 // 0-3(EC), 0-1(FWD) for new TGCcabling (1/12sector)
955 // 0-5(EC), 0-2(FWD) for new TGCcabling (octant)
956 int startEndcapSector{0}, coverageOfEndcapSector{0};
957 int startForwardSector{0}, coverageOfForwardSector{0};
958 int rodId = 1;
959 cabling.getCoveragefromSRodID(rodId,
960 startEndcapSector,
961 coverageOfEndcapSector,
962 startForwardSector,
963 coverageOfForwardSector
964 ) ;
965 int secId = 0;
966 if (isEndcap){
967 secId = sectorId % coverageOfEndcapSector;
968 } else {
969 secId = sectorId % coverageOfForwardSector;
970 }
971
972 // phi=1-48(EC), 1-24(FWD) in detector ID scheme
973 phi = (isEndcap ? (sectorId+46)%48+1 : (sectorId+23)%24+1);
974
975 // get readout ID
976 int subDetectorId = 0, sswId = 0, sbLoc = 0;
977 bool status = cabling.getSReadoutIDfromSLID(phi, isAside, isEndcap,
978 subDetectorId, rodId, sswId, sbLoc);
979 if (!status) {
980 ATH_MSG_WARNING("TGCcablignSvc::ReadoutIDfromSLID fails"
981 << (isEndcap ? " Endcap-" : " Forward-")
982 << (isAside ? "A " : "C ")
983 << " phi=" << phi );
984 return;
985 }
986
987 // bool overlap = 0;
988 int inner=0, coinFlag=0;
989 uint16_t bcTag=m_CurrentBunchTag, l1Id=0, bcId=0;
990 for (unsigned int icand=0; icand < (unsigned int)selectorOut->getNCandidate(); ++icand) {
991 index=icand;
992 bool muplus = getCharge(selectorOut->getDR(icand), Zdir)==1 ? 1 : 0;
993 threshold = selectorOut->getPtLevel(icand);
994 roi = ((selectorOut->getR(icand))<<2)+(selectorOut->getPhi(icand));
995 if (selectorOut->getInnerVeto(icand)) veto = 1;
996 else veto = 0;
997
998 inner = selectorOut->getInnerCoincidenceFlag(icand);
999 coinFlag = selectorOut->getCoincidenceType(icand);
1000
1001 // create TgcRawData
1002 auto rawdata = std::make_unique<TgcRawData>(bcTag,
1003 static_cast<uint16_t>(subDetectorId),
1004 static_cast<uint16_t>(rodId),
1005 l1Id,
1006 bcId,
1007 (!isEndcap), secId,
1008 inner,
1009 coinFlag,
1010 muplus, threshold, roi);
1011 addRawData(std::move(rawdata), tgcrdo);
1012
1013 ATH_MSG_DEBUG("recordRdoSL : bcTag =" << bcTag
1014 << " side=" << (isAside ? "A " : "C ")
1015 << " reg=" << (isEndcap ? "EC" : "FWD")
1016 << " phi=" << phi
1017 << " cand=" << index
1018 << " charge=" << (muplus ? "mu+" : "mu-")
1019 << " thre=" << threshold
1020 << " veto=" << veto
1021 << " roi=" << roi
1022 << " srod=" << rodId << " sswId=" << sswId << " SBLoc=" << sbLoc
1023 << " inner=" << inner << " coinFlag=" << coinFlag );
1024 }
1025 }
1026
1028// Mask=0/Fire=1
1030 std::string fname=m_MaskFileName12.value();
1031 if (fname.empty()) return StatusCode::SUCCESS;
1032
1033 std::string fullName = PathResolver::find_file (fname, "PWD");
1034 if( fullName.empty())
1035 fullName = PathResolver::find_file (fname, "DATAPATH");
1036
1037 std::ifstream fin(fullName.c_str());
1038 if (!fin) {
1039 ATH_MSG_FATAL("Cannot open file " << (fullName.empty() ? fname : fullName));
1040 return StatusCode::FAILURE;
1041 } else {
1042 ATH_MSG_INFO("Use mask file : " << fullName);
1043 }
1044 // read database ------------------------------------------------------------------------------
1045 std::vector<std::string> mask;
1046 std::string aLine;
1047 while(getline(fin,aLine)) {
1048 if (aLine.compare(0,3,"///")!=0) break;
1049 }
1050 int id_type = atoi(aLine.c_str());
1051 while(getline(fin,aLine)) {
1052 if (!aLine.empty()) mask.push_back(aLine);
1053 }
1054 fin.close();
1055
1056 //
1057 std::vector<int> ids;
1058 Identifier ID;
1059 int nmasked=0, nfired=0;
1060 for(int ich=0; ich<(int)mask.size(); ich++) {
1061 std::string ch = mask[ich];
1062 extractFromString(ch, ids);
1063 int OnOff=ids[0]; // 0=off(masked) 1=on(fired)
1064 //
1065 if (id_type==1 && ids.size()==8) { // online
1066 int sysno1 = (ids[1]==-99 ? -1 : ids[1]); int sysno2=(ids[1]==-99 ? 1 : ids[1]);// -1(B) 1(F)
1067 int octno1 = (ids[2]==-99 ? 0 : ids[2]); int octno2=(ids[2]==-99 ? 7 : ids[2]);
1068 for(int sysno=sysno1; sysno<=sysno2; sysno+=2) {
1069 for(int octno=octno1; octno<=octno2; octno++) {
1070 bool status = cabling.getOfflineIDfromOnlineID(ID,sysno,octno,
1071 ids[3],ids[4],ids[5],ids[6],ids[7]);
1072 ATH_MSG_VERBOSE( (OnOff==0 ? "Mask" : "Fire") << " : offlineID=" << ID
1073 << " sys=" << sysno << " oct=" << octno << " modno=" << ids[3]
1074 << " layerno=" << ids[4] << " rNumber=" << ids[5]
1075 << " strip=" << ids[6] << " chno=" << ids[7] );
1076
1077 if (!status) {
1078 ATH_MSG_WARNING("This onlineID is not valid and cannot be converted to offline ID." );
1079 ATH_MSG_WARNING("sys=" << sysno << " oct=" << octno << " modno=" << ids[3]
1080 << " layerno=" << ids[4] << " rNumber=" << ids[5]
1081 << " strip=" << ids[6] << " chno=" << ids[7] );
1082 } else {
1083 m_MaskedChannel.insert(std::map<Identifier, int>::value_type(ID, OnOff));
1084 if (OnOff==0) nmasked+=1;
1085 else if (OnOff==1) nfired+=1;
1086 }
1087 }
1088 }
1089
1090 } else if (id_type==2 && ids.size()==6) { // readout id
1091 int sysno1 = (ids[1]==-99 ? 103 : ids[1]); int sysno2=(ids[1]==-99 ? 104 : ids[1]);// 103(F), 104(B)
1092 int octno1 = (ids[2]==-99 ? 0 : ids[2]); int octno2=(ids[2]==-99 ? 7 : ids[2]);
1093 for(int sysno=sysno1; sysno<=sysno2; sysno+=1) {
1094 for(int octno=octno1; octno<=octno2; octno++) {
1095 bool status = cabling.getOfflineIDfromReadoutID(ID, sysno,octno,ids[3],ids[4],ids[5]);
1096 ATH_MSG_VERBOSE( (OnOff==0 ? "Mask" : "Fire") << " : offlineID=" << ID
1097 << " subdetectorID=" << sysno << " rodId=" << octno << " sswID=" << ids[3]
1098 << " SBLoc=" << ids[4] << " channelId=" << ids[5] );
1099 if (!status) {
1100 ATH_MSG_WARNING("This readoutID is not valid and cannot be converted to offline ID " );
1101 ATH_MSG_WARNING("subdetectorID=" << sysno << " rodId=" << octno << " sswID=" << ids[3]
1102 << " SBLoc=" << ids[4] << " channelId=" << ids[5] );
1103 } else {
1104 m_MaskedChannel.insert(std::map<Identifier, int>::value_type(ID, OnOff));
1105 if (OnOff==0) nmasked+=1;
1106 else if (OnOff==1) nfired+=1;
1107 }
1108 }
1109 }
1110
1111 } else if (id_type==3 && ids.size()==2) { // offline id
1112 ID = Identifier((unsigned int)ids[1]);
1113 ATH_MSG_DEBUG((OnOff==0 ? "Mask" : "Fire") << " : offlineID=" << ID);
1114 m_MaskedChannel.insert(std::map<Identifier, int>::value_type(ID, OnOff));
1115 if (OnOff==0) nmasked+=1;
1116 else if (OnOff==1) nfired+=1;
1117
1118 } else {
1119 ATH_MSG_INFO("Invalid input. Idtype or number of parameters are invalid: idtype=" << id_type
1120 << " number of elements = " << ids.size() );
1121 return StatusCode::FAILURE;
1122 }
1123 }
1124 //
1125 ATH_MSG_INFO("Total number of masked channels ... " << nmasked);
1126 ATH_MSG_INFO("Total number of fired channels ... " << nfired);
1127 //
1128 return StatusCode::SUCCESS;
1129}
1130
1133 if (m_bsMetaDataContRHKey.key().empty()) return StatusCode::SUCCESS;
1134
1135 ATH_MSG_DEBUG("Retrieving Detector Mask from ByteStream metadata container");
1137 if (bsmdc.isValid() && !bsmdc->empty()) {
1138 const ByteStreamMetadata* metadata = bsmdc->front();
1139 uint64_t detMaskLeast = metadata->getDetectorMask();
1140 uint64_t detMaskMost = metadata->getDetectorMask2();
1141
1142 std::vector<eformat::SubDetector> subDetOff;
1143 eformat::helper::DetectorMask(~detMaskLeast, ~detMaskMost).sub_detectors(subDetOff);
1144 auto sideA = std::find_if(subDetOff.begin(), subDetOff.end(), [](const eformat::SubDetector &s) {
1145 return (s == eformat::MUON_MMEGA_ENDCAP_A_SIDE || s == eformat::MUON_STGC_ENDCAP_A_SIDE); });
1146 auto sideC = std::find_if(subDetOff.begin(), subDetOff.end(), [](const eformat::SubDetector &s) {
1147 return (s == eformat::MUON_MMEGA_ENDCAP_C_SIDE || s == eformat::MUON_STGC_ENDCAP_C_SIDE); });
1148
1149 if (sideA != std::end(subDetOff)) tgcArgs()->set_NSWSideInfo(m_NSWSideInfo.value().erase(0,1));
1150 else if (sideC != std::end(subDetOff)) tgcArgs()->set_NSWSideInfo(m_NSWSideInfo.value().erase(1,1));
1151 else if (sideA != std::end(subDetOff) && sideC != std::end(subDetOff)) tgcArgs()->set_NSWSideInfo("");
1152 }
1153 return StatusCode::SUCCESS;
1154}
1155
1157void LVL1TGCTrigger::extractFromString(const std::string& str, std::vector<int> & v) {
1158 v.clear();
1159 if (str.empty()) return;
1160 std::string line=str;
1161 while(1) {
1162 if (line.empty()) break;
1163 int i = line.find(' ');
1164 if (i==(int)std::string::npos && !line.empty()) {
1165 v.push_back(atoi(line.c_str()));
1166 break;
1167 }
1168 std::string temp = line;
1169 temp.erase(i,line.size());
1170 v.push_back(atoi(temp.c_str()));
1171 line.erase(0,i+1);
1172 }
1173}
1174
1176int LVL1TGCTrigger::getCharge(int dR, int /*Zdir*/) {
1177 // old scheme
1178 // if (dR==0) return (Zdir>0 ? -1 : 1);
1179 // return (dR*Zdir>0 ? 1 : -1);
1180 return (dR >=0 ? 1 : -1 );
1181}
1182
1184// see TGCNumbering.h
1186{
1187 switch(type) {
1188 case WTSB :
1190 case WDSB :
1192 case STSB :
1194 case SDSB :
1196 case WISB :
1198 case SISB :
1200 default :
1201 return -1;
1202 }
1203}
1204
1206 bool LVL1TGCTrigger::addRawData(std::unique_ptr<TgcRawData> rawdata,
1207 std::map<std::pair<int, int>, std::unique_ptr<TgcRdo>>& tgcrdo)
1208{
1209 ATH_MSG_DEBUG("addRawData() is called.");
1210 std::pair<int, int> subDetectorRod(rawdata->subDetectorId(), rawdata->rodId());
1211 std::map<std::pair<int, int>, std::unique_ptr<TgcRdo>>::iterator itRdo = tgcrdo.find(subDetectorRod);
1212
1213 if (itRdo==tgcrdo.end()) {
1214 // in case TgcRdo with the given subDetectorId and rodId is
1215 // not registered yet, create new TgcRdo and add rawdata to it
1216 auto thisRdo = std::make_unique<TgcRdo>(rawdata->subDetectorId(), rawdata->rodId(), rawdata->bcId(), rawdata->l1Id());
1217 thisRdo->push_back(std::move(rawdata));
1218 tgcrdo.insert(std::map<std::pair<int, int>, std::unique_ptr<TgcRdo>>::value_type(subDetectorRod, std::move(thisRdo)));
1219 } else {
1220 itRdo->second->push_back(std::move(rawdata));
1221 }
1222 return true;
1223}
1224} // end of namespace
1225
Scalar phi() const
phi method
#define endmsg
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_FATAL(x)
#define ATH_MSG_INFO(x)
#define ATH_MSG_VERBOSE(x)
#define ATH_MSG_WARNING(x)
#define ATH_MSG_DEBUG(x)
std::vector< Identifier > ID
This file defines the class for a collection of AttributeLists where each one is associated with a ch...
static Double_t sc
if(febId1==febId2)
uint16_t bcId(uint32_t data)
unsigned bcTag(unsigned bcBitMap)
AthAlgorithm(const std::string &name, ISvcLocator *pSvcLocator)
Constructor with parameters:
Header file for AthHistogramAlgorithm.
This class is the StoreGate data object for bytestream metadata.
const_iterator end() const
return const_iterator for end of container
size_t size() const
Duplicate of fullSize for backwards compatability.
const_iterator begin() const
return const_iterator for first entry
Class representing (part of) the input data to the MuCTPI for Phase 1.
void setSectorLogicData(const Lvl1MuSectorLogicDataPhase1 &data, size_t systemAddress, size_t subSystemAddress, size_t sectorAddress, int bcid=0)
Class representing data from an endcap SL board.
Base class for the data coming from one SL board.
std::map< Identifier, int > m_MaskedChannel
mask channel map
void recordRdoSLB(const Muon::TgcCablingMap &cabling, TGCSector *, std::map< std::pair< int, int >, std::unique_ptr< TgcRdo > > &)
TGCInnerTrackletSlotHolder m_innerTrackletSlotHolder
SG::ReadHandleKey< Muon::NSW_TrigRawDataContainer > m_keyNSWTrigOut
virtual StatusCode execute() override
void recordRdoHPT(const Muon::TgcCablingMap &cabling, TGCSector *, std::map< std::pair< int, int >, std::unique_ptr< TgcRdo > > &)
virtual StatusCode start() override
SG::ReadHandleKey< Muon::RpcBis78_TrigRawDataContainer > m_keyBIS78TrigOut
SG::ReadHandleKey< TgcDigitContainer > m_keyTgcDigit
SG::ReadCondHandleKey< TGCTriggerLUTs > m_readLUTs_CondKey
void recordRdoSL(const Muon::TgcCablingMap &cabling, TGCSector *, std::map< std::pair< int, int >, std::unique_ptr< TgcRdo > > &)
SG::ReadCondHandleKey< Muon::TgcCablingMap > m_cablingKey
void recordRdoInner(const Muon::TgcCablingMap &cabling, TGCSector *, std::map< std::pair< int, int >, std::unique_ptr< TgcRdo > > &)
SG::ReadHandleKey< TgcRdoContainer > m_keyTgcRdoIn
SG::ReadHandleKey< TileMuonReceiverContainer > m_keyTileMu
ShortProperty m_CurrentBunchTag
property, see LVL1TGCTrigger::LVL1TGCTrigger
virtual StatusCode finalize() override
StatusCode processOneBunch(const Muon::TgcCablingMap &cabling, const TgcDigitContainer *, LVL1MUONIF::Lvl1MuCTPIInputPhase1 *, std::map< std::pair< int, int >, std::unique_ptr< TgcRdo > > &)
virtual StatusCode initialize() override
SG::ReadCondHandleKey< TGCTriggerData > m_readCondKey
void extractFromString(const std::string &, std::vector< int > &)
SG::WriteHandleKey< TgcRdoContainer > m_keyTgcRdo
LVL1TGCTrigger(const std::string &name, ISvcLocator *pSvcLocator)
standard constructor and destructor for algorithms
SG::WriteHandleKey< LVL1MUONIF::Lvl1MuCTPIInputPhase1 > m_muctpiPhase1Key
SG::ReadHandleKey< ByteStreamMetadataContainer > m_bsMetaDataContRHKey
bool addRawData(std::unique_ptr< TgcRawData > rawdata, std::map< std::pair< int, int >, std::unique_ptr< TgcRdo > > &tgcrdo)
void fillTGCEvent(const Muon::TgcCablingMap &cabling, const std::map< Identifier, int > &, TGCEvent &)
std::unique_ptr< TGCElectronicsSystem > m_system
StringProperty m_MaskFileName12
property, see LVL1TGCTrigger::LVL1TGCTrigger
BooleanProperty m_OutputTgcRDO
property, see LVL1TGCTrigger::LVL1TGCTrigger
StatusCode getMaskedChannel(const Muon::TgcCablingMap &cabling)
void FillSectorLogicData(LVL1MUONIF::Lvl1MuSectorLogicDataPhase1 *sldata, const TGCTrackSelectorOut *trackSelectorOut)
void doMaskOperation(const TgcDigitContainer *, std::map< Identifier, int > &)
std::unique_ptr< TGCTimingManager > m_TimingManager
const TGCReadoutIndex & GetTGCReadoutIndex() const
Definition TGCASDOut.h:33
TGCSignalType GetSignalType() const
Definition TGCASDOut.h:34
double GetHitToF() const
Definition TGCASDOut.h:37
static constexpr int s_NHitInTrackSelector
TGCZDirection GetZDirection() const
void setInnerTrackletSlots(const TGCInnerTrackletSlot *innerTrackletSlots[])
void getTrackSelectorOutput(std::shared_ptr< TGCTrackSelectorOut > &trackSelectorOut) const
TGCHighPtBoard * getHPB(int type, int index) const
Definition TGCSector.h:147
TGCRegionType getRegionType() const
Definition TGCSector.h:169
TGCSectorLogic * getSL()
Definition TGCSector.h:65
unsigned int getNumberOfHPB(int type) const
Definition TGCSector.h:164
LVL1TGC::TGCSide getSideId() const
Definition TGCSector.h:75
static std::string find_file(const std::string &logical_file_name, const std::string &search_path)
StatusCode record(std::unique_ptr< T > data)
Record a const object to the store.
pointer_type ptr()
Dereference the pointer.
bool isActive(int cwtype) const
Use IdentifiableContainer with TgcDigitCollection.
@ BC_CURRENT
Definition TgcDigit.h:37
@ BC_PREVIOUS
Definition TgcDigit.h:37
@ BC_NEXTNEXT
Definition TgcDigit.h:37
An unit object of TGC ROD output.
Definition TgcRawData.h:23
@ SLB_TYPE_TRIPLET_WIRE
Definition TgcRawData.h:34
@ SLB_TYPE_INNER_WIRE
Definition TgcRawData.h:36
@ SLB_TYPE_TRIPLET_STRIP
Definition TgcRawData.h:35
@ SLB_TYPE_INNER_STRIP
Definition TgcRawData.h:37
@ SLB_TYPE_DOUBLET_STRIP
Definition TgcRawData.h:33
@ SLB_TYPE_DOUBLET_WIRE
Definition TgcRawData.h:32
uint16_t rodId() const
Definition TgcRdo.h:138
uint16_t subDetectorId() const
Definition TgcRdo.h:134
std::vector< std::string > veto
these patterns are anded
Definition listroot.cxx:191
const int NumberOfChip
TGCSide
The sides of TGC (A- or C-side)
const T * get(const ReadCondHandleKey< T > &key, const EventContext &ctx)
Convenience function to retrieve an object given a ReadCondHandleKey.
SG::ReadCondHandle< T > makeHandle(const SG::ReadCondHandleKey< T > &key, const EventContext &ctx=Gaudi::Hive::currentContext())
Definition index.py:1