diff --git a/Trigger/TrigT1/TrigT1TGC/TrigT1TGC/LVL1TGCTrigger.h b/Trigger/TrigT1/TrigT1TGC/TrigT1TGC/LVL1TGCTrigger.h index f0e5c20cb8eff382b8de49f459ff943106ffcb41..2da3574a105fa47d21b466e220b5d65eb4138c73 100644 --- a/Trigger/TrigT1/TrigT1TGC/TrigT1TGC/LVL1TGCTrigger.h +++ b/Trigger/TrigT1/TrigT1TGC/TrigT1TGC/LVL1TGCTrigger.h @@ -114,7 +114,7 @@ namespace LVL1TGCTrigger { void recordRdoInner(TGCSector *); // record bare-RDO for R-phi coincidences (on m_OutputTgcRDO=True): - void recordRdoSL(TGCSector *, unsigned int ); + void recordRdoSL(TGCSector *); std::map<std::pair<int, int>, TgcRdo*> m_tgcrdo; @@ -130,7 +130,7 @@ namespace LVL1TGCTrigger { bool addRawData(TgcRawData *); int getLPTTypeInRawData(int type); void FillSectorLogicData(LVL1MUONIF::Lvl1MuSectorLogicData* sldata, - const TGCSLSelectorOut *selectorOut, + const TGCSLSelectorOut* out, unsigned int subsystem); void FillSectorLogicData(LVL1MUONIF::Lvl1MuSectorLogicDataPhase1* sldata, const TGCTrackSelectorOut *trackSelectorOut); diff --git a/Trigger/TrigT1/TrigT1TGC/TrigT1TGC/TGCSLSelector.h b/Trigger/TrigT1/TrigT1TGC/TrigT1TGC/TGCSLSelector.h index 7e00e886906186a7a33fe67ddcee8eeb2003938f..5e436d92824a1ef887af1bdaad4a6aee8e684a88 100644 --- a/Trigger/TrigT1/TrigT1TGC/TrigT1TGC/TGCSLSelector.h +++ b/Trigger/TrigT1/TrigT1TGC/TrigT1TGC/TGCSLSelector.h @@ -1,9 +1,11 @@ /* - Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration + Copyright (C) 2002-2021 CERN for the benefit of the ATLAS collaboration */ -#ifndef TGCSLSelector_hh -#define TGCSLSelector_hh +#ifndef TrigT1TGC_TGCSLSelector_h +#define TrigT1TGC_TGCSLSelector_h + +#include <memory> namespace LVL1TGCTrigger { @@ -11,21 +13,19 @@ class TGCSectorLogic; class TGCSLSelectorOut; class TGCSLPreSelectorOut; -class TGCSLSelector { -public: - +class TGCSLSelector +{ + public: TGCSLSelector(const TGCSectorLogic* sL=0); - virtual ~TGCSLSelector(){} + virtual ~TGCSLSelector(); - TGCSLSelectorOut* select(TGCSLPreSelectorOut* PSOut, TGCSLSelectorOut* out); - -private: + bool select(TGCSLPreSelectorOut* in, std::shared_ptr<TGCSLSelectorOut> out); + private: const TGCSectorLogic* m_sectorLogic; - }; -} //end of namespace bracket +} // end of namespace -#endif // TGCSLSelector_hh +#endif diff --git a/Trigger/TrigT1/TrigT1TGC/TrigT1TGC/TGCSLSelectorOut.h b/Trigger/TrigT1/TrigT1TGC/TrigT1TGC/TGCSLSelectorOut.h index 041f580ae5b0aa047107ab2ca5c1badd47b62ac1..56e0fbd91f7de45b2ec62bcb202760b5850f0f17 100644 --- a/Trigger/TrigT1/TrigT1TGC/TrigT1TGC/TGCSLSelectorOut.h +++ b/Trigger/TrigT1/TrigT1TGC/TrigT1TGC/TGCSLSelectorOut.h @@ -13,6 +13,8 @@ class TGCSLSelectorOut static constexpr int s_NCandidateInSLSelector = 2; public: + void reset(); + void setPtLevel(int order, int ptLevel); void setR(int order, int rIn) { m_r[order]=rIn;}; void setPhi(int order, int phiIn) {m_phi[order]=phiIn;}; diff --git a/Trigger/TrigT1/TrigT1TGC/TrigT1TGC/TGCSectorLogic.h b/Trigger/TrigT1/TrigT1TGC/TrigT1TGC/TGCSectorLogic.h index 0ae0faf5c14fac551333e04a1e68227db514d717..8afb4b341e2e54e12c30dc02ba7255fbde7ad7b8 100644 --- a/Trigger/TrigT1/TrigT1TGC/TrigT1TGC/TGCSectorLogic.h +++ b/Trigger/TrigT1/TrigT1TGC/TrigT1TGC/TGCSectorLogic.h @@ -54,16 +54,14 @@ class TGCSectorLogic TGCSectorLogic(const TGCSectorLogic& right); - const TGCSLSelectorOut* getSelectorOutput() const { return m_selectorOut; } - void getTrackSelectorOutput(std::shared_ptr<TGCTrackSelectorOut> &trackSelectorOut)const ; + const TGCSLSelectorOut* getSelectorOutput() const { return m_selectorOut.get(); } + void getTrackSelectorOutput(std::shared_ptr<TGCTrackSelectorOut> &trackSelectorOut) const; int getTileMuonWord() const; int getInnerStationWord() const; - void eraseSelectorOut(); - void clockIn(const SG::ReadCondHandleKey<TGCTriggerData> readCondKey, - int bidIn); + int bidIn, bool process=true); int getId() const; int getModuleID() const; @@ -80,7 +78,7 @@ class TGCSectorLogic void setTMDB(const TGCTMDB* tmdb); void setNSW(std::shared_ptr<const TGCNSW> nsw); - void showResult(TGCSLSelectorOut* out); + void showResult(); int getNumberOfSubSectorCluster() const; int getNumberOfSubSector() const; @@ -144,7 +142,7 @@ private: // for Run2 TGCSLPreSelector m_preSelector; TGCSLSelector m_selector; - TGCSLSelectorOut* m_selectorOut; + std::shared_ptr<TGCSLSelectorOut> m_selectorOut; // for Run3 TGCTrackSelector m_trackSelector; diff --git a/Trigger/TrigT1/TrigT1TGC/src/LVL1TGCTrigger.cxx b/Trigger/TrigT1/TrigT1TGC/src/LVL1TGCTrigger.cxx index e8227f4b7b9ee0b69b5d6afa84b8f7bf8fb1a000..ca058158562cec3fc4266fe9d78f59f86da8ed5c 100644 --- a/Trigger/TrigT1/TrigT1TGC/src/LVL1TGCTrigger.cxx +++ b/Trigger/TrigT1/TrigT1TGC/src/LVL1TGCTrigger.cxx @@ -299,35 +299,35 @@ namespace LVL1TGCTrigger { TGCSector* sector = m_system->getSector(i,j,k); if(sector==0) continue; - if((sector->hasHit())){ - m_TimingManager->startHighPtBoard(sector); - if (m_OutputTgcRDO.value()) recordRdoHPT(sector); + m_TimingManager->startHighPtBoard(sector); + if (m_OutputTgcRDO.value()) recordRdoHPT(sector); - // EIFI trigger bits are checked if Endcap - if(sector->getRegionType()==Endcap && sector->getSL()) { + // EIFI trigger bits are checked if Endcap + if(sector->getRegionType()==Endcap && sector->getSL()) { + if((sector->hasHit())){ // Pointers to store EIFI trigger bits for Endcap SL const TGCInnerTrackletSlot* innerTrackletSlots[TGCInnerTrackletSlotHolder::NUMBER_OF_SLOTS_PER_TRIGGER_SECTOR] = {0, 0, 0, 0}; m_innerTrackletSlotHolder.getInnerTrackletSlots(i, j, k, innerTrackletSlots); sector->getSL()->setInnerTrackletSlots(innerTrackletSlots); } - - m_TimingManager->startSectorLogic(sector); - sector->clearNumberOfHit(); } + m_TimingManager->startSectorLogic(sector); + if(sector->hasHit()) sector->clearNumberOfHit(); // Fill inner (EIFI/Tile) words if (m_OutputTgcRDO.value() && m_tgcArgs.USE_INNER()) recordRdoInner(sector); // Fill Lvl1MuCTPInput + if (m_OutputTgcRDO.value()) recordRdoSL(sector); + size_t tgcsystem=0,subsystem=0; if(i==0) subsystem = LVL1MUONIF::Lvl1MuCTPIInput::idSideA(); if(i==1) subsystem = LVL1MUONIF::Lvl1MuCTPIInput::idSideC(); - if (m_OutputTgcRDO.value()) recordRdoSL(sector, subsystem); const TGCSLSelectorOut* selectorOut = sector->getSL()->getSelectorOutput(); std::shared_ptr<TGCTrackSelectorOut> trackSelectorOut; - sector->getSL()->getTrackSelectorOutput(trackSelectorOut); + sector->getSL()->getTrackSelectorOutput(trackSelectorOut); if(sector->getRegionType()==Endcap){ if(m_tgcArgs.useRun3Config()){ @@ -338,7 +338,7 @@ namespace LVL1TGCTrigger { }else{ LVL1MUONIF::Lvl1MuEndcapSectorLogicData sldata; tgcsystem = LVL1MUONIF::Lvl1MuCTPIInput::idEndcapSystem(); - if(selectorOut!=0) FillSectorLogicData(&sldata,selectorOut,subsystem); + if(selectorOut!=0) FillSectorLogicData(&sldata, selectorOut, subsystem); muctpiinput->setSectorLogicData(sldata,tgcsystem,subsystem,sectoraddr_endcap++,muctpiBcId); } } else if(sector->getRegionType()==Forward){ @@ -350,19 +350,12 @@ namespace LVL1TGCTrigger { }else{ LVL1MUONIF::Lvl1MuForwardSectorLogicData sldata; tgcsystem = LVL1MUONIF::Lvl1MuCTPIInput::idForwardSystem(); - if(selectorOut!=0) FillSectorLogicData(&sldata,selectorOut,subsystem); + if(selectorOut!=0) FillSectorLogicData(&sldata, selectorOut, subsystem); muctpiinput->setSectorLogicData(sldata,tgcsystem,subsystem,sectoraddr_forward++,muctpiBcId); } } - //** Selector in Run2 - // delete selectorOut - sector->getSL()->eraseSelectorOut(); - if (selectorOut != 0 ) delete selectorOut; - selectorOut=0; - //** Selector in Run3 - // delete selectorOut trackSelectorOut.get()->reset(); @@ -499,61 +492,61 @@ namespace LVL1TGCTrigger { } } - //////////////////////////////////////////////////////// - void LVL1TGCTrigger::FillSectorLogicData(LVL1MUONIF::Lvl1MuSectorLogicData *sldata, - const TGCSLSelectorOut* selectorOut, unsigned int subsystem) - { - if(selectorOut ==0) return; - int Zdir= (subsystem==LVL1MUONIF::Lvl1MuCTPIInput::idSideA() ? 1 : -1); +//////////////////////////////////////////////////////// +void LVL1TGCTrigger::FillSectorLogicData(LVL1MUONIF::Lvl1MuSectorLogicData *sldata, + const TGCSLSelectorOut* out, unsigned int subsystem) +{ + if(out == nullptr) return; + int Zdir= (subsystem==LVL1MUONIF::Lvl1MuCTPIInput::idSideA() ? 1 : -1); - sldata->clear2candidatesInSector();// for temporary + sldata->clear2candidatesInSector(); // clear >2 candidates bit at first. - const int muctpiBcId_offset = TgcDigit::BC_CURRENT; - sldata->bcid(m_bctagInProcess - muctpiBcId_offset); + const int muctpiBcId_offset = TgcDigit::BC_CURRENT; + sldata->bcid(m_bctagInProcess - muctpiBcId_offset); - if ((selectorOut->getNCandidate()) >= 1) { - sldata->roi(0,((selectorOut->getR(0))<<2)+(selectorOut->getPhi(0))); + if ((out->getNCandidate()) >= 1) { + sldata->roi(0, ((out->getR(0))<<2)+(out->getPhi(0))); // ovl --> veto // sldata->ovl(0,0); - if (selectorOut->getInnerVeto(0)) sldata->ovl(0,1); + if (out->getInnerVeto(0)) sldata->ovl(0,1); else sldata->ovl(0,0); - sldata->pt(0,selectorOut->getPtLevel(0)); - sldata->charge(0, getCharge(selectorOut->getDR(0),Zdir)); - } else { + sldata->pt(0, out->getPtLevel(0)); + sldata->charge(0, getCharge(out->getDR(0),Zdir)); + } else { // no entry - } - if ((selectorOut->getNCandidate()) == 2) { - sldata->roi(1,((selectorOut->getR(1))<<2)+(selectorOut->getPhi(1))); + } + if ((out->getNCandidate()) == 2) { + sldata->roi(1, ((out->getR(1))<<2)+(out->getPhi(1))); // ovl --> veto // sldata->ovl(1,0); - if (selectorOut->getInnerVeto(1)) sldata->ovl(1,1); + if (out->getInnerVeto(1)) sldata->ovl(1,1); else sldata->ovl(1,0); - sldata->pt(1,selectorOut->getPtLevel(1)); - sldata->charge(1, getCharge(selectorOut->getDR(1),Zdir)); - } - sldata->set2candidates(0);// not used for TGC - sldata->clear2candidates(0);// not used for TGC - sldata->set2candidates(1);// not used for TGC - sldata->clear2candidates(1);// not used for TGC + sldata->pt(1, out->getPtLevel(1)); + sldata->charge(1, getCharge(out->getDR(1), Zdir)); + } + sldata->set2candidates(0);// not used for TGC + sldata->clear2candidates(0);// not used for TGC + sldata->set2candidates(1);// not used for TGC + sldata->clear2candidates(1);// not used for TGC - // Print - if(m_debuglevel) { - if ((selectorOut->getNCandidate()) >= 1) { + // Print + if(m_debuglevel) { + if ((out->getNCandidate()) >= 1) { ATH_MSG_DEBUG( "SectorLogic: 1st candidate " - << " roi:" << (selectorOut->getR(0))<<2 + selectorOut->getPhi(0) - << " pt:" << selectorOut->getPtLevel(0) - << " charge:" << getCharge(selectorOut->getDR(0),Zdir) + << " roi:" << (out->getR(0))<<2 + out->getPhi(0) + << " pt:" << out->getPtLevel(0) + << " charge:" << getCharge(out->getDR(0),Zdir) << " veto:" << sldata->ovl(0)); } - if ((selectorOut->getNCandidate()) == 2) { + if ((out->getNCandidate()) == 2) { ATH_MSG_DEBUG( "SectorLogic: 2nd candidate " - << " roi:" << (selectorOut->getR(1))<<2 + selectorOut->getPhi(1) - << " pt:" << selectorOut->getPtLevel(1) - << " charge:" << getCharge(selectorOut->getDR(1),Zdir) + << " roi:" << (out->getR(1))<<2 + out->getPhi(1) + << " pt:" << out->getPtLevel(1) + << " charge:" << getCharge(out->getDR(1), Zdir) << " veto:" << sldata->ovl(1)); } - } } +} //////////////////////////////////////////////////////// void LVL1TGCTrigger::FillSectorLogicData(LVL1MUONIF::Lvl1MuSectorLogicDataPhase1 *sldata, @@ -711,9 +704,11 @@ namespace LVL1TGCTrigger { } // end loop for SLB type } - //////////////////////////////////////////////////////// - void LVL1TGCTrigger::recordRdoHPT(TGCSector * sector) - { +//////////////////////////////////////////////////////// +void LVL1TGCTrigger::recordRdoHPT(TGCSector* sector) +{ + if(sector->hasHit() == false) return; + // readoutID int subDetectorId, rodId, sswId, sbLoc, secId; @@ -840,7 +835,7 @@ namespace LVL1TGCTrigger { } // end loop for # of HPB per sector } // end loop for HPB type - } +} //////////////////////////////////////////////////////// @@ -925,26 +920,22 @@ namespace LVL1TGCTrigger { } - /////////////////////////////////////////////////////// - void LVL1TGCTrigger::recordRdoSL(TGCSector * sector, unsigned int subsystem) - { - // check if whether trigger exists or not +/////////////////////////////////////////////////////// +void LVL1TGCTrigger::recordRdoSL(TGCSector* sector) +{ + // check if whether trigger output exists or not const TGCSLSelectorOut* selectorOut = sector->getSL()->getSelectorOutput(); - if (selectorOut ==0) return; - if (selectorOut->getNCandidate()==0) return; - - // readoutID - int subDetectorId=0, rodId=0, sswId=0, sbLoc=0, secId=0; + if (selectorOut == nullptr) return; + if (selectorOut->getNCandidate() == 0) return; // trigger info - bool cand3plus=0, isEndcap=0, isAside=0, muplus=0, overlap=0, veto=0; + bool cand3plus = 0; + bool isEndcap = (sector->getRegionType() == Endcap); + bool isAside = (sector->getSideId()==0); + bool veto=0; int phi=0, index=0, threshold=0, roi=0; - int Zdir= (subsystem==LVL1MUONIF::Lvl1MuCTPIInput::idSideA() ? 1 : -1); - - isAside = (sector->getSideId()==0); - isEndcap = (sector->getRegionType()==Endcap); - cand3plus = 0; - + int Zdir= (isAside) ? 1 : -1; + // sector Id = 0..47 (Endcap) 0..23 (forward) int module = sector->getModuleId(); int sectorId; @@ -959,13 +950,14 @@ namespace LVL1TGCTrigger { // 0-5(EC), 0-2(FWD) for new TGCcabling (octant) int startEndcapSector, coverageOfEndcapSector; int startForwardSector, coverageOfForwardSector; - rodId = 1; + int rodId = 1; m_cabling->getCoveragefromRodID(rodId, startEndcapSector, coverageOfEndcapSector, startForwardSector, coverageOfForwardSector ) ; + int secId = 0; if (isEndcap){ secId = sectorId % coverageOfEndcapSector; } else { @@ -976,6 +968,7 @@ namespace LVL1TGCTrigger { phi = (isEndcap ? (sectorId+46)%48+1 : (sectorId+23)%24+1); // get readout ID + int subDetectorId = 0, sswId = 0, sbLoc = 0; bool status = m_cabling->getReadoutIDfromSLID(phi, isAside, isEndcap, subDetectorId, rodId, sswId, sbLoc); if (!status) { @@ -985,11 +978,12 @@ namespace LVL1TGCTrigger { << " phi=" << phi ); return; } - + + bool overlap = 0; uint16_t bcTag=m_CurrentBunchTag, l1Id=0, bcId=0; for (int icand=0; icand < selectorOut->getNCandidate(); icand +=1) { index=icand; - muplus = getCharge(selectorOut->getDR(icand), Zdir)==1 ? 1 : 0; + bool muplus = getCharge(selectorOut->getDR(icand), Zdir)==1 ? 1 : 0; threshold = selectorOut->getPtLevel(icand); roi = ((selectorOut->getR(icand))<<2)+(selectorOut->getPhi(icand)); if (selectorOut->getInnerVeto(icand)) veto = 1; diff --git a/Trigger/TrigT1/TrigT1TGC/src/TGCSLSelector.cxx b/Trigger/TrigT1/TrigT1TGC/src/TGCSLSelector.cxx index 2ba7cc883bfa403b2f04225658db74233930a922..2d988c94b21459a8a496c705954cd3c571cd4bbc 100644 --- a/Trigger/TrigT1/TrigT1TGC/src/TGCSLSelector.cxx +++ b/Trigger/TrigT1/TrigT1TGC/src/TGCSLSelector.cxx @@ -1,5 +1,5 @@ /* - Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration + Copyright (C) 2002-2021 CERN for the benefit of the ATLAS collaboration */ #include "TrigT1TGC/TGCSLSelector.h" @@ -9,35 +9,37 @@ namespace LVL1TGCTrigger { +TGCSLSelector::TGCSLSelector(const TGCSectorLogic* sl) + : m_sectorLogic(sl) +{} + +TGCSLSelector::~TGCSLSelector() +{} + // select Highest Pt tracks from all Pt Level. -TGCSLSelectorOut* TGCSLSelector::select(TGCSLPreSelectorOut* PSOut, - TGCSLSelectorOut* out) +bool TGCSLSelector::select(TGCSLPreSelectorOut* in, std::shared_ptr<TGCSLSelectorOut> out) { - int pt,i,j,nCan=0; + int nCan=0; int ptStart=NumberOfPtLevel; - for( i=0;(i<NumberOfPtLevel)&&(nCan<TGCSLSelectorOut::s_NCandidateInSLSelector); i+=1){ - pt=ptStart-i; - for( j=0;(j<TGCSLPreSelectorOut::NCandidateInSLPreSelector)&& - (nCan<TGCSLSelectorOut::s_NCandidateInSLSelector); j+=1) { + for(int i=0; (i<NumberOfPtLevel)&&(nCan<TGCSLSelectorOut::s_NCandidateInSLSelector); i++) { + int pt = ptStart - i; + for(int j=0; (j<TGCSLPreSelectorOut::NCandidateInSLPreSelector)&& + (nCan<TGCSLSelectorOut::s_NCandidateInSLSelector); j++) { - if(PSOut->getHit(pt,j)){ + if(in->getHit(pt, j)){ out->setPtLevel(nCan,pt); - int R= 2*PSOut->getIdSSC(pt,j)+PSOut->getR(pt,j) - (m_sectorLogic->getRegion()==Endcap ? 1 : 0); - out->setR(nCan,R); - out->setPhi(nCan,PSOut->getPhi(pt,j)); - out->setDR(nCan,2*PSOut->getDR(pt,j)); - out->setDPhi(nCan,PSOut->getDPhi(pt,j)); - out->setInnerVeto(nCan,PSOut->getInnerVeto(pt,j)); + int R = 2 * in->getIdSSC(pt,j) + in->getR(pt,j) - (m_sectorLogic->getRegion()==Endcap ? 1 : 0); + out->setR(nCan, R); + out->setPhi(nCan, in->getPhi(pt,j)); + out->setDR(nCan, 2 * in->getDR(pt,j)); + out->setDPhi(nCan, in->getDPhi(pt,j)); + out->setInnerVeto(nCan, in->getInnerVeto(pt,j)); nCan++; } } } - return out; + return (nCan>0) ? true : false; } -TGCSLSelector::TGCSLSelector( const TGCSectorLogic* sL): - m_sectorLogic(sL) -{ -} -} //end of namespace bracket +} // end of namespace diff --git a/Trigger/TrigT1/TrigT1TGC/src/TGCSLSelectorOut.cxx b/Trigger/TrigT1/TrigT1TGC/src/TGCSLSelectorOut.cxx index 246504098f8d0c1066631c0b0439196a109844d8..7a97cf4499b24d2490039076aa0f3efa5e8a45e4 100644 --- a/Trigger/TrigT1/TrigT1TGC/src/TGCSLSelectorOut.cxx +++ b/Trigger/TrigT1/TrigT1TGC/src/TGCSLSelectorOut.cxx @@ -1,5 +1,5 @@ /* - Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration + Copyright (C) 2002-2021 CERN for the benefit of the ATLAS collaboration */ #include "TrigT1TGC/TGCSLSelectorOut.h" @@ -7,7 +7,8 @@ namespace LVL1TGCTrigger { -TGCSLSelectorOut::TGCSLSelectorOut():m_nCandidate(0) +TGCSLSelectorOut::TGCSLSelectorOut() + : m_nCandidate(0) { for( int i=0; i<s_NCandidateInSLSelector; i+=1){ m_ptLevel[i]=0; @@ -19,6 +20,19 @@ TGCSLSelectorOut::TGCSLSelectorOut():m_nCandidate(0) } } +void TGCSLSelectorOut::reset() +{ + for(int i=0; i<s_NCandidateInSLSelector; i++) { + m_ptLevel[i]=0; + m_r[i]=0; + m_phi[i]=0; + m_dr[i]=99; + m_dphi[i]=99; + m_iVeto[i]=false; + } + m_nCandidate=0; +} + void TGCSLSelectorOut::setPtLevel(int order, int ptLevelIn) { if(order<s_NCandidateInSLSelector){ diff --git a/Trigger/TrigT1/TrigT1TGC/src/TGCSectorLogic.cxx b/Trigger/TrigT1/TrigT1TGC/src/TGCSectorLogic.cxx index e0ee10634e0c14f1aa06dac0e570e67ac6ffa30e..3fb8c9bff71a9f4b02d960feff75bf6a61c2952f 100644 --- a/Trigger/TrigT1/TrigT1TGC/src/TGCSectorLogic.cxx +++ b/Trigger/TrigT1/TrigT1TGC/src/TGCSectorLogic.cxx @@ -36,10 +36,9 @@ TGCSectorLogic::TGCSectorLogic(TGCArguments* tgcargs, const TGCDatabaseManager* m_SSCController(tgcargs,this), m_matrix(tgcargs,this), m_pTMDB(0), - m_preSelector(this), // for Run2 - m_selector(this),//for Run2 - m_selectorOut(0), //for Run2 - m_trackSelector(this),// for Run3 + m_preSelector(this), // for Run2 + m_selector(this), // for Run2 + m_trackSelector(this), // for Run3 m_wordTileMuon(0), m_wordInnerStation(0), m_stripHighPtBoard(0), @@ -79,6 +78,7 @@ TGCSectorLogic::TGCSectorLogic(TGCArguments* tgcargs, const TGCDatabaseManager* m_mapGoodMF = db->getGoodMFMap(); m_mapNSW = db->getNSWCoincidenceMap(m_sideId, m_octantId, m_moduleId); + m_selectorOut.reset(new TGCSLSelectorOut); m_trackSelectorOut.reset(new TGCTrackSelectorOut());//for Run3 for(int i=0; i<MaxNumberOfWireHighPtBoard; i++){ @@ -97,9 +97,7 @@ TGCSectorLogic::TGCSectorLogic(TGCArguments* tgcargs, const TGCDatabaseManager* } TGCSectorLogic::~TGCSectorLogic() -{ - if(m_selectorOut) delete m_selectorOut; -} +{} void TGCSectorLogic::setTMDB(const TGCTMDB* tmdb) { @@ -129,15 +127,14 @@ void TGCSectorLogic::getTrackSelectorOutput(std::shared_ptr<TGCTrackSelectorOut> trackSelectorOut=m_trackSelectorOut; } -void TGCSectorLogic::eraseSelectorOut() -{ - m_selectorOut=0; -} - void TGCSectorLogic::clockIn(const SG::ReadCondHandleKey<TGCTriggerData> readCondKey, - int bidIn) + int bidIn, bool process) { - int SSCid, phiposInSSC; + // reset output at the previous bunch crossing + m_selectorOut.get()->reset(); + // skip to process if want. (e.g. no hit in TGC) + if(!process) return; + m_bid=bidIn; collectInput(); @@ -151,13 +148,13 @@ void TGCSectorLogic::clockIn(const SG::ReadCondHandleKey<TGCTriggerData> readCon m_preSelector.init(); - for(SSCid=0; SSCid<getNumberOfSubSectorCluster(); SSCid+=1){ + for(int SSCid=0; SSCid<getNumberOfSubSectorCluster(); SSCid+=1){ TGCRPhiCoincidenceOut* coincidenceOut = 0; if(SSCCOut->hasHit(SSCid)){ m_matrix.clear(); m_matrix.setSSCId(SSCid); m_matrix.inputR(SSCCOut->getR(SSCid),SSCCOut->getDR(SSCid),SSCCOut->getPtR(SSCid)); - for(phiposInSSC = 0 ;phiposInSSC < TGCSSCControllerOut::MaxNumberOfPhiInSSC; phiposInSSC++){ + for(int phiposInSSC = 0 ;phiposInSSC < TGCSSCControllerOut::MaxNumberOfPhiInSSC; phiposInSSC++){ if(SSCCOut->hasHit(SSCid, phiposInSSC)){ m_matrix.inputPhi(SSCCOut->getPhi(SSCid,phiposInSSC), SSCCOut->getDPhi(SSCid,phiposInSSC), @@ -171,7 +168,7 @@ void TGCSectorLogic::clockIn(const SG::ReadCondHandleKey<TGCTriggerData> readCon m_matrix.clear(); m_matrix.setSSCId(SSCid); m_matrix.inputR(SSCCOut->getR(SSCid),SSCCOut->getDR(SSCid),SSCCOut->getPtR(SSCid)); - for(phiposInSSC = 0 ;phiposInSSC < TGCSSCControllerOut::MaxNumberOfPhiInSSC; phiposInSSC++){ + for(int phiposInSSC = 0 ;phiposInSSC < TGCSSCControllerOut::MaxNumberOfPhiInSSC; phiposInSSC++){ if(SSCCOut->hasHit(SSCid, phiposInSSC, true)){ m_matrix.inputPhi(SSCCOut->getPhi(SSCid,phiposInSSC,true), SSCCOut->getDPhi(SSCid,phiposInSSC,true), @@ -231,8 +228,8 @@ void TGCSectorLogic::clockIn(const SG::ReadCondHandleKey<TGCTriggerData> readCon if(tgcArgs()->useRun3Config()){ //Track selector in Run3. max 4 tracks ,which are send to MUCTPI, are selected. m_trackSelector.select(m_trackSelectorOut); - } - else{ + + } else{ #ifdef TGCDEBUG m_preSelector.dumpInput(); #endif @@ -245,14 +242,12 @@ void TGCSectorLogic::clockIn(const SG::ReadCondHandleKey<TGCTriggerData> readCon preSelectorOut->print(); #endif - // delete SLSelectorOut if exists - if(m_selectorOut!=0) delete m_selectorOut; - // create new SLSelectorOut - m_selectorOut = new TGCSLSelectorOut; + // reset output at the previous bunch crossing + m_selectorOut.get()->reset(); if(preSelectorOut!=0){ // select final canidates - m_selector.select(preSelectorOut,m_selectorOut); + m_selector.select(preSelectorOut, m_selectorOut); // delete SLPreSelectorOut delete preSelectorOut; @@ -263,27 +258,6 @@ void TGCSectorLogic::clockIn(const SG::ReadCondHandleKey<TGCTriggerData> readCon #ifdef TGCDEBUG showResult(m_selectorOut); #endif - // EIFI trigger information is dumped when we have Endcap SL trigger - /* - if(m_region==ENDCAP && m_selectorOut!=0 && m_selectorOut->getNCandidate()) { - for(unsigned int iSlot=0; iSlot<TGCInnerTrackletSlotHolder::NUMBER_OF_SLOTS_PER_TRIGGER_SECTOR; iSlot++) { - std::cout << " innerTrackletSlots[" << iSlot << "]"; - if(m_innerTrackletSlots[iSlot]) { - std::cout << " m_sideId " << m_innerTrackletSlots[iSlot]->getSideId() - << " slotId " << m_innerTrackletSlots[iSlot]->getSlotId() - << " triggerBits "; - for(unsigned int iRegion=0; iRegion<TGCInnerTrackletSlot::NUMBER_OF_REGIONS; iRegion++) { - for(unsigned int readout=0; readout<TGCInnerTrackletSlot::NUMBER_OF_READOUTS; readout++) { - for(unsigned int iBit=0; iBit<TGCInnerTrackletSlot::NUMBER_OF_TRIGGER_BITS; iBit++) { - std::cout << (m_innerTrackletSlots[iSlot]->getTriggerBit(iRegion,readout,iBit) ? 1 : 0); - } - } - } - } - std::cout << std::endl; - } - } - */ } void TGCSectorLogic::collectInput() @@ -311,18 +285,17 @@ void TGCSectorLogic::deleteHPBOut() } -void TGCSectorLogic::showResult(TGCSLSelectorOut* out) +void TGCSectorLogic::showResult() { - int i; std::cout<<"#SL O"<<" BID:"<<m_bid <<" region:"<<((m_region==FORWARD) ? "FWD" : "END") <<" SLid:"<<m_id<<" "; - for( i=0; i<out->getNCandidate(); i+=1){ + for(int i=0; i<m_selectorOut->getNCandidate(); i+=1){ std::cout<<" "<<i<<" " - <<out->getPtLevel(i)<<" " - <<out->getR(i)<<" " - <<out->getPhi(i)<<std::endl; + <<m_selectorOut->getPtLevel(i)<<" " + <<m_selectorOut->getR(i)<<" " + <<m_selectorOut->getPhi(i)<<std::endl; } std::cout<<std::endl; @@ -330,7 +303,7 @@ void TGCSectorLogic::showResult(TGCSLSelectorOut* out) TGCSectorLogic::TGCSectorLogic(const TGCSectorLogic& right) - : m_bid(right.m_id), m_id(right.m_id), + : m_bid(right.m_bid), m_id(right.m_id), m_sectorId(right.m_sectorId), m_moduleId(right.m_moduleId), m_sideId(right.m_sideId), m_octantId(right.m_octantId), m_region(right.m_region), @@ -342,7 +315,6 @@ TGCSectorLogic::TGCSectorLogic(const TGCSectorLogic& right) m_mapEIFI(right.m_mapEIFI), m_pTMDB(right.m_pTMDB), m_preSelector(this), m_selector(this), - m_selectorOut(0), m_wordTileMuon(0), m_wordInnerStation(0), m_stripHighPtBoard(right.m_stripHighPtBoard), m_stripHighPtChipOut(0), @@ -377,8 +349,6 @@ TGCSectorLogic::operator=(const TGCSectorLogic& right) m_NumberOfWireHighPtBoard=right.m_NumberOfWireHighPtBoard; m_mapEIFI=right.m_mapEIFI; m_pTMDB=right.m_pTMDB; - delete m_selectorOut; - m_selectorOut=0; m_wordTileMuon=0; m_wordInnerStation=0; m_stripHighPtBoard=right.m_stripHighPtBoard; diff --git a/Trigger/TrigT1/TrigT1TGC/src/TGCTimingManager.cxx b/Trigger/TrigT1/TrigT1TGC/src/TGCTimingManager.cxx index f1cd893ae063a689056dc5c7da02a996ad6d9fe3..9e326fb2ebe22c3d700939ff7e8e03fcb677984c 100644 --- a/Trigger/TrigT1/TrigT1TGC/src/TGCTimingManager.cxx +++ b/Trigger/TrigT1/TrigT1TGC/src/TGCTimingManager.cxx @@ -75,9 +75,7 @@ void TGCTimingManager::startSlaveBoard(TGCSector* sector) void TGCTimingManager::startHighPtBoard(TGCSector* sector) { -#ifdef TGCDEBUG - std::cout << "Start HighPt Board" <<std::endl; -#endif + if(sector->hasHit() == false) return; // collect input signals by 1st clockIn, // perform coincidence by 2nd clockIn. @@ -92,12 +90,9 @@ void TGCTimingManager::startHighPtBoard(TGCSector* sector) void TGCTimingManager::startSectorLogic(TGCSector* sector) { -#ifdef TGCDEBUG - std::cout << "Start Sector Logic" <<std::endl; -#endif - TGCSectorLogic* sl= sector->getSL(); - if(sl!=0) sl->clockIn(m_readCondKey, m_bunchCounter); + + if(sl!=0) sl->clockIn(m_readCondKey, m_bunchCounter, sector->hasHit()); } } //end of namespace bracket